about summary refs log tree commit diff
path: root/nixpkgs/pkgs/games
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/games')
-rw-r--r--nixpkgs/pkgs/games/0ad/data.nix26
-rw-r--r--nixpkgs/pkgs/games/0ad/default.nix14
-rw-r--r--nixpkgs/pkgs/games/0ad/game.nix112
-rw-r--r--nixpkgs/pkgs/games/0ad/rootdir_env.patch39
-rw-r--r--nixpkgs/pkgs/games/0ad/spidermonkey-cargo-toml.patch15
-rw-r--r--nixpkgs/pkgs/games/0ad/wrapper.nix24
-rw-r--r--nixpkgs/pkgs/games/0verkill/default.nix42
-rw-r--r--nixpkgs/pkgs/games/1oom/default.nix32
-rw-r--r--nixpkgs/pkgs/games/2048-cli/default.nix62
-rw-r--r--nixpkgs/pkgs/games/2048-in-terminal/default.nix30
-rw-r--r--nixpkgs/pkgs/games/20kly/default.nix46
-rw-r--r--nixpkgs/pkgs/games/7kaa/default.nix76
-rw-r--r--nixpkgs/pkgs/games/90secondportraits/default.nix52
-rw-r--r--nixpkgs/pkgs/games/BeatSaberModManager/default.nix77
-rw-r--r--nixpkgs/pkgs/games/BeatSaberModManager/deps.nix99
-rw-r--r--nixpkgs/pkgs/games/abbaye-des-morts/default.nix35
-rw-r--r--nixpkgs/pkgs/games/abuse/abuse.sh18
-rw-r--r--nixpkgs/pkgs/games/abuse/default.nix54
-rw-r--r--nixpkgs/pkgs/games/ace-of-penguins/default.nix78
-rw-r--r--nixpkgs/pkgs/games/ace-of-penguins/fixup-miscompilations.patch80
-rw-r--r--nixpkgs/pkgs/games/adom/default.nix60
-rw-r--r--nixpkgs/pkgs/games/airshipper/Cargo.lock5355
-rw-r--r--nixpkgs/pkgs/games/airshipper/default.nix121
-rw-r--r--nixpkgs/pkgs/games/airstrike/default.nix36
-rw-r--r--nixpkgs/pkgs/games/alienarena/default.nix42
-rw-r--r--nixpkgs/pkgs/games/amoeba/data.nix24
-rw-r--r--nixpkgs/pkgs/games/amoeba/default.nix45
-rw-r--r--nixpkgs/pkgs/games/amoeba/include-string-h.patch12
-rw-r--r--nixpkgs/pkgs/games/among-sus/default.nix30
-rw-r--r--nixpkgs/pkgs/games/andyetitmoves/default.nix73
-rw-r--r--nixpkgs/pkgs/games/angband/default.nix37
-rw-r--r--nixpkgs/pkgs/games/animatch/default.nix41
-rw-r--r--nixpkgs/pkgs/games/anki/Cargo.lock6826
-rw-r--r--nixpkgs/pkgs/games/anki/bin.nix93
-rw-r--r--nixpkgs/pkgs/games/anki/default.nix299
-rw-r--r--nixpkgs/pkgs/games/anki/patches/disable-auto-update.patch15
-rw-r--r--nixpkgs/pkgs/games/anki/patches/remove-the-gl-library-workaround.patch19
-rw-r--r--nixpkgs/pkgs/games/anki/patches/skip-formatting-python-code.patch21
-rw-r--r--nixpkgs/pkgs/games/anki/sync-server.nix40
-rw-r--r--nixpkgs/pkgs/games/antsimulator/default.nix40
-rw-r--r--nixpkgs/pkgs/games/arena/default.nix75
-rw-r--r--nixpkgs/pkgs/games/armagetronad/default.nix179
-rw-r--r--nixpkgs/pkgs/games/arx-libertatis/default.nix62
-rw-r--r--nixpkgs/pkgs/games/asc/default.nix85
-rw-r--r--nixpkgs/pkgs/games/assaultcube/default.nix98
-rw-r--r--nixpkgs/pkgs/games/astromenace/default.nix40
-rw-r--r--nixpkgs/pkgs/games/atanks/default.nix23
-rw-r--r--nixpkgs/pkgs/games/atlauncher/default.nix59
-rw-r--r--nixpkgs/pkgs/games/augustus/default.nix25
-rw-r--r--nixpkgs/pkgs/games/azimuth/default.nix51
-rw-r--r--nixpkgs/pkgs/games/badlion-client/default.nix32
-rw-r--r--nixpkgs/pkgs/games/ballerburg/default.nix55
-rw-r--r--nixpkgs/pkgs/games/banner/default.nix27
-rw-r--r--nixpkgs/pkgs/games/bastet/default.nix45
-rw-r--r--nixpkgs/pkgs/games/black-hole-solver/default.nix30
-rw-r--r--nixpkgs/pkgs/games/blackshades/default.nix43
-rw-r--r--nixpkgs/pkgs/games/blightmud/default.nix68
-rw-r--r--nixpkgs/pkgs/games/blobby/blobby.sh10
-rw-r--r--nixpkgs/pkgs/games/blobby/default.nix37
-rw-r--r--nixpkgs/pkgs/games/blobwars/blobwars-2.00-glibc-2.38.patch11
-rw-r--r--nixpkgs/pkgs/games/blobwars/default.nix36
-rw-r--r--nixpkgs/pkgs/games/blockattack/default.nix58
-rw-r--r--nixpkgs/pkgs/games/boohu/default.nix29
-rw-r--r--nixpkgs/pkgs/games/braincurses/default.nix28
-rw-r--r--nixpkgs/pkgs/games/brogue-ce/default.nix63
-rw-r--r--nixpkgs/pkgs/games/brogue/default.nix59
-rw-r--r--nixpkgs/pkgs/games/brutalmaze/default.nix34
-rw-r--r--nixpkgs/pkgs/games/bsdgames/default.nix69
-rw-r--r--nixpkgs/pkgs/games/btanks/default.nix51
-rw-r--r--nixpkgs/pkgs/games/bugdom/default.nix69
-rw-r--r--nixpkgs/pkgs/games/bzflag/default.nix25
-rw-r--r--nixpkgs/pkgs/games/cataclysm-dda/builder.nix49
-rw-r--r--nixpkgs/pkgs/games/cataclysm-dda/common.nix103
-rw-r--r--nixpkgs/pkgs/games/cataclysm-dda/default.nix43
-rw-r--r--nixpkgs/pkgs/games/cataclysm-dda/git.nix41
-rw-r--r--nixpkgs/pkgs/games/cataclysm-dda/lib.nix46
-rw-r--r--nixpkgs/pkgs/games/cataclysm-dda/locale-path.patch18
-rw-r--r--nixpkgs/pkgs/games/cataclysm-dda/pkgs/default.nix29
-rw-r--r--nixpkgs/pkgs/games/cataclysm-dda/pkgs/tilesets/UndeadPeople/default.nix23
-rw-r--r--nixpkgs/pkgs/games/cataclysm-dda/stable.nix53
-rw-r--r--nixpkgs/pkgs/games/cataclysm-dda/wrapper.nix47
-rw-r--r--nixpkgs/pkgs/games/cbonsai/default.nix29
-rw-r--r--nixpkgs/pkgs/games/cdogs-sdl/default.nix64
-rw-r--r--nixpkgs/pkgs/games/cgoban/default.nix39
-rw-r--r--nixpkgs/pkgs/games/chessdb/default.nix28
-rw-r--r--nixpkgs/pkgs/games/chessx/default.nix73
-rw-r--r--nixpkgs/pkgs/games/chiaki/default.nix66
-rw-r--r--nixpkgs/pkgs/games/chiaki4deck/default.nix78
-rw-r--r--nixpkgs/pkgs/games/chromium-bsu/default.nix68
-rw-r--r--nixpkgs/pkgs/games/ckan/default.nix35
-rw-r--r--nixpkgs/pkgs/games/cl-wordle/default.nix24
-rw-r--r--nixpkgs/pkgs/games/classicube/default.nix102
-rw-r--r--nixpkgs/pkgs/games/classicube/fix-linking.patch13
-rw-r--r--nixpkgs/pkgs/games/classicube/font-location.patch16
-rw-r--r--nixpkgs/pkgs/games/clonehero/default.nix123
-rw-r--r--nixpkgs/pkgs/games/cockatrice/default.nix29
-rw-r--r--nixpkgs/pkgs/games/colobot/data.nix41
-rw-r--r--nixpkgs/pkgs/games/colobot/default.nix41
-rw-r--r--nixpkgs/pkgs/games/commandergenius/default.nix44
-rw-r--r--nixpkgs/pkgs/games/construo/default.nix35
-rw-r--r--nixpkgs/pkgs/games/corsix-th/default.nix44
-rw-r--r--nixpkgs/pkgs/games/crack-attack/crack-attack-1.1.14-gcc43.patch10
-rw-r--r--nixpkgs/pkgs/games/crack-attack/crack-attack-1.1.14-glut.patch10
-rw-r--r--nixpkgs/pkgs/games/crack-attack/default.nix36
-rw-r--r--nixpkgs/pkgs/games/crawl/crawl_purify.patch33
-rw-r--r--nixpkgs/pkgs/games/crawl/default.nix77
-rw-r--r--nixpkgs/pkgs/games/crossfire/crossfire-arch.nix27
-rw-r--r--nixpkgs/pkgs/games/crossfire/crossfire-client.nix32
-rw-r--r--nixpkgs/pkgs/games/crossfire/crossfire-maps.nix27
-rw-r--r--nixpkgs/pkgs/games/crossfire/crossfire-server.nix52
-rw-r--r--nixpkgs/pkgs/games/crossfire/default.nix28
-rw-r--r--nixpkgs/pkgs/games/crrcsim/default.nix28
-rw-r--r--nixpkgs/pkgs/games/crrcsim/gcc6.patch13
-rw-r--r--nixpkgs/pkgs/games/curseofwar/default.nix37
-rw-r--r--nixpkgs/pkgs/games/cutechess/default.nix45
-rw-r--r--nixpkgs/pkgs/games/cutemaze/default.nix52
-rw-r--r--nixpkgs/pkgs/games/cuyo/default.nix21
-rw-r--r--nixpkgs/pkgs/games/darkplaces/default.nix58
-rw-r--r--nixpkgs/pkgs/games/ddnet/default.nix130
-rw-r--r--nixpkgs/pkgs/games/deliantra/0001-abs.patch17
-rw-r--r--nixpkgs/pkgs/games/deliantra/0002-datadir.patch11
-rw-r--r--nixpkgs/pkgs/games/deliantra/0003-swap.patch14
-rw-r--r--nixpkgs/pkgs/games/deliantra/arch.nix25
-rw-r--r--nixpkgs/pkgs/games/deliantra/data.nix21
-rw-r--r--nixpkgs/pkgs/games/deliantra/maps.nix25
-rw-r--r--nixpkgs/pkgs/games/deliantra/server.nix55
-rw-r--r--nixpkgs/pkgs/games/devilutionx/default.nix129
-rw-r--r--nixpkgs/pkgs/games/domination/default.nix108
-rw-r--r--nixpkgs/pkgs/games/doom-ports/chocolate-doom/default.nix49
-rw-r--r--nixpkgs/pkgs/games/doom-ports/crispy-doom/default.nix36
-rw-r--r--nixpkgs/pkgs/games/doom-ports/dhewm3/default.nix45
-rw-r--r--nixpkgs/pkgs/games/doom-ports/doomretro/default.nix74
-rw-r--r--nixpkgs/pkgs/games/doom-ports/doomrunner/default.nix60
-rw-r--r--nixpkgs/pkgs/games/doom-ports/doomseeker/default.nix28
-rw-r--r--nixpkgs/pkgs/games/doom-ports/doomseeker/fix_paths.patch40
-rw-r--r--nixpkgs/pkgs/games/doom-ports/doomseeker/qt_build_fix.patch47
-rw-r--r--nixpkgs/pkgs/games/doom-ports/enyo-launcher/default.nix25
-rw-r--r--nixpkgs/pkgs/games/doom-ports/eternity-engine/default.nix31
-rw-r--r--nixpkgs/pkgs/games/doom-ports/eureka-editor/default.nix36
-rw-r--r--nixpkgs/pkgs/games/doom-ports/gzdoom/default.nix114
-rw-r--r--nixpkgs/pkgs/games/doom-ports/odamex/default.nix54
-rw-r--r--nixpkgs/pkgs/games/doom-ports/prboom-plus/default.nix62
-rw-r--r--nixpkgs/pkgs/games/doom-ports/rbdoom-3-bfg/default.nix88
-rw-r--r--nixpkgs/pkgs/games/doom-ports/slade/default.nix68
-rw-r--r--nixpkgs/pkgs/games/doom-ports/slade/git.nix73
-rw-r--r--nixpkgs/pkgs/games/doom-ports/zandronum/add_gitinfo.patch15
-rw-r--r--nixpkgs/pkgs/games/doom-ports/zandronum/default.nix103
-rw-r--r--nixpkgs/pkgs/games/doom-ports/zandronum/dont_update_gitinfo.patch19
-rw-r--r--nixpkgs/pkgs/games/doom-ports/zandronum/fmod.nix45
-rw-r--r--nixpkgs/pkgs/games/doom-ports/zandronum/sqlite.nix28
-rw-r--r--nixpkgs/pkgs/games/doom-ports/zandronum/zan_configure_impurity.patch69
-rw-r--r--nixpkgs/pkgs/games/doom-ports/zdoom/bcc-git.nix32
-rw-r--r--nixpkgs/pkgs/games/doom-ports/zdoom/bcc-warning-fix.patch25
-rw-r--r--nixpkgs/pkgs/games/doom-ports/zdoom/default.nix55
-rw-r--r--nixpkgs/pkgs/games/doom-ports/zdoom/zdbsp.nix37
-rw-r--r--nixpkgs/pkgs/games/duckmarines/default.nix55
-rw-r--r--nixpkgs/pkgs/games/dwarf-fortress/default.nix117
-rw-r--r--nixpkgs/pkgs/games/dwarf-fortress/df_permission40
-rw-r--r--nixpkgs/pkgs/games/dwarf-fortress/dfhack/default.nix171
-rw-r--r--nixpkgs/pkgs/games/dwarf-fortress/dwarf-therapist/default.nix40
-rw-r--r--nixpkgs/pkgs/games/dwarf-fortress/dwarf-therapist/dwarf-therapist.in25
-rw-r--r--nixpkgs/pkgs/games/dwarf-fortress/dwarf-therapist/wrapper.nix60
-rw-r--r--nixpkgs/pkgs/games/dwarf-fortress/game.json139
-rw-r--r--nixpkgs/pkgs/games/dwarf-fortress/game.nix109
-rw-r--r--nixpkgs/pkgs/games/dwarf-fortress/lazy-pack.nix56
-rw-r--r--nixpkgs/pkgs/games/dwarf-fortress/legends-browser/default.nix37
-rw-r--r--nixpkgs/pkgs/games/dwarf-fortress/soundsense.nix37
-rw-r--r--nixpkgs/pkgs/games/dwarf-fortress/themes/default.nix21
-rw-r--r--nixpkgs/pkgs/games/dwarf-fortress/themes/themes.json87
-rwxr-xr-xnixpkgs/pkgs/games/dwarf-fortress/themes/update.sh8
-rw-r--r--nixpkgs/pkgs/games/dwarf-fortress/twbt/default.nix85
-rw-r--r--nixpkgs/pkgs/games/dwarf-fortress/unfuck.nix134
-rwxr-xr-xnixpkgs/pkgs/games/dwarf-fortress/update.sh42
-rw-r--r--nixpkgs/pkgs/games/dwarf-fortress/wrapper/default.nix182
-rwxr-xr-xnixpkgs/pkgs/games/dwarf-fortress/wrapper/dfhack.in11
-rw-r--r--nixpkgs/pkgs/games/dwarf-fortress/wrapper/dwarf-fortress-init.in45
-rw-r--r--nixpkgs/pkgs/games/dwarf-fortress/wrapper/dwarf-fortress.in9
-rw-r--r--nixpkgs/pkgs/games/dwarf-fortress/wrapper/soundSense.in10
-rw-r--r--nixpkgs/pkgs/games/dxx-rebirth/assets.nix55
-rw-r--r--nixpkgs/pkgs/games/dxx-rebirth/default.nix59
-rw-r--r--nixpkgs/pkgs/games/dxx-rebirth/full.nix30
-rw-r--r--nixpkgs/pkgs/games/easyrpg-player/default.nix135
-rw-r--r--nixpkgs/pkgs/games/eboard/default.nix26
-rw-r--r--nixpkgs/pkgs/games/eboard/eboard.patch16
-rw-r--r--nixpkgs/pkgs/games/ecwolf/default.nix51
-rw-r--r--nixpkgs/pkgs/games/eduke32/default.nix123
-rw-r--r--nixpkgs/pkgs/games/egoboo/default.nix65
-rw-r--r--nixpkgs/pkgs/games/eidolon/Cargo.lock2087
-rw-r--r--nixpkgs/pkgs/games/eidolon/default.nix38
-rw-r--r--nixpkgs/pkgs/games/empty-epsilon/default.nix85
-rw-r--r--nixpkgs/pkgs/games/endgame-singularity/default.nix60
-rw-r--r--nixpkgs/pkgs/games/endless-sky/default.nix68
-rw-r--r--nixpkgs/pkgs/games/endless-sky/fixes.patch53
-rw-r--r--nixpkgs/pkgs/games/enigma/default.nix46
-rw-r--r--nixpkgs/pkgs/games/etlegacy/default.nix141
-rw-r--r--nixpkgs/pkgs/games/everspace/default.nix118
-rw-r--r--nixpkgs/pkgs/games/extremetuxracer/default.nix41
-rw-r--r--nixpkgs/pkgs/games/exult/default.nix62
-rw-r--r--nixpkgs/pkgs/games/ezquake/default.nix41
-rw-r--r--nixpkgs/pkgs/games/factorio/default.nix277
-rw-r--r--nixpkgs/pkgs/games/factorio/mods.nix213
-rwxr-xr-xnixpkgs/pkgs/games/factorio/update.py190
-rw-r--r--nixpkgs/pkgs/games/factorio/utils.nix51
-rw-r--r--nixpkgs/pkgs/games/factorio/versions.json58
-rw-r--r--nixpkgs/pkgs/games/fairymax/default.nix49
-rw-r--r--nixpkgs/pkgs/games/fallout-ce/build.nix77
-rw-r--r--nixpkgs/pkgs/games/fallout-ce/fallout-ce.nix20
-rw-r--r--nixpkgs/pkgs/games/fallout-ce/fallout2-ce.nix23
-rw-r--r--nixpkgs/pkgs/games/ferium/default.nix39
-rw-r--r--nixpkgs/pkgs/games/fheroes2/default.nix71
-rw-r--r--nixpkgs/pkgs/games/fish-fillets-ng/default.nix41
-rw-r--r--nixpkgs/pkgs/games/fish-fillets-ng/icon.xpm39
-rw-r--r--nixpkgs/pkgs/games/flare/default.nix24
-rw-r--r--nixpkgs/pkgs/games/flare/desktop.patch15
-rw-r--r--nixpkgs/pkgs/games/flare/engine.nix27
-rw-r--r--nixpkgs/pkgs/games/flare/game.nix23
-rw-r--r--nixpkgs/pkgs/games/flightgear/default.nix58
-rw-r--r--nixpkgs/pkgs/games/fltrator/default.nix45
-rw-r--r--nixpkgs/pkgs/games/forge-mtg/default.nix65
-rw-r--r--nixpkgs/pkgs/games/forge-mtg/no-launch4j.patch466
-rw-r--r--nixpkgs/pkgs/games/freeciv/default.nix86
-rw-r--r--nixpkgs/pkgs/games/freedink/default.nix63
-rw-r--r--nixpkgs/pkgs/games/freedroid/default.nix53
-rw-r--r--nixpkgs/pkgs/games/freedroidrpg/default.nix76
-rw-r--r--nixpkgs/pkgs/games/freedroidrpg/drop-build-deps.patch15
-rw-r--r--nixpkgs/pkgs/games/freenukum/default.nix74
-rw-r--r--nixpkgs/pkgs/games/freeorion/default.nix87
-rw-r--r--nixpkgs/pkgs/games/freeorion/fix-paths.sh6
-rw-r--r--nixpkgs/pkgs/games/freeorion/fix-paths.xslt13
-rw-r--r--nixpkgs/pkgs/games/freesweep/default.nix37
-rw-r--r--nixpkgs/pkgs/games/frogatto/data.nix25
-rw-r--r--nixpkgs/pkgs/games/frogatto/default.nix43
-rw-r--r--nixpkgs/pkgs/games/frogatto/engine.nix51
-rw-r--r--nixpkgs/pkgs/games/frotz/default.nix43
-rw-r--r--nixpkgs/pkgs/games/frozen-bubble/default.nix37
-rw-r--r--nixpkgs/pkgs/games/frozen-bubble/fix-compilation.patch33
-rw-r--r--nixpkgs/pkgs/games/fsg/default.nix40
-rw-r--r--nixpkgs/pkgs/games/fsg/wxgtk-3.2.patch68
-rw-r--r--nixpkgs/pkgs/games/fteqw/default.nix90
-rw-r--r--nixpkgs/pkgs/games/fteqw/generic.nix61
-rw-r--r--nixpkgs/pkgs/games/galaxis/default.nix47
-rw-r--r--nixpkgs/pkgs/games/gambit/default.nix54
-rw-r--r--nixpkgs/pkgs/games/gamehub/default.nix67
-rw-r--r--nixpkgs/pkgs/games/gamepad-tool/default.nix47
-rw-r--r--nixpkgs/pkgs/games/garden-of-coloured-lights/default.nix33
-rw-r--r--nixpkgs/pkgs/games/gargoyle/darwin.sh54
-rw-r--r--nixpkgs/pkgs/games/gargoyle/default.nix75
-rw-r--r--nixpkgs/pkgs/games/gav/default.nix27
-rw-r--r--nixpkgs/pkgs/games/gav/gcc.patch12
-rw-r--r--nixpkgs/pkgs/games/gcompris/default.nix69
-rw-r--r--nixpkgs/pkgs/games/gcs/default.nix81
-rw-r--r--nixpkgs/pkgs/games/gemrb/default.nix89
-rw-r--r--nixpkgs/pkgs/games/gimx/conf.patch26
-rw-r--r--nixpkgs/pkgs/games/gimx/custom/Dualshock4.xml104
-rw-r--r--nixpkgs/pkgs/games/gimx/default.nix86
-rw-r--r--nixpkgs/pkgs/games/gl-117/default.nix24
-rw-r--r--nixpkgs/pkgs/games/gl-gsync-demo/default.nix38
-rw-r--r--nixpkgs/pkgs/games/globulation/default.nix69
-rw-r--r--nixpkgs/pkgs/games/globulation/header-order.patch23
-rw-r--r--nixpkgs/pkgs/games/globulation/public-buildproject.patch21
-rw-r--r--nixpkgs/pkgs/games/gltron/default.nix30
-rw-r--r--nixpkgs/pkgs/games/gltron/gentoo-prototypes.patch27
-rw-r--r--nixpkgs/pkgs/games/gmad/default.nix35
-rw-r--r--nixpkgs/pkgs/games/gnome-hexgl/default.nix43
-rw-r--r--nixpkgs/pkgs/games/gnonograms/default.nix66
-rw-r--r--nixpkgs/pkgs/games/gnubg/default.nix38
-rw-r--r--nixpkgs/pkgs/games/gnuchess/default.nix28
-rw-r--r--nixpkgs/pkgs/games/gnugo/default.nix30
-rw-r--r--nixpkgs/pkgs/games/gnujump/default.nix42
-rw-r--r--nixpkgs/pkgs/games/gnujump/gnujump.xpm64
-rw-r--r--nixpkgs/pkgs/games/gnushogi/default.nix37
-rw-r--r--nixpkgs/pkgs/games/gogdl/default.nix66
-rw-r--r--nixpkgs/pkgs/games/gogui/default.nix95
-rw-r--r--nixpkgs/pkgs/games/gotypist/default.nix26
-rw-r--r--nixpkgs/pkgs/games/grapejuice/default.nix138
-rw-r--r--nixpkgs/pkgs/games/graphwar/default.nix66
-rw-r--r--nixpkgs/pkgs/games/gscrabble/default.nix44
-rw-r--r--nixpkgs/pkgs/games/gshogi/default.nix40
-rw-r--r--nixpkgs/pkgs/games/gtetrinet/default.nix45
-rw-r--r--nixpkgs/pkgs/games/gtypist/default.nix28
-rw-r--r--nixpkgs/pkgs/games/gweled/default.nix34
-rw-r--r--nixpkgs/pkgs/games/harmonist/default.nix30
-rw-r--r--nixpkgs/pkgs/games/hase/default.nix57
-rw-r--r--nixpkgs/pkgs/games/hase/prefer-dynamic.patch13
-rw-r--r--nixpkgs/pkgs/games/hedgewars/default.nix88
-rw-r--r--nixpkgs/pkgs/games/heroic/default.nix125
-rw-r--r--nixpkgs/pkgs/games/heroic/fhsenv.nix141
-rw-r--r--nixpkgs/pkgs/games/heroic/fix-non-steam-shortcuts.patch13
-rw-r--r--nixpkgs/pkgs/games/heroic/remove-drm-support.patch28
-rw-r--r--nixpkgs/pkgs/games/hex-a-hop/default.nix45
-rw-r--r--nixpkgs/pkgs/games/hexgui/default.nix36
-rw-r--r--nixpkgs/pkgs/games/hheretic/default.nix57
-rw-r--r--nixpkgs/pkgs/games/hhexen/default.nix57
-rw-r--r--nixpkgs/pkgs/games/hikounomizu/default.nix81
-rw-r--r--nixpkgs/pkgs/games/hmcl/default.nix97
-rw-r--r--nixpkgs/pkgs/games/hyperrogue/default.nix69
-rw-r--r--nixpkgs/pkgs/games/icbm3d/default.nix24
-rw-r--r--nixpkgs/pkgs/games/infra-arcana/default.nix49
-rw-r--r--nixpkgs/pkgs/games/instawow/default.nix48
-rw-r--r--nixpkgs/pkgs/games/instead/default.nix71
-rw-r--r--nixpkgs/pkgs/games/iortcw/default.nix27
-rw-r--r--nixpkgs/pkgs/games/iortcw/sp.nix52
-rw-r--r--nixpkgs/pkgs/games/ironwail/default.nix91
-rw-r--r--nixpkgs/pkgs/games/itch/butler.nix44
-rw-r--r--nixpkgs/pkgs/games/itch/default.nix94
-rw-r--r--nixpkgs/pkgs/games/itchiodl/default.nix35
-rw-r--r--nixpkgs/pkgs/games/ivan/default.nix70
-rw-r--r--nixpkgs/pkgs/games/ja2-stracciatella/default.nix62
-rw-r--r--nixpkgs/pkgs/games/ja2-stracciatella/remove-rust-buildstep.patch73
-rw-r--r--nixpkgs/pkgs/games/jfsw/default.nix57
-rw-r--r--nixpkgs/pkgs/games/julius/default.nix32
-rw-r--r--nixpkgs/pkgs/games/jumpnbump/default.nix55
-rw-r--r--nixpkgs/pkgs/games/jumpy/Cargo.lock5117
-rw-r--r--nixpkgs/pkgs/games/jumpy/default.nix85
-rw-r--r--nixpkgs/pkgs/games/kabeljau/default.nix40
-rw-r--r--nixpkgs/pkgs/games/katago/default.nix115
-rw-r--r--nixpkgs/pkgs/games/katawa-shoujo/default.nix181
-rw-r--r--nixpkgs/pkgs/games/keen4/default.nix50
-rw-r--r--nixpkgs/pkgs/games/keeperrl/default.nix91
-rw-r--r--nixpkgs/pkgs/games/klavaro/default.nix57
-rw-r--r--nixpkgs/pkgs/games/kobodeluxe/default.nix25
-rw-r--r--nixpkgs/pkgs/games/kobodeluxe/glibc29.patch83
-rw-r--r--nixpkgs/pkgs/games/koboredux/default.nix94
-rw-r--r--nixpkgs/pkgs/games/koules/default.nix77
-rw-r--r--nixpkgs/pkgs/games/ldmud/default.nix102
-rw-r--r--nixpkgs/pkgs/games/leela-zero/default.nix37
-rw-r--r--nixpkgs/pkgs/games/left4gore/default.nix48
-rw-r--r--nixpkgs/pkgs/games/legendary-gl/default.nix41
-rw-r--r--nixpkgs/pkgs/games/lgames/barrage/default.nix32
-rw-r--r--nixpkgs/pkgs/games/lgames/lbreakout2/default.nix48
-rw-r--r--nixpkgs/pkgs/games/lgames/lbreakouthd/default.nix43
-rw-r--r--nixpkgs/pkgs/games/lgames/lpairs2/default.nix41
-rw-r--r--nixpkgs/pkgs/games/lgames/ltris/default.nix39
-rw-r--r--nixpkgs/pkgs/games/lgogdownloader/default.nix66
-rw-r--r--nixpkgs/pkgs/games/liberal-crime-squad/default.nix30
-rw-r--r--nixpkgs/pkgs/games/liberation-circuit/default.nix42
-rw-r--r--nixpkgs/pkgs/games/libremines/default.nix41
-rw-r--r--nixpkgs/pkgs/games/lincity/default.nix42
-rw-r--r--nixpkgs/pkgs/games/lincity/ng.nix84
-rw-r--r--nixpkgs/pkgs/games/linthesia/default.nix55
-rw-r--r--nixpkgs/pkgs/games/liquidwar/5.nix31
-rw-r--r--nixpkgs/pkgs/games/liquidwar/default.nix53
-rw-r--r--nixpkgs/pkgs/games/lugaru/default.nix31
-rw-r--r--nixpkgs/pkgs/games/lzwolf/default.nix62
-rw-r--r--nixpkgs/pkgs/games/macopix/default.nix35
-rw-r--r--nixpkgs/pkgs/games/maelstrom/default.nix39
-rw-r--r--nixpkgs/pkgs/games/maelstrom/fix-compilation.patch42
-rw-r--r--nixpkgs/pkgs/games/manaplus/default.nix33
-rw-r--r--nixpkgs/pkgs/games/maptool/default.nix123
-rw-r--r--nixpkgs/pkgs/games/mar1d/default.nix46
-rw-r--r--nixpkgs/pkgs/games/marble-marcher-ce/default.nix68
-rw-r--r--nixpkgs/pkgs/games/mari0/default.nix58
-rw-r--r--nixpkgs/pkgs/games/mars/default.nix34
-rw-r--r--nixpkgs/pkgs/games/mchprs/Cargo.lock3052
-rw-r--r--nixpkgs/pkgs/games/mchprs/default.nix51
-rw-r--r--nixpkgs/pkgs/games/megaglest/default.nix88
-rw-r--r--nixpkgs/pkgs/games/methane/default.nix70
-rw-r--r--nixpkgs/pkgs/games/mindustry/0001-fix-include-path-for-SDL2-on-linux.patch33
-rw-r--r--nixpkgs/pkgs/games/mindustry/default.nix253
-rw-r--r--nixpkgs/pkgs/games/minecraft-servers/default.nix24
-rw-r--r--nixpkgs/pkgs/games/minecraft-servers/derivation.nix37
-rwxr-xr-xnixpkgs/pkgs/games/minecraft-servers/update.py159
-rw-r--r--nixpkgs/pkgs/games/minecraft-servers/versions.json116
-rw-r--r--nixpkgs/pkgs/games/minecraft/default.nix160
-rwxr-xr-xnixpkgs/pkgs/games/minecraft/update.sh7
-rw-r--r--nixpkgs/pkgs/games/minesweep-rs/default.nix27
-rw-r--r--nixpkgs/pkgs/games/minetest/default.nix138
-rw-r--r--nixpkgs/pkgs/games/mnemosyne/default.nix82
-rw-r--r--nixpkgs/pkgs/games/moon-buggy/default.nix26
-rw-r--r--nixpkgs/pkgs/games/mrrescue/default.nix58
-rw-r--r--nixpkgs/pkgs/games/mudlet/default.nix135
-rw-r--r--nixpkgs/pkgs/games/n2048/default.nix26
-rw-r--r--nixpkgs/pkgs/games/naev/default.nix83
-rw-r--r--nixpkgs/pkgs/games/nanosaur/default.nix47
-rw-r--r--nixpkgs/pkgs/games/nanosaur2/default.nix47
-rw-r--r--nixpkgs/pkgs/games/nethack/default.nix154
-rw-r--r--nixpkgs/pkgs/games/netris/default.nix32
-rw-r--r--nixpkgs/pkgs/games/neverball/default.nix51
-rw-r--r--nixpkgs/pkgs/games/newtonwars/default.nix40
-rw-r--r--nixpkgs/pkgs/games/nexuiz/default.nix76
-rw-r--r--nixpkgs/pkgs/games/nile/default.nix59
-rw-r--r--nixpkgs/pkgs/games/ninvaders/default.nix24
-rw-r--r--nixpkgs/pkgs/games/njam/default.nix28
-rw-r--r--nixpkgs/pkgs/games/njam/logfile.patch22
-rw-r--r--nixpkgs/pkgs/games/npush/default.nix49
-rw-r--r--nixpkgs/pkgs/games/npush/run.nix31
-rw-r--r--nixpkgs/pkgs/games/nsnake/default.nix24
-rw-r--r--nixpkgs/pkgs/games/nudoku/default.nix41
-rw-r--r--nixpkgs/pkgs/games/nxengine-evo/default.nix68
-rw-r--r--nixpkgs/pkgs/games/oh-my-git/default.nix134
-rw-r--r--nixpkgs/pkgs/games/oilrush/default.nix77
-rw-r--r--nixpkgs/pkgs/games/onscripter-en/default.nix37
-rw-r--r--nixpkgs/pkgs/games/openarena/Makefile.local12
-rw-r--r--nixpkgs/pkgs/games/openarena/default.nix113
-rw-r--r--nixpkgs/pkgs/games/openclonk/default.nix61
-rw-r--r--nixpkgs/pkgs/games/opendune/default.nix46
-rw-r--r--nixpkgs/pkgs/games/opendungeons/cmakepaths.patch20
-rw-r--r--nixpkgs/pkgs/games/opendungeons/default.nix71
-rw-r--r--nixpkgs/pkgs/games/opendungeons/fix_link_date_time.patch13
-rw-r--r--nixpkgs/pkgs/games/openjk/default.nix89
-rw-r--r--nixpkgs/pkgs/games/openlierox/default.nix42
-rw-r--r--nixpkgs/pkgs/games/openloco/default.nix57
-rw-r--r--nixpkgs/pkgs/games/openmw/default.nix113
-rw-r--r--nixpkgs/pkgs/games/openmw/tes3mp.nix153
-rw-r--r--nixpkgs/pkgs/games/openmw/tes3mp.patch13
-rw-r--r--nixpkgs/pkgs/games/openra/build-engine.nix82
-rw-r--r--nixpkgs/pkgs/games/openra/default.nix12
-rw-r--r--nixpkgs/pkgs/games/openra/engines/devtest/default.nix8
-rw-r--r--nixpkgs/pkgs/games/openra/engines/devtest/deps.nix113
-rw-r--r--nixpkgs/pkgs/games/openra/engines/release/default.nix8
-rw-r--r--nixpkgs/pkgs/games/openra/engines/release/deps.nix113
-rw-r--r--nixpkgs/pkgs/games/openra_2019/common.nix69
-rw-r--r--nixpkgs/pkgs/games/openra_2019/default.nix74
-rw-r--r--nixpkgs/pkgs/games/openra_2019/engine.nix57
-rw-r--r--nixpkgs/pkgs/games/openra_2019/engines.nix41
-rw-r--r--nixpkgs/pkgs/games/openra_2019/mkdirp.sh4
-rw-r--r--nixpkgs/pkgs/games/openra_2019/mod-launch-game.sh25
-rwxr-xr-xnixpkgs/pkgs/games/openra_2019/mod-update.sh160
-rw-r--r--nixpkgs/pkgs/games/openra_2019/mod.nix103
-rw-r--r--nixpkgs/pkgs/games/openra_2019/mods.nix345
-rw-r--r--nixpkgs/pkgs/games/openra_2019/openra-mod.desktop11
-rw-r--r--nixpkgs/pkgs/games/openra_2019/packages.nix60
-rw-r--r--nixpkgs/pkgs/games/openrct2/default.nix154
-rw-r--r--nixpkgs/pkgs/games/openrw/default.nix53
-rw-r--r--nixpkgs/pkgs/games/opensoldat/default.nix91
-rw-r--r--nixpkgs/pkgs/games/openspades/default.nix69
-rw-r--r--nixpkgs/pkgs/games/opensupaplex/default.nix89
-rw-r--r--nixpkgs/pkgs/games/openttd/default.nix99
-rw-r--r--nixpkgs/pkgs/games/openttd/grfcodec.nix28
-rw-r--r--nixpkgs/pkgs/games/openttd/jgrpp.nix21
-rw-r--r--nixpkgs/pkgs/games/openttd/nml.nix29
-rw-r--r--nixpkgs/pkgs/games/opentyrian/default.nix44
-rw-r--r--nixpkgs/pkgs/games/openxcom/default.nix54
-rw-r--r--nixpkgs/pkgs/games/openxray/default.nix68
-rw-r--r--nixpkgs/pkgs/games/orthorobot/default.nix76
-rw-r--r--nixpkgs/pkgs/games/osu-lazer/bin.nix73
-rw-r--r--nixpkgs/pkgs/games/osu-lazer/default.nix91
-rw-r--r--nixpkgs/pkgs/games/osu-lazer/deps.nix333
-rw-r--r--nixpkgs/pkgs/games/osu-lazer/osu.runtimeconfig.json9
-rwxr-xr-xnixpkgs/pkgs/games/osu-lazer/update-bin.sh40
-rwxr-xr-xnixpkgs/pkgs/games/osu-lazer/update.sh19
-rw-r--r--nixpkgs/pkgs/games/otto-matic/default.nix44
-rw-r--r--nixpkgs/pkgs/games/pacvim/default.nix32
-rw-r--r--nixpkgs/pkgs/games/papermc/default.nix50
-rw-r--r--nixpkgs/pkgs/games/path-of-building/default.nix72
-rw-r--r--nixpkgs/pkgs/games/pegasus-frontend/default.nix51
-rw-r--r--nixpkgs/pkgs/games/pentobi/default.nix38
-rw-r--r--nixpkgs/pkgs/games/performous/default.nix86
-rw-r--r--nixpkgs/pkgs/games/performous/performous-cmake.patch17
-rw-r--r--nixpkgs/pkgs/games/performous/performous-fftw.patch15
-rw-r--r--nixpkgs/pkgs/games/pinball/default.nix41
-rw-r--r--nixpkgs/pkgs/games/pingus/default.nix22
-rw-r--r--nixpkgs/pkgs/games/pioneer/default.nix69
-rw-r--r--nixpkgs/pkgs/games/pioneers/default.nix30
-rw-r--r--nixpkgs/pkgs/games/planetaryannihilation/default.nix42
-rw-r--r--nixpkgs/pkgs/games/pokerth/default.nix74
-rw-r--r--nixpkgs/pkgs/games/pokete/default.nix56
-rw-r--r--nixpkgs/pkgs/games/pong3d/default.nix24
-rw-r--r--nixpkgs/pkgs/games/portmod/default.nix127
-rw-r--r--nixpkgs/pkgs/games/powermanga/default.nix59
-rw-r--r--nixpkgs/pkgs/games/principia/default.nix98
-rw-r--r--nixpkgs/pkgs/games/prismlauncher/default.nix86
-rw-r--r--nixpkgs/pkgs/games/prismlauncher/wrapper.nix127
-rw-r--r--nixpkgs/pkgs/games/pro-office-calculator/default.nix24
-rw-r--r--nixpkgs/pkgs/games/purpur/default.nix43
-rw-r--r--nixpkgs/pkgs/games/pysolfc/default.nix67
-rw-r--r--nixpkgs/pkgs/games/pysolfc/pysolfc-datadir.patch19
-rw-r--r--nixpkgs/pkgs/games/qgo/default.nix46
-rw-r--r--nixpkgs/pkgs/games/qgo/fix-paths.patch50
-rw-r--r--nixpkgs/pkgs/games/qqwing/default.nix36
-rw-r--r--nixpkgs/pkgs/games/qtads/default.nix27
-rw-r--r--nixpkgs/pkgs/games/quake2/yquake2/default.nix90
-rw-r--r--nixpkgs/pkgs/games/quake2/yquake2/games.nix55
-rw-r--r--nixpkgs/pkgs/games/quake2/yquake2/wrapper.nix31
-rw-r--r--nixpkgs/pkgs/games/quake3/content/demo.nix29
-rw-r--r--nixpkgs/pkgs/games/quake3/content/hires.nix26
-rw-r--r--nixpkgs/pkgs/games/quake3/content/pointrelease.nix29
-rw-r--r--nixpkgs/pkgs/games/quake3/ioquake/Makefile.local6
-rw-r--r--nixpkgs/pkgs/games/quake3/ioquake/default.nix90
-rw-r--r--nixpkgs/pkgs/games/quake3/quake3e/default.nix54
-rw-r--r--nixpkgs/pkgs/games/quake3/wrapper/default.nix34
-rw-r--r--nixpkgs/pkgs/games/quakespasm/default.nix105
-rw-r--r--nixpkgs/pkgs/games/quakespasm/quakespasm-darwin-makefile-improvements.patch111
-rw-r--r--nixpkgs/pkgs/games/quakespasm/vulkan.nix61
-rw-r--r--nixpkgs/pkgs/games/quantumminigolf/default.nix40
-rw-r--r--nixpkgs/pkgs/games/qzdl/default.nix65
-rw-r--r--nixpkgs/pkgs/games/qzdl/non-bundled-inih.patch36
-rw-r--r--nixpkgs/pkgs/games/r2mod_cli/default.nix38
-rw-r--r--nixpkgs/pkgs/games/r2modman/default.nix119
-rw-r--r--nixpkgs/pkgs/games/r2modman/steam-launch-fix.patch21
-rw-r--r--nixpkgs/pkgs/games/racer/default.nix32
-rw-r--r--nixpkgs/pkgs/games/racer/mkdir.patch13
-rw-r--r--nixpkgs/pkgs/games/randtype/default.nix32
-rw-r--r--nixpkgs/pkgs/games/rare/default.nix65
-rw-r--r--nixpkgs/pkgs/games/raylib-games/default.nix61
-rw-r--r--nixpkgs/pkgs/games/redeclipse/default.nix48
-rw-r--r--nixpkgs/pkgs/games/rftg/default.nix23
-rw-r--r--nixpkgs/pkgs/games/rigsofrods-bin/default.nix69
-rw-r--r--nixpkgs/pkgs/games/riko4/default.nix65
-rw-r--r--nixpkgs/pkgs/games/rili/default.nix42
-rw-r--r--nixpkgs/pkgs/games/rili/moderinze_cpp.patch391
-rw-r--r--nixpkgs/pkgs/games/rocksndiamonds/default.nix58
-rw-r--r--nixpkgs/pkgs/games/rogue/default.nix25
-rw-r--r--nixpkgs/pkgs/games/rotp/0001-store-config-and-saves-in-XDG_CONFIG_HOME.patch106
-rw-r--r--nixpkgs/pkgs/games/rotp/default.nix87
-rw-r--r--nixpkgs/pkgs/games/rott/default.nix75
-rw-r--r--nixpkgs/pkgs/games/rpg-cli/default.nix25
-rw-r--r--nixpkgs/pkgs/games/rrootage/default.nix81
-rw-r--r--nixpkgs/pkgs/games/runelite/default.nix67
-rw-r--r--nixpkgs/pkgs/games/runescape-launcher/default.nix155
-rw-r--r--nixpkgs/pkgs/games/sauerbraten/default.nix79
-rw-r--r--nixpkgs/pkgs/games/scid-vs-pc/default.nix50
-rw-r--r--nixpkgs/pkgs/games/scid/default.nix55
-rw-r--r--nixpkgs/pkgs/games/scorched3d/default.nix44
-rw-r--r--nixpkgs/pkgs/games/scorched3d/file-existence.patch37
-rw-r--r--nixpkgs/pkgs/games/scrolls/default.nix45
-rw-r--r--nixpkgs/pkgs/games/scummvm/default.nix52
-rw-r--r--nixpkgs/pkgs/games/scummvm/games.nix155
-rw-r--r--nixpkgs/pkgs/games/sdlpop/default.nix72
-rw-r--r--nixpkgs/pkgs/games/sdlpop/prince.sh16
-rw-r--r--nixpkgs/pkgs/games/sfrotz/default.nix69
-rw-r--r--nixpkgs/pkgs/games/sgt-puzzles/default.nix82
-rw-r--r--nixpkgs/pkgs/games/shattered-pixel-dungeon/default.nix30
-rw-r--r--nixpkgs/pkgs/games/shattered-pixel-dungeon/disable-beryx.patch40
-rw-r--r--nixpkgs/pkgs/games/shattered-pixel-dungeon/disable-git-version.patch29
-rw-r--r--nixpkgs/pkgs/games/shattered-pixel-dungeon/experienced-pixel-dungeon.nix30
-rw-r--r--nixpkgs/pkgs/games/shattered-pixel-dungeon/generic.nix138
-rw-r--r--nixpkgs/pkgs/games/shattered-pixel-dungeon/rat-king-adventure.nix25
-rw-r--r--nixpkgs/pkgs/games/shattered-pixel-dungeon/rkpd2.nix25
-rw-r--r--nixpkgs/pkgs/games/shattered-pixel-dungeon/shorter-pixel-dungeon.nix30
-rw-r--r--nixpkgs/pkgs/games/shattered-pixel-dungeon/summoning-pixel-dungeon.nix36
-rw-r--r--nixpkgs/pkgs/games/shipwright/default.nix216
-rw-r--r--nixpkgs/pkgs/games/shticker-book-unwritten/default.nix26
-rw-r--r--nixpkgs/pkgs/games/shticker-book-unwritten/unwrapped.nix18
-rw-r--r--nixpkgs/pkgs/games/sienna/default.nix50
-rw-r--r--nixpkgs/pkgs/games/sil-q/default.nix73
-rw-r--r--nixpkgs/pkgs/games/sil/default.nix84
-rw-r--r--nixpkgs/pkgs/games/simutrans/default.nix171
-rw-r--r--nixpkgs/pkgs/games/sm64ex/coop.nix41
-rw-r--r--nixpkgs/pkgs/games/sm64ex/default.nix9
-rw-r--r--nixpkgs/pkgs/games/sm64ex/generic.nix84
-rw-r--r--nixpkgs/pkgs/games/sm64ex/sm64ex.nix21
-rw-r--r--nixpkgs/pkgs/games/snake4/default.nix30
-rw-r--r--nixpkgs/pkgs/games/snipes/default.nix47
-rw-r--r--nixpkgs/pkgs/games/snis/default.nix74
-rw-r--r--nixpkgs/pkgs/games/soi/default.nix29
-rw-r--r--nixpkgs/pkgs/games/solarus/default.nix42
-rw-r--r--nixpkgs/pkgs/games/solicurses/default.nix41
-rw-r--r--nixpkgs/pkgs/games/space-cadet-pinball/default.nix70
-rw-r--r--nixpkgs/pkgs/games/space-orbit/default.nix46
-rw-r--r--nixpkgs/pkgs/games/space-station-14-launcher/default.nix40
-rw-r--r--nixpkgs/pkgs/games/space-station-14-launcher/deps.nix143
-rw-r--r--nixpkgs/pkgs/games/space-station-14-launcher/space-station-14-launcher.nix143
-rwxr-xr-xnixpkgs/pkgs/games/space-station-14-launcher/update.sh16
-rw-r--r--nixpkgs/pkgs/games/speed-dreams/default.nix76
-rw-r--r--nixpkgs/pkgs/games/spring/default.nix92
-rw-r--r--nixpkgs/pkgs/games/spring/fix-certs.patch11
-rw-r--r--nixpkgs/pkgs/games/spring/revert_58b423e.patch16
-rw-r--r--nixpkgs/pkgs/games/spring/springlobby.nix71
-rw-r--r--nixpkgs/pkgs/games/srb2/cmake.patch61
-rw-r--r--nixpkgs/pkgs/games/srb2/default.nix118
-rw-r--r--nixpkgs/pkgs/games/srb2/thirdparty.patch12
-rw-r--r--nixpkgs/pkgs/games/srb2kart/default.nix87
-rw-r--r--nixpkgs/pkgs/games/srb2kart/wadlocation.patch61
-rw-r--r--nixpkgs/pkgs/games/stardust/default.nix33
-rw-r--r--nixpkgs/pkgs/games/starsector/default.nix89
-rw-r--r--nixpkgs/pkgs/games/steam-tui/default.nix46
-rw-r--r--nixpkgs/pkgs/games/steam/build-wrapped.sh47
-rw-r--r--nixpkgs/pkgs/games/steam/default.nix38
-rw-r--r--nixpkgs/pkgs/games/steam/fhsenv.nix341
-rw-r--r--nixpkgs/pkgs/games/steam/runtime-wrapped.nix45
-rw-r--r--nixpkgs/pkgs/games/steam/runtime.nix37
-rw-r--r--nixpkgs/pkgs/games/steam/steam.nix54
-rw-r--r--nixpkgs/pkgs/games/steam/steamcmd.nix46
-rw-r--r--nixpkgs/pkgs/games/steam/steamcmd.sh27
-rw-r--r--nixpkgs/pkgs/games/stepmania/default.nix86
-rw-r--r--nixpkgs/pkgs/games/stockfish/default.nix62
-rw-r--r--nixpkgs/pkgs/games/stone-kingdoms/default.nix63
-rw-r--r--nixpkgs/pkgs/games/stuntrally/default.nix79
-rw-r--r--nixpkgs/pkgs/games/super-tux-kart/default.nix152
-rw-r--r--nixpkgs/pkgs/games/supertux/default.nix71
-rw-r--r--nixpkgs/pkgs/games/system-syzygy/Cargo.lock325
-rw-r--r--nixpkgs/pkgs/games/system-syzygy/default.nix52
-rw-r--r--nixpkgs/pkgs/games/t4kcommon/default.nix39
-rw-r--r--nixpkgs/pkgs/games/taisei/0001-lto-fix.patch13
-rw-r--r--nixpkgs/pkgs/games/taisei/default.nix46
-rw-r--r--nixpkgs/pkgs/games/tcl2048/default.nix28
-rw-r--r--nixpkgs/pkgs/games/tecnoballz/default.nix69
-rw-r--r--nixpkgs/pkgs/games/teetertorture/default.nix34
-rw-r--r--nixpkgs/pkgs/games/teeworlds/default.nix122
-rw-r--r--nixpkgs/pkgs/games/teeworlds/rename-VERSION-to-VERSION.txt.patch33
-rw-r--r--nixpkgs/pkgs/games/tennix/default.nix28
-rw-r--r--nixpkgs/pkgs/games/terraria-server/default.nix42
-rw-r--r--nixpkgs/pkgs/games/tes3cmd/default.nix28
-rw-r--r--nixpkgs/pkgs/games/tetrio-desktop/default.nix97
-rw-r--r--nixpkgs/pkgs/games/tetrio-desktop/tetrio-plus.nix27
-rw-r--r--nixpkgs/pkgs/games/the-butterfly-effect/default.nix39
-rw-r--r--nixpkgs/pkgs/games/the-powder-toy/default.nix54
-rw-r--r--nixpkgs/pkgs/games/theforceengine/default.nix52
-rw-r--r--nixpkgs/pkgs/games/tibia/default.nix57
-rw-r--r--nixpkgs/pkgs/games/tintin/default.nix32
-rw-r--r--nixpkgs/pkgs/games/tinyfugue/default.nix43
-rw-r--r--nixpkgs/pkgs/games/titanion/default.nix91
-rw-r--r--nixpkgs/pkgs/games/tome2/default.nix49
-rw-r--r--nixpkgs/pkgs/games/tome4/default.nix76
-rw-r--r--nixpkgs/pkgs/games/toppler/default.nix61
-rw-r--r--nixpkgs/pkgs/games/torcs/default.nix51
-rw-r--r--nixpkgs/pkgs/games/torus-trooper/default.nix104
-rw-r--r--nixpkgs/pkgs/games/tr-patcher/default.nix37
-rw-r--r--nixpkgs/pkgs/games/trackballs/default.nix24
-rw-r--r--nixpkgs/pkgs/games/trigger/default.nix54
-rw-r--r--nixpkgs/pkgs/games/tumiki-fighters/default.nix97
-rw-r--r--nixpkgs/pkgs/games/tuxpaint/default.nix58
-rw-r--r--nixpkgs/pkgs/games/tuxpaint/tuxpaint-completion.diff16
-rw-r--r--nixpkgs/pkgs/games/tuxtype/default.nix43
-rw-r--r--nixpkgs/pkgs/games/typespeed/default.nix30
-rw-r--r--nixpkgs/pkgs/games/typespeed/typespeed-config-in-home.patch148
-rw-r--r--nixpkgs/pkgs/games/uchess/default.nix32
-rw-r--r--nixpkgs/pkgs/games/ue4demos/default.nix195
-rw-r--r--nixpkgs/pkgs/games/ufoai/default.nix50
-rw-r--r--nixpkgs/pkgs/games/uhexen2/default.nix67
-rw-r--r--nixpkgs/pkgs/games/ultimatestunts/default.nix26
-rw-r--r--nixpkgs/pkgs/games/ultrastardx/default.nix86
-rw-r--r--nixpkgs/pkgs/games/umoria/default.nix78
-rw-r--r--nixpkgs/pkgs/games/unciv/default.nix60
-rw-r--r--nixpkgs/pkgs/games/unnethack/default.nix72
-rw-r--r--nixpkgs/pkgs/games/unvanquished/default.nix237
-rw-r--r--nixpkgs/pkgs/games/uqm/3dovideo.nix61
-rw-r--r--nixpkgs/pkgs/games/uqm/default.nix109
-rw-r--r--nixpkgs/pkgs/games/urbanterror/Makefile.local5
-rw-r--r--nixpkgs/pkgs/games/urbanterror/default.nix115
-rw-r--r--nixpkgs/pkgs/games/ut2004/default.nix9
-rw-r--r--nixpkgs/pkgs/games/ut2004/demo.nix40
-rw-r--r--nixpkgs/pkgs/games/ut2004/wrapper.nix46
-rw-r--r--nixpkgs/pkgs/games/vassal/default.nix56
-rw-r--r--nixpkgs/pkgs/games/vcmi/default.nix99
-rw-r--r--nixpkgs/pkgs/games/vdrift/0001-Ignore-missing-data-for-installation.patch27
-rw-r--r--nixpkgs/pkgs/games/vdrift/default.nix70
-rw-r--r--nixpkgs/pkgs/games/vectoroids/default.nix35
-rw-r--r--nixpkgs/pkgs/games/vessel/default.nix84
-rw-r--r--nixpkgs/pkgs/games/vessel/isatty.c6
-rw-r--r--nixpkgs/pkgs/games/vimgolf/Gemfile2
-rw-r--r--nixpkgs/pkgs/games/vimgolf/Gemfile.lock19
-rw-r--r--nixpkgs/pkgs/games/vimgolf/default.nix17
-rw-r--r--nixpkgs/pkgs/games/vimgolf/gemset.nix43
-rw-r--r--nixpkgs/pkgs/games/vintagestory/default.nix91
-rw-r--r--nixpkgs/pkgs/games/vitetris/default.nix33
-rw-r--r--nixpkgs/pkgs/games/vms-empire/default.nix61
-rw-r--r--nixpkgs/pkgs/games/voxelands/default.nix74
-rw-r--r--nixpkgs/pkgs/games/vvvvvv/default.nix102
-rw-r--r--nixpkgs/pkgs/games/vvvvvv/utf8cpp.patch13
-rw-r--r--nixpkgs/pkgs/games/wargus/default.nix63
-rw-r--r--nixpkgs/pkgs/games/wargus/stratagus.nix35
-rw-r--r--nixpkgs/pkgs/games/warmux/default.nix37
-rw-r--r--nixpkgs/pkgs/games/warsow/default.nix38
-rw-r--r--nixpkgs/pkgs/games/warsow/engine.nix59
-rw-r--r--nixpkgs/pkgs/games/warsow/libpath.patch28
-rw-r--r--nixpkgs/pkgs/games/warzone2100/default.nix145
-rw-r--r--nixpkgs/pkgs/games/wesnoth/default.nix51
-rw-r--r--nixpkgs/pkgs/games/widelands/default.nix102
-rw-r--r--nixpkgs/pkgs/games/wipeout-rewrite/default.nix71
-rw-r--r--nixpkgs/pkgs/games/wireworld/default.nix64
-rw-r--r--nixpkgs/pkgs/games/wolfstoneextract/default.nix29
-rw-r--r--nixpkgs/pkgs/games/worldofgoo/default.nix75
-rw-r--r--nixpkgs/pkgs/games/wyvern/cargo-lock.patch4139
-rw-r--r--nixpkgs/pkgs/games/wyvern/default.nix32
-rw-r--r--nixpkgs/pkgs/games/xbill/default.nix49
-rw-r--r--nixpkgs/pkgs/games/xboard/default.nix68
-rw-r--r--nixpkgs/pkgs/games/xbomb/default.nix23
-rw-r--r--nixpkgs/pkgs/games/xconq/default.nix61
-rw-r--r--nixpkgs/pkgs/games/xcowsay/default.nix39
-rw-r--r--nixpkgs/pkgs/games/xgalaga++/default.nix37
-rw-r--r--nixpkgs/pkgs/games/xivlauncher/default.nix80
-rw-r--r--nixpkgs/pkgs/games/xivlauncher/deps.nix191
-rw-r--r--nixpkgs/pkgs/games/xjump/darwin.patch21
-rw-r--r--nixpkgs/pkgs/games/xjump/default.nix23
-rw-r--r--nixpkgs/pkgs/games/xmage/default.nix46
-rw-r--r--nixpkgs/pkgs/games/xmoto/default.nix65
-rw-r--r--nixpkgs/pkgs/games/xonotic/default.nix193
-rw-r--r--nixpkgs/pkgs/games/xpilot/bloodspilot-client.nix25
-rw-r--r--nixpkgs/pkgs/games/xpilot/bloodspilot-server.nix27
-rw-r--r--nixpkgs/pkgs/games/xpilot/default.nix20
-rw-r--r--nixpkgs/pkgs/games/xpilot/server-gcc5.patch65
-rw-r--r--nixpkgs/pkgs/games/xskat/default.nix30
-rw-r--r--nixpkgs/pkgs/games/xsnow/default.nix26
-rw-r--r--nixpkgs/pkgs/games/xsok/default.nix46
-rw-r--r--nixpkgs/pkgs/games/xsokoban/default.nix54
-rw-r--r--nixpkgs/pkgs/games/xtris/default.nix29
-rw-r--r--nixpkgs/pkgs/games/zaz/default.nix60
-rw-r--r--nixpkgs/pkgs/games/zod/0002-add-scaling-factor-to-source.patch161
-rw-r--r--nixpkgs/pkgs/games/zod/default.nix115
-rw-r--r--nixpkgs/pkgs/games/zoom/default.nix50
692 files changed, 67672 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/games/0ad/data.nix b/nixpkgs/pkgs/games/0ad/data.nix
new file mode 100644
index 000000000000..4437a5d26995
--- /dev/null
+++ b/nixpkgs/pkgs/games/0ad/data.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, fetchurl, zeroad-unwrapped }:
+
+stdenv.mkDerivation rec {
+  pname = "0ad-data";
+  inherit (zeroad-unwrapped) version;
+
+  src = fetchurl {
+    url = "http://releases.wildfiregames.com/0ad-${version}-alpha-unix-data.tar.xz";
+    sha256 = "sgDkhVj4goB5EOPGhlZ7ajliSNnUGAROz94JCwV3LX0=";
+  };
+
+  installPhase = ''
+    rm binaries/data/tools/fontbuilder/fonts/*.txt
+    mkdir -p $out/share/0ad
+    cp -r binaries/data $out/share/0ad/
+  '';
+
+  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/nixpkgs/pkgs/games/0ad/default.nix b/nixpkgs/pkgs/games/0ad/default.nix
new file mode 100644
index 000000000000..a97d9f4cda3a
--- /dev/null
+++ b/nixpkgs/pkgs/games/0ad/default.nix
@@ -0,0 +1,14 @@
+{ fmt, wxGTK, stdenv, newScope }:
+let
+  callPackage = newScope self;
+
+  self = {
+    zeroad-unwrapped = callPackage ./game.nix { inherit fmt wxGTK stdenv; };
+
+    zeroad-data = callPackage ./data.nix { inherit stdenv; };
+
+    zeroad = callPackage ./wrapper.nix { };
+  };
+
+in
+self
diff --git a/nixpkgs/pkgs/games/0ad/game.nix b/nixpkgs/pkgs/games/0ad/game.nix
new file mode 100644
index 000000000000..1738c26659d2
--- /dev/null
+++ b/nixpkgs/pkgs/games/0ad/game.nix
@@ -0,0 +1,112 @@
+{ stdenv, lib, fetchpatch, perl, fetchurl, python3, 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, freetype
+, withEditor ? true, wxGTK
+}:
+
+# 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.26";
+
+  src = fetchurl {
+    url = "http://releases.wildfiregames.com/0ad-${version}-alpha-unix-build.tar.xz";
+    sha256 = "Lhxt9+MxLnfF+CeIZkz/w6eNO/YGBsAAOSdeHRPA7ks=";
+  };
+
+  nativeBuildInputs = [ python3 perl pkg-config ];
+
+  buildInputs = [
+    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 fmt freetype
+  ] ++ lib.optional withEditor wxGTK;
+
+  env.NIX_CFLAGS_COMPILE = toString [
+    "-I${xorgproto}/include"
+    "-I${libX11.dev}/include"
+    "-I${libXcursor.dev}/include"
+    "-I${SDL2}/include/SDL2"
+    "-I${fmt.dev}/include"
+    "-I${nvidia-texture-tools.dev}/include"
+  ];
+
+  NIX_CFLAGS_LINK = toString [
+    "-L${nvidia-texture-tools.lib}/lib/static"
+  ];
+
+  patches = [ ./rootdir_env.patch ];
+
+  configurePhase = ''
+    # Delete shipped libraries which we don't need.
+    rm -rf libraries/source/{enet,miniupnpc,nvtt,spidermonkey}
+
+    # Update Makefiles
+    pushd build/workspaces
+    ./update-workspaces.sh \
+      --with-system-nvtt \
+      --with-system-mozjs \
+      ${lib.optionalString withEditor "--enable-atlas"} \
+      --bindir="$out"/bin \
+      --libdir="$out"/lib/0ad \
+      --without-tests \
+      -j $NIX_BUILD_CORES
+    popd
+
+    # Move to the build directory.
+    pushd build/workspaces/gcc
+  '';
+
+  enableParallelBuilding = true;
+
+  installPhase = ''
+    popd
+
+    # Copy executables.
+    install -Dm755 binaries/system/pyrogenesis "$out"/bin/0ad
+    ${lib.optionalString withEditor ''
+      install -Dm755 binaries/system/ActorEditor "$out"/bin/ActorEditor
+    ''}
+
+    # Copy l10n data.
+    install -Dm755 -t $out/share/0ad/data/l10n binaries/data/l10n/*
+
+    # Copy libraries.
+    install -Dm644 -t $out/lib/0ad        binaries/system/*.so
+
+    # Copy icon.
+    install -D build/resources/0ad.png     $out/share/icons/hicolor/128x128/apps/0ad.png
+    install -D build/resources/0ad.desktop $out/share/applications/0ad.desktop
+  '';
+
+  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/nixpkgs/pkgs/games/0ad/rootdir_env.patch b/nixpkgs/pkgs/games/0ad/rootdir_env.patch
new file mode 100644
index 000000000000..95463c7e2df4
--- /dev/null
+++ b/nixpkgs/pkgs/games/0ad/rootdir_env.patch
@@ -0,0 +1,39 @@
+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)
+ {
+-#if OS_ANDROID
+-	return OsPath("/sdcard/0ad"); // TODO: this is kind of bogus
+-#else
+-
+-	// get full path to executable
+-	OsPath pathname = sys_ExecutablePathname();	// safe, but requires OS-specific implementation
+-	if(pathname.empty())	// failed, use argv[0] instead
+-	{
+-		errno = 0;
+-		pathname = wrealpath(argv0);
+-		if(pathname.empty())
+-			WARN_IF_ERR(StatusFromErrno());
+-	}
+-
+-	// make sure it's valid
+-	if(!FileExists(pathname))
+-	{
+-		LOGERROR("Cannot find executable (expected at '%s')", pathname.string8());
+-		WARN_IF_ERR(StatusFromErrno());
+-	}
+-
+-	for(size_t i = 0; i < 2; i++)	// remove "system/name.exe"
+-		pathname = pathname.Parent();
+-	return pathname;
+-
+-#endif
++        UNUSED2(argv0);
++        return OsPath(getenv("ZEROAD_ROOTDIR"));
+ }
+ 
+ /*static*/ OsPath Paths::RootData(const OsPath& argv0)
diff --git a/nixpkgs/pkgs/games/0ad/spidermonkey-cargo-toml.patch b/nixpkgs/pkgs/games/0ad/spidermonkey-cargo-toml.patch
new file mode 100644
index 000000000000..4cb8c3735dbd
--- /dev/null
+++ b/nixpkgs/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/nixpkgs/pkgs/games/0ad/wrapper.nix b/nixpkgs/pkgs/games/0ad/wrapper.nix
new file mode 100644
index 000000000000..3511dc0bed49
--- /dev/null
+++ b/nixpkgs/pkgs/games/0ad/wrapper.nix
@@ -0,0 +1,24 @@
+{ buildEnv, makeWrapper, zeroad-unwrapped, zeroad-data }:
+
+assert zeroad-unwrapped.version == zeroad-data.version;
+
+buildEnv {
+  name = "zeroad-${zeroad-unwrapped.version}";
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  paths = [ zeroad-unwrapped zeroad-data ];
+
+  pathsToLink = [ "/" "/bin" ];
+
+  postBuild = ''
+    for i in $out/bin/*; do
+      wrapProgram "$i" \
+        --set ZEROAD_ROOTDIR "$out/share/0ad"
+    done
+  '';
+
+  meta = zeroad-unwrapped.meta // {
+    hydraPlatforms = [];
+  };
+}
diff --git a/nixpkgs/pkgs/games/0verkill/default.nix b/nixpkgs/pkgs/games/0verkill/default.nix
new file mode 100644
index 000000000000..22ef6c6b0cc4
--- /dev/null
+++ b/nixpkgs/pkgs/games/0verkill/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, gccStdenv
+, fetchFromGitHub
+, autoreconfHook269
+, xorgproto
+, libX11
+, libXpm
+}:
+
+gccStdenv.mkDerivation rec {
+  pname = "0verkill";
+  version = "unstable-2011-01-13";
+
+  src = fetchFromGitHub {
+    owner = "hackndev";
+    repo = pname;
+    rev = "522f11a3e40670bbf85e0fada285141448167968";
+    sha256 = "WO7PN192HhcDl6iHIbVbH7MVMi1Tl2KyQbDa9DWRO6M=";
+  };
+
+  nativeBuildInputs = [ autoreconfHook269 ];
+  buildInputs = [ libX11 xorgproto libXpm ];
+
+  configureFlags = [ "--with-x" ];
+
+  preAutoreconf = ''
+    autoupdate
+  '';
+
+  # The code needs an update for gcc-10:
+  #   https://github.com/hackndev/0verkill/issues/7
+  env.NIX_CFLAGS_COMPILE = "-fcommon";
+  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/nixpkgs/pkgs/games/1oom/default.nix b/nixpkgs/pkgs/games/1oom/default.nix
new file mode 100644
index 000000000000..54bfb4d0b321
--- /dev/null
+++ b/nixpkgs/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/nixpkgs/pkgs/games/2048-cli/default.nix b/nixpkgs/pkgs/games/2048-cli/default.nix
new file mode 100644
index 000000000000..e1eb958164ce
--- /dev/null
+++ b/nixpkgs/pkgs/games/2048-cli/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, gettext
+, installShellFiles
+, ncurses
+, ui ? "terminal"
+}:
+
+assert lib.elem ui [ "terminal" "curses" ];
+stdenv.mkDerivation (finalAttrs: {
+  pname = "2048-cli";
+  version = "unstable-2019-12-10";
+
+  src = fetchFromGitHub {
+    owner = "tiehuis";
+    repo = "2048-cli";
+    rev = "67439255df7d4f70209ca628d65128cd41d33e8d";
+    hash = "sha256-U7g2wCZgR7Lp/69ktQIZZ1cScll2baCequemTl3Mc3I=";
+  };
+
+  postPatch = ''
+    substituteInPlace Makefile \
+      --replace "-lcurses" "-lncurses"
+  '';
+
+  nativeBuildInputs = [
+    installShellFiles
+  ];
+
+  buildInputs = [
+    gettext
+  ]
+  ++ (lib.optional (ui == "curses") ncurses);
+
+  dontConfigure = true;
+
+  env.NIX_CFLAGS_COMPILE = "-I${lib.getDev gettext}/share/gettext/";
+
+  makeFlags = [
+    "CC=${stdenv.cc.targetPrefix}cc"
+    ui
+  ];
+
+  installPhase = ''
+    runHook preInstall
+
+    install -Dm755 -t $out/bin 2048
+    installManPage man/2048.6
+
+    runHook postInstall
+  '';
+
+  meta = {
+    homepage = "https://github.com/tiehuis/2048-cli";
+    description = "The game 2048 for your Linux terminal";
+    license = lib.licenses.mit;
+    maintainers = [ lib.maintainers.AndersonTorres ];
+    platforms = lib.platforms.unix;
+    mainProgram = "2048";
+  };
+})
diff --git a/nixpkgs/pkgs/games/2048-in-terminal/default.nix b/nixpkgs/pkgs/games/2048-in-terminal/default.nix
new file mode 100644
index 000000000000..2ffefb601125
--- /dev/null
+++ b/nixpkgs/pkgs/games/2048-in-terminal/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, fetchFromGitHub, ncurses, pkg-config }:
+
+stdenv.mkDerivation rec {
+  pname = "2048-in-terminal";
+  version = "unstable-2022-06-13";
+
+  src = fetchFromGitHub {
+    owner = "alewmoose";
+    repo = "2048-in-terminal";
+    rev = "bf22f868a2e0e572f22153468585ec0226a4b8b2";
+    sha256 = "sha256-Y5ZQYWOiG3QZZsr+d7olUDGAQ1LhRG9X2hBNQDx+Ztw=";
+  };
+
+  buildInputs = [ ncurses ];
+  nativeBuildInputs = [ pkg-config ];
+
+  enableParallelBuilding = true;
+
+  preInstall = ''
+    mkdir -p $out/bin
+  '';
+  installFlags = [ "PREFIX=$(out)" ];
+
+  meta = with lib; {
+    inherit (src.meta) homepage;
+    description = "Animated console version of the 2048 game";
+    license = licenses.mit;
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/games/20kly/default.nix b/nixpkgs/pkgs/games/20kly/default.nix
new file mode 100644
index 000000000000..0cc61367e28e
--- /dev/null
+++ b/nixpkgs/pkgs/games/20kly/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, fetchFromGitHub
+, python3Packages
+}:
+
+python3Packages.buildPythonApplication rec {
+  pname = "20kly";
+  version = "1.5.0";
+
+  format = "other";
+
+  src = fetchFromGitHub {
+    owner = "20kly";
+    repo = "20kly";
+    rev = "v${version}";
+    sha256 = "1zxsxg49a02k7zidx3kgk2maa0vv0n1f9wrl5vch07sq3ghvpphx";
+  };
+
+  patchPhase = ''
+    substituteInPlace lightyears \
+      --replace \
+        "LIGHTYEARS_DIR = \".\"" \
+        "LIGHTYEARS_DIR = \"$out/share\""
+  '';
+
+  propagatedBuildInputs = with python3Packages; [
+    pygame
+  ];
+
+  buildPhase = ''
+    python -O -m compileall .
+  '';
+
+  installPhase = ''
+    mkdir -p "$out/share"
+    cp -r data lib20k lightyears "$out/share"
+    install -Dm755 lightyears "$out/bin/lightyears"
+  '';
+
+  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.gpl2Only;
+    maintainers = with maintainers; [ fgaz ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/7kaa/default.nix b/nixpkgs/pkgs/games/7kaa/default.nix
new file mode 100644
index 000000000000..f9cd1a457b19
--- /dev/null
+++ b/nixpkgs/pkgs/games/7kaa/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, stdenv
+, gccStdenv
+, autoreconfHook
+, autoconf-archive
+, pkg-config
+, fetchurl
+, fetchFromGitHub
+, openal
+, libtool
+, enet
+, SDL2
+, curl
+, gettext
+, libiconv
+}:
+
+let
+  pname = "7kaa";
+  version = "2.15.5";
+
+  musicVersion = lib.versions.majorMinor version;
+  music = stdenv.mkDerivation {
+    pname = "7kaa-music";
+    version = musicVersion;
+
+    src = fetchurl {
+      url = "https://www.7kfans.com/downloads/7kaa-music-${musicVersion}.tar.bz2";
+      hash = "sha256-sNdntuJXGaFPXzSpN0SoAi17wkr2YnW+5U38eIaVwcM=";
+    };
+
+    installPhase = ''
+      mkdir -p $out
+      cp -r * $out/
+    '';
+
+    meta.license = lib.licenses.unfree;
+  };
+in
+gccStdenv.mkDerivation rec {
+  inherit pname version;
+
+  src = fetchFromGitHub {
+    owner = "the3dfxdude";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-Z6TsR6L6vwpzoKTj6xJ6HKy4DxcUBWmYBFi/a9pQBD8=";
+  };
+
+  nativeBuildInputs = [ autoreconfHook autoconf-archive pkg-config ];
+
+  buildInputs = [ openal enet SDL2 curl gettext libiconv ];
+
+  preAutoreconf = ''
+    autoupdate
+  '';
+
+  hardeningDisable = lib.optionals (stdenv.isAarch64 && stdenv.isDarwin) [ "stackprotector" ];
+
+  postInstall = ''
+    mkdir $out/share/7kaa/MUSIC
+    cp -R ${music}/MUSIC $out/share/7kaa/
+    cp ${music}/COPYING-Music.txt $out/share/7kaa/MUSIC
+    cp ${music}/COPYING-Music.txt $out/share/doc/7kaa
+  '';
+
+  # Multiplayer is auto-disabled for non-x86 system
+
+  meta = with lib; {
+    homepage = "https://www.7kfans.com";
+    description = "GPL release of the Seven Kingdoms with multiplayer (available only on x86 platforms)";
+    license = licenses.gpl2Only;
+    platforms = platforms.x86_64 ++ platforms.aarch64;
+    maintainers = with maintainers; [ _1000101 ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/90secondportraits/default.nix b/nixpkgs/pkgs/games/90secondportraits/default.nix
new file mode 100644
index 000000000000..fd6bb9239938
--- /dev/null
+++ b/nixpkgs/pkgs/games/90secondportraits/default.nix
@@ -0,0 +1,52 @@
+{ lib, stdenv, fetchurl, love, makeWrapper, makeDesktopItem, copyDesktopItems }:
+
+let
+  pname = "90secondportraits";
+
+  icon = fetchurl {
+    url = "http://tangramgames.dk/img/thumb/90secondportraits.png";
+    sha256 = "13k6cq8s7jw77j81xfa5ri41445m778q6iqbfplhwdpja03c6faw";
+  };
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "90secondportraits";
+      exec = pname;
+      icon = icon;
+      comment = "A silly speed painting game";
+      desktopName = "90 Second Portraits";
+      genericName = "90secondportraits";
+      categories = [ "Game" ];
+    })
+  ];
+
+in stdenv.mkDerivation rec {
+  inherit pname desktopItems;
+  version = "1.01b";
+
+  src = fetchurl {
+    url = "https://github.com/SimonLarsen/90-Second-Portraits/releases/download/${version}/${pname}-${version}.love";
+    sha256 = "0jj3k953r6vb02212gqcgqpb4ima87gnqgls43jmylxq2mcm33h5";
+  };
+
+  nativeBuildInputs = [ makeWrapper copyDesktopItems ];
+
+  dontUnpack = true;
+
+  installPhase = ''
+    runHook preInstall
+    install -Dm444 $src $out/share/games/lovegames/${pname}.love
+    makeWrapper ${love}/bin/love $out/bin/${pname} \
+      --add-flags $out/share/games/lovegames/${pname}.love
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "A silly speed painting game";
+    maintainers = with maintainers; [ leenaars ];
+    platforms = platforms.linux;
+    license = licenses.free;
+    downloadPage = "http://tangramgames.dk/games/90secondportraits";
+  };
+
+}
diff --git a/nixpkgs/pkgs/games/BeatSaberModManager/default.nix b/nixpkgs/pkgs/games/BeatSaberModManager/default.nix
new file mode 100644
index 000000000000..a4b53810244d
--- /dev/null
+++ b/nixpkgs/pkgs/games/BeatSaberModManager/default.nix
@@ -0,0 +1,77 @@
+{
+  lib,
+  dotnet-sdk,
+  stdenv,
+  substituteAll,
+
+  buildDotnetModule,
+  fetchFromGitHub,
+
+  dotnetCorePackages,
+
+  libX11,
+  libICE,
+  libSM,
+  fontconfig,
+
+  xdg-utils,
+}:
+
+buildDotnetModule rec {
+  pname = "BeatSaberModManager";
+  version = "0.0.5";
+
+  src = fetchFromGitHub {
+    owner = "affederaffe";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-HHWC+MAwJ+AMCuBzSuR7FbW3k+wLri0B9J1DftyfNEU=";
+    fetchSubmodules = true; # It vendors BSIPA-Linux
+  };
+
+  dotnet-sdk = with dotnetCorePackages; combinePackages [
+    sdk_7_0
+    sdk_6_0
+  ];
+
+  dotnet-runtime = dotnetCorePackages.runtime_7_0;
+
+  projectFile = [ "BeatSaberModManager/BeatSaberModManager.csproj" ];
+
+  executables = [ "BeatSaberModManager" ];
+
+  nugetDeps = ./deps.nix;
+
+  runtimeDeps = [
+    libX11
+    libICE
+    libSM
+    fontconfig
+  ];
+
+  # Required for OneClick
+  makeWrapperArgs = [
+    ''--suffix PATH : "${lib.makeBinPath [ xdg-utils ]}"''
+  ];
+
+  meta = with lib; {
+    description = "Yet another mod installer for Beat Saber, heavily inspired by ModAssistant";
+    homepage = "https://github.com/affederaffe/BeatSaberModManager";
+    longDescription = ''
+      BeatSaberModManager is yet another mod installer for Beat Saber, heavily inspired by ModAssistant
+      It strives to look more visually appealing and support both Windows and Linux, while still being as feature-rich as ModAssistant.
+
+      Features
+
+      - Windows and Linux support
+      - Dependency resolution
+      - Installed mod detection
+      - Mod uninstallation
+      - Theming support
+      - OneClickâ„¢ support for BeatSaver, ModelSaber and Playlists
+    '';
+    license = licenses.mit;
+    maintainers = with maintainers; [ atemu ];
+    platforms = with platforms; linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/BeatSaberModManager/deps.nix b/nixpkgs/pkgs/games/BeatSaberModManager/deps.nix
new file mode 100644
index 000000000000..64115dd683e9
--- /dev/null
+++ b/nixpkgs/pkgs/games/BeatSaberModManager/deps.nix
@@ -0,0 +1,99 @@
+# This file was automatically generated by passthru.fetch-deps.
+# Please dont edit it manually, your changes might get overwritten!
+
+{ fetchNuGet }: [
+  (fetchNuGet { pname = "Avalonia"; version = "11.0.999-cibuild0030643-beta"; sha256 = "0bcc3h5hxy8mfkgxn07vnnq2rn8whn2gx3d67lmlpm01r16rndyc"; url = "https://pkgs.dev.azure.com/AvaloniaUI/aa84306f-2981-47b9-8206-edb3bed6250d/_packaging/5ebc1fbc-7d49-4641-8a57-d18c55ed6602/nuget/v3/flat2/avalonia/11.0.999-cibuild0030643-beta/avalonia.11.0.999-cibuild0030643-beta.nupkg"; })
+  (fetchNuGet { pname = "Avalonia.Angle.Windows.Natives"; version = "2.1.0.2023020321"; sha256 = "1az4s1g22ipak9a3xfh55z2h3rm6lpqh7svbpw6ag4ysrgsjjsjd"; })
+  (fetchNuGet { pname = "Avalonia.Controls.ColorPicker"; version = "11.0.999-cibuild0030643-beta"; sha256 = "06n0c8dyh1q4a97nm31vyr8b6jzcq8nvvligwzp4xaxdwhkphg2x"; url = "https://pkgs.dev.azure.com/AvaloniaUI/aa84306f-2981-47b9-8206-edb3bed6250d/_packaging/5ebc1fbc-7d49-4641-8a57-d18c55ed6602/nuget/v3/flat2/avalonia.controls.colorpicker/11.0.999-cibuild0030643-beta/avalonia.controls.colorpicker.11.0.999-cibuild0030643-beta.nupkg"; })
+  (fetchNuGet { pname = "Avalonia.Controls.DataGrid"; version = "11.0.999-cibuild0030643-beta"; sha256 = "1vfkbjy9fl24i6skn02wgr047579x4a1liiw79qwbkx7mgvw9pvn"; url = "https://pkgs.dev.azure.com/AvaloniaUI/aa84306f-2981-47b9-8206-edb3bed6250d/_packaging/5ebc1fbc-7d49-4641-8a57-d18c55ed6602/nuget/v3/flat2/avalonia.controls.datagrid/11.0.999-cibuild0030643-beta/avalonia.controls.datagrid.11.0.999-cibuild0030643-beta.nupkg"; })
+  (fetchNuGet { pname = "Avalonia.Desktop"; version = "11.0.999-cibuild0030643-beta"; sha256 = "0nh6hdw07hwq92n0m1sx7qxwp4ccqash5f8sivj3lflx786s9i5f"; url = "https://pkgs.dev.azure.com/AvaloniaUI/aa84306f-2981-47b9-8206-edb3bed6250d/_packaging/5ebc1fbc-7d49-4641-8a57-d18c55ed6602/nuget/v3/flat2/avalonia.desktop/11.0.999-cibuild0030643-beta/avalonia.desktop.11.0.999-cibuild0030643-beta.nupkg"; })
+  (fetchNuGet { pname = "Avalonia.Diagnostics"; version = "11.0.999-cibuild0030643-beta"; sha256 = "0ddcq2w54cywpzcwb9av54zkblvpnp0g7xs4dsw6s39wrxyh8spw"; url = "https://pkgs.dev.azure.com/AvaloniaUI/aa84306f-2981-47b9-8206-edb3bed6250d/_packaging/5ebc1fbc-7d49-4641-8a57-d18c55ed6602/nuget/v3/flat2/avalonia.diagnostics/11.0.999-cibuild0030643-beta/avalonia.diagnostics.11.0.999-cibuild0030643-beta.nupkg"; })
+  (fetchNuGet { pname = "Avalonia.FreeDesktop"; version = "11.0.999-cibuild0030643-beta"; sha256 = "1wshqaikd1b2a91yixgsnvl8i1arhmlviavjywi67a2w1xv98das"; url = "https://pkgs.dev.azure.com/AvaloniaUI/aa84306f-2981-47b9-8206-edb3bed6250d/_packaging/5ebc1fbc-7d49-4641-8a57-d18c55ed6602/nuget/v3/flat2/avalonia.freedesktop/11.0.999-cibuild0030643-beta/avalonia.freedesktop.11.0.999-cibuild0030643-beta.nupkg"; })
+  (fetchNuGet { pname = "Avalonia.Native"; version = "11.0.999-cibuild0030643-beta"; sha256 = "10pp6lh5hlcfs3xrqg1rv7xkckkpnbvdvx0ndfqgpfqxyv99jdhd"; url = "https://pkgs.dev.azure.com/AvaloniaUI/aa84306f-2981-47b9-8206-edb3bed6250d/_packaging/5ebc1fbc-7d49-4641-8a57-d18c55ed6602/nuget/v3/flat2/avalonia.native/11.0.999-cibuild0030643-beta/avalonia.native.11.0.999-cibuild0030643-beta.nupkg"; })
+  (fetchNuGet { pname = "Avalonia.ReactiveUI"; version = "11.0.999-cibuild0030643-beta"; sha256 = "1pl35gkpc36hydd350ch6iilyfngbg8wxw3vkx5a971761lqrgbz"; url = "https://pkgs.dev.azure.com/AvaloniaUI/aa84306f-2981-47b9-8206-edb3bed6250d/_packaging/5ebc1fbc-7d49-4641-8a57-d18c55ed6602/nuget/v3/flat2/avalonia.reactiveui/11.0.999-cibuild0030643-beta/avalonia.reactiveui.11.0.999-cibuild0030643-beta.nupkg"; })
+  (fetchNuGet { pname = "Avalonia.Remote.Protocol"; version = "11.0.999-cibuild0030643-beta"; sha256 = "179l5w9j2hy683fhxi25q98sfgz03l48qj8mgg1asjjpqcbybgh2"; url = "https://pkgs.dev.azure.com/AvaloniaUI/aa84306f-2981-47b9-8206-edb3bed6250d/_packaging/5ebc1fbc-7d49-4641-8a57-d18c55ed6602/nuget/v3/flat2/avalonia.remote.protocol/11.0.999-cibuild0030643-beta/avalonia.remote.protocol.11.0.999-cibuild0030643-beta.nupkg"; })
+  (fetchNuGet { pname = "Avalonia.Skia"; version = "11.0.999-cibuild0030643-beta"; sha256 = "0fvc83phdjxhfg3pndr7j178i2km5wjbm1xiplh4bvg6pwa2xypz"; url = "https://pkgs.dev.azure.com/AvaloniaUI/aa84306f-2981-47b9-8206-edb3bed6250d/_packaging/5ebc1fbc-7d49-4641-8a57-d18c55ed6602/nuget/v3/flat2/avalonia.skia/11.0.999-cibuild0030643-beta/avalonia.skia.11.0.999-cibuild0030643-beta.nupkg"; })
+  (fetchNuGet { pname = "Avalonia.Themes.Fluent"; version = "11.0.999-cibuild0030643-beta"; sha256 = "1ch7v19xpg4nkq2aqap82sd237735g5nrp06h1i0m83kks4xz6as"; url = "https://pkgs.dev.azure.com/AvaloniaUI/aa84306f-2981-47b9-8206-edb3bed6250d/_packaging/5ebc1fbc-7d49-4641-8a57-d18c55ed6602/nuget/v3/flat2/avalonia.themes.fluent/11.0.999-cibuild0030643-beta/avalonia.themes.fluent.11.0.999-cibuild0030643-beta.nupkg"; })
+  (fetchNuGet { pname = "Avalonia.Themes.Simple"; version = "11.0.999-cibuild0030643-beta"; sha256 = "0aify5nh31bf347k4s4d5c36mhh6yc6q4l6araq3fxb05v4pb5c0"; url = "https://pkgs.dev.azure.com/AvaloniaUI/aa84306f-2981-47b9-8206-edb3bed6250d/_packaging/5ebc1fbc-7d49-4641-8a57-d18c55ed6602/nuget/v3/flat2/avalonia.themes.simple/11.0.999-cibuild0030643-beta/avalonia.themes.simple.11.0.999-cibuild0030643-beta.nupkg"; })
+  (fetchNuGet { pname = "Avalonia.Win32"; version = "11.0.999-cibuild0030643-beta"; sha256 = "1b86hlr25w8i3hdxxxb9qrbaf91d56vmiwm5ikywglk28c9x8zyq"; url = "https://pkgs.dev.azure.com/AvaloniaUI/aa84306f-2981-47b9-8206-edb3bed6250d/_packaging/5ebc1fbc-7d49-4641-8a57-d18c55ed6602/nuget/v3/flat2/avalonia.win32/11.0.999-cibuild0030643-beta/avalonia.win32.11.0.999-cibuild0030643-beta.nupkg"; })
+  (fetchNuGet { pname = "Avalonia.X11"; version = "11.0.999-cibuild0030643-beta"; sha256 = "15pcbv0hw099080s2ndi7cqm3gnyzcvva3jgp8z33g4h8qaiiyvn"; url = "https://pkgs.dev.azure.com/AvaloniaUI/aa84306f-2981-47b9-8206-edb3bed6250d/_packaging/5ebc1fbc-7d49-4641-8a57-d18c55ed6602/nuget/v3/flat2/avalonia.x11/11.0.999-cibuild0030643-beta/avalonia.x11.11.0.999-cibuild0030643-beta.nupkg"; })
+  (fetchNuGet { pname = "Devlooped.SponsorLink"; version = "0.9.6"; sha256 = "0d6sdy4312fb9g7l3q9x78vmw4ngrzf2f961778h4zqga8nc23rm"; })
+  (fetchNuGet { pname = "DynamicData"; version = "7.9.5"; sha256 = "1m9qx8g6na5ka6kd9vhg8gjmxrnkzb6v5cl5yqp1kdjsw4rcwy6x"; })
+  (fetchNuGet { pname = "HarfBuzzSharp"; version = "2.8.2.3"; sha256 = "115aybicqs9ijjlcv6k6r5v0agkjm1bm1nkd0rj3jglv8s0xvmp2"; })
+  (fetchNuGet { pname = "HarfBuzzSharp.NativeAssets.Linux"; version = "2.8.2.3"; sha256 = "1f18ahwkaginrg0vwsi6s56lvnqvvxv7pzklfs5lnknasxy1a76z"; })
+  (fetchNuGet { pname = "HarfBuzzSharp.NativeAssets.macOS"; version = "2.8.2.3"; sha256 = "052d8frpkj4ijs6fm6xp55xbv95b1s9biqwa0w8zp3rgm88m9236"; })
+  (fetchNuGet { pname = "HarfBuzzSharp.NativeAssets.WebAssembly"; version = "2.8.2.3"; sha256 = "043hv36bg5240znbm8x5la7py17m4jfzy57q3ka32f6zjld83j36"; })
+  (fetchNuGet { pname = "HarfBuzzSharp.NativeAssets.Win32"; version = "2.8.2.3"; sha256 = "08khd2jqm8sw58ljz5srangzfm2sz3gd2q1jzc5fr80lj8rv6r74"; })
+  (fetchNuGet { pname = "MicroCom.Runtime"; version = "0.11.0"; sha256 = "0p9c3m0zk59x9dcqw077hzd2yk60myisbacvm36mnwpcjwzjkp2m"; })
+  (fetchNuGet { pname = "Microsoft.Bcl.AsyncInterfaces"; version = "6.0.0"; sha256 = "15gqy2m14fdlvy1g59207h5kisznm355kbw010gy19vh47z8gpz3"; })
+  (fetchNuGet { pname = "Microsoft.CodeAnalysis.Analyzers"; version = "3.0.0"; sha256 = "0bbl0jpqywqmzz2gagld1p2gvdfldjfjmm25hil9wj2nq1zc4di8"; })
+  (fetchNuGet { pname = "Microsoft.CodeAnalysis.Common"; version = "3.8.0"; sha256 = "12n7rvr39bzkf2maw7zplw8rwpxpxss4ich3bb2pw770rx4nyvyw"; })
+  (fetchNuGet { pname = "Microsoft.CodeAnalysis.CSharp"; version = "3.8.0"; sha256 = "1kmry65csvfn72zzc16vj1nfbfwam28wcmlrk3m5rzb8ydbzgylb"; })
+  (fetchNuGet { pname = "Microsoft.CodeAnalysis.CSharp.Scripting"; version = "3.8.0"; sha256 = "0w0yx0lpg54iw5jazqk46h48gx43ij32gwac8iywdj6kxfxm03vw"; })
+  (fetchNuGet { pname = "Microsoft.CodeAnalysis.Scripting.Common"; version = "3.8.0"; sha256 = "0hjgxcsj5zy27lqk0986m59n5dbplx2vjjla2lsvg4bwg8qa7bpk"; })
+  (fetchNuGet { pname = "Microsoft.CSharp"; version = "4.3.0"; sha256 = "0gw297dgkh0al1zxvgvncqs0j15lsna9l1wpqas4rflmys440xvb"; })
+  (fetchNuGet { pname = "Microsoft.CSharp"; version = "4.7.0"; sha256 = "0gd67zlw554j098kabg887b5a6pq9kzavpa3jjy5w53ccjzjfy8j"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Platforms"; version = "1.1.0"; sha256 = "08vh1r12g6ykjygq5d3vq09zylgb84l63k49jc4v8faw9g93iqqm"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Platforms"; version = "2.1.2"; sha256 = "1507hnpr9my3z4w1r6xk5n0s1j3y6a2c2cnynj76za7cphxi1141"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Platforms"; version = "5.0.0"; sha256 = "0mwpwdflidzgzfx2dlpkvvnkgkr2ayaf0s80737h4wa35gaj11rc"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Targets"; version = "1.1.0"; sha256 = "193xwf33fbm0ni3idxzbr5fdq3i2dlfgihsac9jj7whj0gd902nh"; })
+  (fetchNuGet { pname = "Microsoft.VisualStudio.Threading"; version = "17.1.46"; sha256 = "0w7b17xh88rqzjjsy66gg2kfaqmg7sdmx70sharkqb7qh3pih87m"; })
+  (fetchNuGet { pname = "Microsoft.VisualStudio.Threading.Analyzers"; version = "17.1.46"; sha256 = "0lgx7776ivmz0gr0whyacxpnlp6w5b80mj012a28mm79r1qxpf60"; })
+  (fetchNuGet { pname = "Microsoft.VisualStudio.Validation"; version = "17.0.53"; sha256 = "0y34dvc5z6ash2cpp69mclb3wr52fd8khsmm61sv7lkql0pg03ki"; })
+  (fetchNuGet { pname = "Microsoft.Win32.Registry"; version = "5.0.0"; sha256 = "102hvhq2gmlcbq8y2cb7hdr2dnmjzfp2k3asr1ycwrfacwyaak7n"; })
+  (fetchNuGet { pname = "Microsoft.Win32.SystemEvents"; version = "6.0.0"; sha256 = "0c6pcj088g1yd1vs529q3ybgsd2vjlk5y1ic6dkmbhvrp5jibl9p"; })
+  (fetchNuGet { pname = "Nerdbank.Streams"; version = "2.9.112"; sha256 = "1i10xr5zm9vapfzvimim9gn2pm9vgnsnb44sq3b0162r0k572rrp"; })
+  (fetchNuGet { pname = "ReactiveUI"; version = "18.3.1"; sha256 = "1lxkc8yk9glj0w9n5vry2dnwwvh8152ad2c5bivk8aciq64zidyn"; })
+  (fetchNuGet { pname = "Serilog"; version = "2.10.0"; sha256 = "08bih205i632ywryn3zxkhb15dwgyaxbhmm1z3b5nmby9fb25k7v"; })
+  (fetchNuGet { pname = "Serilog.Sinks.File"; version = "5.0.1-dev-00947"; sha256 = "153vi3xjy65ixfr8nfs59n0bmgj0jxfyydmhjs8h3apr9f29lbh4"; })
+  (fetchNuGet { pname = "SkiaSharp"; version = "2.88.3"; sha256 = "1yq694myq2rhfp2hwwpyzcg1pzpxcp7j72wib8p9pw9dfj7008sv"; })
+  (fetchNuGet { pname = "SkiaSharp.NativeAssets.Linux"; version = "2.88.3"; sha256 = "0dajvr60nwvnv7s6kcqgw1w97zxdpz1c5lb7kcq7r0hi0l05ck3q"; })
+  (fetchNuGet { pname = "SkiaSharp.NativeAssets.macOS"; version = "2.88.3"; sha256 = "191ajgi6fnfqcvqvkayjsxasiz6l0bv3pps8vv9abbyc4b12qvph"; })
+  (fetchNuGet { pname = "SkiaSharp.NativeAssets.WebAssembly"; version = "2.88.3"; sha256 = "1w5njksq3amrrp7fqxw89nv6ar2kgc5yx092i4rxv7hrjbd1aagx"; })
+  (fetchNuGet { pname = "SkiaSharp.NativeAssets.Win32"; version = "2.88.3"; sha256 = "03wwfbarsxjnk70qhqyd1dw65098dncqk2m0vksx92j70i7lry6q"; })
+  (fetchNuGet { pname = "Splat"; version = "14.4.1"; sha256 = "03ycyjn2ii44npi015p4rk344xnjgdzz02cf63cmhx2ab8hv6p4b"; })
+  (fetchNuGet { pname = "StrongInject"; version = "1.4.5-ci-20220524-023137"; sha256 = "1ksiv5rs22j193sxwjvdc4vhblikka9z8hhs705f4mi1r4q0x1ha"; })
+  (fetchNuGet { pname = "System.Collections"; version = "4.3.0"; sha256 = "19r4y64dqyrq6k4706dnyhhw7fs24kpp3awak7whzss39dakpxk9"; })
+  (fetchNuGet { pname = "System.Collections.Immutable"; version = "5.0.0"; sha256 = "1kvcllagxz2q92g81zkz81djkn2lid25ayjfgjalncyc68i15p0r"; })
+  (fetchNuGet { pname = "System.ComponentModel.Annotations"; version = "4.5.0"; sha256 = "1jj6f6g87k0iwsgmg3xmnn67a14mq88np0l1ys5zkxhkvbc8976p"; })
+  (fetchNuGet { pname = "System.Diagnostics.Debug"; version = "4.3.0"; sha256 = "00yjlf19wjydyr6cfviaph3vsjzg3d5nvnya26i2fvfg53sknh3y"; })
+  (fetchNuGet { pname = "System.Drawing.Common"; version = "6.0.0"; sha256 = "02n8rzm58dac2np8b3xw8ychbvylja4nh6938l5k2fhyn40imlgz"; })
+  (fetchNuGet { pname = "System.Dynamic.Runtime"; version = "4.3.0"; sha256 = "1d951hrvrpndk7insiag80qxjbf2y0y39y8h5hnq9612ws661glk"; })
+  (fetchNuGet { pname = "System.Globalization"; version = "4.3.0"; sha256 = "1cp68vv683n6ic2zqh2s1fn4c2sd87g5hpp6l4d4nj4536jz98ki"; })
+  (fetchNuGet { pname = "System.IO"; version = "4.3.0"; sha256 = "05l9qdrzhm4s5dixmx68kxwif4l99ll5gqmh7rqgw554fx0agv5f"; })
+  (fetchNuGet { pname = "System.IO.Pipelines"; version = "6.0.3"; sha256 = "1jgdazpmwc21dd9naq3l9n5s8a1jnbwlvgkf1pnm0aji6jd4xqdz"; })
+  (fetchNuGet { pname = "System.Linq"; version = "4.3.0"; sha256 = "1w0gmba695rbr80l1k2h4mrwzbzsyfl2z4klmpbsvsg5pm4a56s7"; })
+  (fetchNuGet { pname = "System.Linq.Expressions"; version = "4.3.0"; sha256 = "0ky2nrcvh70rqq88m9a5yqabsl4fyd17bpr63iy2mbivjs2nyypv"; })
+  (fetchNuGet { pname = "System.Memory"; version = "4.5.4"; sha256 = "14gbbs22mcxwggn0fcfs1b062521azb9fbb7c113x0mq6dzq9h6y"; })
+  (fetchNuGet { pname = "System.Numerics.Vectors"; version = "4.5.0"; sha256 = "1kzrj37yzawf1b19jq0253rcs8hsq1l2q8g69d7ipnhzb0h97m59"; })
+  (fetchNuGet { pname = "System.ObjectModel"; version = "4.3.0"; sha256 = "191p63zy5rpqx7dnrb3h7prvgixmk168fhvvkkvhlazncf8r3nc2"; })
+  (fetchNuGet { pname = "System.Reactive"; version = "5.0.0"; sha256 = "1lafmpnadhiwxyd543kraxa3jfdpm6ipblxrjlibym9b1ykpr5ik"; })
+  (fetchNuGet { pname = "System.Reflection"; version = "4.3.0"; sha256 = "0xl55k0mw8cd8ra6dxzh974nxif58s3k1rjv1vbd7gjbjr39j11m"; })
+  (fetchNuGet { pname = "System.Reflection.Emit"; version = "4.3.0"; sha256 = "11f8y3qfysfcrscjpjym9msk7lsfxkk4fmz9qq95kn3jd0769f74"; })
+  (fetchNuGet { pname = "System.Reflection.Emit.ILGeneration"; version = "4.3.0"; sha256 = "0w1n67glpv8241vnpz1kl14sy7zlnw414aqwj4hcx5nd86f6994q"; })
+  (fetchNuGet { pname = "System.Reflection.Emit.Lightweight"; version = "4.3.0"; sha256 = "0ql7lcakycrvzgi9kxz1b3lljd990az1x6c4jsiwcacrvimpib5c"; })
+  (fetchNuGet { pname = "System.Reflection.Extensions"; version = "4.3.0"; sha256 = "02bly8bdc98gs22lqsfx9xicblszr2yan7v2mmw3g7hy6miq5hwq"; })
+  (fetchNuGet { pname = "System.Reflection.Metadata"; version = "5.0.0"; sha256 = "17qsl5nanlqk9iz0l5wijdn6ka632fs1m1fvx18dfgswm258r3ss"; })
+  (fetchNuGet { pname = "System.Reflection.Primitives"; version = "4.3.0"; sha256 = "04xqa33bld78yv5r93a8n76shvc8wwcdgr1qvvjh959g3rc31276"; })
+  (fetchNuGet { pname = "System.Reflection.TypeExtensions"; version = "4.3.0"; sha256 = "0y2ssg08d817p0vdag98vn238gyrrynjdj4181hdg780sif3ykp1"; })
+  (fetchNuGet { pname = "System.Resources.ResourceManager"; version = "4.3.0"; sha256 = "0sjqlzsryb0mg4y4xzf35xi523s4is4hz9q4qgdvlvgivl7qxn49"; })
+  (fetchNuGet { pname = "System.Runtime"; version = "4.3.0"; sha256 = "066ixvgbf2c929kgknshcxqj6539ax7b9m570cp8n179cpfkapz7"; })
+  (fetchNuGet { pname = "System.Runtime.CompilerServices.Unsafe"; version = "4.7.1"; sha256 = "119br3pd85lq8zcgh4f60jzmv1g976q1kdgi3hvqdlhfbw6siz2j"; })
+  (fetchNuGet { pname = "System.Runtime.CompilerServices.Unsafe"; version = "6.0.0"; sha256 = "0qm741kh4rh57wky16sq4m0v05fxmkjjr87krycf5vp9f0zbahbc"; })
+  (fetchNuGet { pname = "System.Runtime.Extensions"; version = "4.3.0"; sha256 = "1ykp3dnhwvm48nap8q23893hagf665k0kn3cbgsqpwzbijdcgc60"; })
+  (fetchNuGet { pname = "System.Runtime.Handles"; version = "4.3.0"; sha256 = "0sw2gfj2xr7sw9qjn0j3l9yw07x73lcs97p8xfc9w1x9h5g5m7i8"; })
+  (fetchNuGet { pname = "System.Runtime.InteropServices"; version = "4.3.0"; sha256 = "00hywrn4g7hva1b2qri2s6rabzwgxnbpw9zfxmz28z09cpwwgh7j"; })
+  (fetchNuGet { pname = "System.Security.AccessControl"; version = "5.0.0"; sha256 = "17n3lrrl6vahkqmhlpn3w20afgz09n7i6rv0r3qypngwi7wqdr5r"; })
+  (fetchNuGet { pname = "System.Security.Principal.Windows"; version = "5.0.0"; sha256 = "1mpk7xj76lxgz97a5yg93wi8lj0l8p157a5d50mmjy3gbz1904q8"; })
+  (fetchNuGet { pname = "System.Text.Encoding"; version = "4.3.0"; sha256 = "1f04lkir4iladpp51sdgmis9dj4y8v08cka0mbmsy0frc9a4gjqr"; })
+  (fetchNuGet { pname = "System.Text.Encoding.CodePages"; version = "4.5.1"; sha256 = "1z21qyfs6sg76rp68qdx0c9iy57naan89pg7p6i3qpj8kyzn921w"; })
+  (fetchNuGet { pname = "System.Threading"; version = "4.3.0"; sha256 = "0rw9wfamvhayp5zh3j7p1yfmx9b5khbf4q50d8k5rk993rskfd34"; })
+  (fetchNuGet { pname = "System.Threading.Channels"; version = "7.0.0"; sha256 = "1qrmqa6hpzswlmyp3yqsbnmia9i5iz1y208xpqc1y88b1f6j1v8a"; })
+  (fetchNuGet { pname = "System.Threading.Tasks"; version = "4.3.0"; sha256 = "134z3v9abw3a6jsw17xl3f6hqjpak5l682k2vz39spj4kmydg6k7"; })
+  (fetchNuGet { pname = "System.Threading.Tasks.Extensions"; version = "4.5.4"; sha256 = "0y6ncasgfcgnjrhynaf0lwpkpkmv4a07sswwkwbwb5h7riisj153"; })
+  (fetchNuGet { pname = "ThisAssembly.AssemblyInfo"; version = "1.2.9"; sha256 = "1pilnin62fb2frmybl3n0xvxn1xpr8bymbzialspl6cbw2xvag97"; })
+  (fetchNuGet { pname = "ThisAssembly.Prerequisites"; version = "1.2.9"; sha256 = "0skk9sk8lc4dn9rmykz337n5apg76if9l327q7787fabisr9rbw7"; })
+  (fetchNuGet { pname = "Tmds.DBus.Protocol"; version = "0.13.0"; sha256 = "1r5lc8x3iq795l7vnyzs3shvpqz92fldkayvkqmrfjxnqmy0w3kg"; })
+  (fetchNuGet { pname = "Tmds.DBus.SourceGenerator"; version = "0.0.2"; sha256 = "03q0fja30216npb3hd39iapr9psriz2k35lymaf4921195y40fiq"; })
+  (fetchNuGet { pname = "XamlNameReferenceGenerator"; version = "1.6.1"; sha256 = "0348gj9g5rl0pj2frx4vscj6602gfyn9ba3i1rmfcrxh9jwwa09m"; })
+]
diff --git a/nixpkgs/pkgs/games/abbaye-des-morts/default.nix b/nixpkgs/pkgs/games/abbaye-des-morts/default.nix
new file mode 100644
index 000000000000..3cf03ed22119
--- /dev/null
+++ b/nixpkgs/pkgs/games/abbaye-des-morts/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, fetchFromGitHub, SDL2, SDL2_image, SDL2_mixer }:
+
+stdenv.mkDerivation rec {
+  pname = "abbaye-des-morts";
+  version = "2.0.2";
+
+  src = fetchFromGitHub {
+    owner = "nevat";
+    repo = "abbayedesmorts-gpl";
+    rev = "v${version}";
+    sha256 = "sha256-/RAtOL51o3/5pDgqPLJMTtDFY9BpIowM5MpJ88+v/Zs=";
+  };
+
+  buildInputs = [ SDL2 SDL2_image SDL2_mixer ];
+
+  makeFlags = [ "PREFIX=$(out)" "DESTDIR=" ];
+
+  preBuild = lib.optionalString stdenv.cc.isClang
+    ''
+      substituteInPlace Makefile \
+        --replace -fpredictive-commoning ""
+    '';
+
+  preInstall = ''
+    mkdir -p $out/bin
+    mkdir -p $out/share/applications
+  '';
+
+  meta = with lib; {
+    homepage = "https://locomalito.com/abbaye_des_morts.php";
+    description = "A retro arcade video game";
+    license = licenses.gpl3;
+    maintainers = [ maintainers.marius851000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/abuse/abuse.sh b/nixpkgs/pkgs/games/abuse/abuse.sh
new file mode 100644
index 000000000000..de837d27181f
--- /dev/null
+++ b/nixpkgs/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/nixpkgs/pkgs/games/abuse/default.nix b/nixpkgs/pkgs/games/abuse/default.nix
new file mode 100644
index 000000000000..1e2d4f82f837
--- /dev/null
+++ b/nixpkgs/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/nixpkgs/pkgs/games/ace-of-penguins/default.nix b/nixpkgs/pkgs/games/ace-of-penguins/default.nix
new file mode 100644
index 000000000000..fb15aedc1df8
--- /dev/null
+++ b/nixpkgs/pkgs/games/ace-of-penguins/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, stdenv
+, fetchurl
+, copyDesktopItems
+, libX11
+, libXpm
+, libpng
+, makeDesktopItem
+, zlib
+}:
+
+stdenv.mkDerivation rec {
+  pname = "ace-of-penguins";
+  version = "1.4";
+
+  src = fetchurl {
+    url = "http://www.delorie.com/store/ace/ace-${version}.tar.gz";
+    hash = "sha256-H+47BTOSGkKHPAYj8z2HOgZ7HuxY8scMAUSRRueaTM4=";
+  };
+
+  patches = [
+    # Fixes a bunch of miscompilations in modern environments
+    ./fixup-miscompilations.patch
+  ];
+
+  nativeBuildInputs = [
+    copyDesktopItems
+  ];
+
+  buildInputs = [
+    libX11
+    libXpm
+    libpng
+    zlib
+  ];
+
+  desktopItems = let
+    generateItem = gameName: {
+      name = "${pname}-${gameName}";
+      exec = "${placeholder "out"}/bin/${gameName}";
+      comment = "Ace of Penguins ${gameName} Card Game";
+      desktopName = gameName;
+      genericName = gameName;
+    };
+  in
+    map (x: makeDesktopItem (generateItem x)) [
+      "canfield"
+      "freecell"
+      "golf"
+      "mastermind"
+      "merlin"
+      "minesweeper"
+      "pegged"
+      "penguins"
+      "solitaire"
+      "spider"
+      "taipedit"
+      "taipei"
+      "thornq"
+    ];
+
+  meta = with lib; {
+    homepage = "http://www.delorie.com/store/ace/";
+    description = "Solitaire games in X11";
+    longDescription = ''
+      The Ace of Penguins is a set of Unix/X solitaire games based on the ones
+      available for Windows(tm) but with a number of enhancements that my wife
+      says make my versions better :-)
+
+      The latest version includes clones of freecell, golf, mastermind, merlin,
+      minesweeper, pegged, solitaire, taipei (with editor!), and thornq (by
+      Martin Thornquist).
+    '';
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ AndersonTorres ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/ace-of-penguins/fixup-miscompilations.patch b/nixpkgs/pkgs/games/ace-of-penguins/fixup-miscompilations.patch
new file mode 100644
index 000000000000..599b4a137d79
--- /dev/null
+++ b/nixpkgs/pkgs/games/ace-of-penguins/fixup-miscompilations.patch
@@ -0,0 +1,80 @@
+--- ace-1.4/lib/xwin.c	
++++ ace-1.4/lib/xwin.c	
+@@ -89,10 +89,10 @@
+ /* Motif window hints */
+ typedef struct
+ {
+-  unsigned flags;
+-  unsigned functions;
+-  unsigned decorations;
+-  int inputMode;
++  unsigned long flags;
++  unsigned long functions;
++  unsigned long decorations;
++  long inputMode;
+ } PropMotifWmHints;
+ 
+ typedef PropMotifWmHints        PropMwmHints;
+@@ -841,13 +841,13 @@
+   png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, 0, 0, 0);
+   info_ptr = png_create_info_struct (png_ptr);
+ 
+-  if (setjmp (png_ptr->jmpbuf)) {
++  if (setjmp (png_jmpbuf (png_ptr))) {
+     fprintf(stderr, "Invalid PNG image!\n");
+     return;
+   }
+ 
+   file_bytes = src->file_data;
+-  png_set_read_fn (png_ptr, (voidp)&file_bytes, (png_rw_ptr)png_reader);
++  png_set_read_fn (png_ptr, (void *)&file_bytes, (png_rw_ptr)png_reader);
+ 
+   png_read_info (png_ptr, info_ptr);
+ 
+--- ace-1.4/lib/make-imglib.c	
++++ ace-1.4/lib/make-imglib.c	
+@@ -86,7 +86,7 @@
+     png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, 0, 0, 0);
+     info_ptr = png_create_info_struct (png_ptr);
+ 
+-    if (setjmp (png_ptr->jmpbuf)) {
++    if (setjmp (png_jmpbuf (png_ptr))) {
+       fclose (f);
+       continue;
+     }
+
+--- ace-1.4/lib/Makefile.am	
++++ ace-1.4/lib/Makefile.am
+@@ -6,7 +6,7 @@
+ CLEANFILES = images.c images.d
+ 
+ INCLUDES = $(X_CFLAGS) @PDA@
+-AM_LDFLAGS = $(X_LIBS)
++AM_LDFLAGS = $(X_LIBS) -lpng -lz -lm
+ 
+ BUILD_CC = @BUILD_CC@
+ AR = @AR@
+
+--- ace-1.4/lib/xwin.c  2020-10-07 02:07:59.000000000 +0300
++++ ace-1.4/lib/xwin.c    2020-10-07 02:15:05.941784967 +0300
+@@ -55,7 +55,6 @@
+   { "-visual", OPTION_INTEGER, &visual_id },
+   { 0, 0, 0 }
+ };
+-OptionDesc *xwin_options = xwin_options_list;
+
+ Display *display=0;
+ int screen=0;
+--- ace-1.4/config.guess	2012-03-24 19:00:49.000000000 +0100
++++ ace-1.4/config.guess	2021-07-05 11:02:16.685843793 +0200
+@@ -882,6 +882,9 @@
+ 	    echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+ 	fi
+ 	exit ;;
++    aarch64*:Linux:*:*)
++	echo ${UNAME_MACHINE}-unknown-linux-gnu
++	exit ;;
+     avr32*:Linux:*:*)
+ 	echo ${UNAME_MACHINE}-unknown-linux-gnu
+ 	exit ;;
+
diff --git a/nixpkgs/pkgs/games/adom/default.nix b/nixpkgs/pkgs/games/adom/default.nix
new file mode 100644
index 000000000000..bef9d1b42d32
--- /dev/null
+++ b/nixpkgs/pkgs/games/adom/default.nix
@@ -0,0 +1,60 @@
+{ 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:" + lib.makeLibraryPath [
+      zlib libmad libpng12 libcaca libXext libX11 libGLU libGL alsa-lib libpulseaudio];
+
+in
+stdenv.mkDerivation rec {
+  name = "adom-${version}-noteye";
+  version = "1.2.0_pre23";
+
+  src = fetchurl {
+    url = "http://ancardia.uk.to/download/adom_noteye_linux_ubuntu_64_${version}.tar.gz";
+    sha256 = "0sbn0csaqb9cqi0z5fdwvnymkf84g64csg0s9mm6fzh0sm2mi0hz";
+  };
+
+  buildCommand = ''
+    . $stdenv/setup
+
+    unpackPhase
+
+    mkdir -pv $out
+    cp -r -t $out adom/*
+
+    chmod u+w $out/lib
+    for l in $out/lib/*so* ; do
+      chmod u+w $l
+      ${patchelf}/bin/patchelf \
+        --set-rpath "$out/lib:${lpath}" \
+        $l
+    done
+
+    ${patchelf}/bin/patchelf \
+      --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \
+      --set-rpath "$out/lib:${lpath}" \
+      $out/adom
+
+    mkdir $out/bin
+    cat >$out/bin/adom <<EOF
+    #! ${stdenv.shell}
+    (cd $out; exec $out/adom ; )
+    EOF
+    chmod +x $out/bin/adom
+  '';
+
+  meta = with lib; {
+    description = "A rogue-like game with nice graphical interface";
+    homepage = "http://adom.de/";
+    license = licenses.unfreeRedistributable;
+    maintainers = [maintainers.smironov];
+
+    # Please, notify me (smironov) if you need the x86 version
+    platforms = ["x86_64-linux"];
+    broken = true; # at 2022-09-30, failed download.
+  };
+}
diff --git a/nixpkgs/pkgs/games/airshipper/Cargo.lock b/nixpkgs/pkgs/games/airshipper/Cargo.lock
new file mode 100644
index 000000000000..d89ec3a7472a
--- /dev/null
+++ b/nixpkgs/pkgs/games/airshipper/Cargo.lock
@@ -0,0 +1,5355 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "Inflector"
+version = "0.11.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3"
+
+[[package]]
+name = "ab_glyph"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04a9283dace1c41c265496614998d5b9c4a97b3eb770e804f007c5144bf03f2b"
+dependencies = [
+ "ab_glyph_rasterizer",
+ "owned_ttf_parser",
+]
+
+[[package]]
+name = "ab_glyph_rasterizer"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "363b9b88fad3af3be80bc8f762c9a3f9dfe906fd0327b8e92f1c12e5ae1b8bbb"
+
+[[package]]
+name = "addr2line"
+version = "0.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b"
+dependencies = [
+ "gimli",
+]
+
+[[package]]
+name = "adler"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+
+[[package]]
+name = "adler32"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234"
+
+[[package]]
+name = "aead"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "aes"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8"
+dependencies = [
+ "cfg-if 1.0.0",
+ "cipher",
+ "cpufeatures",
+ "opaque-debug",
+]
+
+[[package]]
+name = "aes-gcm"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df5f85a83a7d8b0442b6aa7b504b8212c1733da07b98aae43d4bc21b2cb3cdf6"
+dependencies = [
+ "aead",
+ "aes",
+ "cipher",
+ "ctr",
+ "ghash",
+ "subtle",
+]
+
+[[package]]
+name = "ahash"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47"
+dependencies = [
+ "getrandom 0.2.7",
+ "once_cell",
+ "version_check",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "0.7.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "airshipper"
+version = "0.10.0"
+dependencies = [
+ "bytesize",
+ "chrono",
+ "clap",
+ "colored",
+ "country-parser",
+ "derive_more",
+ "dirs-next",
+ "find_folder",
+ "futures-util",
+ "html2text",
+ "iced",
+ "iced_lazy",
+ "iced_native",
+ "image",
+ "indicatif 0.16.2",
+ "lazy_static",
+ "md5",
+ "opener",
+ "openssl-sys",
+ "pulldown-cmark 0.8.0",
+ "rand 0.8.5",
+ "regex",
+ "reqwest",
+ "ron 0.6.6",
+ "rss",
+ "rustyline",
+ "self_update",
+ "semver 1.0.13",
+ "serde",
+ "socket2",
+ "strip_markdown",
+ "surge-ping",
+ "termcolor",
+ "thiserror",
+ "tokio",
+ "tokio-stream",
+ "tracing",
+ "tracing-appender",
+ "tracing-futures",
+ "tracing-log",
+ "tracing-subscriber",
+ "url",
+ "veloren-serverbrowser-api",
+ "winapi",
+ "winres",
+ "zip",
+]
+
+[[package]]
+name = "airshipper-server"
+version = "0.10.0"
+dependencies = [
+ "bytes",
+ "chrono",
+ "diesel",
+ "diesel_migrations",
+ "dotenv",
+ "futures",
+ "lazy_static",
+ "libsqlite3-sys",
+ "md5",
+ "octocrab",
+ "openssl-sys",
+ "prometheus",
+ "regex",
+ "reqwest",
+ "rocket",
+ "rocket_sync_db_pools",
+ "ron 0.7.1",
+ "serde",
+ "serde_json",
+ "termcolor",
+ "thiserror",
+ "tokio",
+ "tokio-util 0.6.10",
+ "tracing",
+ "tracing-appender",
+ "tracing-log",
+ "tracing-subscriber",
+ "url",
+]
+
+[[package]]
+name = "aliasable"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "ansi_term"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "approx"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "arc-swap"
+version = "1.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "983cd8b9d4b02a6dc6ffa557262eb5858a27a0038ffffe21a0f133eaa819a164"
+
+[[package]]
+name = "arrayvec"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6"
+
+[[package]]
+name = "ash"
+version = "0.34.0+1.2.203"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0f780da53d0063880d45554306489f09dd8d1bda47688b4a57bc579119356df"
+dependencies = [
+ "libloading",
+]
+
+[[package]]
+name = "async-stream"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dad5c83079eae9969be7fadefe640a1c566901f05ff91ab221de4b6f68d9507e"
+dependencies = [
+ "async-stream-impl",
+ "futures-core",
+]
+
+[[package]]
+name = "async-stream-impl"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "10f203db73a71dfa2fb6dd22763990fa26f3d2625a6da2da900d23b87d26be27"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "async-trait"
+version = "0.1.57"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76464446b8bc32758d7e88ee1a804d9914cd9b1cb264c029899680b0be29826f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "atom_syndication"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d5016bf52ff4f3ed28bf3ec1fed96b53daf4b137d5e6b9f97a8cfae7b57a3a2"
+dependencies = [
+ "chrono",
+ "derive_builder",
+ "diligent-date-parser",
+ "quick-xml",
+]
+
+[[package]]
+name = "atomic"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b88d82667eca772c4aa12f0f1348b3ae643424c8876448f3f7bd5787032e234c"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "atty"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
+dependencies = [
+ "hermit-abi",
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "backtrace"
+version = "0.3.66"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cab84319d616cfb654d03394f38ab7e6f0919e181b1b57e1fd15e7fb4077d9a7"
+dependencies = [
+ "addr2line",
+ "cc",
+ "cfg-if 1.0.0",
+ "libc",
+ "miniz_oxide 0.5.4",
+ "object",
+ "rustc-demangle",
+]
+
+[[package]]
+name = "base64"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff"
+
+[[package]]
+name = "base64"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
+
+[[package]]
+name = "binascii"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "383d29d513d8764dcdc42ea295d979eb99c3c9f00607b3692cf68a431f7dca72"
+
+[[package]]
+name = "bit-set"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1"
+dependencies = [
+ "bit-vec",
+]
+
+[[package]]
+name = "bit-vec"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "block"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
+
+[[package]]
+name = "block-buffer"
+version = "0.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "bstr"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223"
+dependencies = [
+ "lazy_static",
+ "memchr",
+ "regex-automata",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d"
+
+[[package]]
+name = "bytemuck"
+version = "1.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f5715e491b5a1598fc2bef5a606847b5dc1d48ea625bd3c02c00de8285591da"
+dependencies = [
+ "bytemuck_derive",
+]
+
+[[package]]
+name = "bytemuck_derive"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b9e1f5fa78f69496407a27ae9ed989e3c3b072310286f5ef385525e4cbc24a9"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "byteorder"
+version = "1.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+
+[[package]]
+name = "bytes"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8"
+
+[[package]]
+name = "bytesize"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c58ec36aac5066d5ca17df51b3e70279f5670a72102f5752cb7e7c856adfc70"
+
+[[package]]
+name = "bzip2"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6afcd980b5f3a45017c57e57a2fcccbb351cc43a356ce117ef760ef8052b89b0"
+dependencies = [
+ "bzip2-sys",
+ "libc",
+]
+
+[[package]]
+name = "bzip2-sys"
+version = "0.1.11+1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+]
+
+[[package]]
+name = "calloop"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf2eec61efe56aa1e813f5126959296933cf0700030e4314786c48779a66ab82"
+dependencies = [
+ "log",
+ "nix 0.22.3",
+]
+
+[[package]]
+name = "cc"
+version = "1.0.73"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11"
+
+[[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 = "cfg_aliases"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e"
+
+[[package]]
+name = "chrono"
+version = "0.4.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfd4d1b31faaa3a89d7934dbded3111da0d2ef28e3ebccdb4f0179f5929d1ef1"
+dependencies = [
+ "iana-time-zone",
+ "js-sys",
+ "num-integer",
+ "num-traits",
+ "serde",
+ "time 0.1.44",
+ "wasm-bindgen",
+ "winapi",
+]
+
+[[package]]
+name = "cipher"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "clap"
+version = "3.2.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23b71c3ce99b7611011217b366d923f1d0a7e07a92bb2dbf1e84508c673ca3bd"
+dependencies = [
+ "atty",
+ "bitflags",
+ "clap_derive",
+ "clap_lex",
+ "indexmap",
+ "once_cell",
+ "strsim 0.10.0",
+ "termcolor",
+ "textwrap",
+]
+
+[[package]]
+name = "clap_derive"
+version = "3.2.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea0c8bce528c4be4da13ea6fead8965e95b6073585a2f05204bd8f4119f82a65"
+dependencies = [
+ "heck",
+ "proc-macro-error",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "clap_lex"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5"
+dependencies = [
+ "os_str_bytes",
+]
+
+[[package]]
+name = "clipboard-win"
+version = "4.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4ab1b92798304eedc095b53942963240037c0516452cb11aeba709d420b2219"
+dependencies = [
+ "error-code",
+ "str-buf",
+ "winapi",
+]
+
+[[package]]
+name = "clipboard_macos"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "145a7f9e9b89453bc0a5e32d166456405d389cea5b578f57f1274b1397588a95"
+dependencies = [
+ "objc",
+ "objc-foundation",
+ "objc_id",
+]
+
+[[package]]
+name = "clipboard_wayland"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6f6364a9f7a66f2ac1a1a098aa1c7f6b686f2496c6ac5e5c0d773445df912747"
+dependencies = [
+ "smithay-clipboard",
+]
+
+[[package]]
+name = "clipboard_x11"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "983a7010836ecd04dde2c6d27a0cb56ec5d21572177e782bdcb24a600124e921"
+dependencies = [
+ "thiserror",
+ "x11rb",
+]
+
+[[package]]
+name = "cocoa"
+version = "0.24.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6f63902e9223530efb4e26ccd0cf55ec30d592d3b42e21a28defc42a9586e832"
+dependencies = [
+ "bitflags",
+ "block",
+ "cocoa-foundation",
+ "core-foundation 0.9.3",
+ "core-graphics 0.22.3",
+ "foreign-types",
+ "libc",
+ "objc",
+]
+
+[[package]]
+name = "cocoa-foundation"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318"
+dependencies = [
+ "bitflags",
+ "block",
+ "core-foundation 0.9.3",
+ "core-graphics-types",
+ "foreign-types",
+ "libc",
+ "objc",
+]
+
+[[package]]
+name = "codespan-reporting"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e"
+dependencies = [
+ "termcolor",
+ "unicode-width",
+]
+
+[[package]]
+name = "color_quant"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
+
+[[package]]
+name = "colored"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd"
+dependencies = [
+ "atty",
+ "lazy_static",
+ "winapi",
+]
+
+[[package]]
+name = "console"
+version = "0.15.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89eab4d20ce20cea182308bca13088fecea9c05f6776cf287205d41a0ed3c847"
+dependencies = [
+ "encode_unicode",
+ "libc",
+ "once_cell",
+ "terminal_size",
+ "unicode-width",
+ "winapi",
+]
+
+[[package]]
+name = "convert_case"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e"
+
+[[package]]
+name = "cookie"
+version = "0.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94d4706de1b0fa5b132270cddffa8585166037822e260a944fe161acd137ca05"
+dependencies = [
+ "aes-gcm",
+ "base64 0.13.0",
+ "hkdf",
+ "hmac",
+ "percent-encoding",
+ "rand 0.8.5",
+ "sha2",
+ "subtle",
+ "time 0.3.14",
+ "version_check",
+]
+
+[[package]]
+name = "copyless"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2df960f5d869b2dd8532793fde43eb5427cceb126c929747a26823ab0eeb536"
+
+[[package]]
+name = "core-foundation"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171"
+dependencies = [
+ "core-foundation-sys 0.7.0",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146"
+dependencies = [
+ "core-foundation-sys 0.8.3",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac"
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc"
+
+[[package]]
+name = "core-graphics"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b3889374e6ea6ab25dba90bb5d96202f61108058361f6dc72e8b03e6f8bbe923"
+dependencies = [
+ "bitflags",
+ "core-foundation 0.7.0",
+ "foreign-types",
+ "libc",
+]
+
+[[package]]
+name = "core-graphics"
+version = "0.22.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb"
+dependencies = [
+ "bitflags",
+ "core-foundation 0.9.3",
+ "core-graphics-types",
+ "foreign-types",
+ "libc",
+]
+
+[[package]]
+name = "core-graphics-types"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b"
+dependencies = [
+ "bitflags",
+ "core-foundation 0.9.3",
+ "foreign-types",
+ "libc",
+]
+
+[[package]]
+name = "core-video-sys"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34ecad23610ad9757664d644e369246edde1803fcb43ed72876565098a5d3828"
+dependencies = [
+ "cfg-if 0.1.10",
+ "core-foundation-sys 0.7.0",
+ "core-graphics 0.19.2",
+ "libc",
+ "objc",
+]
+
+[[package]]
+name = "country-parser"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1dee23a8308105cbce67c6b9bf85d204949b614bf9286c24f5eebfae50f17b60"
+dependencies = [
+ "lazy_static",
+ "ron 0.6.6",
+ "serde",
+]
+
+[[package]]
+name = "cpufeatures"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "crc32fast"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521"
+dependencies = [
+ "cfg-if 1.0.0",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc"
+dependencies = [
+ "cfg-if 1.0.0",
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "045ebe27666471bb549370b4b0b3e51b07f56325befa4284db65fc89c02511b1"
+dependencies = [
+ "autocfg",
+ "cfg-if 1.0.0",
+ "crossbeam-utils",
+ "memoffset",
+ "once_cell",
+ "scopeguard",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc"
+dependencies = [
+ "cfg-if 1.0.0",
+ "once_cell",
+]
+
+[[package]]
+name = "crypto-common"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
+dependencies = [
+ "generic-array",
+ "typenum",
+]
+
+[[package]]
+name = "ctr"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea"
+dependencies = [
+ "cipher",
+]
+
+[[package]]
+name = "cty"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35"
+
+[[package]]
+name = "d3d12"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2daefd788d1e96e0a9d66dee4b828b883509bc3ea9ce30665f04c3246372690c"
+dependencies = [
+ "bitflags",
+ "libloading",
+ "winapi",
+]
+
+[[package]]
+name = "darling"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858"
+dependencies = [
+ "darling_core 0.10.2",
+ "darling_macro 0.10.2",
+]
+
+[[package]]
+name = "darling"
+version = "0.13.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c"
+dependencies = [
+ "darling_core 0.13.4",
+ "darling_macro 0.13.4",
+]
+
+[[package]]
+name = "darling_core"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b"
+dependencies = [
+ "fnv",
+ "ident_case",
+ "proc-macro2",
+ "quote",
+ "strsim 0.9.3",
+ "syn",
+]
+
+[[package]]
+name = "darling_core"
+version = "0.13.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610"
+dependencies = [
+ "fnv",
+ "ident_case",
+ "proc-macro2",
+ "quote",
+ "strsim 0.10.0",
+ "syn",
+]
+
+[[package]]
+name = "darling_macro"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72"
+dependencies = [
+ "darling_core 0.10.2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "darling_macro"
+version = "0.13.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835"
+dependencies = [
+ "darling_core 0.13.4",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "deflate"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174"
+dependencies = [
+ "adler32",
+ "byteorder",
+]
+
+[[package]]
+name = "derive_builder"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2658621297f2cf68762a6f7dc0bb7e1ff2cfd6583daef8ee0fed6f7ec468ec0"
+dependencies = [
+ "darling 0.10.2",
+ "derive_builder_core",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "derive_builder_core"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2791ea3e372c8495c0bc2033991d76b512cd799d07491fbd6890124db9458bef"
+dependencies = [
+ "darling 0.10.2",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "derive_more"
+version = "0.99.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321"
+dependencies = [
+ "convert_case",
+ "proc-macro2",
+ "quote",
+ "rustc_version",
+ "syn",
+]
+
+[[package]]
+name = "devise"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50c7580b072f1c8476148f16e0a0d5dedddab787da98d86c5082c5e9ed8ab595"
+dependencies = [
+ "devise_codegen",
+ "devise_core",
+]
+
+[[package]]
+name = "devise_codegen"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "123c73e7a6e51b05c75fe1a1b2f4e241399ea5740ed810b0e3e6cacd9db5e7b2"
+dependencies = [
+ "devise_core",
+ "quote",
+]
+
+[[package]]
+name = "devise_core"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "841ef46f4787d9097405cac4e70fb8644fc037b526e8c14054247c0263c400d0"
+dependencies = [
+ "bitflags",
+ "proc-macro2",
+ "proc-macro2-diagnostics",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "diesel"
+version = "1.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b28135ecf6b7d446b43e27e225622a038cc4e2930a1022f51cdb97ada19b8e4d"
+dependencies = [
+ "byteorder",
+ "chrono",
+ "diesel_derives",
+ "libsqlite3-sys",
+ "r2d2",
+]
+
+[[package]]
+name = "diesel_derives"
+version = "1.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "45f5098f628d02a7a0f68ddba586fb61e80edec3bdc1be3b921f4ceec60858d3"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "diesel_migrations"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf3cde8413353dc7f5d72fa8ce0b99a560a359d2c5ef1e5817ca731cd9008f4c"
+dependencies = [
+ "migrations_internals",
+ "migrations_macros",
+]
+
+[[package]]
+name = "digest"
+version = "0.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506"
+dependencies = [
+ "block-buffer",
+ "crypto-common",
+ "subtle",
+]
+
+[[package]]
+name = "diligent-date-parser"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2d0fd95c7c02e2d6c588c6c5628466fff9bdde4b8c6196465e087b08e792720"
+dependencies = [
+ "chrono",
+]
+
+[[package]]
+name = "dirs-next"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1"
+dependencies = [
+ "cfg-if 1.0.0",
+ "dirs-sys-next",
+]
+
+[[package]]
+name = "dirs-sys-next"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d"
+dependencies = [
+ "libc",
+ "redox_users",
+ "winapi",
+]
+
+[[package]]
+name = "dispatch"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b"
+
+[[package]]
+name = "dlib"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac1b7517328c04c2aa68422fc60a41b92208182142ed04a25879c26c8f878794"
+dependencies = [
+ "libloading",
+]
+
+[[package]]
+name = "doc-comment"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
+
+[[package]]
+name = "dotenv"
+version = "0.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f"
+
+[[package]]
+name = "downcast-rs"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650"
+
+[[package]]
+name = "either"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797"
+
+[[package]]
+name = "encode_unicode"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
+
+[[package]]
+name = "encoding_rs"
+version = "0.8.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "endian-type"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d"
+
+[[package]]
+name = "errno"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1"
+dependencies = [
+ "errno-dragonfly",
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "errno-dragonfly"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
+dependencies = [
+ "cc",
+ "libc",
+]
+
+[[package]]
+name = "error-code"
+version = "2.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64f18991e7bf11e7ffee451b5318b5c1a73c52d0d0ada6e5a3017c8c1ced6a21"
+dependencies = [
+ "libc",
+ "str-buf",
+]
+
+[[package]]
+name = "euclid"
+version = "0.22.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b52c2ef4a78da0ba68fbe1fd920627411096d2ac478f7f4c9f3a54ba6705bade"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "fastrand"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499"
+dependencies = [
+ "instant",
+]
+
+[[package]]
+name = "fd-lock"
+version = "3.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bb21c69b9fea5e15dbc1049e4b77145dd0ba1c84019c488102de0dc4ea4b0a27"
+dependencies = [
+ "cfg-if 1.0.0",
+ "rustix",
+ "windows-sys 0.42.0",
+]
+
+[[package]]
+name = "figment"
+version = "0.10.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e3bd154d9ae2f1bb0ada5b7eebd56529513efa5de7d2fc8c6adf33bc43260cf"
+dependencies = [
+ "atomic",
+ "pear",
+ "serde",
+ "toml",
+ "uncased",
+ "version_check",
+]
+
+[[package]]
+name = "find_folder"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9f6d018fb95a0b59f854aed68ecd96ce2b80af7911b92b1fed3c4b1fa516b91b"
+
+[[package]]
+name = "flate2"
+version = "1.0.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6"
+dependencies = [
+ "crc32fast",
+ "miniz_oxide 0.5.4",
+]
+
+[[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 = "futf"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843"
+dependencies = [
+ "mac",
+ "new_debug_unreachable",
+]
+
+[[package]]
+name = "futures"
+version = "0.3.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f21eda599937fba36daeb58a22e8f5cee2d14c4a17b5b7739c7c8e5e3b8230c"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-io",
+ "futures-sink",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "30bdd20c28fadd505d0fd6712cdfcb0d4b5648baf45faef7f852afb2399bb050"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4e5aa3de05362c3fb88de6531e6296e85cde7739cccad4b9dfeeb7f6ebce56bf"
+
+[[package]]
+name = "futures-executor"
+version = "0.3.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ff63c23854bee61b6e9cd331d523909f238fc7636290b96826e9cfa5faa00ab"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "futures-util",
+ "num_cpus",
+]
+
+[[package]]
+name = "futures-io"
+version = "0.3.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbf4d2a7a308fd4578637c0b17c7e1c7ba127b8f6ba00b29f717e9655d85eb68"
+
+[[package]]
+name = "futures-macro"
+version = "0.3.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42cd15d1c7456c04dbdf7e88bcd69760d74f3a798d6444e16974b505b0e62f17"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "futures-sink"
+version = "0.3.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "21b20ba5a92e727ba30e72834706623d94ac93a725410b6a6b6fbc1b07f7ba56"
+
+[[package]]
+name = "futures-task"
+version = "0.3.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a6508c467c73851293f390476d4491cf4d227dbabcd4170f3bb6044959b294f1"
+
+[[package]]
+name = "futures-util"
+version = "0.3.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44fb6cb1be61cc1d2e43b262516aafcf63b241cffdb1d3fa115f91d9c7b09c90"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-macro",
+ "futures-sink",
+ "futures-task",
+ "memchr",
+ "pin-project-lite",
+ "pin-utils",
+ "slab",
+]
+
+[[package]]
+name = "fxhash"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
+dependencies = [
+ "byteorder",
+]
+
+[[package]]
+name = "generator"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc184cace1cea8335047a471cc1da80f18acf8a76f3bab2028d499e328948ec7"
+dependencies = [
+ "cc",
+ "libc",
+ "log",
+ "rustversion",
+ "windows",
+]
+
+[[package]]
+name = "generic-array"
+version = "0.14.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9"
+dependencies = [
+ "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "gethostname"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "getopts"
+version = "0.2.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5"
+dependencies = [
+ "unicode-width",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.1.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
+dependencies = [
+ "cfg-if 1.0.0",
+ "libc",
+ "wasi 0.9.0+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6"
+dependencies = [
+ "cfg-if 1.0.0",
+ "libc",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "ghash"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1583cc1656d7839fd3732b80cf4f38850336cdb9b8ded1cd399ca62958de3c99"
+dependencies = [
+ "opaque-debug",
+ "polyval",
+]
+
+[[package]]
+name = "gif"
+version = "0.11.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3edd93c6756b4dfaf2709eafcc345ba2636565295c198a9cfbf75fa5e3e00b06"
+dependencies = [
+ "color_quant",
+ "weezl",
+]
+
+[[package]]
+name = "gimli"
+version = "0.26.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d"
+
+[[package]]
+name = "glam"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "579160312273c954cc51bd440f059dde741029ac8daf8c84fece76cb77f62c15"
+dependencies = [
+ "version_check",
+]
+
+[[package]]
+name = "glob"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
+
+[[package]]
+name = "glow"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8bd5877156a19b8ac83a29b2306fe20537429d318f3ff0a1a2119f8d9c61919"
+dependencies = [
+ "js-sys",
+ "slotmap",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "glyph_brush"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac02497410cdb5062cc056a33f2e1e19ff69fbf26a4be9a02bf29d6e17ea105b"
+dependencies = [
+ "glyph_brush_draw_cache",
+ "glyph_brush_layout",
+ "log",
+ "ordered-float",
+ "rustc-hash",
+ "twox-hash",
+]
+
+[[package]]
+name = "glyph_brush_draw_cache"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6010675390f6889e09a21e2c8b575b3ee25667ea8237a8d59423f73cb8c28610"
+dependencies = [
+ "ab_glyph",
+ "crossbeam-channel",
+ "crossbeam-deque",
+ "linked-hash-map",
+ "rayon",
+ "rustc-hash",
+]
+
+[[package]]
+name = "glyph_brush_layout"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc32c2334f00ca5ac3695c5009ae35da21da8c62d255b5b96d56e2597a637a38"
+dependencies = [
+ "ab_glyph",
+ "approx",
+ "xi-unicode",
+]
+
+[[package]]
+name = "gpu-alloc"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fc59e5f710e310e76e6707f86c561dd646f69a8876da9131703b2f717de818d"
+dependencies = [
+ "bitflags",
+ "gpu-alloc-types",
+]
+
+[[package]]
+name = "gpu-alloc-types"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54804d0d6bc9d7f26db4eaec1ad10def69b599315f487d32c334a80d1efe67a5"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "gpu-descriptor"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b0c02e1ba0bdb14e965058ca34e09c020f8e507a760df1121728e0aef68d57a"
+dependencies = [
+ "bitflags",
+ "gpu-descriptor-types",
+ "hashbrown",
+]
+
+[[package]]
+name = "gpu-descriptor-types"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "363e3677e55ad168fef68cf9de3a4a310b53124c5e784c53a1d70e92d23f2126"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "guillotiere"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b62d5865c036cb1393e23c50693df631d3f5d7bcca4c04fe4cc0fd592e74a782"
+dependencies = [
+ "euclid",
+ "svg_fmt",
+]
+
+[[package]]
+name = "h2"
+version = "0.3.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ca32592cf21ac7ccab1825cd87f6c9b3d9022c44d086172ed0966bec8af30be"
+dependencies = [
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "futures-util",
+ "http",
+ "indexmap",
+ "slab",
+ "tokio",
+ "tokio-util 0.7.3",
+ "tracing",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+dependencies = [
+ "ahash",
+]
+
+[[package]]
+name = "heck"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9"
+
+[[package]]
+name = "hermit-abi"
+version = "0.1.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "hex"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+
+[[package]]
+name = "hexf-parse"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df"
+
+[[package]]
+name = "hkdf"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437"
+dependencies = [
+ "hmac",
+]
+
+[[package]]
+name = "hmac"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
+dependencies = [
+ "digest",
+]
+
+[[package]]
+name = "html2text"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a26379dcb715e237b96102a12b505c553e2bffa74bae2e54658748d298660ef1"
+dependencies = [
+ "html5ever",
+ "markup5ever_rcdom",
+ "unicode-width",
+]
+
+[[package]]
+name = "html5ever"
+version = "0.25.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5c13fb08e5d4dfc151ee5e88bae63f7773d61852f3bdc73c9f4b9e1bde03148"
+dependencies = [
+ "log",
+ "mac",
+ "markup5ever",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "http"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
+[[package]]
+name = "http-body"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
+dependencies = [
+ "bytes",
+ "http",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "httparse"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
+
+[[package]]
+name = "httpdate"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421"
+
+[[package]]
+name = "hyper"
+version = "0.14.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "02c929dc5c39e335a03c405292728118860721b10190d98c2a0f0efd5baafbac"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "pin-project-lite",
+ "socket2",
+ "tokio",
+ "tower-service",
+ "tracing",
+ "want",
+]
+
+[[package]]
+name = "hyper-rustls"
+version = "0.23.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d87c48c02e0dc5e3b849a2041db3029fd066650f8f717c07bf8ed78ccb895cac"
+dependencies = [
+ "http",
+ "hyper",
+ "rustls",
+ "tokio",
+ "tokio-rustls",
+]
+
+[[package]]
+name = "hyper-tls"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905"
+dependencies = [
+ "bytes",
+ "hyper",
+ "native-tls",
+ "tokio",
+ "tokio-native-tls",
+]
+
+[[package]]
+name = "hyperx"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5617e92fc2f2501c3e2bc6ce547cad841adba2bae5b921c7e52510beca6d084c"
+dependencies = [
+ "base64 0.13.0",
+ "bytes",
+ "http",
+ "httpdate",
+ "language-tags",
+ "mime",
+ "percent-encoding",
+ "unicase",
+]
+
+[[package]]
+name = "iana-time-zone"
+version = "0.1.47"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c495f162af0bf17656d0014a0eded5f3cd2f365fdd204548c2869db89359dc7"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys 0.8.3",
+ "js-sys",
+ "once_cell",
+ "wasm-bindgen",
+ "winapi",
+]
+
+[[package]]
+name = "iced"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6025abe6b1056c9b5adad79c484c5fd8b7012e5230f3b0439a1294ade7ded7bf"
+dependencies = [
+ "iced_core",
+ "iced_futures",
+ "iced_graphics",
+ "iced_native",
+ "iced_pure",
+ "iced_wgpu",
+ "iced_winit",
+ "thiserror",
+]
+
+[[package]]
+name = "iced_core"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ccf9133ceb345ec640047d5597fb8aa88e9cf74ce2d0277a9a62e2d6ed4a8148"
+dependencies = [
+ "bitflags",
+ "wasm-timer",
+]
+
+[[package]]
+name = "iced_futures"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "13d13241d5ed32846bbcffaf60e27e7ceebb60cf16d791ff00d582f0d4d1b07b"
+dependencies = [
+ "futures",
+ "log",
+ "tokio",
+ "wasm-bindgen-futures",
+ "wasm-timer",
+]
+
+[[package]]
+name = "iced_graphics"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2adcf703fc326e0985ea99c75f1b73e718560a7b220d57ec6478417ccb2f463f"
+dependencies = [
+ "bytemuck",
+ "glam",
+ "iced_native",
+ "iced_pure",
+ "iced_style",
+ "raw-window-handle 0.4.3",
+ "thiserror",
+]
+
+[[package]]
+name = "iced_lazy"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "333979d705964832864ee7676516ab3c3df4ab0b65efb603c86a256d4adbec6f"
+dependencies = [
+ "iced_native",
+ "ouroboros",
+]
+
+[[package]]
+name = "iced_native"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ca174d4693a5daa2ffcae38d5c28cf0dbd54bd8fc19848f28392cd52624751a"
+dependencies = [
+ "iced_core",
+ "iced_futures",
+ "iced_style",
+ "num-traits",
+ "twox-hash",
+ "unicode-segmentation",
+]
+
+[[package]]
+name = "iced_pure"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80aeaecadfd6832c2c787cbdfd357adc256a51c55d68142d852037451e72f393"
+dependencies = [
+ "iced_native",
+ "iced_style",
+ "num-traits",
+]
+
+[[package]]
+name = "iced_style"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a90028c94ab62c13cd3b6fb1499a593a51510d4729c5b4e8e60705b2b28c6bc2"
+dependencies = [
+ "iced_core",
+]
+
+[[package]]
+name = "iced_wgpu"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8bc44ca209f77bd855f035d2e86e50e66332f55fb60d9fb67eeb09eae9d9de2e"
+dependencies = [
+ "bitflags",
+ "bytemuck",
+ "futures",
+ "glyph_brush",
+ "guillotiere",
+ "iced_graphics",
+ "iced_native",
+ "image",
+ "kamadak-exif",
+ "log",
+ "raw-window-handle 0.4.3",
+ "wgpu",
+ "wgpu_glyph",
+]
+
+[[package]]
+name = "iced_winit"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72011b895e439e2ebad8f545720e3e97c7368ecfc47a23cbfeaa9508a98af90c"
+dependencies = [
+ "iced_futures",
+ "iced_graphics",
+ "iced_native",
+ "log",
+ "thiserror",
+ "web-sys",
+ "winapi",
+ "window_clipboard",
+ "winit",
+]
+
+[[package]]
+name = "ident_case"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
+
+[[package]]
+name = "idna"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8"
+dependencies = [
+ "matches",
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "image"
+version = "0.23.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1"
+dependencies = [
+ "bytemuck",
+ "byteorder",
+ "color_quant",
+ "gif",
+ "jpeg-decoder",
+ "num-iter",
+ "num-rational",
+ "num-traits",
+ "png",
+]
+
+[[package]]
+name = "indexmap"
+version = "1.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e"
+dependencies = [
+ "autocfg",
+ "hashbrown",
+ "serde",
+]
+
+[[package]]
+name = "indicatif"
+version = "0.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7baab56125e25686df467fe470785512329883aab42696d661247aca2a2896e4"
+dependencies = [
+ "console",
+ "lazy_static",
+ "number_prefix 0.3.0",
+ "regex",
+]
+
+[[package]]
+name = "indicatif"
+version = "0.16.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d207dc617c7a380ab07ff572a6e52fa202a2a8f355860ac9c38e23f8196be1b"
+dependencies = [
+ "console",
+ "lazy_static",
+ "number_prefix 0.4.0",
+ "regex",
+]
+
+[[package]]
+name = "inlinable_string"
+version = "0.1.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb"
+
+[[package]]
+name = "inplace_it"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67f0347836f3f6362c1e7efdadde2b1c4b4556d211310b70631bae7eb692070b"
+
+[[package]]
+name = "instant"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+dependencies = [
+ "cfg-if 1.0.0",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "io-lifetimes"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7d367024b3f3414d8e01f437f704f41a9f64ab36f9067fa73e526ad4c763c87"
+dependencies = [
+ "libc",
+ "windows-sys 0.42.0",
+]
+
+[[package]]
+name = "ipnet"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b"
+
+[[package]]
+name = "itoa"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754"
+
+[[package]]
+name = "jni-sys"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
+
+[[package]]
+name = "jpeg-decoder"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2"
+dependencies = [
+ "rayon",
+]
+
+[[package]]
+name = "js-sys"
+version = "0.3.59"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "258451ab10b34f8af53416d1fdab72c22e805f0c92a1136d59470ec0b11138b2"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "jsonwebtoken"
+version = "7.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "afabcc15e437a6484fc4f12d0fd63068fe457bf93f1c148d3d9649c60b103f32"
+dependencies = [
+ "base64 0.12.3",
+ "pem",
+ "ring",
+ "serde",
+ "serde_json",
+ "simple_asn1",
+]
+
+[[package]]
+name = "kamadak-exif"
+version = "0.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70494964492bf8e491eb3951c5d70c9627eb7100ede6cc56d748b9a3f302cfb6"
+dependencies = [
+ "mutate_once",
+]
+
+[[package]]
+name = "khronos-egl"
+version = "4.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c2352bd1d0bceb871cb9d40f24360c8133c11d7486b68b5381c1dd1a32015e3"
+dependencies = [
+ "libc",
+ "libloading",
+]
+
+[[package]]
+name = "language-tags"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388"
+
+[[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.137"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89"
+
+[[package]]
+name = "libloading"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd"
+dependencies = [
+ "cfg-if 1.0.0",
+ "winapi",
+]
+
+[[package]]
+name = "libsqlite3-sys"
+version = "0.22.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "290b64917f8b0cb885d9de0f9959fe1f775d7fa12f1da2db9001c1c8ab60f89d"
+dependencies = [
+ "cc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "linked-hash-map"
+version = "0.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bb68f22743a3fb35785f1e7f844ca5a3de2dde5bd0c0ef5b372065814699b121"
+
+[[package]]
+name = "lock_api"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9f80bf5aacaf25cbfc8210d1cfb718f2bf3b11c4c54e5afe36c236853a8ec390"
+dependencies = [
+ "autocfg",
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "loom"
+version = "0.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5"
+dependencies = [
+ "cfg-if 1.0.0",
+ "generator",
+ "scoped-tls",
+ "serde",
+ "serde_json",
+ "tracing",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "mac"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
+
+[[package]]
+name = "malloc_buf"
+version = "0.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "markup5ever"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a24f40fb03852d1cdd84330cddcaf98e9ec08a7b7768e952fad3b4cf048ec8fd"
+dependencies = [
+ "log",
+ "phf",
+ "phf_codegen",
+ "string_cache",
+ "string_cache_codegen",
+ "tendril",
+]
+
+[[package]]
+name = "markup5ever_rcdom"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f015da43bcd8d4f144559a3423f4591d69b8ce0652c905374da7205df336ae2b"
+dependencies = [
+ "html5ever",
+ "markup5ever",
+ "tendril",
+ "xml5ever",
+]
+
+[[package]]
+name = "matchers"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
+dependencies = [
+ "regex-automata",
+]
+
+[[package]]
+name = "matches"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f"
+
+[[package]]
+name = "md5"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771"
+
+[[package]]
+name = "memchr"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+
+[[package]]
+name = "memmap2"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "00b6c2ebff6180198788f5db08d7ce3bc1d0b617176678831a7510825973e357"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "memmap2"
+version = "0.5.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95af15f345b17af2efc8ead6080fb8bc376f8cec1b35277b935637595fe77498"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "memoffset"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "metal"
+version = "0.23.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e0514f491f4cc03632ab399ee01e2c1c1b12d3e1cf2d667c1ff5f87d6dcd2084"
+dependencies = [
+ "bitflags",
+ "block",
+ "core-graphics-types",
+ "foreign-types",
+ "log",
+ "objc",
+]
+
+[[package]]
+name = "migrations_internals"
+version = "1.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b4fc84e4af020b837029e017966f86a1c2d5e83e64b589963d5047525995860"
+dependencies = [
+ "diesel",
+]
+
+[[package]]
+name = "migrations_macros"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9753f12909fd8d923f75ae5c3258cae1ed3c8ec052e1b38c93c21a6d157f789c"
+dependencies = [
+ "migrations_internals",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "mime"
+version = "0.3.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d"
+
+[[package]]
+name = "minimal-lexical"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+
+[[package]]
+name = "miniz_oxide"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435"
+dependencies = [
+ "adler32",
+]
+
+[[package]]
+name = "miniz_oxide"
+version = "0.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96590ba8f175222643a85693f33d26e9c8a015f599c216509b1a6894af675d34"
+dependencies = [
+ "adler",
+]
+
+[[package]]
+name = "mio"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf"
+dependencies = [
+ "libc",
+ "log",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+ "windows-sys 0.36.1",
+]
+
+[[package]]
+name = "multer"
+version = "2.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a30ba6d97eb198c5e8a35d67d5779d6680cca35652a60ee90fc23dc431d4fde8"
+dependencies = [
+ "bytes",
+ "encoding_rs",
+ "futures-util",
+ "http",
+ "httparse",
+ "log",
+ "memchr",
+ "mime",
+ "spin 0.9.4",
+ "tokio",
+ "tokio-util 0.7.3",
+ "version_check",
+]
+
+[[package]]
+name = "mutate_once"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16cf681a23b4d0a43fc35024c176437f9dcd818db34e0f42ab456a0ee5ad497b"
+
+[[package]]
+name = "naga"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3012f2dbcc79e8e0b5825a4836a7106a75dd9b2fe42c528163be0f572538c705"
+dependencies = [
+ "bit-set",
+ "bitflags",
+ "codespan-reporting",
+ "hexf-parse",
+ "indexmap",
+ "log",
+ "num-traits",
+ "rustc-hash",
+ "spirv",
+ "thiserror",
+]
+
+[[package]]
+name = "native-tls"
+version = "0.2.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9"
+dependencies = [
+ "lazy_static",
+ "libc",
+ "log",
+ "openssl",
+ "openssl-probe",
+ "openssl-sys",
+ "schannel",
+ "security-framework",
+ "security-framework-sys",
+ "tempfile",
+]
+
+[[package]]
+name = "ndk"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96d868f654c72e75f8687572699cdabe755f03effbb62542768e995d5b8d699d"
+dependencies = [
+ "bitflags",
+ "jni-sys",
+ "ndk-sys",
+ "num_enum",
+ "thiserror",
+]
+
+[[package]]
+name = "ndk-context"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b"
+
+[[package]]
+name = "ndk-glue"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c71bee8ea72d685477e28bd004cfe1bf99c754d688cd78cad139eae4089484d4"
+dependencies = [
+ "lazy_static",
+ "libc",
+ "log",
+ "ndk",
+ "ndk-context",
+ "ndk-macro",
+ "ndk-sys",
+]
+
+[[package]]
+name = "ndk-macro"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0df7ac00c4672f9d5aece54ee3347520b7e20f158656c7db2e6de01902eb7a6c"
+dependencies = [
+ "darling 0.13.4",
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "ndk-sys"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1bcdd74c20ad5d95aacd60ef9ba40fdf77f767051040541df557b7a9b2a2121"
+
+[[package]]
+name = "new_debug_unreachable"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
+
+[[package]]
+name = "nibble_vec"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43"
+dependencies = [
+ "smallvec",
+]
+
+[[package]]
+name = "nix"
+version = "0.22.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf"
+dependencies = [
+ "bitflags",
+ "cc",
+ "cfg-if 1.0.0",
+ "libc",
+ "memoffset",
+]
+
+[[package]]
+name = "nix"
+version = "0.24.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "195cdbc1741b8134346d515b3a56a1c94b0912758009cfd53f99ea0f57b065fc"
+dependencies = [
+ "bitflags",
+ "cfg-if 1.0.0",
+ "libc",
+ "memoffset",
+]
+
+[[package]]
+name = "no-std-net"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65"
+
+[[package]]
+name = "nom"
+version = "7.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36"
+dependencies = [
+ "memchr",
+ "minimal-lexical",
+]
+
+[[package]]
+name = "num-bigint"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
+dependencies = [
+ "autocfg",
+ "num-traits",
+]
+
+[[package]]
+name = "num-iter"
+version = "0.1.43"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-rational"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1"
+dependencies = [
+ "hermit-abi",
+ "libc",
+]
+
+[[package]]
+name = "num_enum"
+version = "0.5.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf5395665662ef45796a4ff5486c5d41d29e0c09640af4c5f17fd94ee2c119c9"
+dependencies = [
+ "num_enum_derive",
+]
+
+[[package]]
+name = "num_enum_derive"
+version = "0.5.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b0498641e53dd6ac1a4f22547548caa6864cc4933784319cd1775271c5a46ce"
+dependencies = [
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "num_threads"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "number_prefix"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17b02fc0ff9a9e4b35b3342880f48e896ebf69f2967921fe8646bf5b7125956a"
+
+[[package]]
+name = "number_prefix"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3"
+
+[[package]]
+name = "objc"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1"
+dependencies = [
+ "malloc_buf",
+ "objc_exception",
+]
+
+[[package]]
+name = "objc-foundation"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9"
+dependencies = [
+ "block",
+ "objc",
+ "objc_id",
+]
+
+[[package]]
+name = "objc_exception"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "objc_id"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b"
+dependencies = [
+ "objc",
+]
+
+[[package]]
+name = "object"
+version = "0.29.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "octocrab"
+version = "0.15.4"
+source = "git+https://github.com/XAMPPRocky/octocrab?rev=c78edcd87fa5edcd5a6d0d0878b2a8d020802c40#c78edcd87fa5edcd5a6d0d0878b2a8d020802c40"
+dependencies = [
+ "arc-swap",
+ "async-trait",
+ "base64 0.13.0",
+ "bytes",
+ "chrono",
+ "hyperx",
+ "jsonwebtoken",
+ "once_cell",
+ "reqwest",
+ "serde",
+ "serde_json",
+ "serde_path_to_error",
+ "snafu",
+ "url",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f7254b99e31cad77da24b08ebf628882739a608578bb1bcdfc1f9c21260d7c0"
+
+[[package]]
+name = "opaque-debug"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
+
+[[package]]
+name = "opener"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ea3ebcd72a54701f56345f16785a6d3ac2df7e986d273eb4395c0b01db17952"
+dependencies = [
+ "bstr",
+ "winapi",
+]
+
+[[package]]
+name = "openssl"
+version = "0.10.41"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "618febf65336490dfcf20b73f885f5651a0c89c64c2d4a8c3662585a70bf5bd0"
+dependencies = [
+ "bitflags",
+ "cfg-if 1.0.0",
+ "foreign-types",
+ "libc",
+ "once_cell",
+ "openssl-macros",
+ "openssl-sys",
+]
+
+[[package]]
+name = "openssl-macros"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "openssl-probe"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
+
+[[package]]
+name = "openssl-src"
+version = "111.22.0+1.1.1q"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f31f0d509d1c1ae9cada2f9539ff8f37933831fd5098879e482aa687d659853"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "openssl-sys"
+version = "0.9.75"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5f9bd0c2710541a3cda73d6f9ac4f1b240de4ae261065d309dbe73d9dceb42f"
+dependencies = [
+ "autocfg",
+ "cc",
+ "libc",
+ "openssl-src",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "ordered-float"
+version = "3.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96bcbab4bfea7a59c2c0fe47211a1ac4e3e96bea6eb446d704f310bc5c732ae2"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "os_str_bytes"
+version = "6.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff"
+
+[[package]]
+name = "ouroboros"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f357ef82d1b4db66fbed0b8d542cbd3c22d0bf5b393b3c257b9ba4568e70c9c3"
+dependencies = [
+ "aliasable",
+ "ouroboros_macro",
+ "stable_deref_trait",
+]
+
+[[package]]
+name = "ouroboros_macro"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44a0b52c2cbaef7dffa5fec1a43274afe8bd2a644fa9fc50a9ef4ff0269b1257"
+dependencies = [
+ "Inflector",
+ "proc-macro-error",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "owned_ttf_parser"
+version = "0.15.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05e6affeb1632d6ff6a23d2cd40ffed138e82f1532571a26f527c8a284bb2fbb"
+dependencies = [
+ "ttf-parser",
+]
+
+[[package]]
+name = "parking_lot"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99"
+dependencies = [
+ "instant",
+ "lock_api",
+ "parking_lot_core 0.8.5",
+]
+
+[[package]]
+name = "parking_lot"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+dependencies = [
+ "lock_api",
+ "parking_lot_core 0.9.3",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216"
+dependencies = [
+ "cfg-if 1.0.0",
+ "instant",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "winapi",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929"
+dependencies = [
+ "cfg-if 1.0.0",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "windows-sys 0.36.1",
+]
+
+[[package]]
+name = "pear"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "15e44241c5e4c868e3eaa78b7c1848cadd6344ed4f54d029832d32b415a58702"
+dependencies = [
+ "inlinable_string",
+ "pear_codegen",
+ "yansi",
+]
+
+[[package]]
+name = "pear_codegen"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82a5ca643c2303ecb740d506539deba189e16f2754040a42901cd8105d0282d0"
+dependencies = [
+ "proc-macro2",
+ "proc-macro2-diagnostics",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "pem"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd56cbd21fea48d0c440b41cd69c589faacade08c992d9a54e471b79d0fd13eb"
+dependencies = [
+ "base64 0.13.0",
+ "once_cell",
+ "regex",
+]
+
+[[package]]
+name = "percent-encoding"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
+
+[[package]]
+name = "pest"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b0560d531d1febc25a3c9398a62a71256c0178f2e3443baedd9ad4bb8c9deb4"
+dependencies = [
+ "thiserror",
+ "ucd-trie",
+]
+
+[[package]]
+name = "phf"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12"
+dependencies = [
+ "phf_shared 0.8.0",
+]
+
+[[package]]
+name = "phf_codegen"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815"
+dependencies = [
+ "phf_generator 0.8.0",
+ "phf_shared 0.8.0",
+]
+
+[[package]]
+name = "phf_generator"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526"
+dependencies = [
+ "phf_shared 0.8.0",
+ "rand 0.7.3",
+]
+
+[[package]]
+name = "phf_generator"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6"
+dependencies = [
+ "phf_shared 0.10.0",
+ "rand 0.8.5",
+]
+
+[[package]]
+name = "phf_shared"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7"
+dependencies = [
+ "siphasher",
+]
+
+[[package]]
+name = "phf_shared"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096"
+dependencies = [
+ "siphasher",
+]
+
+[[package]]
+name = "pin-project"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc"
+dependencies = [
+ "pin-project-internal",
+]
+
+[[package]]
+name = "pin-project-internal"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
+
+[[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.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae"
+
+[[package]]
+name = "pnet_base"
+version = "0.30.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2e88341c6c842f89bdc7287f7b1e26b6fa64fa11c7ea3756971e6f18cd2510c4"
+dependencies = [
+ "no-std-net",
+]
+
+[[package]]
+name = "pnet_macros"
+version = "0.30.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ebfcdc9c072966723026b3596a1f655fb8bbfe0142f9770f8d481aee4459d6b9"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "regex",
+ "syn",
+]
+
+[[package]]
+name = "pnet_macros_support"
+version = "0.30.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bba532f5a4b320c029d89e612671fb621851b3b07e972c53850d34130033a5cd"
+dependencies = [
+ "pnet_base",
+]
+
+[[package]]
+name = "pnet_packet"
+version = "0.30.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7009716ac86091c1b6e2cdec95a2b028c880f516054c1ec11edd02f9f463cbde"
+dependencies = [
+ "glob",
+ "pnet_base",
+ "pnet_macros",
+ "pnet_macros_support",
+]
+
+[[package]]
+name = "png"
+version = "0.16.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c3287920cb847dee3de33d301c463fba14dda99db24214ddf93f83d3021f4c6"
+dependencies = [
+ "bitflags",
+ "crc32fast",
+ "deflate",
+ "miniz_oxide 0.3.7",
+]
+
+[[package]]
+name = "polyval"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1"
+dependencies = [
+ "cfg-if 1.0.0",
+ "cpufeatures",
+ "opaque-debug",
+ "universal-hash",
+]
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872"
+
+[[package]]
+name = "precomputed-hash"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
+
+[[package]]
+name = "proc-macro-crate"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9"
+dependencies = [
+ "once_cell",
+ "thiserror",
+ "toml",
+]
+
+[[package]]
+name = "proc-macro-error"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
+dependencies = [
+ "proc-macro-error-attr",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "version_check",
+]
+
+[[package]]
+name = "proc-macro-error-attr"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "version_check",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.43"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "proc-macro2-diagnostics"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4bf29726d67464d49fa6224a1d07936a8c08bb3fba727c7493f6cf1616fdaada"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "version_check",
+ "yansi",
+]
+
+[[package]]
+name = "profiling"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f61dcf0b917cd75d4521d7343d1ffff3d1583054133c9b5cbea3375c703c40d"
+
+[[package]]
+name = "prometheus"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5986aa8d62380092d2f50f8b1cdba9cb9b6731ffd4b25b51fd126b6c3e05b99c"
+dependencies = [
+ "cfg-if 1.0.0",
+ "fnv",
+ "lazy_static",
+ "memchr",
+ "parking_lot 0.11.2",
+ "protobuf",
+ "thiserror",
+]
+
+[[package]]
+name = "protobuf"
+version = "2.27.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf7e6d18738ecd0902d30d1ad232c9125985a3422929b16c65517b38adc14f96"
+
+[[package]]
+name = "pulldown-cmark"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca36dea94d187597e104a5c8e4b07576a8a45aa5db48a65e12940d3eb7461f55"
+dependencies = [
+ "bitflags",
+ "getopts",
+ "memchr",
+ "unicase",
+]
+
+[[package]]
+name = "pulldown-cmark"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffade02495f22453cd593159ea2f59827aae7f53fa8323f756799b670881dcf8"
+dependencies = [
+ "bitflags",
+ "getopts",
+ "memchr",
+ "unicase",
+]
+
+[[package]]
+name = "quick-xml"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26aab6b48e2590e4a64d1ed808749ba06257882b461d01ca71baeb747074a6dd"
+dependencies = [
+ "encoding_rs",
+ "memchr",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "r2d2"
+version = "0.8.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51de85fb3fb6524929c8a2eb85e6b6d363de4e8c48f9e2c2eac4944abc181c93"
+dependencies = [
+ "log",
+ "parking_lot 0.12.1",
+ "scheduled-thread-pool",
+]
+
+[[package]]
+name = "radix_trie"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c069c179fcdc6a2fe24d8d18305cf085fdbd4f922c041943e203685d6a1c58fd"
+dependencies = [
+ "endian-type",
+ "nibble_vec",
+]
+
+[[package]]
+name = "rand"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
+dependencies = [
+ "getrandom 0.1.16",
+ "libc",
+ "rand_chacha 0.2.2",
+ "rand_core 0.5.1",
+ "rand_hc",
+ "rand_pcg",
+]
+
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "libc",
+ "rand_chacha 0.3.1",
+ "rand_core 0.6.3",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
+dependencies = [
+ "ppv-lite86",
+ "rand_core 0.5.1",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+dependencies = [
+ "ppv-lite86",
+ "rand_core 0.6.3",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
+dependencies = [
+ "getrandom 0.1.16",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7"
+dependencies = [
+ "getrandom 0.2.7",
+]
+
+[[package]]
+name = "rand_hc"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
+dependencies = [
+ "rand_core 0.5.1",
+]
+
+[[package]]
+name = "rand_pcg"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429"
+dependencies = [
+ "rand_core 0.5.1",
+]
+
+[[package]]
+name = "range-alloc"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "63e935c45e09cc6dcf00d2f0b2d630a58f4095320223d47fc68918722f0538b6"
+
+[[package]]
+name = "raw-window-handle"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e28f55143d0548dad60bb4fbdc835a3d7ac6acc3324506450c5fdd6e42903a76"
+dependencies = [
+ "libc",
+ "raw-window-handle 0.4.3",
+]
+
+[[package]]
+name = "raw-window-handle"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b800beb9b6e7d2df1fe337c9e3d04e3af22a124460fb4c30fcc22c9117cefb41"
+dependencies = [
+ "cty",
+]
+
+[[package]]
+name = "rayon"
+version = "1.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d"
+dependencies = [
+ "autocfg",
+ "crossbeam-deque",
+ "either",
+ "rayon-core",
+]
+
+[[package]]
+name = "rayon-core"
+version = "1.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f"
+dependencies = [
+ "crossbeam-channel",
+ "crossbeam-deque",
+ "crossbeam-utils",
+ "num_cpus",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "redox_users"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"
+dependencies = [
+ "getrandom 0.2.7",
+ "redox_syscall",
+ "thiserror",
+]
+
+[[package]]
+name = "ref-cast"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed13bcd201494ab44900a96490291651d200730904221832b9547d24a87d332b"
+dependencies = [
+ "ref-cast-impl",
+]
+
+[[package]]
+name = "ref-cast-impl"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5234cd6063258a5e32903b53b1b6ac043a0541c8adc1f610f67b0326c7a578fa"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "regex"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
+dependencies = [
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244"
+
+[[package]]
+name = "remove_dir_all"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "renderdoc-sys"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1382d1f0a252c4bf97dc20d979a2fdd05b024acd7c2ed0f7595d7817666a157"
+
+[[package]]
+name = "reqwest"
+version = "0.11.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b75aa69a3f06bbcc66ede33af2af253c6f7a86b1ca0033f60c580a27074fbf92"
+dependencies = [
+ "base64 0.13.0",
+ "bytes",
+ "encoding_rs",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "hyper",
+ "hyper-rustls",
+ "hyper-tls",
+ "ipnet",
+ "js-sys",
+ "lazy_static",
+ "log",
+ "mime",
+ "native-tls",
+ "percent-encoding",
+ "pin-project-lite",
+ "rustls",
+ "rustls-pemfile",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "tokio",
+ "tokio-native-tls",
+ "tokio-rustls",
+ "tokio-util 0.7.3",
+ "tower-service",
+ "url",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+ "webpki-roots",
+ "winreg",
+]
+
+[[package]]
+name = "ring"
+version = "0.16.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc"
+dependencies = [
+ "cc",
+ "libc",
+ "once_cell",
+ "spin 0.5.2",
+ "untrusted",
+ "web-sys",
+ "winapi",
+]
+
+[[package]]
+name = "rocket"
+version = "0.5.0-rc.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "98ead083fce4a405feb349cf09abdf64471c6077f14e0ce59364aa90d4b99317"
+dependencies = [
+ "async-stream",
+ "async-trait",
+ "atomic",
+ "atty",
+ "binascii",
+ "bytes",
+ "either",
+ "figment",
+ "futures",
+ "indexmap",
+ "log",
+ "memchr",
+ "multer",
+ "num_cpus",
+ "parking_lot 0.12.1",
+ "pin-project-lite",
+ "rand 0.8.5",
+ "ref-cast",
+ "rocket_codegen",
+ "rocket_http",
+ "serde",
+ "serde_json",
+ "state",
+ "tempfile",
+ "time 0.3.14",
+ "tokio",
+ "tokio-stream",
+ "tokio-util 0.7.3",
+ "ubyte",
+ "version_check",
+ "yansi",
+]
+
+[[package]]
+name = "rocket_codegen"
+version = "0.5.0-rc.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6aeb6bb9c61e9cd2c00d70ea267bf36f76a4cc615e5908b349c2f9d93999b47"
+dependencies = [
+ "devise",
+ "glob",
+ "indexmap",
+ "proc-macro2",
+ "quote",
+ "rocket_http",
+ "syn",
+ "unicode-xid",
+]
+
+[[package]]
+name = "rocket_http"
+version = "0.5.0-rc.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2ded65d127954de3c12471630bf4b81a2792f065984461e65b91d0fdaafc17a2"
+dependencies = [
+ "cookie",
+ "either",
+ "futures",
+ "http",
+ "hyper",
+ "indexmap",
+ "log",
+ "memchr",
+ "pear",
+ "percent-encoding",
+ "pin-project-lite",
+ "ref-cast",
+ "serde",
+ "smallvec",
+ "stable-pattern",
+ "state",
+ "time 0.3.14",
+ "tokio",
+ "uncased",
+]
+
+[[package]]
+name = "rocket_sync_db_pools"
+version = "0.1.0-rc.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5fa48b6ab25013e9812f1b0c592741900b3a2a83c0936292e0565c0ac842f558"
+dependencies = [
+ "diesel",
+ "r2d2",
+ "rocket",
+ "rocket_sync_db_pools_codegen",
+ "serde",
+ "tokio",
+]
+
+[[package]]
+name = "rocket_sync_db_pools_codegen"
+version = "0.1.0-rc.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "280ef2d232923e69cb93da156972eb5476a7cce5ba44843f6608f46a4abf7aab"
+dependencies = [
+ "devise",
+ "quote",
+]
+
+[[package]]
+name = "ron"
+version = "0.6.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "86018df177b1beef6c7c8ef949969c4f7cb9a9344181b92486b23c79995bdaa4"
+dependencies = [
+ "base64 0.13.0",
+ "bitflags",
+ "serde",
+]
+
+[[package]]
+name = "ron"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "88073939a61e5b7680558e6be56b419e208420c2adb92be54921fa6b72283f1a"
+dependencies = [
+ "base64 0.13.0",
+ "bitflags",
+ "serde",
+]
+
+[[package]]
+name = "rss"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "02e70d6ae72f8a4333af8ce9dce58942020528430eb0d46ee2fcb5e8d4d16377"
+dependencies = [
+ "atom_syndication",
+ "derive_builder",
+ "quick-xml",
+]
+
+[[package]]
+name = "rustc-demangle"
+version = "0.1.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342"
+
+[[package]]
+name = "rustc-hash"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
+
+[[package]]
+name = "rustc_version"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
+dependencies = [
+ "semver 1.0.13",
+]
+
+[[package]]
+name = "rustix"
+version = "0.36.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "203974af07ea769452490ee8de3e5947971efc3a090dca8a779dd432d3fa46a7"
+dependencies = [
+ "bitflags",
+ "errno",
+ "io-lifetimes",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys 0.42.0",
+]
+
+[[package]]
+name = "rustls"
+version = "0.20.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5aab8ee6c7097ed6057f43c187a62418d0c05a4bd5f18b3571db50ee0f9ce033"
+dependencies = [
+ "log",
+ "ring",
+ "sct",
+ "webpki",
+]
+
+[[package]]
+name = "rustls-pemfile"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0864aeff53f8c05aa08d86e5ef839d3dfcf07aeba2db32f12db0ef716e87bd55"
+dependencies = [
+ "base64 0.13.0",
+]
+
+[[package]]
+name = "rustversion"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8"
+
+[[package]]
+name = "rustyline"
+version = "10.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d1cd5ae51d3f7bf65d7969d579d502168ef578f289452bd8ccc91de28fda20e"
+dependencies = [
+ "bitflags",
+ "cfg-if 1.0.0",
+ "clipboard-win",
+ "dirs-next",
+ "fd-lock",
+ "libc",
+ "log",
+ "memchr",
+ "nix 0.24.2",
+ "radix_trie",
+ "scopeguard",
+ "unicode-segmentation",
+ "unicode-width",
+ "utf8parse",
+ "winapi",
+]
+
+[[package]]
+name = "ryu"
+version = "1.0.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09"
+
+[[package]]
+name = "schannel"
+version = "0.1.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2"
+dependencies = [
+ "lazy_static",
+ "windows-sys 0.36.1",
+]
+
+[[package]]
+name = "scheduled-thread-pool"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "977a7519bff143a44f842fd07e80ad1329295bd71686457f18e496736f4bf9bf"
+dependencies = [
+ "parking_lot 0.12.1",
+]
+
+[[package]]
+name = "scoped-tls"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2"
+
+[[package]]
+name = "scopeguard"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+
+[[package]]
+name = "sct"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
+[[package]]
+name = "security-framework"
+version = "2.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c"
+dependencies = [
+ "bitflags",
+ "core-foundation 0.9.3",
+ "core-foundation-sys 0.8.3",
+ "libc",
+ "security-framework-sys",
+]
+
+[[package]]
+name = "security-framework-sys"
+version = "2.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556"
+dependencies = [
+ "core-foundation-sys 0.8.3",
+ "libc",
+]
+
+[[package]]
+name = "self_update"
+version = "0.27.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6fb85f1802f7b987237b8525c0fde86ea86f31c957c1875467c727d5b921179c"
+dependencies = [
+ "hyper",
+ "indicatif 0.15.0",
+ "log",
+ "quick-xml",
+ "regex",
+ "reqwest",
+ "semver 0.11.0",
+ "serde_json",
+ "tempfile",
+ "zip",
+]
+
+[[package]]
+name = "semver"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6"
+dependencies = [
+ "semver-parser",
+]
+
+[[package]]
+name = "semver"
+version = "1.0.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93f6841e709003d68bb2deee8c343572bf446003ec20a583e76f7b15cebf3711"
+
+[[package]]
+name = "semver-parser"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7"
+dependencies = [
+ "pest",
+]
+
+[[package]]
+name = "serde"
+version = "1.0.144"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0f747710de3dcd43b88c9168773254e809d8ddbdf9653b84e2554ab219f17860"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.144"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94ed3a816fb1d101812f83e789f888322c34e291f894f19590dc310963e87a00"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.85"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_path_to_error"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "184c643044780f7ceb59104cef98a5a6f12cb2288a7bc701ab93a362b49fd47d"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "serde_urlencoded"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
+dependencies = [
+ "form_urlencoded",
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "sha2"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf9db03534dff993187064c4e0c05a5708d2a9728ace9a8959b77bedf415dac5"
+dependencies = [
+ "cfg-if 1.0.0",
+ "cpufeatures",
+ "digest",
+]
+
+[[package]]
+name = "sharded-slab"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "signal-hook-registry"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "simple_asn1"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "692ca13de57ce0613a363c8c2f1de925adebc81b04c923ac60c5488bb44abe4b"
+dependencies = [
+ "chrono",
+ "num-bigint",
+ "num-traits",
+]
+
+[[package]]
+name = "siphasher"
+version = "0.3.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de"
+
+[[package]]
+name = "slab"
+version = "0.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "slotmap"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342"
+dependencies = [
+ "version_check",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1"
+
+[[package]]
+name = "smithay-client-toolkit"
+version = "0.15.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a28f16a97fa0e8ce563b2774d1e732dd5d4025d2772c5dba0a41a0f90a29da3"
+dependencies = [
+ "bitflags",
+ "calloop",
+ "dlib",
+ "lazy_static",
+ "log",
+ "memmap2 0.3.1",
+ "nix 0.22.3",
+ "pkg-config",
+ "wayland-client",
+ "wayland-cursor",
+ "wayland-protocols",
+]
+
+[[package]]
+name = "smithay-client-toolkit"
+version = "0.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f307c47d32d2715eb2e0ece5589057820e0e5e70d07c247d1063e844e107f454"
+dependencies = [
+ "bitflags",
+ "dlib",
+ "lazy_static",
+ "log",
+ "memmap2 0.5.7",
+ "nix 0.24.2",
+ "pkg-config",
+ "wayland-client",
+ "wayland-cursor",
+ "wayland-protocols",
+]
+
+[[package]]
+name = "smithay-clipboard"
+version = "0.6.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0a345c870a1fae0b1b779085e81b51e614767c239e93503588e54c5b17f4b0e8"
+dependencies = [
+ "smithay-client-toolkit 0.16.0",
+ "wayland-client",
+]
+
+[[package]]
+name = "snafu"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5177903bf45656592d9eb5c0e22f408fc023aae51dbe2088889b71633ba451f2"
+dependencies = [
+ "backtrace",
+ "doc-comment",
+ "snafu-derive",
+]
+
+[[package]]
+name = "snafu-derive"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "410b26ed97440d90ced3e2488c868d56a86e2064f5d7d6f417909b286afe25e5"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "socket2"
+version = "0.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "spin"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
+
+[[package]]
+name = "spin"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f6002a767bff9e83f8eeecf883ecb8011875a21ae8da43bffb817a57e78cc09"
+
+[[package]]
+name = "spirv"
+version = "0.2.0+1.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "246bfa38fe3db3f1dfc8ca5a2cdeb7348c78be2112740cc0ec8ef18b6d94f830"
+dependencies = [
+ "bitflags",
+ "num-traits",
+]
+
+[[package]]
+name = "stable-pattern"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4564168c00635f88eaed410d5efa8131afa8d8699a612c80c455a0ba05c21045"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "stable_deref_trait"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
+
+[[package]]
+name = "state"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b"
+dependencies = [
+ "loom",
+]
+
+[[package]]
+name = "static_assertions"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+
+[[package]]
+name = "str-buf"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0"
+
+[[package]]
+name = "string_cache"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "213494b7a2b503146286049378ce02b482200519accc31872ee8be91fa820a08"
+dependencies = [
+ "new_debug_unreachable",
+ "once_cell",
+ "parking_lot 0.12.1",
+ "phf_shared 0.10.0",
+ "precomputed-hash",
+ "serde",
+]
+
+[[package]]
+name = "string_cache_codegen"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988"
+dependencies = [
+ "phf_generator 0.10.0",
+ "phf_shared 0.10.0",
+ "proc-macro2",
+ "quote",
+]
+
+[[package]]
+name = "strip_markdown"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32c754386109f9adc8ca62513c51cf81cc2d8502588064103aa8e9f69b4276da"
+dependencies = [
+ "log",
+ "pulldown-cmark 0.7.2",
+]
+
+[[package]]
+name = "strsim"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c"
+
+[[package]]
+name = "strsim"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
+
+[[package]]
+name = "subtle"
+version = "2.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601"
+
+[[package]]
+name = "surge-ping"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4d33636a95261e9f939742d4712b20f8813a9b3cfaf1510b751096329cd3902b"
+dependencies = [
+ "hex",
+ "parking_lot 0.12.1",
+ "pnet_packet",
+ "rand 0.8.5",
+ "socket2",
+ "thiserror",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "svg_fmt"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fb1df15f412ee2e9dfc1c504260fa695c1c3f10fe9f4a6ee2d2184d7d6450e2"
+
+[[package]]
+name = "syn"
+version = "1.0.99"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "tempfile"
+version = "3.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4"
+dependencies = [
+ "cfg-if 1.0.0",
+ "fastrand",
+ "libc",
+ "redox_syscall",
+ "remove_dir_all",
+ "winapi",
+]
+
+[[package]]
+name = "tendril"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0"
+dependencies = [
+ "futf",
+ "mac",
+ "utf-8",
+]
+
+[[package]]
+name = "termcolor"
+version = "1.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "terminal_size"
+version = "0.1.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "textwrap"
+version = "0.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb"
+
+[[package]]
+name = "thiserror"
+version = "1.0.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c1b05ca9d106ba7d2e31a9dab4a64e7be2cce415321966ea3132c49a656e252"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e8f2591983642de85c921015f3f070c665a197ed69e417af436115e3a1407487"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "thread_local"
+version = "1.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180"
+dependencies = [
+ "once_cell",
+]
+
+[[package]]
+name = "time"
+version = "0.1.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255"
+dependencies = [
+ "libc",
+ "wasi 0.10.0+wasi-snapshot-preview1",
+ "winapi",
+]
+
+[[package]]
+name = "time"
+version = "0.3.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c3f9a28b618c3a6b9251b6908e9c99e04b9e5c02e6581ccbb67d59c34ef7f9b"
+dependencies = [
+ "itoa",
+ "libc",
+ "num_threads",
+ "time-macros",
+]
+
+[[package]]
+name = "time-macros"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792"
+
+[[package]]
+name = "tinyvec"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+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 = "1.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89797afd69d206ccd11fb0ea560a44bbb87731d020670e79416d442919257d42"
+dependencies = [
+ "autocfg",
+ "bytes",
+ "libc",
+ "memchr",
+ "mio",
+ "num_cpus",
+ "once_cell",
+ "pin-project-lite",
+ "signal-hook-registry",
+ "socket2",
+ "tokio-macros",
+ "winapi",
+]
+
+[[package]]
+name = "tokio-macros"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "tokio-native-tls"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b"
+dependencies = [
+ "native-tls",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-rustls"
+version = "0.23.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59"
+dependencies = [
+ "rustls",
+ "tokio",
+ "webpki",
+]
+
+[[package]]
+name = "tokio-stream"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df54d54117d6fdc4e4fea40fe1e4e566b3505700e148a6827e59b34b0d2600d9"
+dependencies = [
+ "futures-core",
+ "pin-project-lite",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-util"
+version = "0.6.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "log",
+ "pin-project-lite",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-util"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "pin-project-lite",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "toml"
+version = "0.5.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "tower-service"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
+
+[[package]]
+name = "tracing"
+version = "0.1.36"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2fce9567bd60a67d08a16488756721ba392f24f29006402881e43b19aac64307"
+dependencies = [
+ "cfg-if 1.0.0",
+ "log",
+ "pin-project-lite",
+ "tracing-attributes",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-appender"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09d48f71a791638519505cefafe162606f706c25592e4bde4d97600c0195312e"
+dependencies = [
+ "crossbeam-channel",
+ "time 0.3.14",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "tracing-attributes"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "11c75893af559bc8e10716548bdef5cb2b983f8e637db9d0e15126b61b484ee2"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5aeea4303076558a00714b823f9ad67d58a3bbda1df83d8827d21193156e22f7"
+dependencies = [
+ "once_cell",
+ "valuable",
+]
+
+[[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 = "tracing-log"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922"
+dependencies = [
+ "lazy_static",
+ "log",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-subscriber"
+version = "0.3.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60db860322da191b40952ad9affe65ea23e7dd6a5c442c2c42865810c6ab8e6b"
+dependencies = [
+ "ansi_term",
+ "matchers",
+ "once_cell",
+ "regex",
+ "sharded-slab",
+ "smallvec",
+ "thread_local",
+ "time 0.3.14",
+ "tracing",
+ "tracing-core",
+ "tracing-log",
+]
+
+[[package]]
+name = "try-lock"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642"
+
+[[package]]
+name = "ttf-parser"
+version = "0.15.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b3e06c9b9d80ed6b745c7159c40b311ad2916abb34a49e9be2653b90db0d8dd"
+
+[[package]]
+name = "twox-hash"
+version = "1.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675"
+dependencies = [
+ "cfg-if 1.0.0",
+ "rand 0.8.5",
+ "static_assertions",
+]
+
+[[package]]
+name = "typenum"
+version = "1.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987"
+
+[[package]]
+name = "ubyte"
+version = "0.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c81f0dae7d286ad0d9366d7679a77934cfc3cf3a8d67e82669794412b2368fe6"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "ucd-trie"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81"
+
+[[package]]
+name = "uncased"
+version = "0.9.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09b01702b0fd0b3fadcf98e098780badda8742d4f4a7676615cad90e8ac73622"
+dependencies = [
+ "serde",
+ "version_check",
+]
+
+[[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.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf"
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "854cbdc4f7bc6ae19c820d44abdc3277ac3e1b2b93db20a636825d9322fb60e6"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "unicode-segmentation"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99"
+
+[[package]]
+name = "unicode-width"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973"
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04"
+
+[[package]]
+name = "universal-hash"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05"
+dependencies = [
+ "generic-array",
+ "subtle",
+]
+
+[[package]]
+name = "untrusted"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
+
+[[package]]
+name = "url"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22fe195a4f217c25b25cb5058ced57059824a678474874038dc88d211bf508d3"
+dependencies = [
+ "form_urlencoded",
+ "idna",
+ "percent-encoding",
+ "serde",
+]
+
+[[package]]
+name = "utf-8"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
+
+[[package]]
+name = "utf8parse"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "936e4b492acfd135421d8dca4b1aa80a7bfc26e702ef3af710e0752684df5372"
+
+[[package]]
+name = "valuable"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
+
+[[package]]
+name = "vcpkg"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+
+[[package]]
+name = "veloren-serverbrowser-api"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b25e966b27a95a55d4903c4646dc55ffdf59f23bef7e27978b97fa92fd64ca27"
+dependencies = [
+ "country-parser",
+ "serde",
+]
+
+[[package]]
+name = "version_check"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+[[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.9.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
+
+[[package]]
+name = "wasi"
+version = "0.10.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
+
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.82"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc7652e3f6c4706c8d9cd54832c4a4ccb9b5336e2c3bd154d5cccfbf1c1f5f7d"
+dependencies = [
+ "cfg-if 1.0.0",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.82"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "662cd44805586bd52971b9586b1df85cdbbd9112e4ef4d8f41559c334dc6ac3f"
+dependencies = [
+ "bumpalo",
+ "log",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-futures"
+version = "0.4.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa76fb221a1f8acddf5b54ace85912606980ad661ac7a503b4570ffd3a624dad"
+dependencies = [
+ "cfg-if 1.0.0",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.82"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b260f13d3012071dfb1512849c033b1925038373aea48ced3012c09df952c602"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.82"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5be8e654bdd9b79216c2929ab90721aa82faf65c48cdf08bdc4e7f51357b80da"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.82"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6598dd0bd3c7d51095ff6531a5b23e02acdc81804e30d8f07afb77b7215a140a"
+
+[[package]]
+name = "wasm-timer"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f"
+dependencies = [
+ "futures",
+ "js-sys",
+ "parking_lot 0.11.2",
+ "pin-utils",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+]
+
+[[package]]
+name = "wayland-client"
+version = "0.29.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715"
+dependencies = [
+ "bitflags",
+ "downcast-rs",
+ "libc",
+ "nix 0.24.2",
+ "scoped-tls",
+ "wayland-commons",
+ "wayland-scanner",
+ "wayland-sys",
+]
+
+[[package]]
+name = "wayland-commons"
+version = "0.29.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8691f134d584a33a6606d9d717b95c4fa20065605f798a3f350d78dced02a902"
+dependencies = [
+ "nix 0.24.2",
+ "once_cell",
+ "smallvec",
+ "wayland-sys",
+]
+
+[[package]]
+name = "wayland-cursor"
+version = "0.29.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6865c6b66f13d6257bef1cd40cbfe8ef2f150fb8ebbdb1e8e873455931377661"
+dependencies = [
+ "nix 0.24.2",
+ "wayland-client",
+ "xcursor",
+]
+
+[[package]]
+name = "wayland-protocols"
+version = "0.29.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6"
+dependencies = [
+ "bitflags",
+ "wayland-client",
+ "wayland-commons",
+ "wayland-scanner",
+]
+
+[[package]]
+name = "wayland-scanner"
+version = "0.29.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "xml-rs",
+]
+
+[[package]]
+name = "wayland-sys"
+version = "0.29.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be12ce1a3c39ec7dba25594b97b42cb3195d54953ddb9d3d95a7c3902bc6e9d4"
+dependencies = [
+ "dlib",
+ "lazy_static",
+ "pkg-config",
+]
+
+[[package]]
+name = "web-sys"
+version = "0.3.57"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b17e741662c70c8bd24ac5c5b18de314a2c26c32bf8346ee1e6f53de919c283"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "webpki"
+version = "0.22.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
+[[package]]
+name = "webpki-roots"
+version = "0.22.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1c760f0d366a6c24a02ed7816e23e691f5d92291f94d15e836006fd11b04daf"
+dependencies = [
+ "webpki",
+]
+
+[[package]]
+name = "weezl"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb"
+
+[[package]]
+name = "wgpu"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b97cd781ff044d6d697b632a2e212032c2e957d1afaa21dbf58069cbb8f78567"
+dependencies = [
+ "arrayvec",
+ "js-sys",
+ "log",
+ "naga",
+ "parking_lot 0.11.2",
+ "raw-window-handle 0.4.3",
+ "smallvec",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+ "wgpu-core",
+ "wgpu-hal",
+ "wgpu-types",
+]
+
+[[package]]
+name = "wgpu-core"
+version = "0.12.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4688c000eb841ca55f7b35db659b78d6e1cd77d7caf8fb929f4e181f754047d"
+dependencies = [
+ "arrayvec",
+ "bitflags",
+ "cfg_aliases",
+ "codespan-reporting",
+ "copyless",
+ "fxhash",
+ "log",
+ "naga",
+ "parking_lot 0.11.2",
+ "profiling",
+ "raw-window-handle 0.4.3",
+ "smallvec",
+ "thiserror",
+ "wgpu-hal",
+ "wgpu-types",
+]
+
+[[package]]
+name = "wgpu-hal"
+version = "0.12.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d684ea6a34974a2fc19f1dfd183d11a62e22d75c4f187a574bb1224df8e056c2"
+dependencies = [
+ "arrayvec",
+ "ash",
+ "bit-set",
+ "bitflags",
+ "block",
+ "core-graphics-types",
+ "d3d12",
+ "foreign-types",
+ "fxhash",
+ "glow",
+ "gpu-alloc",
+ "gpu-descriptor",
+ "inplace_it",
+ "js-sys",
+ "khronos-egl",
+ "libloading",
+ "log",
+ "metal",
+ "naga",
+ "objc",
+ "parking_lot 0.11.2",
+ "profiling",
+ "range-alloc",
+ "raw-window-handle 0.4.3",
+ "renderdoc-sys",
+ "thiserror",
+ "wasm-bindgen",
+ "web-sys",
+ "wgpu-types",
+ "winapi",
+]
+
+[[package]]
+name = "wgpu-types"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "549533d9e1cdd4b4cda7718d33ff500fc4c34b5467b71d76b547ae0324f3b2a2"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "wgpu_glyph"
+version = "0.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8134edb15ae465caf308125646c9e98bdef7398cdefc69227ac77a5eb795e7fe"
+dependencies = [
+ "bytemuck",
+ "glyph_brush",
+ "log",
+ "wgpu",
+]
+
+[[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-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-util"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "winapi-wsapoll"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44c17110f57155602a80dca10be03852116403c9ff3cd25b079d666f2aa3df6e"
+dependencies = [
+ "winapi",
+]
+
+[[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 = "window_clipboard"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b47d7fb4df5cd1fea61e5ee3841380f54359bac814e227d8f72709f4f193f8cf"
+dependencies = [
+ "clipboard-win",
+ "clipboard_macos",
+ "clipboard_wayland",
+ "clipboard_x11",
+ "raw-window-handle 0.3.4",
+ "thiserror",
+]
+
+[[package]]
+name = "windows"
+version = "0.32.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fbedf6db9096bc2364adce0ae0aa636dcd89f3c3f2cd67947062aaf0ca2a10ec"
+dependencies = [
+ "windows_aarch64_msvc 0.32.0",
+ "windows_i686_gnu 0.32.0",
+ "windows_i686_msvc 0.32.0",
+ "windows_x86_64_gnu 0.32.0",
+ "windows_x86_64_msvc 0.32.0",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.36.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2"
+dependencies = [
+ "windows_aarch64_msvc 0.36.1",
+ "windows_i686_gnu 0.36.1",
+ "windows_i686_msvc 0.36.1",
+ "windows_x86_64_gnu 0.36.1",
+ "windows_x86_64_msvc 0.36.1",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc 0.42.0",
+ "windows_i686_gnu 0.42.0",
+ "windows_i686_msvc 0.42.0",
+ "windows_x86_64_gnu 0.42.0",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc 0.42.0",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.32.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.36.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.32.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.36.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.32.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.36.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.32.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.36.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.32.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.36.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5"
+
+[[package]]
+name = "winit"
+version = "0.26.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b43cc931d58b99461188607efd7acb2a093e65fc621f54cad78517a6063e73a"
+dependencies = [
+ "bitflags",
+ "cocoa",
+ "core-foundation 0.9.3",
+ "core-graphics 0.22.3",
+ "core-video-sys",
+ "dispatch",
+ "instant",
+ "lazy_static",
+ "libc",
+ "log",
+ "mio",
+ "ndk",
+ "ndk-glue",
+ "ndk-sys",
+ "objc",
+ "parking_lot 0.11.2",
+ "percent-encoding",
+ "raw-window-handle 0.4.3",
+ "smithay-client-toolkit 0.15.4",
+ "wasm-bindgen",
+ "wayland-client",
+ "wayland-protocols",
+ "web-sys",
+ "winapi",
+ "x11-dl",
+]
+
+[[package]]
+name = "winreg"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "winres"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c"
+dependencies = [
+ "toml",
+]
+
+[[package]]
+name = "x11-dl"
+version = "2.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c83627bc137605acc00bb399c7b908ef460b621fc37c953db2b09f88c449ea6"
+dependencies = [
+ "lazy_static",
+ "libc",
+ "pkg-config",
+]
+
+[[package]]
+name = "x11rb"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e99be55648b3ae2a52342f9a870c0e138709a3493261ce9b469afe6e4df6d8a"
+dependencies = [
+ "gethostname",
+ "nix 0.22.3",
+ "winapi",
+ "winapi-wsapoll",
+]
+
+[[package]]
+name = "xcursor"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "463705a63313cd4301184381c5e8042f0a7e9b4bb63653f216311d4ae74690b7"
+dependencies = [
+ "nom",
+]
+
+[[package]]
+name = "xi-unicode"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a67300977d3dc3f8034dae89778f502b6ba20b269527b3223ba59c0cf393bb8a"
+
+[[package]]
+name = "xml-rs"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3"
+
+[[package]]
+name = "xml5ever"
+version = "0.16.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9234163818fd8e2418fcde330655e757900d4236acd8cc70fef345ef91f6d865"
+dependencies = [
+ "log",
+ "mac",
+ "markup5ever",
+ "time 0.1.44",
+]
+
+[[package]]
+name = "yansi"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec"
+
+[[package]]
+name = "zip"
+version = "0.5.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93ab48844d61251bb3835145c521d88aa4031d7139e8485990f60ca911fa0815"
+dependencies = [
+ "byteorder",
+ "bzip2",
+ "crc32fast",
+ "flate2",
+ "thiserror",
+ "time 0.1.44",
+]
diff --git a/nixpkgs/pkgs/games/airshipper/default.nix b/nixpkgs/pkgs/games/airshipper/default.nix
new file mode 100644
index 000000000000..d2f80e96fdcb
--- /dev/null
+++ b/nixpkgs/pkgs/games/airshipper/default.nix
@@ -0,0 +1,121 @@
+{ lib
+, rustPlatform
+, fetchFromGitLab
+, fetchpatch
+, openssl
+, libGL
+, vulkan-loader
+, wayland
+, wayland-protocols
+, libxkbcommon
+, libX11
+, libXrandr
+, libXi
+, libXcursor
+, udev
+, alsa-lib
+, stdenv
+, libxcb
+, pkg-config
+, makeWrapper
+, writeShellScript
+, patchelf
+}:
+let
+  version = "0.10.0";
+  # Patch for airshipper to install veloren
+  patch = let
+    runtimeLibs = [
+      udev
+      alsa-lib
+      stdenv.cc.cc.lib
+      libxkbcommon
+      libxcb
+      libX11
+      libXcursor
+      libXrandr
+      libXi
+      vulkan-loader
+      libGL
+    ];
+  in
+    writeShellScript "patch" ''
+      echo "making binaries executable"
+      chmod +x {veloren-voxygen,veloren-server-cli}
+      echo "patching dynamic linkers"
+      ${patchelf}/bin/patchelf \
+        --set-interpreter "${stdenv.cc.bintools.dynamicLinker}" \
+        veloren-server-cli
+      ${patchelf}/bin/patchelf \
+        --set-interpreter "${stdenv.cc.bintools.dynamicLinker}" \
+        --set-rpath "${lib.makeLibraryPath runtimeLibs}" \
+        veloren-voxygen
+  '';
+in
+rustPlatform.buildRustPackage {
+  pname = "airshipper";
+  inherit version;
+
+  src = fetchFromGitLab {
+    owner = "Veloren";
+    repo = "airshipper";
+    rev = "v${version}";
+    sha256 = "sha256-5zP1Ye1fJNQp8eWKwdxLqBr4qzBfWEEBsJ9s7+8idL4=";
+  };
+
+  cargoLock = {
+    lockFile = ./Cargo.lock;
+    outputHashes = {
+      "octocrab-0.15.4" = "sha256-uKHLlb0EyWF0Ho8FP38DFZsEWXiAG8FEYzJgwO9W90U=";
+    };
+  };
+
+  buildInputs = [
+    openssl
+    wayland
+    wayland-protocols
+    libxkbcommon
+    libX11
+    libXrandr
+    libXi
+    libXcursor
+  ];
+  nativeBuildInputs = [ pkg-config makeWrapper ];
+
+  RUSTC_BOOTSTRAP = 1; # We need rust unstable features
+
+  postInstall = ''
+    install -Dm444 -t "$out/share/applications" "client/assets/net.veloren.airshipper.desktop"
+    install -Dm444    "client/assets/net.veloren.airshipper.png"  "$out/share/icons/net.veloren.airshipper.png"
+  '';
+
+  postFixup =
+    let
+      libPath = lib.makeLibraryPath [
+        libGL
+        vulkan-loader
+        wayland
+        wayland-protocols
+        libxkbcommon
+        libX11
+        libXrandr
+        libXi
+        libXcursor
+      ];
+    in
+    ''
+      patchelf --set-rpath "${libPath}" "$out/bin/airshipper"
+      wrapProgram "$out/bin/airshipper" --set VELOREN_PATCHER "${patch}"
+    '';
+
+  doCheck = false;
+  cargoBuildFlags = [ "--package" "airshipper" ];
+  cargoTestFlags = [ "--package" "airshipper" ];
+
+  meta = with lib; {
+    description = "Provides automatic updates for the voxel RPG Veloren.";
+    homepage = "https://www.veloren.net";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ yusdacra ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/airstrike/default.nix b/nixpkgs/pkgs/games/airstrike/default.nix
new file mode 100644
index 000000000000..8441ac7a2fee
--- /dev/null
+++ b/nixpkgs/pkgs/games/airstrike/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv, fetchurl, makeWrapper, SDL, SDL_image }:
+
+stdenv.mkDerivation rec {
+  pname = "airstrike-pre";
+  version = "6a";
+
+  src = fetchurl {
+    url = "https://icculus.org/airstrike/airstrike-pre${version}-src.tar.gz";
+    sha256 = "1h6rv2zcp84ycmd0kv1pbpqjgwx57dw42x7878d2c2vnpi5jn8qi";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ SDL SDL_image ];
+
+  NIX_LDFLAGS = "-lm";
+
+  installPhase = ''
+    ls -l
+    mkdir -p $out/bin
+    cp airstrike $out/bin
+
+    mkdir -p $out/share
+    cp -r data airstrikerc $out/share
+
+    wrapProgram $out/bin/airstrike \
+      --chdir "$out/share"
+  '';
+
+  meta = with lib; {
+    description = "A 2d dogfighting game";
+    homepage = "https://icculus.org/airstrike/";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ pSub ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/alienarena/default.nix b/nixpkgs/pkgs/games/alienarena/default.nix
new file mode 100644
index 000000000000..39b232b267c3
--- /dev/null
+++ b/nixpkgs/pkgs/games/alienarena/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv, fetchsvn, pkg-config, libjpeg, libX11, libXxf86vm, curl, libogg
+, libvorbis, freetype, openal, libGL }:
+
+stdenv.mkDerivation rec {
+  pname = "alienarena";
+  version = "7.71.2";
+
+  src = fetchsvn {
+    url = "svn://svn.icculus.org/alienarena/trunk";
+    rev = "5673";
+    sha256 = "1qfrgrp7nznk5n1jqvjba6l1w8y2ixzyx9swkpvd02rdwlwrp9kw";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ libjpeg libX11 curl libogg libvorbis
+                  freetype openal libGL libXxf86vm ];
+
+  patchPhase = ''
+    substituteInPlace ./configure \
+      --replace libopenal.so.1 ${openal}/lib/libopenal.so.1 \
+      --replace libGL.so.1 ${libGL}/lib/libGL.so.1
+  '';
+
+  meta = with lib; {
+    description = "A free, stand-alone first-person shooter computer game";
+    longDescription = ''
+      Do you like old school deathmatch with modern features? How
+      about rich, colorful, arcade-like atmospheres? How about retro
+      Sci-Fi? Then you're going to love what Alien Arena has in store
+      for you! This game combines some of the very best aspects of
+      such games as Quake III and Unreal Tournament and wraps them up
+      with a retro alien theme, while adding tons of original ideas to
+      make the game quite unique.
+    '';
+    homepage = "http://red.planetarena.org";
+    # Engine is under GPLv2, everything else is under
+    license = licenses.unfreeRedistributable;
+    maintainers = with maintainers; [ astsmtl ];
+    platforms = platforms.linux;
+    hydraPlatforms = [];
+  };
+}
diff --git a/nixpkgs/pkgs/games/amoeba/data.nix b/nixpkgs/pkgs/games/amoeba/data.nix
new file mode 100644
index 000000000000..193c710b31a1
--- /dev/null
+++ b/nixpkgs/pkgs/games/amoeba/data.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, fetchurl }:
+
+stdenv.mkDerivation rec {
+  pname = "amoeba-data";
+  version = "1.1";
+
+  src = fetchurl {
+    url = "http://http.debian.net/debian/pool/non-free/a/amoeba-data/amoeba-data_${version}.orig.tar.gz";
+    sha256 = "1bgclr1v63n14bj9nwzm5zxg48nm0cla9bq1rbd5ylxra18k0jbg";
+  };
+
+  installPhase = ''
+    mkdir -p $out/share/amoeba
+    cp demo.dat $out/share/amoeba/
+  '';
+
+  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;
+    maintainers = [ maintainers.dezgeg ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/games/amoeba/default.nix b/nixpkgs/pkgs/games/amoeba/default.nix
new file mode 100644
index 000000000000..445c86c3bd16
--- /dev/null
+++ b/nixpkgs/pkgs/games/amoeba/default.nix
@@ -0,0 +1,45 @@
+{ lib, stdenv, fetchurl, amoeba-data, alsa-lib, expat, freetype, gtk3, libvorbis, libGLU, xorg, pkg-config, installShellFiles }:
+
+stdenv.mkDerivation rec {
+  pname = "amoeba";
+  version = "1.1";
+  debver = "31";
+
+  srcs = [
+    (fetchurl {
+      url = "http://http.debian.net/debian/pool/contrib/a/amoeba/amoeba_${version}.orig.tar.gz";
+      hash = "sha256-NT6oMuAlTcVZEnYjMCF+BD+k3/w7LfWEmj6bkQln3sM=";
+    })
+    (fetchurl {
+      url = "http://http.debian.net/debian/pool/contrib/a/amoeba/amoeba_${version}-${debver}.debian.tar.xz";
+      hash = "sha256-Ga/YeXbPXjkG/6qd9Z201d14Hlj/Je6DxgzeIQOqrWc=";
+    })
+  ];
+  sourceRoot = "amoeba-1.1.orig";
+
+  prePatch = ''
+    patches="${./include-string-h.patch} $(echo ../debian/patches/*.diff)"
+  '';
+  postPatch = ''
+    sed -i packer/pakfile.cpp -e 's|/usr/share/amoeba|${amoeba-data}/share/amoeba|'
+    sed -i main/linux-config/linux-config.cpp -e 's|libgdk-x11-2.0.so.0|${gtk3}/lib/&|'
+    sed -i main/linux-config/linux-config.cpp -e 's|libgtk-x11-2.0.so.0|${gtk3}/lib/&|'
+  '';
+
+  nativeBuildInputs = [ pkg-config installShellFiles ];
+  buildInputs = [ alsa-lib expat freetype gtk3 libvorbis libGLU xorg.libXxf86vm ];
+
+  installPhase = ''
+    mkdir -p $out/bin
+    cp amoeba $out/bin/
+    installManPage ../debian/amoeba.1
+  '';
+
+  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
+    maintainers = [ maintainers.dezgeg ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/amoeba/include-string-h.patch b/nixpkgs/pkgs/games/amoeba/include-string-h.patch
new file mode 100644
index 000000000000..828cab88d989
--- /dev/null
+++ b/nixpkgs/pkgs/games/amoeba/include-string-h.patch
@@ -0,0 +1,12 @@
+diff --git a/image/png_image.cpp b/image/png_image.cpp
+index 37875fc..1531d6f 100644
+--- a/image/png_image.cpp
++++ b/image/png_image.cpp
+@@ -4,6 +4,7 @@
+ 
+ #include <stdio.h>
+ #include <stdlib.h>
++#include <string.h>
+ 
+ #include <png.h>
+ #include "png_image.h"
diff --git a/nixpkgs/pkgs/games/among-sus/default.nix b/nixpkgs/pkgs/games/among-sus/default.nix
new file mode 100644
index 000000000000..be9ecc7adf57
--- /dev/null
+++ b/nixpkgs/pkgs/games/among-sus/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, fetchFromSourcehut, port ? "1234" }:
+
+stdenv.mkDerivation {
+  pname = "among-sus-unstable";
+  version = "2021-05-19";
+
+  src = fetchFromSourcehut {
+    owner = "~martijnbraam";
+    repo = "among-sus";
+    rev = "554e60bf52e3fa931661b9414189a92bb8f69d78";
+    sha256 = "0j1158nczhvy5i1ykvzvhlv4ndhibgng0dq1lw2bmi8q6k1q1s0w";
+  };
+
+  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/nixpkgs/pkgs/games/andyetitmoves/default.nix b/nixpkgs/pkgs/games/andyetitmoves/default.nix
new file mode 100644
index 000000000000..ecd1dfc9b3cd
--- /dev/null
+++ b/nixpkgs/pkgs/games/andyetitmoves/default.nix
@@ -0,0 +1,73 @@
+{ lib, stdenv, fetchurl, libvorbis, libogg, libtheora, SDL, libXft, SDL_image, zlib, libX11, libpng, openal, runtimeShell, requireFile, commercialVersion ? false }:
+
+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 = "${pname}-${version}_${postfix}.tar.gz";
+        demoUrl = "http://www.andyetitmoves.net/demo/${pname}Demo-${version}_${postfix}.tar.gz";
+      in
+      if commercialVersion
+      then
+        requireFile
+          {
+            message = ''
+              We cannot download the commercial version automatically, as you require a license.
+              Once you bought a license, you need to add your downloaded version to the nix store.
+              You can do this by using "nix-prefetch-url file:///\$PWD/${commercialName}" in the
+              directory where yousaved it.
+            '';
+            name = commercialName;
+            sha256 =
+              if stdenv.hostPlatform.system == "i686-linux"
+              then "15wvzmmidvykwjrbnq70h5jrvnjx1hcrm0357qj85q4aqbzavh01"
+              else "1v8z16qa9ka8sf7qq45knsxj87s6sipvv3a7xq11pb5xk08fb2ql";
+          }
+      else
+        fetchurl {
+          url = demoUrl;
+          sha256 =
+            if stdenv.hostPlatform.system == "i686-linux"
+            then "0f14vrrbq05hsbdajrb5y9za65fpng1lc8f0adb4aaz27x7sh525"
+            else "0mg41ya0b27blq3b5498kwl4rj46dj21rcd7qd0rw1kyvr7sx4v4";
+        }
+    else
+      throw "And Yet It Moves nix package only supports linux and intel cpu's.";
+
+  installPhase = ''
+    mkdir -p $out/{opt/andyetitmoves,bin}
+    cp -r * $out/opt/andyetitmoves/
+
+    fullPath=${stdenv.cc.cc.lib}/lib64
+    for i in $nativeBuildInputs; do
+      fullPath=$fullPath''${fullPath:+:}$i/lib
+    done
+
+    binName=${if commercialVersion then "AndYetItMoves" else "AndYetItMovesDemo"}
+
+    patchelf --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) --set-rpath $fullPath $out/opt/andyetitmoves/lib/$binName
+    cat > $out/bin/$binName << EOF
+    #!${runtimeShell}
+    cd $out/opt/andyetitmoves
+    exec ./lib/$binName
+    EOF
+    chmod +x $out/bin/$binName
+  '';
+
+  buildInputs = [ libvorbis libogg libtheora SDL libXft SDL_image zlib libX11 libpng openal ];
+
+  meta = with lib; {
+    description = "Physics/Gravity Platform game";
+    longDescription = ''
+      And Yet It Moves is an award-winning physics-based platform game in which players rotate the game world at will to solve challenging puzzles. Tilting the world turns walls into floors, slides into platforms, and stacks of rocks into dangerous hazards.
+    '';
+    homepage = "http://www.andyetitmoves.net/";
+    license = licenses.unfree;
+    maintainers = with maintainers; [ bluescreen303 ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/angband/default.nix b/nixpkgs/pkgs/games/angband/default.nix
new file mode 100644
index 000000000000..0b24988c54f2
--- /dev/null
+++ b/nixpkgs/pkgs/games/angband/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv, fetchFromGitHub, autoreconfHook, ncurses5
+, enableSdl2 ? false, SDL2, SDL2_image, SDL2_sound, SDL2_mixer, SDL2_ttf
+}:
+
+stdenv.mkDerivation rec {
+  pname = "angband";
+  version = "4.2.5";
+
+  src = fetchFromGitHub {
+    owner = "angband";
+    repo = "angband";
+    rev = version;
+    sha256 = "sha256-XH2FUTJJaH5TqV2UD1CKKAXE4CRAb6zfg1UQ79a15k0=";
+  };
+
+
+  nativeBuildInputs = [ autoreconfHook ];
+  buildInputs = [ ncurses5 ]
+  ++ lib.optionals enableSdl2 [
+    SDL2
+    SDL2_image
+    SDL2_sound
+    SDL2_mixer
+    SDL2_ttf
+  ];
+
+  configureFlags = lib.optional enableSdl2 "--enable-sdl2";
+
+  installFlags = [ "bindir=$(out)/bin" ];
+
+  meta = with lib; {
+    homepage = "https://angband.github.io/angband";
+    description = "A single-player roguelike dungeon exploration game";
+    maintainers = [ maintainers.kenran ];
+    license = licenses.gpl2;
+  };
+}
diff --git a/nixpkgs/pkgs/games/animatch/default.nix b/nixpkgs/pkgs/games/animatch/default.nix
new file mode 100644
index 000000000000..b6bf5473807c
--- /dev/null
+++ b/nixpkgs/pkgs/games/animatch/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, allegro5
+, cmake
+, fetchFromGitLab
+, libGL
+, stdenv
+, xorg
+}:
+stdenv.mkDerivation rec {
+  pname = "animatch";
+  version = "1.0.3";
+  src = fetchFromGitLab {
+    owner = "HolyPangolin";
+    repo = "animatch";
+    fetchSubmodules = true;
+    rev = "v${version}";
+    hash = "sha256-zBV45WMAXtCpPPbDpr04K/a9UtZ4KLP9nUauBlbhrFo=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+  ];
+
+  buildInputs = [
+    allegro5
+    libGL
+    xorg.libX11
+  ];
+
+  cmakeFlags = [
+    "-DLIBSUPERDERPY_STATIC=ON"  # recommended by upstream for coexistence with other superderpy games
+  ];
+
+  meta = {
+    homepage = "https://gitlab.com/HolyPangolin/animatch/";
+    description = "A cute match three game for the Librem 5 smartphone";
+    license = with lib.licenses; [ gpl3Plus ];
+    maintainers = with lib.maintainers; [ colinsane ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/games/anki/Cargo.lock b/nixpkgs/pkgs/games/anki/Cargo.lock
new file mode 100644
index 000000000000..d5e7ac5c2148
--- /dev/null
+++ b/nixpkgs/pkgs/games/anki/Cargo.lock
@@ -0,0 +1,6826 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "addr2line"
+version = "0.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb"
+dependencies = [
+ "gimli",
+]
+
+[[package]]
+name = "adler"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+
+[[package]]
+name = "aes"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2"
+dependencies = [
+ "cfg-if",
+ "cipher",
+ "cpufeatures",
+]
+
+[[package]]
+name = "ahash"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "version_check",
+ "zerocopy",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "1.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "allocator-api2"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5"
+
+[[package]]
+name = "ammonia"
+version = "3.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64e6d1c7838db705c9b756557ee27c384ce695a1c51a6fe528784cb1c6840170"
+dependencies = [
+ "html5ever",
+ "maplit",
+ "once_cell",
+ "tendril",
+ "url",
+]
+
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "anes"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299"
+
+[[package]]
+name = "anki"
+version = "0.0.0"
+dependencies = [
+ "ammonia",
+ "anki_i18n",
+ "anki_io",
+ "anki_proto",
+ "anki_proto_gen",
+ "anyhow",
+ "async-compression",
+ "async-stream",
+ "async-trait",
+ "axum",
+ "axum-client-ip",
+ "blake3",
+ "bytes",
+ "chrono",
+ "coarsetime",
+ "convert_case",
+ "criterion",
+ "csv",
+ "data-encoding",
+ "difflib",
+ "dirs",
+ "envy",
+ "flate2",
+ "fluent",
+ "fluent-bundle",
+ "fnv",
+ "fsrs",
+ "futures",
+ "hex",
+ "htmlescape",
+ "hyper",
+ "id_tree",
+ "inflections",
+ "itertools 0.12.0",
+ "lazy_static",
+ "nom",
+ "num_cpus",
+ "num_enum",
+ "once_cell",
+ "percent-encoding-iri",
+ "phf 0.11.2",
+ "pin-project",
+ "prettyplease",
+ "prost",
+ "prost-reflect",
+ "pulldown-cmark 0.9.3",
+ "rand 0.8.5",
+ "regex",
+ "reqwest",
+ "rusqlite",
+ "scopeguard",
+ "serde",
+ "serde-aux",
+ "serde_json",
+ "serde_repr",
+ "serde_tuple",
+ "sha1",
+ "snafu",
+ "strum",
+ "syn 2.0.39",
+ "tempfile",
+ "tokio",
+ "tokio-util",
+ "tower-http",
+ "tracing",
+ "tracing-appender",
+ "tracing-subscriber",
+ "unic-ucd-category",
+ "unicase",
+ "unicode-normalization",
+ "utime",
+ "windows 0.52.0",
+ "wiremock",
+ "zip",
+ "zstd 0.13.0",
+]
+
+[[package]]
+name = "anki-sync-server"
+version = "0.0.0"
+dependencies = [
+ "anki",
+]
+
+[[package]]
+name = "anki_i18n"
+version = "0.0.0"
+dependencies = [
+ "anki_io",
+ "anyhow",
+ "fluent",
+ "fluent-bundle",
+ "fluent-syntax",
+ "inflections",
+ "intl-memoizer",
+ "itertools 0.12.0",
+ "num-format",
+ "phf 0.11.2",
+ "serde",
+ "serde_json",
+ "unic-langid",
+]
+
+[[package]]
+name = "anki_io"
+version = "0.0.0"
+dependencies = [
+ "camino",
+ "snafu",
+ "tempfile",
+]
+
+[[package]]
+name = "anki_process"
+version = "0.0.0"
+dependencies = [
+ "itertools 0.12.0",
+ "snafu",
+]
+
+[[package]]
+name = "anki_proto"
+version = "0.0.0"
+dependencies = [
+ "anki_io",
+ "anki_proto_gen",
+ "anyhow",
+ "inflections",
+ "itertools 0.12.0",
+ "prost",
+ "prost-build",
+ "prost-reflect",
+ "prost-types",
+ "serde",
+ "snafu",
+ "strum",
+]
+
+[[package]]
+name = "anki_proto_gen"
+version = "0.0.0"
+dependencies = [
+ "anki_io",
+ "anyhow",
+ "camino",
+ "inflections",
+ "itertools 0.12.0",
+ "once_cell",
+ "prost-reflect",
+ "prost-types",
+ "regex",
+ "walkdir",
+]
+
+[[package]]
+name = "anstream"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44"
+dependencies = [
+ "anstyle",
+ "anstyle-parse",
+ "anstyle-query",
+ "anstyle-wincon",
+ "colorchoice",
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87"
+
+[[package]]
+name = "anstyle-parse"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c"
+dependencies = [
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle-query"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3a318f1f38d2418400f8209655bfd825785afd25aa30bb7ba6cc792e4596748"
+dependencies = [
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "anstyle-wincon"
+version = "3.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7"
+dependencies = [
+ "anstyle",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.75"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6"
+
+[[package]]
+name = "apple-bundles"
+version = "0.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "716b8a7bacf7325eb3e7a1a7f5ead4da91e1e16d9b56a25edea0e1e4ba21fd8e"
+dependencies = [
+ "anyhow",
+ "plist",
+ "simple-file-manifest",
+ "walkdir",
+]
+
+[[package]]
+name = "arrayref"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545"
+
+[[package]]
+name = "arrayvec"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
+
+[[package]]
+name = "ash"
+version = "0.37.3+1.3.251"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356a25ecd4a"
+dependencies = [
+ "libloading 0.7.4",
+]
+
+[[package]]
+name = "assert-json-diff"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "47e4f2b81832e72834d7518d8487a0396a28cc408186a2e8854c0f98011faf12"
+dependencies = [
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "async-channel"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35"
+dependencies = [
+ "concurrent-queue",
+ "event-listener",
+ "futures-core",
+]
+
+[[package]]
+name = "async-compression"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc2d0cfb2a7388d34f590e76686704c494ed7aaceed62ee1ba35cbf363abc2a5"
+dependencies = [
+ "futures-core",
+ "memchr",
+ "pin-project-lite",
+ "tokio",
+ "zstd 0.13.0",
+ "zstd-safe 7.0.0",
+]
+
+[[package]]
+name = "async-stream"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51"
+dependencies = [
+ "async-stream-impl",
+ "futures-core",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "async-stream-impl"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.39",
+]
+
+[[package]]
+name = "async-trait"
+version = "0.1.74"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.39",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "axum"
+version = "0.6.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf"
+dependencies = [
+ "async-trait",
+ "axum-core",
+ "axum-macros",
+ "bitflags 1.3.2",
+ "bytes",
+ "futures-util",
+ "headers",
+ "http",
+ "http-body",
+ "hyper",
+ "itoa",
+ "matchit",
+ "memchr",
+ "mime",
+ "multer",
+ "percent-encoding",
+ "pin-project-lite",
+ "rustversion",
+ "serde",
+ "serde_json",
+ "serde_path_to_error",
+ "serde_urlencoded",
+ "sync_wrapper",
+ "tokio",
+ "tower",
+ "tower-layer",
+ "tower-service",
+]
+
+[[package]]
+name = "axum-client-ip"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ef117890a418b7832678d9ea1e1c08456dd7b2fd1dadb9676cd6f0fe7eb4b21"
+dependencies = [
+ "axum",
+ "forwarded-header-value",
+ "serde",
+]
+
+[[package]]
+name = "axum-core"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c"
+dependencies = [
+ "async-trait",
+ "bytes",
+ "futures-util",
+ "http",
+ "http-body",
+ "mime",
+ "rustversion",
+ "tower-layer",
+ "tower-service",
+]
+
+[[package]]
+name = "axum-macros"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdca6a10ecad987bda04e95606ef85a5417dcaac1a78455242d72e031e2b6b62"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.39",
+]
+
+[[package]]
+name = "backtrace"
+version = "0.3.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837"
+dependencies = [
+ "addr2line",
+ "cc",
+ "cfg-if",
+ "libc",
+ "miniz_oxide",
+ "object",
+ "rustc-demangle",
+]
+
+[[package]]
+name = "base64"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
+
+[[package]]
+name = "base64"
+version = "0.21.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9"
+
+[[package]]
+name = "base64ct"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"
+
+[[package]]
+name = "bincode"
+version = "2.0.0-rc.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f11ea1a0346b94ef188834a65c068a03aec181c94896d481d7a0a40d85b0ce95"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "bit-set"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1"
+dependencies = [
+ "bit-vec",
+]
+
+[[package]]
+name = "bit-vec"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb"
+
+[[package]]
+name = "bit_field"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "bitflags"
+version = "2.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
+
+[[package]]
+name = "blake3"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0231f06152bf547e9c2b5194f247cd97aacf6dcd8b15d8e5ec0663f64580da87"
+dependencies = [
+ "arrayref",
+ "arrayvec",
+ "cc",
+ "cfg-if",
+ "constant_time_eq 0.3.0",
+]
+
+[[package]]
+name = "block"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
+
+[[package]]
+name = "block-buffer"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "block-padding"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "bstr"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "542f33a8835a0884b006a0c3df3dadd99c0c3f296ed26c2fdc8028e01ad6230c"
+dependencies = [
+ "memchr",
+ "regex-automata 0.4.3",
+ "serde",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec"
+
+[[package]]
+name = "burn"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d5008368c07b8ffc5c8bde2ebf31b59bdd263fdd825152bd0a9d333a220ba44f"
+dependencies = [
+ "burn-core",
+ "burn-train",
+]
+
+[[package]]
+name = "burn-autodiff"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "176a12ffd413ba2bfafa2b4ed1e2a21d7880b67a1ac3a9bb4919c9c0f102cdd7"
+dependencies = [
+ "burn-common",
+ "burn-tensor",
+ "burn-tensor-testgen",
+ "derive-new",
+ "spin 0.9.8",
+]
+
+[[package]]
+name = "burn-candle"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce2556eb085f2ef1cd8d0d6d932f8a64f529c5d0487ea7e4a868fe6a65e3d892"
+dependencies = [
+ "burn-tensor",
+ "candle-core",
+ "derive-new",
+ "half 2.3.1",
+]
+
+[[package]]
+name = "burn-common"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7dcb7947986d5420a9126959a5f16675f2d7b822bacc60a966fcfcf5a7dbd247"
+dependencies = [
+ "async-trait",
+ "derive-new",
+ "getrandom 0.2.11",
+ "rand 0.8.5",
+ "spin 0.9.8",
+ "uuid",
+]
+
+[[package]]
+name = "burn-compute"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08dfd31ce4d27c64358991c23a26d8aaa2d9cb0f8517c7e79d01f2fe8d6c1eb0"
+dependencies = [
+ "burn-common",
+ "derive-new",
+ "hashbrown 0.14.3",
+ "log",
+ "spin 0.9.8",
+]
+
+[[package]]
+name = "burn-core"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2067024ff50b21e29e6835a7cc8189046024fc7c174f1d2d635a4955c5151fe5"
+dependencies = [
+ "bincode",
+ "burn-autodiff",
+ "burn-candle",
+ "burn-common",
+ "burn-dataset",
+ "burn-derive",
+ "burn-fusion",
+ "burn-ndarray",
+ "burn-tch",
+ "burn-tensor",
+ "burn-wgpu",
+ "derive-new",
+ "flate2",
+ "half 2.3.1",
+ "hashbrown 0.14.3",
+ "libm",
+ "log",
+ "rand 0.8.5",
+ "rmp-serde",
+ "serde",
+ "serde_json",
+ "spin 0.9.8",
+]
+
+[[package]]
+name = "burn-dataset"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9f3481ac13ad69279d4922cf17866aa99841b76db49d9a7915a7521d772a345"
+dependencies = [
+ "csv",
+ "derive-new",
+ "dirs",
+ "gix-tempfile",
+ "image",
+ "r2d2",
+ "r2d2_sqlite",
+ "rand 0.8.5",
+ "rmp-serde",
+ "rusqlite",
+ "sanitize-filename",
+ "serde",
+ "serde_json",
+ "serde_rusqlite",
+ "strum",
+ "strum_macros",
+ "tempfile",
+ "thiserror",
+]
+
+[[package]]
+name = "burn-derive"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d44415ff69a525b49272a5ed893655441834f9ee6cac3ffe2b2387326042d8fc"
+dependencies = [
+ "derive-new",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.39",
+]
+
+[[package]]
+name = "burn-fusion"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "821663ff1f79865d6b0e998230683f72ff4351608770c07f91e39953e89fbec6"
+dependencies = [
+ "burn-common",
+ "burn-tensor",
+ "derive-new",
+ "hashbrown 0.14.3",
+ "spin 0.9.8",
+]
+
+[[package]]
+name = "burn-ndarray"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0448005c7ed6f1636ca0e12a148613fdd4d5739e1db8b241c7940140098f4fe3"
+dependencies = [
+ "burn-autodiff",
+ "burn-common",
+ "burn-tensor",
+ "derive-new",
+ "libm",
+ "matrixmultiply",
+ "ndarray",
+ "num-traits",
+ "rand 0.8.5",
+ "rayon",
+ "spin 0.9.8",
+]
+
+[[package]]
+name = "burn-tch"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "197d7276dd95abe3872fdbdfedd091730700aef7d83542ecc9d20a015791d968"
+dependencies = [
+ "burn-tensor",
+ "half 2.3.1",
+ "libc",
+ "rand 0.8.5",
+ "tch",
+]
+
+[[package]]
+name = "burn-tensor"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60f8cf3d9588047b7d221c718b7208b829fdd1050150a69d069b66e1bb6e6cbb"
+dependencies = [
+ "burn-common",
+ "burn-tensor-testgen",
+ "derive-new",
+ "half 2.3.1",
+ "hashbrown 0.14.3",
+ "libm",
+ "num-traits",
+ "rand 0.8.5",
+ "rand_distr",
+ "serde",
+]
+
+[[package]]
+name = "burn-tensor-testgen"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a555a79ab0ab974e61aee15e62e87576ca47e7df768f68145754527d31633f87"
+dependencies = [
+ "proc-macro2",
+ "quote",
+]
+
+[[package]]
+name = "burn-train"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb7defef4e44f0780d25c0aaf4d55efc96fb726b3f5d60902da682a59692359d"
+dependencies = [
+ "burn-core",
+ "derive-new",
+ "log",
+ "serde",
+ "tracing-appender",
+ "tracing-core",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "burn-wgpu"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8676fa583cfa91db6f2ed26d8e42197fd378c15ed1e8a62c07286cb88f1971ec"
+dependencies = [
+ "burn-common",
+ "burn-compute",
+ "burn-tensor",
+ "bytemuck",
+ "derive-new",
+ "futures-intrusive",
+ "hashbrown 0.14.3",
+ "log",
+ "num-traits",
+ "pollster",
+ "rand 0.8.5",
+ "serde",
+ "spin 0.9.8",
+ "text_placeholder",
+ "wgpu",
+]
+
+[[package]]
+name = "bytemuck"
+version = "1.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6"
+dependencies = [
+ "bytemuck_derive",
+]
+
+[[package]]
+name = "bytemuck_derive"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.39",
+]
+
+[[package]]
+name = "byteorder"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
+
+[[package]]
+name = "bytes"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223"
+
+[[package]]
+name = "bzip2"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8"
+dependencies = [
+ "bzip2-sys",
+ "libc",
+]
+
+[[package]]
+name = "bzip2-sys"
+version = "0.1.11+1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+]
+
+[[package]]
+name = "camino"
+version = "1.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c"
+
+[[package]]
+name = "candle-core"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d60d9b91c73bc662dc45aff607f5ffe79724b7cf7d7c8dc12a72b25921683b67"
+dependencies = [
+ "byteorder",
+ "gemm",
+ "half 2.3.1",
+ "memmap2",
+ "num-traits",
+ "num_cpus",
+ "rand 0.8.5",
+ "rand_distr",
+ "rayon",
+ "safetensors",
+ "thiserror",
+ "yoke",
+ "zip",
+]
+
+[[package]]
+name = "cast"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
+
+[[package]]
+name = "cbc"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6"
+dependencies = [
+ "cipher",
+]
+
+[[package]]
+name = "cc"
+version = "1.0.83"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
+dependencies = [
+ "jobserver",
+ "libc",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "chrono"
+version = "0.4.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "num-traits",
+ "windows-targets 0.48.5",
+]
+
+[[package]]
+name = "ciborium"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926"
+dependencies = [
+ "ciborium-io",
+ "ciborium-ll",
+ "serde",
+]
+
+[[package]]
+name = "ciborium-io"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656"
+
+[[package]]
+name = "ciborium-ll"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b"
+dependencies = [
+ "ciborium-io",
+ "half 1.8.2",
+]
+
+[[package]]
+name = "cipher"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad"
+dependencies = [
+ "crypto-common",
+ "inout",
+]
+
+[[package]]
+name = "clap"
+version = "4.4.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfaff671f6b22ca62406885ece523383b9b64022e341e53e009a62ebc47a45f2"
+dependencies = [
+ "clap_builder",
+ "clap_derive",
+]
+
+[[package]]
+name = "clap_builder"
+version = "4.4.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a216b506622bb1d316cd51328dce24e07bdff4a6128a47c7e7fad11878d5adbb"
+dependencies = [
+ "anstream",
+ "anstyle",
+ "clap_lex",
+ "strsim",
+ "terminal_size",
+]
+
+[[package]]
+name = "clap_complete"
+version = "4.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bffe91f06a11b4b9420f62103854e90867812cd5d01557f853c5ee8e791b12ae"
+dependencies = [
+ "clap",
+]
+
+[[package]]
+name = "clap_derive"
+version = "4.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.39",
+]
+
+[[package]]
+name = "clap_lex"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1"
+
+[[package]]
+name = "coarsetime"
+version = "0.1.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "71367d3385c716342014ad17e3d19f7788ae514885a1f4c24f500260fb365e1a"
+dependencies = [
+ "libc",
+ "once_cell",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "codespan"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3362992a0d9f1dd7c3d0e89e0ab2bb540b7a95fea8cd798090e758fda2899b5e"
+dependencies = [
+ "codespan-reporting",
+ "serde",
+]
+
+[[package]]
+name = "codespan-reporting"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e"
+dependencies = [
+ "serde",
+ "termcolor",
+ "unicode-width",
+]
+
+[[package]]
+name = "color_quant"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
+
+[[package]]
+name = "colorchoice"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
+
+[[package]]
+name = "com-rs"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf43edc576402991846b093a7ca18a3477e0ef9c588cde84964b5d3e43016642"
+
+[[package]]
+name = "concurrent-queue"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363"
+dependencies = [
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "configure"
+version = "0.0.0"
+dependencies = [
+ "anyhow",
+ "itertools 0.12.0",
+ "ninja_gen",
+]
+
+[[package]]
+name = "constant_time_eq"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
+
+[[package]]
+name = "constant_time_eq"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2"
+
+[[package]]
+name = "convert_case"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca"
+dependencies = [
+ "unicode-segmentation",
+]
+
+[[package]]
+name = "core-foundation"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
+
+[[package]]
+name = "core-graphics-types"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf"
+dependencies = [
+ "bitflags 1.3.2",
+ "core-foundation",
+ "libc",
+]
+
+[[package]]
+name = "cpufeatures"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "crc32fast"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "criterion"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f"
+dependencies = [
+ "anes",
+ "cast",
+ "ciborium",
+ "clap",
+ "criterion-plot",
+ "is-terminal",
+ "itertools 0.10.5",
+ "num-traits",
+ "once_cell",
+ "oorandom",
+ "plotters",
+ "rayon",
+ "regex",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "tinytemplate",
+ "walkdir",
+]
+
+[[package]]
+name = "criterion-plot"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1"
+dependencies = [
+ "cast",
+ "itertools 0.10.5",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef"
+dependencies = [
+ "cfg-if",
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7"
+dependencies = [
+ "autocfg",
+ "cfg-if",
+ "crossbeam-utils",
+ "memoffset",
+ "scopeguard",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "crunchy"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
+
+[[package]]
+name = "crypto-common"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
+dependencies = [
+ "generic-array",
+ "typenum",
+]
+
+[[package]]
+name = "csv"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe"
+dependencies = [
+ "csv-core",
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "csv-core"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "d3d12"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e16e44ab292b1dddfdaf7be62cfd8877df52f2f3fde5858d95bab606be259f20"
+dependencies = [
+ "bitflags 2.4.1",
+ "libloading 0.8.1",
+ "winapi",
+]
+
+[[package]]
+name = "dashmap"
+version = "5.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856"
+dependencies = [
+ "cfg-if",
+ "hashbrown 0.14.3",
+ "lock_api",
+ "once_cell",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "data-encoding"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5"
+
+[[package]]
+name = "deadpool"
+version = "0.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "421fe0f90f2ab22016f32a9881be5134fdd71c65298917084b0c7477cbc3856e"
+dependencies = [
+ "async-trait",
+ "deadpool-runtime",
+ "num_cpus",
+ "retain_mut",
+ "tokio",
+]
+
+[[package]]
+name = "deadpool-runtime"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "63dfa964fe2a66f3fde91fc70b267fe193d822c7e603e2a675a49a7f46ad3f49"
+
+[[package]]
+name = "deranged"
+version = "0.3.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8eb30d70a07a3b04884d2677f06bec33509dc67ca60d92949e5535352d3191dc"
+dependencies = [
+ "powerfmt",
+]
+
+[[package]]
+name = "derive-new"
+version = "0.5.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3418329ca0ad70234b9735dc4ceed10af4df60eff9c8e7b06cb5e520d92c3535"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "des"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffdd80ce8ce993de27e9f063a444a4d53ce8e8db4c1f00cc03af5ad5a9867a1e"
+dependencies = [
+ "cipher",
+]
+
+[[package]]
+name = "difflib"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8"
+
+[[package]]
+name = "digest"
+version = "0.10.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
+dependencies = [
+ "block-buffer",
+ "crypto-common",
+ "subtle",
+]
+
+[[package]]
+name = "dirs"
+version = "5.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225"
+dependencies = [
+ "dirs-sys",
+]
+
+[[package]]
+name = "dirs-sys"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c"
+dependencies = [
+ "libc",
+ "option-ext",
+ "redox_users",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "displaydoc"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.39",
+]
+
+[[package]]
+name = "doc-comment"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
+
+[[package]]
+name = "duct"
+version = "0.13.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37ae3fc31835f74c2a7ceda3aeede378b0ae2e74c8f1c36559fcc9ae2a4e7d3e"
+dependencies = [
+ "libc",
+ "once_cell",
+ "os_pipe",
+ "shared_child",
+]
+
+[[package]]
+name = "dunce"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b"
+
+[[package]]
+name = "dyn-stack"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56e53799688f5632f364f8fb387488dd05db9fe45db7011be066fc20e7027f8b"
+dependencies = [
+ "bytemuck",
+ "reborrow",
+]
+
+[[package]]
+name = "either"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
+
+[[package]]
+name = "elasticlunr-rs"
+version = "3.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41e83863a500656dfa214fee6682de9c5b9f03de6860fec531235ed2ae9f6571"
+dependencies = [
+ "regex",
+ "serde",
+ "serde_derive",
+ "serde_json",
+]
+
+[[package]]
+name = "encoding_rs"
+version = "0.8.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "env_logger"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95b3f3e67048839cb0d0781f445682a35113da7121f7c949db0e2be96a4fbece"
+dependencies = [
+ "humantime",
+ "is-terminal",
+ "log",
+ "regex",
+ "termcolor",
+]
+
+[[package]]
+name = "envy"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f47e0157f2cb54f5ae1bd371b30a2ae4311e1c028f575cd4e81de7353215965"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "equivalent"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
+
+[[package]]
+name = "errno"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
+dependencies = [
+ "libc",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "event-listener"
+version = "2.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
+
+[[package]]
+name = "exr"
+version = "1.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "279d3efcc55e19917fff7ab3ddd6c14afb6a90881a0078465196fe2f99d08c56"
+dependencies = [
+ "bit_field",
+ "flume 0.10.14",
+ "half 2.3.1",
+ "lebe",
+ "miniz_oxide",
+ "rayon-core",
+ "smallvec",
+ "zune-inflate",
+]
+
+[[package]]
+name = "fallible-iterator"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649"
+
+[[package]]
+name = "fallible-streaming-iterator"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a"
+
+[[package]]
+name = "faster-hex"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "239f7bfb930f820ab16a9cd95afc26f88264cf6905c960b340a615384aa3338a"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "fastrand"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
+dependencies = [
+ "instant",
+]
+
+[[package]]
+name = "fastrand"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"
+
+[[package]]
+name = "fdeflate"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64d6dafc854908ff5da46ff3f8f473c6984119a2876a383a860246dd7841a868"
+dependencies = [
+ "simd-adler32",
+]
+
+[[package]]
+name = "filetime"
+version = "0.2.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "find-crate"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59a98bbaacea1c0eb6a0876280051b892eb73594fd90cf3b20e9c817029c57d2"
+dependencies = [
+ "toml",
+]
+
+[[package]]
+name = "find-winsdk"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8cbf17b871570c1f8612b763bac3e86290602bcf5dc3c5ce657e0e1e9071d9e"
+dependencies = [
+ "serde",
+ "serde_derive",
+ "winreg 0.5.1",
+]
+
+[[package]]
+name = "fixedbitset"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
+
+[[package]]
+name = "flate2"
+version = "1.0.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e"
+dependencies = [
+ "crc32fast",
+ "miniz_oxide",
+]
+
+[[package]]
+name = "fluent"
+version = "0.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61f69378194459db76abd2ce3952b790db103ceb003008d3d50d97c41ff847a7"
+dependencies = [
+ "fluent-bundle",
+ "unic-langid",
+]
+
+[[package]]
+name = "fluent-bundle"
+version = "0.15.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e242c601dec9711505f6d5bbff5bedd4b61b2469f2e8bb8e57ee7c9747a87ffd"
+dependencies = [
+ "fluent-langneg",
+ "fluent-syntax",
+ "intl-memoizer",
+ "intl_pluralrules",
+ "rustc-hash",
+ "self_cell 0.10.3",
+ "smallvec",
+ "unic-langid",
+]
+
+[[package]]
+name = "fluent-langneg"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c4ad0989667548f06ccd0e306ed56b61bd4d35458d54df5ec7587c0e8ed5e94"
+dependencies = [
+ "unic-langid",
+]
+
+[[package]]
+name = "fluent-syntax"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0abed97648395c902868fee9026de96483933faa54ea3b40d652f7dfe61ca78"
+dependencies = [
+ "thiserror",
+]
+
+[[package]]
+name = "flume"
+version = "0.10.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+ "nanorand",
+ "pin-project",
+ "spin 0.9.8",
+]
+
+[[package]]
+name = "flume"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+ "nanorand",
+ "spin 0.9.8",
+]
+
+[[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 0.1.1",
+]
+
+[[package]]
+name = "foreign-types"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965"
+dependencies = [
+ "foreign-types-macros",
+ "foreign-types-shared 0.3.1",
+]
+
+[[package]]
+name = "foreign-types-macros"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.39",
+]
+
+[[package]]
+name = "foreign-types-shared"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
+
+[[package]]
+name = "foreign-types-shared"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b"
+
+[[package]]
+name = "form_urlencoded"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
+dependencies = [
+ "percent-encoding",
+]
+
+[[package]]
+name = "forwarded-header-value"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8835f84f38484cc86f110a805655697908257fb9a7af005234060891557198e9"
+dependencies = [
+ "nonempty",
+ "thiserror",
+]
+
+[[package]]
+name = "fs2"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "fsevent-sys"
+version = "4.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "fsrs"
+version = "0.1.0"
+source = "git+https://github.com/open-spaced-repetition/fsrs-rs.git?rev=58ca25ed2bc4bb1dc376208bbcaed7f5a501b941#58ca25ed2bc4bb1dc376208bbcaed7f5a501b941"
+dependencies = [
+ "burn",
+ "itertools 0.12.0",
+ "log",
+ "ndarray",
+ "ndarray-rand",
+ "rand 0.8.5",
+ "rayon",
+ "serde",
+ "snafu",
+ "strum",
+]
+
+[[package]]
+name = "ftl"
+version = "0.0.0"
+dependencies = [
+ "anki_io",
+ "anki_process",
+ "anyhow",
+ "camino",
+ "clap",
+ "fluent-syntax",
+ "itertools 0.12.0",
+ "lazy_static",
+ "regex",
+ "serde_json",
+ "snafu",
+ "walkdir",
+]
+
+[[package]]
+name = "futf"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843"
+dependencies = [
+ "mac",
+ "new_debug_unreachable",
+]
+
+[[package]]
+name = "futures"
+version = "0.3.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-io",
+ "futures-sink",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c"
+
+[[package]]
+name = "futures-executor"
+version = "0.3.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-intrusive"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f"
+dependencies = [
+ "futures-core",
+ "lock_api",
+ "parking_lot",
+]
+
+[[package]]
+name = "futures-io"
+version = "0.3.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa"
+
+[[package]]
+name = "futures-lite"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce"
+dependencies = [
+ "fastrand 1.9.0",
+ "futures-core",
+ "futures-io",
+ "memchr",
+ "parking",
+ "pin-project-lite",
+ "waker-fn",
+]
+
+[[package]]
+name = "futures-macro"
+version = "0.3.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.39",
+]
+
+[[package]]
+name = "futures-sink"
+version = "0.3.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817"
+
+[[package]]
+name = "futures-task"
+version = "0.3.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2"
+
+[[package]]
+name = "futures-timer"
+version = "3.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c"
+
+[[package]]
+name = "futures-util"
+version = "0.3.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-macro",
+ "futures-sink",
+ "futures-task",
+ "memchr",
+ "pin-project-lite",
+ "pin-utils",
+ "slab",
+]
+
+[[package]]
+name = "gemm"
+version = "0.16.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b3afa707040531a7527477fd63a81ea4f6f3d26037a2f96776e57fb843b258e"
+dependencies = [
+ "dyn-stack",
+ "gemm-c32",
+ "gemm-c64",
+ "gemm-common",
+ "gemm-f16",
+ "gemm-f32",
+ "gemm-f64",
+ "num-complex",
+ "num-traits",
+ "paste",
+ "raw-cpuid",
+ "seq-macro",
+]
+
+[[package]]
+name = "gemm-c32"
+version = "0.16.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cc3973a4c30c73f26a099113953d0c772bb17ee2e07976c0a06b8fe1f38a57d"
+dependencies = [
+ "dyn-stack",
+ "gemm-common",
+ "num-complex",
+ "num-traits",
+ "paste",
+ "raw-cpuid",
+ "seq-macro",
+]
+
+[[package]]
+name = "gemm-c64"
+version = "0.16.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "30362894b93dada374442cb2edf4512ddf19513c9bec88e06a445bcb6b22e64f"
+dependencies = [
+ "dyn-stack",
+ "gemm-common",
+ "num-complex",
+ "num-traits",
+ "paste",
+ "raw-cpuid",
+ "seq-macro",
+]
+
+[[package]]
+name = "gemm-common"
+version = "0.16.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "988499faa80566b046b4fee2c5f15af55b5a20c1fe8486b112ebb34efa045ad6"
+dependencies = [
+ "bytemuck",
+ "dyn-stack",
+ "half 2.3.1",
+ "num-complex",
+ "num-traits",
+ "once_cell",
+ "paste",
+ "pulp",
+ "raw-cpuid",
+ "rayon",
+ "seq-macro",
+]
+
+[[package]]
+name = "gemm-f16"
+version = "0.16.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6cf2854a12371684c38d9a865063a27661812a3ff5803454c5742e8f5a388ce"
+dependencies = [
+ "dyn-stack",
+ "gemm-common",
+ "gemm-f32",
+ "half 2.3.1",
+ "num-complex",
+ "num-traits",
+ "paste",
+ "raw-cpuid",
+ "rayon",
+ "seq-macro",
+]
+
+[[package]]
+name = "gemm-f32"
+version = "0.16.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0bc84003cf6d950a7c7ca714ad6db281b6cef5c7d462f5cd9ad90ea2409c7227"
+dependencies = [
+ "dyn-stack",
+ "gemm-common",
+ "num-complex",
+ "num-traits",
+ "paste",
+ "raw-cpuid",
+ "seq-macro",
+]
+
+[[package]]
+name = "gemm-f64"
+version = "0.16.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "35187ef101a71eed0ecd26fb4a6255b4192a12f1c5335f3a795698f2d9b6cf33"
+dependencies = [
+ "dyn-stack",
+ "gemm-common",
+ "num-complex",
+ "num-traits",
+ "paste",
+ "raw-cpuid",
+ "seq-macro",
+]
+
+[[package]]
+name = "generic-array"
+version = "0.14.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
+dependencies = [
+ "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "getopts"
+version = "0.2.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5"
+dependencies = [
+ "unicode-width",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.1.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi 0.9.0+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f"
+dependencies = [
+ "cfg-if",
+ "js-sys",
+ "libc",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "gif"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045"
+dependencies = [
+ "color_quant",
+ "weezl",
+]
+
+[[package]]
+name = "gimli"
+version = "0.28.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
+
+[[package]]
+name = "gix-features"
+version = "0.33.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f77decb545f63a52852578ef5f66ecd71017ffc1983d551d5fa2328d6d9817f"
+dependencies = [
+ "gix-hash",
+ "gix-trace",
+ "libc",
+]
+
+[[package]]
+name = "gix-fs"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53d5089f3338647776733a75a800a664ab046f56f21c515fa4722e395f877ef8"
+dependencies = [
+ "gix-features",
+]
+
+[[package]]
+name = "gix-hash"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d4796bac3aaf0c2f8bea152ca924ae3bdc5f135caefe6431116bcd67e98eab9"
+dependencies = [
+ "faster-hex",
+ "thiserror",
+]
+
+[[package]]
+name = "gix-tempfile"
+version = "8.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cea558d3daf3b1d0001052b12218c66c8f84788852791333b633d7eeb6999db1"
+dependencies = [
+ "dashmap",
+ "gix-fs",
+ "libc",
+ "once_cell",
+ "parking_lot",
+ "signal-hook",
+ "signal-hook-registry",
+ "tempfile",
+]
+
+[[package]]
+name = "gix-trace"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96b6d623a1152c3facb79067d6e2ecdae48130030cf27d6eb21109f13bd7b836"
+
+[[package]]
+name = "gl_generator"
+version = "0.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d"
+dependencies = [
+ "khronos_api",
+ "log",
+ "xml-rs",
+]
+
+[[package]]
+name = "glob"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
+
+[[package]]
+name = "globset"
+version = "0.4.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1"
+dependencies = [
+ "aho-corasick",
+ "bstr",
+ "log",
+ "regex-automata 0.4.3",
+ "regex-syntax 0.8.2",
+]
+
+[[package]]
+name = "glow"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "886c2a30b160c4c6fec8f987430c26b526b7988ca71f664e6a699ddf6f9601e4"
+dependencies = [
+ "js-sys",
+ "slotmap",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "glutin_wgl_sys"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c8098adac955faa2d31079b65dc48841251f69efd3ac25477903fc424362ead"
+dependencies = [
+ "gl_generator",
+]
+
+[[package]]
+name = "gpu-alloc"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171"
+dependencies = [
+ "bitflags 2.4.1",
+ "gpu-alloc-types",
+]
+
+[[package]]
+name = "gpu-alloc-types"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4"
+dependencies = [
+ "bitflags 2.4.1",
+]
+
+[[package]]
+name = "gpu-allocator"
+version = "0.23.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "40fe17c8a05d60c38c0a4e5a3c802f2f1ceb66b76c67d96ffb34bef0475a7fad"
+dependencies = [
+ "backtrace",
+ "log",
+ "presser",
+ "thiserror",
+ "winapi",
+ "windows 0.51.1",
+]
+
+[[package]]
+name = "gpu-descriptor"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c"
+dependencies = [
+ "bitflags 2.4.1",
+ "gpu-descriptor-types",
+ "hashbrown 0.14.3",
+]
+
+[[package]]
+name = "gpu-descriptor-types"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6bf0b36e6f090b7e1d8a4b49c0cb81c1f8376f72198c65dd3ad9ff3556b8b78c"
+dependencies = [
+ "bitflags 2.4.1",
+]
+
+[[package]]
+name = "h2"
+version = "0.3.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178"
+dependencies = [
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "futures-util",
+ "http",
+ "indexmap",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
+[[package]]
+name = "half"
+version = "1.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7"
+
+[[package]]
+name = "half"
+version = "2.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc52e53916c08643f1b56ec082790d1e86a32e58dc5268f897f313fbae7b4872"
+dependencies = [
+ "bytemuck",
+ "cfg-if",
+ "crunchy",
+ "num-traits",
+ "rand 0.8.5",
+ "rand_distr",
+ "serde",
+]
+
+[[package]]
+name = "handlebars"
+version = "4.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "faa67bab9ff362228eb3d00bd024a4965d8231bbb7921167f0cfa66c6626b225"
+dependencies = [
+ "log",
+ "pest",
+ "pest_derive",
+ "serde",
+ "serde_json",
+ "thiserror",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.13.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e"
+dependencies = [
+ "ahash",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.14.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
+dependencies = [
+ "ahash",
+ "allocator-api2",
+ "serde",
+]
+
+[[package]]
+name = "hashlink"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7"
+dependencies = [
+ "hashbrown 0.14.3",
+]
+
+[[package]]
+name = "hassle-rs"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1397650ee315e8891a0df210707f0fc61771b0cc518c3023896064c5407cb3b0"
+dependencies = [
+ "bitflags 1.3.2",
+ "com-rs",
+ "libc",
+ "libloading 0.7.4",
+ "thiserror",
+ "widestring",
+ "winapi",
+]
+
+[[package]]
+name = "headers"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270"
+dependencies = [
+ "base64 0.21.5",
+ "bytes",
+ "headers-core",
+ "http",
+ "httpdate",
+ "mime",
+ "sha1",
+]
+
+[[package]]
+name = "headers-core"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429"
+dependencies = [
+ "http",
+]
+
+[[package]]
+name = "heck"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+
+[[package]]
+name = "hermit-abi"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7"
+
+[[package]]
+name = "hex"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+
+[[package]]
+name = "hexf-parse"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df"
+
+[[package]]
+name = "hmac"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
+dependencies = [
+ "digest",
+]
+
+[[package]]
+name = "home"
+version = "0.5.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb"
+dependencies = [
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "html5ever"
+version = "0.26.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7"
+dependencies = [
+ "log",
+ "mac",
+ "markup5ever",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "htmlescape"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e9025058dae765dee5070ec375f591e2ba14638c63feff74f13805a72e523163"
+
+[[package]]
+name = "http"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
+[[package]]
+name = "http-body"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
+dependencies = [
+ "bytes",
+ "http",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "http-range-header"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f"
+
+[[package]]
+name = "http-types"
+version = "2.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e9b187a72d63adbfba487f48095306ac823049cb504ee195541e91c7775f5ad"
+dependencies = [
+ "anyhow",
+ "async-channel",
+ "base64 0.13.1",
+ "futures-lite",
+ "http",
+ "infer",
+ "pin-project-lite",
+ "rand 0.7.3",
+ "serde",
+ "serde_json",
+ "serde_qs",
+ "serde_urlencoded",
+ "url",
+]
+
+[[package]]
+name = "httparse"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
+
+[[package]]
+name = "httpdate"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
+
+[[package]]
+name = "humantime"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
+
+[[package]]
+name = "hyper"
+version = "0.14.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "pin-project-lite",
+ "socket2 0.4.10",
+ "tokio",
+ "tower-service",
+ "tracing",
+ "want",
+]
+
+[[package]]
+name = "hyper-rustls"
+version = "0.24.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590"
+dependencies = [
+ "futures-util",
+ "http",
+ "hyper",
+ "rustls",
+ "tokio",
+ "tokio-rustls",
+]
+
+[[package]]
+name = "hyper-tls"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905"
+dependencies = [
+ "bytes",
+ "hyper",
+ "native-tls",
+ "tokio",
+ "tokio-native-tls",
+]
+
+[[package]]
+name = "iana-time-zone"
+version = "0.1.58"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows-core 0.51.1",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "id_tree"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bcd9db8dd5be8bde5a2624ed4b2dfb74368fe7999eb9c4940fd3ca344b61071a"
+dependencies = [
+ "snowflake",
+]
+
+[[package]]
+name = "idna"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
+dependencies = [
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "ignore"
+version = "0.4.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "747ad1b4ae841a78e8aba0d63adbfbeaea26b517b63705d47856b73015d27060"
+dependencies = [
+ "crossbeam-deque",
+ "globset",
+ "log",
+ "memchr",
+ "regex-automata 0.4.3",
+ "same-file",
+ "walkdir",
+ "winapi-util",
+]
+
+[[package]]
+name = "image"
+version = "0.24.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711"
+dependencies = [
+ "bytemuck",
+ "byteorder",
+ "color_quant",
+ "exr",
+ "gif",
+ "jpeg-decoder",
+ "num-rational",
+ "num-traits",
+ "png",
+ "qoi",
+ "tiff",
+]
+
+[[package]]
+name = "indexmap"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f"
+dependencies = [
+ "equivalent",
+ "hashbrown 0.14.3",
+]
+
+[[package]]
+name = "indoc"
+version = "2.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8"
+
+[[package]]
+name = "infer"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64e9829a50b42bb782c1df523f78d332fe371b10c661e78b7a3c34b0198e9fac"
+
+[[package]]
+name = "inflections"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a257582fdcde896fd96463bf2d40eefea0580021c0712a0e2b028b60b47a837a"
+
+[[package]]
+name = "inotify"
+version = "0.9.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff"
+dependencies = [
+ "bitflags 1.3.2",
+ "inotify-sys",
+ "libc",
+]
+
+[[package]]
+name = "inotify-sys"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "inout"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5"
+dependencies = [
+ "block-padding",
+ "generic-array",
+]
+
+[[package]]
+name = "instant"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "intl-memoizer"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c310433e4a310918d6ed9243542a6b83ec1183df95dff8f23f87bb88a264a66f"
+dependencies = [
+ "type-map",
+ "unic-langid",
+]
+
+[[package]]
+name = "intl_pluralrules"
+version = "7.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "078ea7b7c29a2b4df841a7f6ac8775ff6074020c6776d48491ce2268e068f972"
+dependencies = [
+ "unic-langid",
+]
+
+[[package]]
+name = "ipnet"
+version = "2.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3"
+
+[[package]]
+name = "is-terminal"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b"
+dependencies = [
+ "hermit-abi",
+ "rustix",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "itertools"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itertools"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itertools"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
+
+[[package]]
+name = "jobserver"
+version = "0.1.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "jpeg-decoder"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc0000e42512c92e31c2252315bda326620a4e034105e900c98ec492fa077b3e"
+dependencies = [
+ "rayon",
+]
+
+[[package]]
+name = "js-sys"
+version = "0.3.66"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "junction"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca39ef0d69b18e6a2fd14c2f0a1d593200f4a4ed949b240b5917ab51fac754cb"
+dependencies = [
+ "scopeguard",
+ "winapi",
+]
+
+[[package]]
+name = "khronos-egl"
+version = "6.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76"
+dependencies = [
+ "libc",
+ "libloading 0.8.1",
+ "pkg-config",
+]
+
+[[package]]
+name = "khronos_api"
+version = "3.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc"
+
+[[package]]
+name = "kqueue"
+version = "1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c"
+dependencies = [
+ "kqueue-sys",
+ "libc",
+]
+
+[[package]]
+name = "kqueue-sys"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b"
+dependencies = [
+ "bitflags 1.3.2",
+ "libc",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "lebe"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8"
+
+[[package]]
+name = "libc"
+version = "0.2.150"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c"
+
+[[package]]
+name = "libloading"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f"
+dependencies = [
+ "cfg-if",
+ "winapi",
+]
+
+[[package]]
+name = "libloading"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161"
+dependencies = [
+ "cfg-if",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "libm"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058"
+
+[[package]]
+name = "libredox"
+version = "0.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8"
+dependencies = [
+ "bitflags 2.4.1",
+ "libc",
+ "redox_syscall",
+]
+
+[[package]]
+name = "libsqlite3-sys"
+version = "0.27.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716"
+dependencies = [
+ "cc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "line-wrap"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9"
+dependencies = [
+ "safemem",
+]
+
+[[package]]
+name = "linkcheck"
+version = "0.4.1"
+source = "git+https://github.com/ankitects/linkcheck.git?rev=184b2ca50ed39ca43da13f0b830a463861adb9ca#184b2ca50ed39ca43da13f0b830a463861adb9ca"
+dependencies = [
+ "bytes",
+ "codespan",
+ "dunce",
+ "futures",
+ "html5ever",
+ "http",
+ "lazy_static",
+ "linkify",
+ "log",
+ "markup5ever_rcdom",
+ "mdbook",
+ "pulldown-cmark 0.8.0",
+ "regex",
+ "reqwest",
+ "serde",
+ "thiserror",
+ "url",
+]
+
+[[package]]
+name = "linkchecker"
+version = "0.0.0"
+dependencies = [
+ "anki",
+ "futures",
+ "itertools 0.12.0",
+ "lazy_static",
+ "linkcheck",
+ "regex",
+ "reqwest",
+ "strum",
+ "tokio",
+]
+
+[[package]]
+name = "linkify"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04d828fdc1ffceb369a5a9183bd4df2dbb3678f40c8b3fbaa9231de32beb29f9"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.4.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456"
+
+[[package]]
+name = "lock_api"
+version = "0.4.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"
+dependencies = [
+ "autocfg",
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
+
+[[package]]
+name = "lzma-sys"
+version = "0.1.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+]
+
+[[package]]
+name = "mac"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
+
+[[package]]
+name = "makeapp"
+version = "0.0.0"
+dependencies = [
+ "anyhow",
+ "apple-bundles",
+ "camino",
+ "clap",
+ "glob",
+ "plist",
+ "serde",
+ "serde_json",
+ "simple-file-manifest",
+ "walkdir",
+]
+
+[[package]]
+name = "makeexe"
+version = "0.0.0"
+dependencies = [
+ "anyhow",
+ "camino",
+ "clap",
+ "tugger-windows-codesign",
+ "walkdir",
+]
+
+[[package]]
+name = "malloc_buf"
+version = "0.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "maplit"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
+
+[[package]]
+name = "markup5ever"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016"
+dependencies = [
+ "log",
+ "phf 0.10.1",
+ "phf_codegen",
+ "string_cache",
+ "string_cache_codegen",
+ "tendril",
+]
+
+[[package]]
+name = "markup5ever_rcdom"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9521dd6750f8e80ee6c53d65e2e4656d7de37064f3a7a5d2d11d05df93839c2"
+dependencies = [
+ "html5ever",
+ "markup5ever",
+ "tendril",
+ "xml5ever",
+]
+
+[[package]]
+name = "matchers"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
+dependencies = [
+ "regex-automata 0.1.10",
+]
+
+[[package]]
+name = "matches"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5"
+
+[[package]]
+name = "matchit"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94"
+
+[[package]]
+name = "matrixmultiply"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2"
+dependencies = [
+ "autocfg",
+ "num_cpus",
+ "once_cell",
+ "rawpointer",
+ "thread-tree",
+]
+
+[[package]]
+name = "mdbook"
+version = "0.4.36"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80992cb0e05f22cc052c99f8e883f1593b891014b96a8b4637fd274d7030c85e"
+dependencies = [
+ "ammonia",
+ "anyhow",
+ "chrono",
+ "clap",
+ "clap_complete",
+ "elasticlunr-rs",
+ "env_logger",
+ "futures-util",
+ "handlebars",
+ "ignore",
+ "log",
+ "memchr",
+ "notify",
+ "notify-debouncer-mini",
+ "once_cell",
+ "opener",
+ "pathdiff",
+ "pulldown-cmark 0.9.3",
+ "regex",
+ "serde",
+ "serde_json",
+ "shlex",
+ "tempfile",
+ "tokio",
+ "toml",
+ "topological-sort",
+ "warp",
+]
+
+[[package]]
+name = "memchr"
+version = "2.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167"
+
+[[package]]
+name = "memmap2"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f49388d20533534cd19360ad3d6a7dadc885944aa802ba3995040c5ec11288c6"
+dependencies = [
+ "libc",
+ "stable_deref_trait",
+]
+
+[[package]]
+name = "memoffset"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "metal"
+version = "0.27.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25"
+dependencies = [
+ "bitflags 2.4.1",
+ "block",
+ "core-graphics-types",
+ "foreign-types 0.5.0",
+ "log",
+ "objc",
+ "paste",
+]
+
+[[package]]
+name = "mime"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
+
+[[package]]
+name = "mime_guess"
+version = "2.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef"
+dependencies = [
+ "mime",
+ "unicase",
+]
+
+[[package]]
+name = "minilints"
+version = "0.0.0"
+dependencies = [
+ "anki_io",
+ "anki_process",
+ "anyhow",
+ "camino",
+ "once_cell",
+ "walkdir",
+ "which 5.0.0",
+]
+
+[[package]]
+name = "minimal-lexical"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+
+[[package]]
+name = "miniz_oxide"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
+dependencies = [
+ "adler",
+ "simd-adler32",
+]
+
+[[package]]
+name = "mio"
+version = "0.8.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0"
+dependencies = [
+ "libc",
+ "log",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "multer"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "01acbdc23469fd8fe07ab135923371d5f5a422fbf9c522158677c8eb15bc51c2"
+dependencies = [
+ "bytes",
+ "encoding_rs",
+ "futures-util",
+ "http",
+ "httparse",
+ "log",
+ "memchr",
+ "mime",
+ "spin 0.9.8",
+ "version_check",
+]
+
+[[package]]
+name = "multimap"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a"
+
+[[package]]
+name = "naga"
+version = "0.14.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6cd05939c491da968a42986204b7431678be21fdcd4b10cc84997ba130ada5a4"
+dependencies = [
+ "bit-set",
+ "bitflags 2.4.1",
+ "codespan-reporting",
+ "hexf-parse",
+ "indexmap",
+ "log",
+ "num-traits",
+ "rustc-hash",
+ "spirv",
+ "termcolor",
+ "thiserror",
+ "unicode-xid",
+]
+
+[[package]]
+name = "nanorand"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3"
+dependencies = [
+ "getrandom 0.2.11",
+]
+
+[[package]]
+name = "native-tls"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e"
+dependencies = [
+ "lazy_static",
+ "libc",
+ "log",
+ "openssl",
+ "openssl-probe",
+ "openssl-sys",
+ "schannel",
+ "security-framework",
+ "security-framework-sys",
+ "tempfile",
+]
+
+[[package]]
+name = "ndarray"
+version = "0.15.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32"
+dependencies = [
+ "matrixmultiply",
+ "num-complex",
+ "num-integer",
+ "num-traits",
+ "rawpointer",
+ "rayon",
+]
+
+[[package]]
+name = "ndarray-rand"
+version = "0.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "65608f937acc725f5b164dcf40f4f0bc5d67dc268ab8a649d3002606718c4588"
+dependencies = [
+ "ndarray",
+ "rand 0.8.5",
+ "rand_distr",
+]
+
+[[package]]
+name = "new_debug_unreachable"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
+
+[[package]]
+name = "ninja_gen"
+version = "0.0.0"
+dependencies = [
+ "anki_io",
+ "anyhow",
+ "camino",
+ "dunce",
+ "globset",
+ "itertools 0.12.0",
+ "lazy_static",
+ "maplit",
+ "num_cpus",
+ "walkdir",
+ "which 5.0.0",
+]
+
+[[package]]
+name = "nom"
+version = "7.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
+dependencies = [
+ "memchr",
+ "minimal-lexical",
+]
+
+[[package]]
+name = "nonempty"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e9e591e719385e6ebaeb5ce5d3887f7d5676fceca6411d1925ccc95745f3d6f7"
+
+[[package]]
+name = "normpath"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec60c60a693226186f5d6edf073232bfb6464ed97eb22cf3b01c1e8198fd97f5"
+dependencies = [
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "notify"
+version = "6.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d"
+dependencies = [
+ "bitflags 2.4.1",
+ "crossbeam-channel",
+ "filetime",
+ "fsevent-sys",
+ "inotify",
+ "kqueue",
+ "libc",
+ "log",
+ "mio",
+ "walkdir",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "notify-debouncer-mini"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d40b221972a1fc5ef4d858a2f671fb34c75983eb385463dff3780eeff6a9d43"
+dependencies = [
+ "crossbeam-channel",
+ "log",
+ "notify",
+]
+
+[[package]]
+name = "nu-ansi-term"
+version = "0.46.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
+dependencies = [
+ "overload",
+ "winapi",
+]
+
+[[package]]
+name = "num-complex"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214"
+dependencies = [
+ "bytemuck",
+ "num-traits",
+]
+
+[[package]]
+name = "num-format"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3"
+dependencies = [
+ "arrayvec",
+ "itoa",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
+dependencies = [
+ "autocfg",
+ "num-traits",
+]
+
+[[package]]
+name = "num-rational"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c"
+dependencies = [
+ "autocfg",
+ "libm",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
+dependencies = [
+ "hermit-abi",
+ "libc",
+]
+
+[[package]]
+name = "num_enum"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0"
+dependencies = [
+ "num_enum_derive",
+]
+
+[[package]]
+name = "num_enum_derive"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e"
+dependencies = [
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.39",
+]
+
+[[package]]
+name = "objc"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1"
+dependencies = [
+ "malloc_buf",
+ "objc_exception",
+]
+
+[[package]]
+name = "objc_exception"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "object"
+version = "0.32.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
+
+[[package]]
+name = "oorandom"
+version = "11.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575"
+
+[[package]]
+name = "opener"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c62dcb6174f9cb326eac248f07e955d5d559c272730b6c03e396b443b562788"
+dependencies = [
+ "bstr",
+ "normpath",
+ "winapi",
+]
+
+[[package]]
+name = "openssl"
+version = "0.10.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b8419dc8cc6d866deb801274bba2e6f8f6108c1bb7fcc10ee5ab864931dbb45"
+dependencies = [
+ "bitflags 2.4.1",
+ "cfg-if",
+ "foreign-types 0.3.2",
+ "libc",
+ "once_cell",
+ "openssl-macros",
+ "openssl-sys",
+]
+
+[[package]]
+name = "openssl-macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.39",
+]
+
+[[package]]
+name = "openssl-probe"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
+
+[[package]]
+name = "openssl-sys"
+version = "0.9.97"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3eaad34cdd97d81de97964fc7f29e2d104f483840d906ef56daa1912338460b"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "option-ext"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
+
+[[package]]
+name = "os_pipe"
+version = "1.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ae859aa07428ca9a929b936690f8b12dc5f11dd8c6992a18ca93919f28bc177"
+dependencies = [
+ "libc",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "overload"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
+
+[[package]]
+name = "p12"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4873306de53fe82e7e484df31e1e947d61514b6ea2ed6cd7b45d63006fd9224"
+dependencies = [
+ "cbc",
+ "cipher",
+ "des",
+ "getrandom 0.2.11",
+ "hmac",
+ "lazy_static",
+ "rc2",
+ "sha1",
+ "yasna",
+]
+
+[[package]]
+name = "parking"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae"
+
+[[package]]
+name = "parking_lot"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+dependencies = [
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "windows-targets 0.48.5",
+]
+
+[[package]]
+name = "password-hash"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700"
+dependencies = [
+ "base64ct",
+ "rand_core 0.6.4",
+ "subtle",
+]
+
+[[package]]
+name = "paste"
+version = "1.0.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c"
+
+[[package]]
+name = "pathdiff"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd"
+
+[[package]]
+name = "pbkdf2"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917"
+dependencies = [
+ "digest",
+ "hmac",
+ "password-hash",
+ "sha2",
+]
+
+[[package]]
+name = "pem"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8"
+dependencies = [
+ "base64 0.13.1",
+]
+
+[[package]]
+name = "percent-encoding"
+version = "2.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
+
+[[package]]
+name = "percent-encoding-iri"
+version = "2.2.0"
+source = "git+https://github.com/ankitects/rust-url.git?rev=bb930b8d089f4d30d7d19c12e54e66191de47b88#bb930b8d089f4d30d7d19c12e54e66191de47b88"
+
+[[package]]
+name = "pest"
+version = "2.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae9cee2a55a544be8b89dc6848072af97a20f2422603c10865be2a42b580fff5"
+dependencies = [
+ "memchr",
+ "thiserror",
+ "ucd-trie",
+]
+
+[[package]]
+name = "pest_derive"
+version = "2.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81d78524685f5ef2a3b3bd1cafbc9fcabb036253d9b1463e726a91cd16e2dfc2"
+dependencies = [
+ "pest",
+ "pest_generator",
+]
+
+[[package]]
+name = "pest_generator"
+version = "2.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68bd1206e71118b5356dae5ddc61c8b11e28b09ef6a31acbd15ea48a28e0c227"
+dependencies = [
+ "pest",
+ "pest_meta",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.39",
+]
+
+[[package]]
+name = "pest_meta"
+version = "2.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7c747191d4ad9e4a4ab9c8798f1e82a39affe7ef9648390b7e5548d18e099de6"
+dependencies = [
+ "once_cell",
+ "pest",
+ "sha2",
+]
+
+[[package]]
+name = "petgraph"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9"
+dependencies = [
+ "fixedbitset",
+ "indexmap",
+]
+
+[[package]]
+name = "phf"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259"
+dependencies = [
+ "phf_shared 0.10.0",
+]
+
+[[package]]
+name = "phf"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc"
+dependencies = [
+ "phf_macros",
+ "phf_shared 0.11.2",
+]
+
+[[package]]
+name = "phf_codegen"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd"
+dependencies = [
+ "phf_generator 0.10.0",
+ "phf_shared 0.10.0",
+]
+
+[[package]]
+name = "phf_generator"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6"
+dependencies = [
+ "phf_shared 0.10.0",
+ "rand 0.8.5",
+]
+
+[[package]]
+name = "phf_generator"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0"
+dependencies = [
+ "phf_shared 0.11.2",
+ "rand 0.8.5",
+]
+
+[[package]]
+name = "phf_macros"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b"
+dependencies = [
+ "phf_generator 0.11.2",
+ "phf_shared 0.11.2",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.39",
+]
+
+[[package]]
+name = "phf_shared"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096"
+dependencies = [
+ "siphasher",
+]
+
+[[package]]
+name = "phf_shared"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b"
+dependencies = [
+ "siphasher",
+]
+
+[[package]]
+name = "pin-project"
+version = "1.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422"
+dependencies = [
+ "pin-project-internal",
+]
+
+[[package]]
+name = "pin-project-internal"
+version = "1.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.39",
+]
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
+
+[[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.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
+
+[[package]]
+name = "plist"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5699cc8a63d1aa2b1ee8e12b9ad70ac790d65788cd36101fa37f87ea46c4cef"
+dependencies = [
+ "base64 0.21.5",
+ "indexmap",
+ "line-wrap",
+ "quick-xml",
+ "serde",
+ "time",
+]
+
+[[package]]
+name = "plotters"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45"
+dependencies = [
+ "num-traits",
+ "plotters-backend",
+ "plotters-svg",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "plotters-backend"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609"
+
+[[package]]
+name = "plotters-svg"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab"
+dependencies = [
+ "plotters-backend",
+]
+
+[[package]]
+name = "png"
+version = "0.17.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64"
+dependencies = [
+ "bitflags 1.3.2",
+ "crc32fast",
+ "fdeflate",
+ "flate2",
+ "miniz_oxide",
+]
+
+[[package]]
+name = "pollster"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22686f4785f02a4fcc856d3b3bb19bf6c8160d103f7a99cc258bddd0251dc7f2"
+
+[[package]]
+name = "powerfmt"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+
+[[package]]
+name = "precomputed-hash"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
+
+[[package]]
+name = "presser"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa"
+
+[[package]]
+name = "prettyplease"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d"
+dependencies = [
+ "proc-macro2",
+ "syn 2.0.39",
+]
+
+[[package]]
+name = "proc-macro-crate"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8"
+dependencies = [
+ "toml_edit",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.70"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "profiling"
+version = "1.0.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f89dff0959d98c9758c88826cc002e2c3d0b9dfac4139711d1f30de442f1139b"
+
+[[package]]
+name = "prost"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a"
+dependencies = [
+ "bytes",
+ "prost-derive",
+]
+
+[[package]]
+name = "prost-build"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c55e02e35260070b6f716a2423c2ff1c3bb1642ddca6f99e1f26d06268a0e2d2"
+dependencies = [
+ "bytes",
+ "heck",
+ "itertools 0.11.0",
+ "log",
+ "multimap",
+ "once_cell",
+ "petgraph",
+ "prettyplease",
+ "prost",
+ "prost-types",
+ "regex",
+ "syn 2.0.39",
+ "tempfile",
+ "which 4.4.2",
+]
+
+[[package]]
+name = "prost-derive"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e"
+dependencies = [
+ "anyhow",
+ "itertools 0.11.0",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.39",
+]
+
+[[package]]
+name = "prost-reflect"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "057237efdb71cf4b3f9396302a3d6599a92fa94063ba537b66130980ea9909f3"
+dependencies = [
+ "once_cell",
+ "prost",
+ "prost-types",
+]
+
+[[package]]
+name = "prost-types"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "193898f59edcf43c26227dcd4c8427f00d99d61e95dcde58dabd49fa291d470e"
+dependencies = [
+ "prost",
+]
+
+[[package]]
+name = "pulldown-cmark"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffade02495f22453cd593159ea2f59827aae7f53fa8323f756799b670881dcf8"
+dependencies = [
+ "bitflags 1.3.2",
+ "getopts",
+ "memchr",
+ "unicase",
+]
+
+[[package]]
+name = "pulldown-cmark"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77a1a2f1f0a7ecff9c31abbe177637be0e97a0aef46cf8738ece09327985d998"
+dependencies = [
+ "bitflags 1.3.2",
+ "getopts",
+ "memchr",
+ "unicase",
+]
+
+[[package]]
+name = "pulp"
+version = "0.18.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16785ee69419641c75affff7c9fdbdb7c0ab26dc9a5fb5218c2a2e9e4ef2087d"
+dependencies = [
+ "bytemuck",
+ "libm",
+ "num-complex",
+ "reborrow",
+]
+
+[[package]]
+name = "pyo3"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04e8453b658fe480c3e70c8ed4e3d3ec33eb74988bd186561b0cc66b85c3bc4b"
+dependencies = [
+ "cfg-if",
+ "indoc",
+ "libc",
+ "memoffset",
+ "parking_lot",
+ "pyo3-build-config",
+ "pyo3-ffi",
+ "pyo3-macros",
+ "unindent",
+]
+
+[[package]]
+name = "pyo3-build-config"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a96fe70b176a89cff78f2fa7b3c930081e163d5379b4dcdf993e3ae29ca662e5"
+dependencies = [
+ "once_cell",
+ "target-lexicon",
+]
+
+[[package]]
+name = "pyo3-ffi"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "214929900fd25e6604661ed9cf349727c8920d47deff196c4e28165a6ef2a96b"
+dependencies = [
+ "libc",
+ "pyo3-build-config",
+]
+
+[[package]]
+name = "pyo3-macros"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dac53072f717aa1bfa4db832b39de8c875b7c7af4f4a6fe93cdbf9264cf8383b"
+dependencies = [
+ "proc-macro2",
+ "pyo3-macros-backend",
+ "quote",
+ "syn 2.0.39",
+]
+
+[[package]]
+name = "pyo3-macros-backend"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7774b5a8282bd4f25f803b1f0d945120be959a36c72e08e7cd031c792fdfd424"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.39",
+]
+
+[[package]]
+name = "qoi"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001"
+dependencies = [
+ "bytemuck",
+]
+
+[[package]]
+name = "quick-xml"
+version = "0.31.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "r2d2"
+version = "0.8.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51de85fb3fb6524929c8a2eb85e6b6d363de4e8c48f9e2c2eac4944abc181c93"
+dependencies = [
+ "log",
+ "parking_lot",
+ "scheduled-thread-pool",
+]
+
+[[package]]
+name = "r2d2_sqlite"
+version = "0.23.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4dc290b669d30e20751e813517bbe13662d020419c5c8818ff10b6e8bb7777f6"
+dependencies = [
+ "r2d2",
+ "rusqlite",
+ "uuid",
+]
+
+[[package]]
+name = "rand"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
+dependencies = [
+ "getrandom 0.1.16",
+ "libc",
+ "rand_chacha 0.2.2",
+ "rand_core 0.5.1",
+ "rand_hc",
+]
+
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "libc",
+ "rand_chacha 0.3.1",
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
+dependencies = [
+ "ppv-lite86",
+ "rand_core 0.5.1",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+dependencies = [
+ "ppv-lite86",
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
+dependencies = [
+ "getrandom 0.1.16",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+dependencies = [
+ "getrandom 0.2.11",
+]
+
+[[package]]
+name = "rand_distr"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31"
+dependencies = [
+ "num-traits",
+ "rand 0.8.5",
+]
+
+[[package]]
+name = "rand_hc"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
+dependencies = [
+ "rand_core 0.5.1",
+]
+
+[[package]]
+name = "range-alloc"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8a99fddc9f0ba0a85884b8d14e3592853e787d581ca1816c91349b10e4eeab"
+
+[[package]]
+name = "raw-cpuid"
+version = "10.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332"
+dependencies = [
+ "bitflags 1.3.2",
+]
+
+[[package]]
+name = "raw-window-handle"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9"
+
+[[package]]
+name = "rawpointer"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3"
+
+[[package]]
+name = "rayon"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1"
+dependencies = [
+ "either",
+ "rayon-core",
+]
+
+[[package]]
+name = "rayon-core"
+version = "1.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed"
+dependencies = [
+ "crossbeam-deque",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "rc2"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62c64daa8e9438b84aaae55010a93f396f8e60e3911590fcba770d04643fc1dd"
+dependencies = [
+ "cipher",
+]
+
+[[package]]
+name = "rcgen"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffbe84efe2f38dea12e9bfc1f65377fdf03e53a18cb3b995faedf7934c7e785b"
+dependencies = [
+ "pem",
+ "ring 0.16.20",
+ "time",
+ "yasna",
+]
+
+[[package]]
+name = "reborrow"
+version = "0.5.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430"
+
+[[package]]
+name = "redox_syscall"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
+dependencies = [
+ "bitflags 1.3.2",
+]
+
+[[package]]
+name = "redox_users"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4"
+dependencies = [
+ "getrandom 0.2.11",
+ "libredox",
+ "thiserror",
+]
+
+[[package]]
+name = "regex"
+version = "1.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata 0.4.3",
+ "regex-syntax 0.8.2",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
+dependencies = [
+ "regex-syntax 0.6.29",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax 0.8.2",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
+
+[[package]]
+name = "regex-syntax"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
+
+[[package]]
+name = "renderdoc-sys"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "216080ab382b992234dda86873c18d4c48358f5cfcb70fd693d7f6f2131b628b"
+
+[[package]]
+name = "reqwest"
+version = "0.11.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b"
+dependencies = [
+ "base64 0.21.5",
+ "bytes",
+ "encoding_rs",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "hyper",
+ "hyper-rustls",
+ "hyper-tls",
+ "ipnet",
+ "js-sys",
+ "log",
+ "mime",
+ "mime_guess",
+ "native-tls",
+ "once_cell",
+ "percent-encoding",
+ "pin-project-lite",
+ "rustls",
+ "rustls-native-certs",
+ "rustls-pemfile",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "system-configuration",
+ "tokio",
+ "tokio-native-tls",
+ "tokio-rustls",
+ "tokio-socks",
+ "tokio-util",
+ "tower-service",
+ "url",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "wasm-streams",
+ "web-sys",
+ "webpki-roots",
+ "winreg 0.50.0",
+]
+
+[[package]]
+name = "retain_mut"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4389f1d5789befaf6029ebd9f7dac4af7f7e3d61b69d4f30e2ac02b57e7712b0"
+
+[[package]]
+name = "ring"
+version = "0.16.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc"
+dependencies = [
+ "cc",
+ "libc",
+ "once_cell",
+ "spin 0.5.2",
+ "untrusted 0.7.1",
+ "web-sys",
+ "winapi",
+]
+
+[[package]]
+name = "ring"
+version = "0.17.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74"
+dependencies = [
+ "cc",
+ "getrandom 0.2.11",
+ "libc",
+ "spin 0.9.8",
+ "untrusted 0.9.0",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "rmp"
+version = "0.8.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f9860a6cc38ed1da53456442089b4dfa35e7cedaa326df63017af88385e6b20"
+dependencies = [
+ "byteorder",
+ "num-traits",
+ "paste",
+]
+
+[[package]]
+name = "rmp-serde"
+version = "1.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bffea85eea980d8a74453e5d02a8d93028f3c34725de143085a844ebe953258a"
+dependencies = [
+ "byteorder",
+ "rmp",
+ "serde",
+]
+
+[[package]]
+name = "rsbridge"
+version = "0.0.0"
+dependencies = [
+ "anki",
+ "pyo3",
+]
+
+[[package]]
+name = "runner"
+version = "0.0.0"
+dependencies = [
+ "anki_io",
+ "anki_process",
+ "anyhow",
+ "camino",
+ "clap",
+ "flate2",
+ "junction",
+ "reqwest",
+ "sha2",
+ "tar",
+ "termcolor",
+ "tokio",
+ "which 5.0.0",
+ "xz2",
+ "zip",
+ "zstd 0.13.0",
+]
+
+[[package]]
+name = "rusqlite"
+version = "0.30.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a78046161564f5e7cd9008aff3b2990b3850dc8e0349119b98e8f251e099f24d"
+dependencies = [
+ "bitflags 2.4.1",
+ "fallible-iterator",
+ "fallible-streaming-iterator",
+ "hashlink",
+ "libsqlite3-sys",
+ "smallvec",
+]
+
+[[package]]
+name = "rustc-demangle"
+version = "0.1.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
+
+[[package]]
+name = "rustc-hash"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
+
+[[package]]
+name = "rustix"
+version = "0.38.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9470c4bf8246c8daf25f9598dca807fb6510347b1e1cfa55749113850c79d88a"
+dependencies = [
+ "bitflags 2.4.1",
+ "errno",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "rustls"
+version = "0.21.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "629648aced5775d558af50b2b4c7b02983a04b312126d45eeead26e7caa498b9"
+dependencies = [
+ "log",
+ "ring 0.17.7",
+ "rustls-webpki",
+ "sct",
+]
+
+[[package]]
+name = "rustls-native-certs"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00"
+dependencies = [
+ "openssl-probe",
+ "rustls-pemfile",
+ "schannel",
+ "security-framework",
+]
+
+[[package]]
+name = "rustls-pemfile"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c"
+dependencies = [
+ "base64 0.21.5",
+]
+
+[[package]]
+name = "rustls-webpki"
+version = "0.101.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765"
+dependencies = [
+ "ring 0.17.7",
+ "untrusted 0.9.0",
+]
+
+[[package]]
+name = "rustversion"
+version = "1.0.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4"
+
+[[package]]
+name = "ryu"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
+
+[[package]]
+name = "safemem"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072"
+
+[[package]]
+name = "safetensors"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d93279b86b3de76f820a8854dd06cbc33cfa57a417b19c47f6a25280112fb1df"
+dependencies = [
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "same-file"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "sanitize-filename"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2ed72fbaf78e6f2d41744923916966c4fbe3d7c74e3037a8ee482f1115572603"
+dependencies = [
+ "lazy_static",
+ "regex",
+]
+
+[[package]]
+name = "schannel"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88"
+dependencies = [
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "scheduled-thread-pool"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3cbc66816425a074528352f5789333ecff06ca41b36b0b0efdfbb29edc391a19"
+dependencies = [
+ "parking_lot",
+]
+
+[[package]]
+name = "scoped-tls"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
+
+[[package]]
+name = "scopeguard"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+
+[[package]]
+name = "sct"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414"
+dependencies = [
+ "ring 0.17.7",
+ "untrusted 0.9.0",
+]
+
+[[package]]
+name = "security-framework"
+version = "2.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de"
+dependencies = [
+ "bitflags 1.3.2",
+ "core-foundation",
+ "core-foundation-sys",
+ "libc",
+ "security-framework-sys",
+]
+
+[[package]]
+name = "security-framework-sys"
+version = "2.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "self_cell"
+version = "0.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e14e4d63b804dc0c7ec4a1e52bcb63f02c7ac94476755aa579edac21e01f915d"
+dependencies = [
+ "self_cell 1.0.2",
+]
+
+[[package]]
+name = "self_cell"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e388332cd64eb80cd595a00941baf513caffae8dce9cfd0467fc9c66397dade6"
+
+[[package]]
+name = "semver"
+version = "1.0.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090"
+
+[[package]]
+name = "seq-macro"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4"
+
+[[package]]
+name = "serde"
+version = "1.0.193"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde-aux"
+version = "4.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "184eba62ebddb71658697c8b08822edee89970bf318c5362189f0de27f85b498"
+dependencies = [
+ "chrono",
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.193"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.39",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.108"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_path_to_error"
+version = "0.1.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4beec8bce849d58d06238cb50db2e1c417cfeafa4c63f692b15c82b7c80f8335"
+dependencies = [
+ "itoa",
+ "serde",
+]
+
+[[package]]
+name = "serde_qs"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c7715380eec75f029a4ef7de39a9200e0a63823176b759d055b613f5a87df6a6"
+dependencies = [
+ "percent-encoding",
+ "serde",
+ "thiserror",
+]
+
+[[package]]
+name = "serde_repr"
+version = "0.1.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.39",
+]
+
+[[package]]
+name = "serde_rusqlite"
+version = "0.34.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4600dac14aada464c5584d327baa164e372153309bc4c0fb1498bbfbaa5a028b"
+dependencies = [
+ "rusqlite",
+ "serde",
+]
+
+[[package]]
+name = "serde_tuple"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4f025b91216f15a2a32aa39669329a475733590a015835d1783549a56d09427"
+dependencies = [
+ "serde",
+ "serde_tuple_macros",
+]
+
+[[package]]
+name = "serde_tuple_macros"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4076151d1a2b688e25aaf236997933c66e18b870d0369f8b248b8ab2be630d7e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "serde_urlencoded"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
+dependencies = [
+ "form_urlencoded",
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "sha1"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+]
+
+[[package]]
+name = "sha2"
+version = "0.10.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+]
+
+[[package]]
+name = "sharded-slab"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "shared_child"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0d94659ad3c2137fef23ae75b03d5241d633f8acded53d672decfa0e6e0caef"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "shlex"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380"
+
+[[package]]
+name = "signal-hook"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801"
+dependencies = [
+ "libc",
+ "signal-hook-registry",
+]
+
+[[package]]
+name = "signal-hook-registry"
+version = "1.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "simd-adler32"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
+
+[[package]]
+name = "simple-file-manifest"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5dd19be0257552dd56d1bb6946f89f193c6e5b9f13cc9327c4bc84a357507c74"
+
+[[package]]
+name = "siphasher"
+version = "0.3.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
+
+[[package]]
+name = "slab"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "slotmap"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a"
+dependencies = [
+ "version_check",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970"
+
+[[package]]
+name = "snafu"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4de37ad025c587a29e8f3f5605c00f70b98715ef90b9061a815b9e59e9042d6"
+dependencies = [
+ "backtrace",
+ "doc-comment",
+ "snafu-derive",
+]
+
+[[package]]
+name = "snafu-derive"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "990079665f075b699031e9c08fd3ab99be5029b96f3b78dc0709e8f77e4efebf"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "snowflake"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "27207bb65232eda1f588cf46db2fee75c0808d557f6b3cf19a75f5d6d7c94df1"
+
+[[package]]
+name = "socket2"
+version = "0.4.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "socket2"
+version = "0.5.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9"
+dependencies = [
+ "libc",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "spin"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
+
+[[package]]
+name = "spin"
+version = "0.9.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
+dependencies = [
+ "lock_api",
+]
+
+[[package]]
+name = "spirv"
+version = "0.2.0+1.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "246bfa38fe3db3f1dfc8ca5a2cdeb7348c78be2112740cc0ec8ef18b6d94f830"
+dependencies = [
+ "bitflags 1.3.2",
+ "num-traits",
+]
+
+[[package]]
+name = "stable_deref_trait"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
+
+[[package]]
+name = "static_assertions"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+
+[[package]]
+name = "string_cache"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b"
+dependencies = [
+ "new_debug_unreachable",
+ "once_cell",
+ "parking_lot",
+ "phf_shared 0.10.0",
+ "precomputed-hash",
+ "serde",
+]
+
+[[package]]
+name = "string_cache_codegen"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988"
+dependencies = [
+ "phf_generator 0.10.0",
+ "phf_shared 0.10.0",
+ "proc-macro2",
+ "quote",
+]
+
+[[package]]
+name = "strsim"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
+
+[[package]]
+name = "strum"
+version = "0.25.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125"
+dependencies = [
+ "strum_macros",
+]
+
+[[package]]
+name = "strum_macros"
+version = "0.25.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "rustversion",
+ "syn 2.0.39",
+]
+
+[[package]]
+name = "subtle"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc"
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "sync_wrapper"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
+
+[[package]]
+name = "synstructure"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "285ba80e733fac80aa4270fbcdf83772a79b80aa35c97075320abfee4a915b06"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.39",
+ "unicode-xid",
+]
+
+[[package]]
+name = "system-configuration"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7"
+dependencies = [
+ "bitflags 1.3.2",
+ "core-foundation",
+ "system-configuration-sys",
+]
+
+[[package]]
+name = "system-configuration-sys"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "tar"
+version = "0.4.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb"
+dependencies = [
+ "filetime",
+ "libc",
+ "xattr",
+]
+
+[[package]]
+name = "target-lexicon"
+version = "0.12.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a"
+
+[[package]]
+name = "tch"
+version = "0.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ed5dddab3812892bf5fb567136e372ea49f31672931e21cec967ca68aec03da"
+dependencies = [
+ "half 2.3.1",
+ "lazy_static",
+ "libc",
+ "ndarray",
+ "rand 0.8.5",
+ "safetensors",
+ "thiserror",
+ "torch-sys",
+ "zip",
+]
+
+[[package]]
+name = "tempfile"
+version = "3.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5"
+dependencies = [
+ "cfg-if",
+ "fastrand 2.0.1",
+ "redox_syscall",
+ "rustix",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "tendril"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0"
+dependencies = [
+ "futf",
+ "mac",
+ "utf-8",
+]
+
+[[package]]
+name = "termcolor"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "terminal_size"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7"
+dependencies = [
+ "rustix",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "text_placeholder"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "512104f982ce6f50def5340f9d7d14cc21f7a859e9ccd251aa19d12e1345c070"
+dependencies = [
+ "hashbrown 0.13.2",
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.50"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.50"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.39",
+]
+
+[[package]]
+name = "thread-tree"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffbd370cb847953a25954d9f63e14824a36113f8c72eecf6eccef5dc4b45d630"
+dependencies = [
+ "crossbeam-channel",
+]
+
+[[package]]
+name = "thread_local"
+version = "1.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+]
+
+[[package]]
+name = "tiff"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d172b0f4d3fba17ba89811858b9d3d97f928aece846475bbda076ca46736211"
+dependencies = [
+ "flate2",
+ "jpeg-decoder",
+ "weezl",
+]
+
+[[package]]
+name = "time"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5"
+dependencies = [
+ "deranged",
+ "itoa",
+ "powerfmt",
+ "serde",
+ "time-core",
+ "time-macros",
+]
+
+[[package]]
+name = "time-core"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
+
+[[package]]
+name = "time-macros"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20"
+dependencies = [
+ "time-core",
+]
+
+[[package]]
+name = "tinystr"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "83c02bf3c538ab32ba913408224323915f4ef9a6d61c0e85d493f355921c0ece"
+dependencies = [
+ "displaydoc",
+]
+
+[[package]]
+name = "tinytemplate"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc"
+dependencies = [
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "tinyvec"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+dependencies = [
+ "tinyvec_macros",
+]
+
+[[package]]
+name = "tinyvec_macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
+
+[[package]]
+name = "tokio"
+version = "1.34.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9"
+dependencies = [
+ "backtrace",
+ "bytes",
+ "libc",
+ "mio",
+ "num_cpus",
+ "pin-project-lite",
+ "signal-hook-registry",
+ "socket2 0.5.5",
+ "tokio-macros",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "tokio-macros"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.39",
+]
+
+[[package]]
+name = "tokio-native-tls"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2"
+dependencies = [
+ "native-tls",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-rustls"
+version = "0.24.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
+dependencies = [
+ "rustls",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-socks"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51165dfa029d2a65969413a6cc96f354b86b464498702f174a4efa13608fd8c0"
+dependencies = [
+ "either",
+ "futures-util",
+ "thiserror",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-stream"
+version = "0.1.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842"
+dependencies = [
+ "futures-core",
+ "pin-project-lite",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-tungstenite"
+version = "0.20.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c"
+dependencies = [
+ "futures-util",
+ "log",
+ "tokio",
+ "tungstenite",
+]
+
+[[package]]
+name = "tokio-util"
+version = "0.7.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "pin-project-lite",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "toml"
+version = "0.5.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "toml_datetime"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1"
+
+[[package]]
+name = "toml_edit"
+version = "0.20.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81"
+dependencies = [
+ "indexmap",
+ "toml_datetime",
+ "winnow",
+]
+
+[[package]]
+name = "topological-sort"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea68304e134ecd095ac6c3574494fc62b909f416c4fca77e440530221e549d3d"
+
+[[package]]
+name = "torch-sys"
+version = "0.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "803446f89fb877a117503dbfb8375b6a29fa8b0e0f44810fac3863c798ecef22"
+dependencies = [
+ "anyhow",
+ "cc",
+ "libc",
+ "serde",
+ "serde_json",
+ "ureq",
+ "zip",
+]
+
+[[package]]
+name = "tower"
+version = "0.4.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
+dependencies = [
+ "futures-core",
+ "futures-util",
+ "pin-project",
+ "pin-project-lite",
+ "tokio",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "tower-http"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61c5bb1d698276a2443e5ecfabc1008bf15a36c12e6a7176e7bf089ea9131140"
+dependencies = [
+ "bitflags 2.4.1",
+ "bytes",
+ "futures-core",
+ "futures-util",
+ "http",
+ "http-body",
+ "http-range-header",
+ "pin-project-lite",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "tower-layer"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0"
+
+[[package]]
+name = "tower-service"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
+
+[[package]]
+name = "tracing"
+version = "0.1.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
+dependencies = [
+ "log",
+ "pin-project-lite",
+ "tracing-attributes",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-appender"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf"
+dependencies = [
+ "crossbeam-channel",
+ "thiserror",
+ "time",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "tracing-attributes"
+version = "0.1.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.39",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
+dependencies = [
+ "once_cell",
+ "valuable",
+]
+
+[[package]]
+name = "tracing-log"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
+dependencies = [
+ "log",
+ "once_cell",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-subscriber"
+version = "0.3.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b"
+dependencies = [
+ "matchers",
+ "nu-ansi-term",
+ "once_cell",
+ "regex",
+ "sharded-slab",
+ "smallvec",
+ "thread_local",
+ "tracing",
+ "tracing-core",
+ "tracing-log",
+]
+
+[[package]]
+name = "try-lock"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed"
+
+[[package]]
+name = "tugger-common"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f90d950380afdb1a6bbe74f29485a04e821869dfad11f5929ff1c5b1dac09d02"
+dependencies = [
+ "anyhow",
+ "fs2",
+ "glob",
+ "hex",
+ "log",
+ "once_cell",
+ "reqwest",
+ "sha2",
+ "tempfile",
+ "url",
+ "zip",
+]
+
+[[package]]
+name = "tugger-windows"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e9f181ac4fc7f8facfd418824d13045cd068ee73de44319a6116868c22789782"
+dependencies = [
+ "anyhow",
+ "duct",
+ "find-winsdk",
+ "glob",
+ "once_cell",
+ "semver",
+ "tugger-common",
+ "winapi",
+]
+
+[[package]]
+name = "tugger-windows-codesign"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed3f09f8bdace495373cec3fc607bc39f00720a984ba82e310cc9382462fd364"
+dependencies = [
+ "anyhow",
+ "duct",
+ "log",
+ "p12",
+ "rcgen",
+ "time",
+ "tugger-common",
+ "tugger-windows",
+ "yasna",
+]
+
+[[package]]
+name = "tungstenite"
+version = "0.20.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9"
+dependencies = [
+ "byteorder",
+ "bytes",
+ "data-encoding",
+ "http",
+ "httparse",
+ "log",
+ "rand 0.8.5",
+ "sha1",
+ "thiserror",
+ "url",
+ "utf-8",
+]
+
+[[package]]
+name = "type-map"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6d3364c5e96cb2ad1603037ab253ddd34d7fb72a58bdddf4b7350760fc69a46"
+dependencies = [
+ "rustc-hash",
+]
+
+[[package]]
+name = "typenum"
+version = "1.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
+
+[[package]]
+name = "ucd-trie"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9"
+
+[[package]]
+name = "unic-char-property"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221"
+dependencies = [
+ "unic-char-range",
+]
+
+[[package]]
+name = "unic-char-range"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc"
+
+[[package]]
+name = "unic-common"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc"
+
+[[package]]
+name = "unic-langid"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "887622f8e7b723780c5e64b04dcc0c9b8f426ada7cca6790cd3ea3bf0f08037a"
+dependencies = [
+ "unic-langid-impl",
+ "unic-langid-macros",
+]
+
+[[package]]
+name = "unic-langid-impl"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5adeb847e35eed4efbffd9fb2e4d078b91ece56e4d6a3c0d2df55b3a1dac07d5"
+dependencies = [
+ "tinystr",
+]
+
+[[package]]
+name = "unic-langid-macros"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4d4589552627b69df7135a17919dc0b62f320be06988b77fcfc69bc89425600"
+dependencies = [
+ "tinystr",
+ "unic-langid-impl",
+ "unic-langid-macros-impl",
+]
+
+[[package]]
+name = "unic-langid-macros-impl"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb865515362dca12581b9a4b731acdc9015f4b81e1be9b21fa6d9dbbd2598e5e"
+dependencies = [
+ "find-crate",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.39",
+ "unic-langid-impl",
+]
+
+[[package]]
+name = "unic-ucd-category"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b8d4591f5fcfe1bd4453baaf803c40e1b1e69ff8455c47620440b46efef91c0"
+dependencies = [
+ "matches",
+ "unic-char-property",
+ "unic-char-range",
+ "unic-ucd-version",
+]
+
+[[package]]
+name = "unic-ucd-version"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4"
+dependencies = [
+ "unic-common",
+]
+
+[[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.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "unicode-segmentation"
+version = "1.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
+
+[[package]]
+name = "unicode-width"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85"
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
+
+[[package]]
+name = "unindent"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce"
+
+[[package]]
+name = "untrusted"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
+
+[[package]]
+name = "untrusted"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
+
+[[package]]
+name = "ureq"
+version = "2.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8cdd25c339e200129fe4de81451814e5228c9b771d57378817d6117cc2b3f97"
+dependencies = [
+ "base64 0.21.5",
+ "flate2",
+ "log",
+ "once_cell",
+ "rustls",
+ "rustls-webpki",
+ "serde",
+ "serde_json",
+ "url",
+ "webpki-roots",
+]
+
+[[package]]
+name = "url"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633"
+dependencies = [
+ "form_urlencoded",
+ "idna",
+ "percent-encoding",
+ "serde",
+]
+
+[[package]]
+name = "utf-8"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
+
+[[package]]
+name = "utf8parse"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
+
+[[package]]
+name = "utime"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91baa0c65eabd12fcbdac8cc35ff16159cab95cae96d0222d6d0271db6193cef"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "uuid"
+version = "1.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560"
+dependencies = [
+ "getrandom 0.2.11",
+ "rand 0.8.5",
+]
+
+[[package]]
+name = "valuable"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
+
+[[package]]
+name = "vcpkg"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+
+[[package]]
+name = "version_check"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+[[package]]
+name = "waker-fn"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690"
+
+[[package]]
+name = "walkdir"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee"
+dependencies = [
+ "same-file",
+ "winapi-util",
+]
+
+[[package]]
+name = "want"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
+dependencies = [
+ "try-lock",
+]
+
+[[package]]
+name = "warp"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1e92e22e03ff1230c03a1a8ee37d2f89cd489e2e541b7550d6afad96faed169"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-util",
+ "headers",
+ "http",
+ "hyper",
+ "log",
+ "mime",
+ "mime_guess",
+ "percent-encoding",
+ "pin-project",
+ "rustls-pemfile",
+ "scoped-tls",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "tokio",
+ "tokio-stream",
+ "tokio-tungstenite",
+ "tokio-util",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "wasi"
+version = "0.9.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
+
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.89"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e"
+dependencies = [
+ "cfg-if",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.89"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826"
+dependencies = [
+ "bumpalo",
+ "log",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.39",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-futures"
+version = "0.4.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12"
+dependencies = [
+ "cfg-if",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.89"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.89"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.39",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.89"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f"
+
+[[package]]
+name = "wasm-streams"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7"
+dependencies = [
+ "futures-util",
+ "js-sys",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+]
+
+[[package]]
+name = "web-sys"
+version = "0.3.64"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "webpki-roots"
+version = "0.25.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10"
+
+[[package]]
+name = "weezl"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb"
+
+[[package]]
+name = "wgpu"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "30e7d227c9f961f2061c26f4cb0fbd4df0ef37e056edd0931783599d6c94ef24"
+dependencies = [
+ "arrayvec",
+ "cfg-if",
+ "flume 0.11.0",
+ "js-sys",
+ "log",
+ "naga",
+ "parking_lot",
+ "profiling",
+ "raw-window-handle",
+ "smallvec",
+ "static_assertions",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+ "wgpu-core",
+ "wgpu-hal",
+ "wgpu-types",
+]
+
+[[package]]
+name = "wgpu-core"
+version = "0.18.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef91c1d62d1e9e81c79e600131a258edf75c9531cbdbde09c44a011a47312726"
+dependencies = [
+ "arrayvec",
+ "bit-vec",
+ "bitflags 2.4.1",
+ "codespan-reporting",
+ "log",
+ "naga",
+ "parking_lot",
+ "profiling",
+ "raw-window-handle",
+ "rustc-hash",
+ "smallvec",
+ "thiserror",
+ "web-sys",
+ "wgpu-hal",
+ "wgpu-types",
+]
+
+[[package]]
+name = "wgpu-hal"
+version = "0.18.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b84ecc802da3eb67b4cf3dd9ea6fe45bbb47ef13e6c49c5c3240868a9cc6cdd9"
+dependencies = [
+ "android_system_properties",
+ "arrayvec",
+ "ash",
+ "bit-set",
+ "bitflags 2.4.1",
+ "block",
+ "core-graphics-types",
+ "d3d12",
+ "glow",
+ "glutin_wgl_sys",
+ "gpu-alloc",
+ "gpu-allocator",
+ "gpu-descriptor",
+ "hassle-rs",
+ "js-sys",
+ "khronos-egl",
+ "libc",
+ "libloading 0.8.1",
+ "log",
+ "metal",
+ "naga",
+ "objc",
+ "once_cell",
+ "parking_lot",
+ "profiling",
+ "range-alloc",
+ "raw-window-handle",
+ "renderdoc-sys",
+ "rustc-hash",
+ "smallvec",
+ "thiserror",
+ "wasm-bindgen",
+ "web-sys",
+ "wgpu-types",
+ "winapi",
+]
+
+[[package]]
+name = "wgpu-types"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d5ed5f0edf0de351fe311c53304986315ce866f394a2e6df0c4b3c70774bcdd"
+dependencies = [
+ "bitflags 2.4.1",
+ "js-sys",
+ "web-sys",
+]
+
+[[package]]
+name = "which"
+version = "4.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7"
+dependencies = [
+ "either",
+ "home",
+ "once_cell",
+ "rustix",
+]
+
+[[package]]
+name = "which"
+version = "5.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9bf3ea8596f3a0dd5980b46430f2058dfe2c36a27ccfbb1845d6fbfcd9ba6e14"
+dependencies = [
+ "either",
+ "home",
+ "once_cell",
+ "rustix",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "widestring"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8"
+
+[[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-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-util"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596"
+dependencies = [
+ "winapi",
+]
+
+[[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 = "windows"
+version = "0.51.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9"
+dependencies = [
+ "windows-core 0.51.1",
+ "windows-targets 0.48.5",
+]
+
+[[package]]
+name = "windows"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be"
+dependencies = [
+ "windows-core 0.52.0",
+ "windows-targets 0.52.0",
+]
+
+[[package]]
+name = "windows-core"
+version = "0.51.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64"
+dependencies = [
+ "windows-targets 0.48.5",
+]
+
+[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets 0.52.0",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets 0.48.5",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
+dependencies = [
+ "windows-targets 0.52.0",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
+dependencies = [
+ "windows_aarch64_gnullvm 0.48.5",
+ "windows_aarch64_msvc 0.48.5",
+ "windows_i686_gnu 0.48.5",
+ "windows_i686_msvc 0.48.5",
+ "windows_x86_64_gnu 0.48.5",
+ "windows_x86_64_gnullvm 0.48.5",
+ "windows_x86_64_msvc 0.48.5",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd"
+dependencies = [
+ "windows_aarch64_gnullvm 0.52.0",
+ "windows_aarch64_msvc 0.52.0",
+ "windows_i686_gnu 0.52.0",
+ "windows_i686_msvc 0.52.0",
+ "windows_x86_64_gnu 0.52.0",
+ "windows_x86_64_gnullvm 0.52.0",
+ "windows_x86_64_msvc 0.52.0",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"
+
+[[package]]
+name = "winnow"
+version = "0.5.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b7e87b8dfbe3baffbe687eef2e164e32286eff31a5ee16463ce03d991643ec94"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "winreg"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a27a759395c1195c4cc5cda607ef6f8f6498f64e78f7900f5de0a127a424704a"
+dependencies = [
+ "serde",
+ "winapi",
+]
+
+[[package]]
+name = "winreg"
+version = "0.50.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1"
+dependencies = [
+ "cfg-if",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "wiremock"
+version = "0.5.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "13a3a53eaf34f390dd30d7b1b078287dd05df2aa2e21a589ccb80f5c7253c2e9"
+dependencies = [
+ "assert-json-diff",
+ "async-trait",
+ "base64 0.21.5",
+ "deadpool",
+ "futures",
+ "futures-timer",
+ "http-types",
+ "hyper",
+ "log",
+ "once_cell",
+ "regex",
+ "serde",
+ "serde_json",
+ "tokio",
+]
+
+[[package]]
+name = "xattr"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4686009f71ff3e5c4dbcf1a282d0a44db3f021ba69350cd42086b3e5f1c6985"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "xml-rs"
+version = "0.8.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a"
+
+[[package]]
+name = "xml5ever"
+version = "0.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4034e1d05af98b51ad7214527730626f019682d797ba38b51689212118d8e650"
+dependencies = [
+ "log",
+ "mac",
+ "markup5ever",
+]
+
+[[package]]
+name = "xz2"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2"
+dependencies = [
+ "lzma-sys",
+]
+
+[[package]]
+name = "yasna"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd"
+dependencies = [
+ "time",
+]
+
+[[package]]
+name = "yoke"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "65e71b2e4f287f467794c671e2b8f8a5f3716b3c829079a1c44740148eff07e4"
+dependencies = [
+ "serde",
+ "stable_deref_trait",
+ "yoke-derive",
+ "zerofrom",
+]
+
+[[package]]
+name = "yoke-derive"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e6936f0cce458098a201c245a11bef556c6a0181129c7034d10d76d1ec3a2b8"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.39",
+ "synstructure",
+]
+
+[[package]]
+name = "zerocopy"
+version = "0.7.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1c4061bedbb353041c12f413700357bec76df2c7e2ca8e4df8bac24c6bf68e3d"
+dependencies = [
+ "zerocopy-derive",
+]
+
+[[package]]
+name = "zerocopy-derive"
+version = "0.7.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b3c129550b3e6de3fd0ba67ba5c81818f9805e58b8d7fee80a3a59d2c9fc601a"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.39",
+]
+
+[[package]]
+name = "zerofrom"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "655b0814c5c0b19ade497851070c640773304939a6c0fd5f5fb43da0696d05b7"
+dependencies = [
+ "zerofrom-derive",
+]
+
+[[package]]
+name = "zerofrom-derive"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6a647510471d372f2e6c2e6b7219e44d8c574d24fdc11c610a61455782f18c3"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.39",
+ "synstructure",
+]
+
+[[package]]
+name = "zip"
+version = "0.6.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261"
+dependencies = [
+ "aes",
+ "byteorder",
+ "bzip2",
+ "constant_time_eq 0.1.5",
+ "crc32fast",
+ "crossbeam-utils",
+ "flate2",
+ "hmac",
+ "pbkdf2",
+ "sha1",
+ "time",
+ "zstd 0.11.2+zstd.1.5.2",
+]
+
+[[package]]
+name = "zstd"
+version = "0.11.2+zstd.1.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4"
+dependencies = [
+ "zstd-safe 5.0.2+zstd.1.5.2",
+]
+
+[[package]]
+name = "zstd"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bffb3309596d527cfcba7dfc6ed6052f1d39dfbd7c867aa2e865e4a449c10110"
+dependencies = [
+ "zstd-safe 7.0.0",
+]
+
+[[package]]
+name = "zstd-safe"
+version = "5.0.2+zstd.1.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db"
+dependencies = [
+ "libc",
+ "zstd-sys",
+]
+
+[[package]]
+name = "zstd-safe"
+version = "7.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43747c7422e2924c11144d5229878b98180ef8b06cca4ab5af37afc8a8d8ea3e"
+dependencies = [
+ "zstd-sys",
+]
+
+[[package]]
+name = "zstd-sys"
+version = "2.0.9+zstd.1.5.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656"
+dependencies = [
+ "cc",
+ "pkg-config",
+]
+
+[[package]]
+name = "zune-inflate"
+version = "0.2.54"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02"
+dependencies = [
+ "simd-adler32",
+]
diff --git a/nixpkgs/pkgs/games/anki/bin.nix b/nixpkgs/pkgs/games/anki/bin.nix
new file mode 100644
index 000000000000..7404be23bc64
--- /dev/null
+++ b/nixpkgs/pkgs/games/anki/bin.nix
@@ -0,0 +1,93 @@
+{ fetchurl, stdenv, lib, buildFHSEnv, appimageTools, writeShellScript, anki, undmg, zstd, commandLineArgs ? [] }:
+
+let
+  pname = "anki-bin";
+  # Update hashes for both Linux and Darwin!
+  version = "23.10.1";
+
+  sources = {
+    linux = fetchurl {
+      url = "https://github.com/ankitects/anki/releases/download/${version}/anki-${version}-linux-qt6.tar.zst";
+      sha256 = "sha256-Kv0SH+bLnBSM/tYHe2kEJc4n7izZTBNWQs2nm/teLEU=";
+    };
+
+    # For some reason anki distributes completely separate dmg-files for the aarch64 version and the x86_64 version
+    darwin-x86_64 = fetchurl {
+      url = "https://github.com/ankitects/anki/releases/download/${version}/anki-${version}-mac-intel-qt6.dmg";
+      sha256 = "sha256-MSlKsEv4N/H7G1bUOBlPBXerpHIW32P6Va02aRq1+54=";
+    };
+    darwin-aarch64 = fetchurl {
+      url = "https://github.com/ankitects/anki/releases/download/${version}/anki-${version}-mac-apple-qt6.dmg";
+      sha256 = "sha256-jEm9WJBXx77KpldzBuxK1Pu6VGiARZPnRmMhEjZdm1I=";
+    };
+  };
+
+  unpacked = stdenv.mkDerivation {
+    inherit pname version;
+
+    nativeBuildInputs = [ zstd ];
+    src = sources.linux;
+
+    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" "aarch64-darwin" ];
+    maintainers = with maintainers; [ mahmoudk1000 ];
+  };
+
+  passthru = { inherit sources; };
+
+  fhsEnvAnki = buildFHSEnv (appimageTools.defaultFhsEnvArgs // {
+    inherit pname version;
+    name = null; # Appimage sets it to "appimage-env"
+
+    # Dependencies of anki
+    targetPkgs = pkgs: (with pkgs; [ xorg.libxkbfile xcb-util-cursor-HEAD krb5 ]);
+
+    runScript = writeShellScript "anki-wrapper.sh" ''
+      exec ${unpacked}/bin/anki ${ lib.strings.escapeShellArgs commandLineArgs } "$@"
+    '';
+
+    extraInstallCommands = ''
+      ln -s ${pname} $out/bin/anki
+
+      mkdir -p $out/share
+      cp -R ${unpacked}/share/applications \
+        ${unpacked}/share/man \
+        ${unpacked}/share/pixmaps \
+        $out/share/
+    '';
+
+    inherit meta passthru;
+  });
+in
+
+if stdenv.isLinux then fhsEnvAnki
+else stdenv.mkDerivation {
+  inherit pname version passthru;
+
+  src = if stdenv.isAarch64 then sources.darwin-aarch64 else sources.darwin-x86_64;
+
+  nativeBuildInputs = [ undmg ];
+  sourceRoot = ".";
+
+  installPhase = ''
+    mkdir -p $out/Applications/
+    cp -a Anki.app $out/Applications/
+  '';
+
+  inherit meta;
+}
diff --git a/nixpkgs/pkgs/games/anki/default.nix b/nixpkgs/pkgs/games/anki/default.nix
new file mode 100644
index 000000000000..ca6eaf15ac21
--- /dev/null
+++ b/nixpkgs/pkgs/games/anki/default.nix
@@ -0,0 +1,299 @@
+{ lib
+, stdenv
+
+, buildEnv
+, cargo
+, fetchFromGitHub
+, fetchYarnDeps
+, installShellFiles
+, lame
+, mpv-unwrapped
+, ninja
+, nixosTests
+, nodejs
+, nodejs-slim
+, prefetch-yarn-deps
+, protobuf
+, python3
+, qt6
+, rsync
+, rustPlatform
+, writeShellScriptBin
+, yarn
+
+, AVKit
+, CoreAudio
+, swift
+}:
+
+let
+  pname = "anki";
+  version = "23.12.1";
+  rev = "1a1d4d5419c6b57ef3baf99c9d2d9cf85d36ae0a";
+
+  src = fetchFromGitHub {
+    owner = "ankitects";
+    repo = "anki";
+    rev = version;
+    hash = "sha256-K38bhfU1076PxdKJFvnFb2w6Q9Q2MUmL+j8be3RZQYk=";
+    fetchSubmodules = true;
+  };
+
+  cargoLock = {
+    lockFile = ./Cargo.lock;
+    outputHashes = {
+      "fsrs-0.1.0" = "sha256-KJgT01OmMbqgYFE5Fu8nblZl9rL5QVVMa2DNFsw6cdk=";
+      "linkcheck-0.4.1" = "sha256-S93J1cDzMlzDjcvz/WABmv8CEC6x78E+f7nzhsN7NkE=";
+      "percent-encoding-iri-2.2.0" = "sha256-kCBeS1PNExyJd4jWfDfctxq6iTdAq69jtxFQgCCQ8kQ=";
+    };
+  };
+  cargoDeps = rustPlatform.importCargoLock cargoLock;
+
+  yarnOfflineCache = fetchYarnDeps {
+    yarnLock = "${src}/yarn.lock";
+    hash = "sha256-tOl+gLBE6SNPQvVWT/N7RKFaaP9SnpCBJf5dq2wCPuM=";
+  };
+
+  anki-build-python = python3.withPackages (ps: with ps; [
+    mypy-protobuf
+  ]);
+
+  # anki shells out to git to check its revision, and also to update submodules
+  # We don't actually need the submodules, so we stub that out
+  fakeGit = writeShellScriptBin "git" ''
+    case "$*" in
+      "rev-parse --short=8 HEAD")
+        echo ${builtins.substring 0 8 rev}
+      ;;
+      *"submodule update "*)
+        exit 0
+      ;;
+      *)
+        echo "Unrecognized git: $@"
+        exit 1
+      ;;
+    esac
+  '';
+
+  # We don't want to run pip-sync, it does network-io
+  fakePipSync = writeShellScriptBin "pip-sync" ''
+    exit 0
+  '';
+
+  offlineYarn = writeShellScriptBin "yarn" ''
+    [[ "$1" == "install" ]] && exit 0
+    exec ${yarn}/bin/yarn --offline "$@"
+  '';
+
+  pyEnv = buildEnv {
+    name = "anki-pyenv-${version}";
+    paths = with python3.pkgs; [
+      pip
+      fakePipSync
+      anki-build-python
+    ];
+    pathsToLink = [ "/bin" ];
+  };
+
+  # https://discourse.nixos.org/t/mkyarnpackage-lockfile-has-incorrect-entry/21586/3
+  anki-nodemodules = stdenv.mkDerivation {
+    pname = "anki-nodemodules";
+
+    inherit version src yarnOfflineCache;
+
+    nativeBuildInputs = [
+      nodejs-slim
+      prefetch-yarn-deps
+      yarn
+    ];
+
+    configurePhase = ''
+      export HOME=$NIX_BUILD_TOP
+      yarn config --offline set yarn-offline-mirror $yarnOfflineCache
+      fixup-yarn-lock yarn.lock
+      yarn install --offline --frozen-lockfile --ignore-scripts --no-progress --non-interactive
+      patchShebangs node_modules/
+    '';
+
+    installPhase = ''
+      mv node_modules $out
+    '';
+  };
+in
+python3.pkgs.buildPythonApplication {
+  inherit pname version;
+
+  outputs = [ "out" "doc" "man" ];
+
+  inherit src;
+
+  patches = [
+    ./patches/disable-auto-update.patch
+    ./patches/remove-the-gl-library-workaround.patch
+    ./patches/skip-formatting-python-code.patch
+  ];
+
+  inherit cargoDeps yarnOfflineCache;
+
+  nativeBuildInputs = [
+    fakeGit
+    offlineYarn
+    prefetch-yarn-deps
+
+    cargo
+    installShellFiles
+    ninja
+    qt6.wrapQtAppsHook
+    rsync
+    rustPlatform.cargoSetupHook
+  ] ++ lib.optional stdenv.isDarwin swift;
+
+  buildInputs = [
+    qt6.qtbase
+    qt6.qtsvg
+  ] ++ lib.optional stdenv.isLinux qt6.qtwayland;
+
+  propagatedBuildInputs = with python3.pkgs; [
+    # This rather long list came from running:
+    #    grep --no-filename -oE "^[^ =]*" python/{requirements.base.txt,requirements.bundle.txt,requirements.qt6_4.txt} | \
+    #      sort | uniq | grep -v "^#$"
+    # in their repo at the git tag for this version
+    # There's probably a more elegant way, but the above extracted all the
+    # names, without version numbers, of their python dependencies. The hope is
+    # that nixpkgs versions are "close enough"
+    # I then removed the ones the check phase failed on (pythonCatchConflictsPhase)
+    beautifulsoup4
+    certifi
+    charset-normalizer
+    click
+    colorama
+    decorator
+    distro
+    flask
+    flask-cors
+    idna
+    importlib-metadata
+    itsdangerous
+    jinja2
+    jsonschema
+    markdown
+    markupsafe
+    orjson
+    pep517
+    pyparsing
+    pyqt6
+    pyqt6-sip
+    pyqt6-webengine
+    pyrsistent
+    pysocks
+    python3.pkgs.protobuf
+    requests
+    send2trash
+    six
+    soupsieve
+    urllib3
+    waitress
+    werkzeug
+    zipp
+  ] ++ lib.optionals stdenv.isDarwin [
+    AVKit
+    CoreAudio
+  ];
+
+  nativeCheckInputs = with python3.pkgs; [ pytest mock astroid ];
+
+  # tests fail with to many open files
+  # TODO: verify if this is still true (I can't, no mac)
+  doCheck = !stdenv.isDarwin;
+
+  dontUseNinjaInstall = false;
+  dontWrapQtApps = true;
+
+  env = {
+    # Activate optimizations
+    RELEASE = true;
+
+    NODE_BINARY = lib.getExe nodejs;
+    PROTOC_BINARY = lib.getExe protobuf;
+    PYTHON_BINARY = lib.getExe python3;
+    YARN_BINARY = lib.getExe offlineYarn;
+  };
+
+  buildPhase = ''
+    export RUST_BACKTRACE=1
+    export RUST_LOG=debug
+
+    mkdir -p out/pylib/anki .git
+
+    echo ${builtins.substring 0 8 rev} > out/buildhash
+    touch out/env
+    touch .git/HEAD
+
+    ln -vsf ${pyEnv} ./out/pyenv
+    rsync --chmod +w -avP ${anki-nodemodules}/ out/node_modules/
+    ln -vsf out/node_modules node_modules
+
+    export HOME=$NIX_BUILD_TOP
+    yarn config --offline set yarn-offline-mirror $yarnOfflineCache
+    fixup-yarn-lock yarn.lock
+
+    patchShebangs ./ninja
+    PIP_USER=1 ./ninja build wheels
+  '';
+
+  # mimic https://github.com/ankitects/anki/blob/76d8807315fcc2675e7fa44d9ddf3d4608efc487/build/ninja_gen/src/python.rs#L232-L250
+  checkPhase = ''
+    HOME=$TMP ANKI_TEST_MODE=1 PYTHONPATH=$PYTHONPATH:$PWD/out/pylib \
+      pytest -p no:cacheprovider pylib/tests
+    HOME=$TMP ANKI_TEST_MODE=1 PYTHONPATH=$PYTHONPATH:$PWD/out/pylib:$PWD/pylib:$PWD/out/qt \
+      pytest -p no:cacheprovider qt/tests
+  '';
+
+  preInstall = ''
+    mkdir dist
+    mv out/wheels/* dist
+  '';
+
+  postInstall = ''
+    install -D -t $out/share/applications qt/bundle/lin/anki.desktop
+    install -D -t $doc/share/doc/anki README* LICENSE*
+    install -D -t $out/share/mime/packages qt/bundle/lin/anki.xml
+    install -D -t $out/share/pixmaps qt/bundle/lin/anki.{png,xpm}
+    installManPage qt/bundle/lin/anki.1
+  '';
+
+  preFixup = ''
+    makeWrapperArgs+=(
+      "''${qtWrapperArgs[@]}"
+      --prefix PATH ':' "${lame}/bin:${mpv-unwrapped}/bin"
+    )
+  '';
+
+  passthru = {
+    # cargoLock is reused in anki-sync-server
+    inherit cargoLock;
+    tests.anki-sync-server = nixosTests.anki-sync-server;
+  };
+
+  meta = with lib; {
+    description = "Spaced repetition flashcard program";
+    longDescription = ''
+      Anki is a program which makes remembering things easy. Because it is a lot
+      more efficient than traditional study methods, you can either greatly
+      decrease your time spent studying, or greatly increase the amount you learn.
+
+      Anyone who needs to remember things in their daily life can benefit from
+      Anki. Since it is content-agnostic and supports images, audio, videos and
+      scientific markup (via LaTeX), the possibilities are endless. For example:
+      learning a language, studying for medical and law exams, memorizing
+      people's names and faces, brushing up on geography, mastering long poems,
+      or even practicing guitar chords!
+    '';
+    homepage = "https://apps.ankiweb.net";
+    license = licenses.agpl3Plus;
+    platforms = platforms.mesaPlatforms;
+    maintainers = with maintainers; [ euank oxij paveloom ];
+    # Reported to crash at launch on darwin (as of 2.1.65)
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/games/anki/patches/disable-auto-update.patch b/nixpkgs/pkgs/games/anki/patches/disable-auto-update.patch
new file mode 100644
index 000000000000..25071a0f1943
--- /dev/null
+++ b/nixpkgs/pkgs/games/anki/patches/disable-auto-update.patch
@@ -0,0 +1,15 @@
+diff --git a/qt/aqt/main.py b/qt/aqt/main.py
+index 6c634132d..f3f3d4d10 100644
+--- a/qt/aqt/main.py
++++ b/qt/aqt/main.py
+@@ -1421,6 +1421,8 @@ title="{}" {}>{}</button>""".format(
+     ##########################################################################
+
+     def setup_auto_update(self, _log: list[DownloadLogEntry]) -> None:
++        return
++
+         from aqt.update import check_for_update
+
+         check_for_update()
+--
+2.42.0
diff --git a/nixpkgs/pkgs/games/anki/patches/remove-the-gl-library-workaround.patch b/nixpkgs/pkgs/games/anki/patches/remove-the-gl-library-workaround.patch
new file mode 100644
index 000000000000..0a3f94e132a0
--- /dev/null
+++ b/nixpkgs/pkgs/games/anki/patches/remove-the-gl-library-workaround.patch
@@ -0,0 +1,19 @@
+diff --git a/qt/aqt/__init__.py b/qt/aqt/__init__.py
+index 6f28d2dd0..fcd6a5ee4 100644
+--- a/qt/aqt/__init__.py
++++ b/qt/aqt/__init__.py
+@@ -402,12 +402,6 @@ def setupGL(pm: aqt.profiles.ProfileManager) -> None:
+     # RHI errors are emitted multiple times so make sure we only handle them once
+     driver_failed = False
+
+-    # work around pyqt loading wrong GL library
+-    if is_lin:
+-        import ctypes
+-
+-        ctypes.CDLL("libGL.so.1", ctypes.RTLD_GLOBAL)
+-
+     # catch opengl errors
+     def msgHandler(category: Any, ctx: Any, msg: Any) -> None:
+         if category == QtMsgType.QtDebugMsg:
+--
+2.42.0
diff --git a/nixpkgs/pkgs/games/anki/patches/skip-formatting-python-code.patch b/nixpkgs/pkgs/games/anki/patches/skip-formatting-python-code.patch
new file mode 100644
index 000000000000..c471c6ecb325
--- /dev/null
+++ b/nixpkgs/pkgs/games/anki/patches/skip-formatting-python-code.patch
@@ -0,0 +1,21 @@
+From 104572dc7ebb75061b867158ce3d4311d8cf4594 Mon Sep 17 00:00:00 2001
+From: Euan Kemp <euank@euank.com>
+Date: Thu, 6 Jul 2023 10:05:15 +0900
+Subject: [PATCH] Skip formatting Python code.
+
+Co-authored-by: Pavel Sobolev <paveloom@riseup.net>
+---
+ pylib/tools/hookslib.py | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/pylib/tools/hookslib.py b/pylib/tools/hookslib.py
+index 6361c633e..6b16d3ec1 100644
+--- a/pylib/tools/hookslib.py
++++ b/pylib/tools/hookslib.py
+@@ -208,4 +208,3 @@ def write_file(path: str, hooks: list[Hook], prefix: str, suffix: str):
+         os.environ["USERPROFILE"] = os.environ["HOME"]
+     with open(path, "wb") as file:
+         file.write(code.encode("utf8"))
+-    subprocess.run([sys.executable, "-m", "black", "-q", path], check=True)
+--
+2.42.0
diff --git a/nixpkgs/pkgs/games/anki/sync-server.nix b/nixpkgs/pkgs/games/anki/sync-server.nix
new file mode 100644
index 000000000000..248d3f34a06a
--- /dev/null
+++ b/nixpkgs/pkgs/games/anki/sync-server.nix
@@ -0,0 +1,40 @@
+{ lib
+, stdenv
+, rustPlatform
+, anki
+, darwin
+
+, openssl
+, pkg-config
+, protobuf
+}:
+
+rustPlatform.buildRustPackage {
+  pname = "anki-sync-server";
+  inherit (anki) version src cargoLock;
+
+  # only build sync server
+  cargoBuildFlags = [
+    "--bin"
+    "anki-sync-server"
+  ];
+
+  nativeBuildInputs = [ protobuf pkg-config ];
+
+  buildInputs = [
+    openssl
+  ] ++ lib.optionals stdenv.isDarwin [
+    darwin.apple_sdk.frameworks.Security
+    darwin.apple_sdk.frameworks.SystemConfiguration
+  ];
+
+  env.PROTOC = lib.getExe protobuf;
+
+  meta = with lib; {
+    description = "Standalone official anki sync server";
+    homepage = "https://apps.ankiweb.net";
+    license = with licenses; [ agpl3Plus ];
+    maintainers = with maintainers; [ martinetd ];
+    mainProgram = "anki-sync-server";
+  };
+}
diff --git a/nixpkgs/pkgs/games/antsimulator/default.nix b/nixpkgs/pkgs/games/antsimulator/default.nix
new file mode 100644
index 000000000000..bac481c88f35
--- /dev/null
+++ b/nixpkgs/pkgs/games/antsimulator/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv, fetchFromGitHub, cmake, sfml }:
+
+stdenv.mkDerivation rec {
+  pname = "antsimulator";
+  version = "3.1";
+
+  src = fetchFromGitHub {
+    owner = "johnBuffer";
+    repo = "AntSimulator";
+    rev = "v${version}";
+    sha256 = "sha256-1KWoGbdjF8VI4th/ZjAzASgsLEuS3xiwObulzxQAppA=";
+  };
+
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ sfml ];
+
+  postPatch = ''
+    substituteInPlace src/main.cpp \
+      --replace "res/" "$out/opt/antsimulator/"
+
+    substituteInPlace include/simulation/config.hpp \
+      --replace "res/" "$out/opt/antsimulator/"
+
+    substituteInPlace include/render/colony_renderer.hpp \
+      --replace "res/" "$out/opt/antsimulator/"
+  '';
+
+  installPhase = ''
+    install -Dm644 -t $out/opt/antsimulator res/*
+    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/nixpkgs/pkgs/games/arena/default.nix b/nixpkgs/pkgs/games/arena/default.nix
new file mode 100644
index 000000000000..16553a5f8ea6
--- /dev/null
+++ b/nixpkgs/pkgs/games/arena/default.nix
@@ -0,0 +1,75 @@
+{ 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
+# any way other than the original release tarball, so we cannot include its NAR
+# into the Nixpkgs channel.
+
+let
+
+  inherit (lib) makeLibraryPath;
+  libDir = "lib64";
+
+in
+stdenv.mkDerivation rec {
+  pname = "arena";
+  version = "3.10-beta";
+
+  src = fetchurl {
+    url = "http://www.playwitharena.de/downloads/arenalinux_64bit_${lib.replaceStrings ["-"] [""] version}.tar.gz";
+    sha256 = "1pzb9sg4lzbbi4gbldvlb85p8xyl9xnplxwyb9pkk2mwzvvxkf0d";
+  };
+
+  # stdenv.cc.cc.lib is in that list to pick up libstdc++.so. Is there a better way?
+  buildInputs = [gtk2-x11 glib pango cairo atk gdk-pixbuf libX11 stdenv.cc.cc.lib];
+
+  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/${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/${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/${pname}-${version}/Engines -type f -perm /u+x)
+         )
+    for i in "''${exes[@]}"; do
+      # Arminius is statically linked.
+      if [[ $i =~ "Arminius_2017-01-01" ]]; then echo yo $i; continue; fi
+      echo Fixing interpreter and rpath paths in $i ...
+      patchelf                                                                                   \
+        --interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)"                                \
+        --set-rpath ${makeLibraryPath buildInputs}:$(cat $NIX_CC/nix-support/orig-cc)/${libDir}  \
+        $i
+    done
+  '';
+
+  installPhase = ''
+    mkdir -p $out/bin
+    ln -s $out/lib/${pname}-${version}/Arena_x86_64_linux $out/bin/arena
+  '';
+
+  dontStrip = true;
+
+  meta = {
+    description = "Chess GUI for analyzing with and playing against various engines";
+    longDescription = ''
+      A free Graphical User Interface (GUI) for chess. Arena assists you in
+      analyzing and playing games as well as in testing chess engines. It runs
+      on Linux or Windows. Arena is compatible to Winboard protocol I, II and
+      UCI protocol I, II. Furthermore, compatible to Chess960, DGT electronic
+      chess board & DGT clocks and much more.
+    '';
+    license = lib.licenses.unfree;
+    platforms = ["x86_64-linux"];
+    hydraPlatforms = lib.platforms.none;
+  };
+
+}
diff --git a/nixpkgs/pkgs/games/armagetronad/default.nix b/nixpkgs/pkgs/games/armagetronad/default.nix
new file mode 100644
index 000000000000..fb0117f3e93e
--- /dev/null
+++ b/nixpkgs/pkgs/games/armagetronad/default.nix
@@ -0,0 +1,179 @@
+{ lib
+, stdenv
+, fetchFromGitLab
+, autoconf
+, automake
+, gnum4
+, pkg-config
+, bison
+, python3
+, which
+, boost
+, ftgl
+, freetype
+, glew
+, SDL
+, SDL_image
+, SDL_mixer
+, SDL2
+, SDL2_image
+, SDL2_mixer
+, libpng
+, libxml2
+, protobuf
+, dedicatedServer ? false
+}:
+
+let
+  latestVersionMajor = "0.2.9";
+  unstableVersionMajor = "0.4";
+
+  latestCommonBuildInputs = [ SDL SDL_image SDL_mixer libpng ];
+
+  unstableCommonBuildInputs = [ SDL2 SDL2_image SDL2_mixer glew ftgl freetype ];
+  unstableCommonNativeBuildInputs = [ SDL ]; # for sdl-config
+
+  srcs = {
+    ${latestVersionMajor} = rec {
+      version = "${latestVersionMajor}.1.1";
+      src = fetchFromGitLab {
+        owner = "armagetronad";
+        repo = "armagetronad";
+        rev = "v${version}";
+        sha256 = "tvmKGqzH8IYTSeahc8XmN3RV+GdE5GsP8pAlwG8Ph3M=";
+      };
+      extraBuildInputs = latestCommonBuildInputs;
+    };
+
+    ${unstableVersionMajor} =
+      let
+        rev = "4bf6245a668ce181cd464b767ce436a6b7bf8506";
+      in
+      {
+        version = "${unstableVersionMajor}-${builtins.substring 0 8 rev}";
+        src = fetchFromGitLab {
+          owner = "armagetronad";
+          repo = "armagetronad";
+          inherit rev;
+          sha256 = "cpJmQHCS6asGasD7anEgNukG9hRXpsIJZrCr3Q7uU4I=";
+        };
+        extraBuildInputs = [ protobuf boost ] ++ unstableCommonBuildInputs;
+        extraNativeBuildInputs = [ bison ] ++ unstableCommonNativeBuildInputs;
+      };
+
+    "${latestVersionMajor}-sty+ct+ap" =
+      let
+        rev = "fdfd5fb97083aed45467385b96d50d87669e4023";
+      in
+      {
+        version = "${latestVersionMajor}-sty+ct+ap-${builtins.substring 0 8 rev}";
+        src = fetchFromGitLab {
+          owner = "armagetronad";
+          repo = "armagetronad";
+          inherit rev;
+          sha256 = "UDbe7DiMLzNFAs4C6BbnmdEjqSltSbnk/uQfNOLGAfo=";
+        };
+        extraBuildInputs = latestCommonBuildInputs;
+        extraNativeBuildInputs = [ python3 ];
+      };
+  };
+
+  mkArmagetron = { version, src, dedicatedServer ? false, extraBuildInputs ? [ ], extraNativeBuildInputs ? [ ] }@params:
+  let
+    # Split the version into the major and minor parts
+    versionParts = lib.splitString "-" version;
+    splitVersion = lib.splitVersion (builtins.elemAt versionParts 0);
+    majorVersion = builtins.concatStringsSep "." (lib.lists.take 2 splitVersion);
+
+    minorVersionPart =  parts: sep: expectedSize:
+      if builtins.length parts > expectedSize then
+        sep + (builtins.concatStringsSep sep (lib.lists.drop expectedSize parts))
+      else
+        "";
+
+    minorVersion = (minorVersionPart splitVersion "." 2) + (minorVersionPart versionParts "-" 1) + "-nixpkgs";
+  in
+    stdenv.mkDerivation rec {
+      pname = if dedicatedServer then "armagetronad-dedicated" else "armagetronad";
+      inherit version src;
+
+      # Build works fine; install has a race.
+      enableParallelBuilding = true;
+      enableParallelInstalling = false;
+
+      preConfigure = ''
+        patchShebangs .
+
+        # Create the version.
+        echo "${majorVersion}" > major_version
+        echo "${minorVersion}" > minor_version
+
+        echo "Bootstrapping version: $(<major_version)$(<minor_version)" >&2
+        ./bootstrap.sh
+      '';
+
+      configureFlags = [
+        "--enable-automakedefaults"
+        "--enable-authentication"
+        "--disable-memmanager"
+        "--disable-useradd"
+        "--disable-initscripts"
+        "--disable-etc"
+        "--disable-uninstall"
+        "--disable-sysinstall"
+      ] ++ lib.optional dedicatedServer "--enable-dedicated"
+        ++ lib.optional (!dedicatedServer) "--enable-music";
+
+      buildInputs = [ libxml2 ] ++ extraBuildInputs;
+
+      nativeBuildInputs = [ autoconf automake gnum4 pkg-config which python3 ]
+        ++ extraNativeBuildInputs;
+
+      doInstallCheck = true;
+
+      installCheckPhase = ''
+        export XDG_RUNTIME_DIR=/tmp
+        bin="$out/bin/${pname}"
+        version="$("$bin" --version || true)"
+        prefix="$("$bin" --prefix || true)"
+        rubber="$("$bin" --doc | grep -m1 CYCLE_RUBBER)"
+
+        echo "Version: $version" >&2
+        echo "Prefix: $prefix" >&2
+        echo "Docstring: $rubber" >&2
+
+        if [[ "$version" != *"${version}"* ]] || \
+           [ "$prefix" != "$out" ] || \
+           [[ ! "$rubber" =~ ^CYCLE_RUBBER[[:space:]]+Niceness[[:space:]]factor ]]; then
+          exit 1
+        fi
+      '';
+
+      passthru =
+        if (dedicatedServer) then {
+          # No passthru, end of the line.
+          # https://www.youtube.com/watch?v=NOMa56y_Was
+        }
+        else if (version != srcs.${latestVersionMajor}.version) then {
+          # Allow a "dedicated" passthru for versions other than the default.
+          dedicated = mkArmagetron (params // {
+            dedicatedServer = true;
+          });
+        }
+        else (lib.mapAttrs (name: value: mkArmagetron value) (lib.filterAttrs (name: value: value.version != srcs.${latestVersionMajor}.version) srcs)) // {
+          # Allow both a "dedicated" passthru and a passthru for all the options other than the latest version, which this is.
+          dedicated = mkArmagetron (params // {
+            dedicatedServer = true;
+          });
+        };
+
+      meta = with lib; {
+        homepage = "http://armagetronad.org";
+        description = "A multiplayer networked arcade racing game in 3D similar to Tron";
+        maintainers = with maintainers; [ numinit ];
+        license = licenses.gpl2Plus;
+        platforms = platforms.linux;
+      };
+    };
+in
+mkArmagetron (srcs.${latestVersionMajor} // { inherit dedicatedServer; })
diff --git a/nixpkgs/pkgs/games/arx-libertatis/default.nix b/nixpkgs/pkgs/games/arx-libertatis/default.nix
new file mode 100644
index 000000000000..de597163a3d1
--- /dev/null
+++ b/nixpkgs/pkgs/games/arx-libertatis/default.nix
@@ -0,0 +1,62 @@
+{ lib, stdenv, fetchFromGitHub, cmake, zlib, boost
+, openal, glm, freetype, libGLU, SDL2, libepoxy
+, dejavu_fonts, inkscape, optipng, imagemagick
+, withCrashReporter ? !stdenv.isDarwin
+,   qtbase ? null
+,   wrapQtAppsHook ? null
+,   curl ? null
+,   gdb  ? null
+}:
+
+with lib;
+
+stdenv.mkDerivation rec {
+  pname = "arx-libertatis";
+  version = "1.2.1";
+
+  src = fetchFromGitHub {
+    owner = "arx";
+    repo = "ArxLibertatis";
+    rev = version;
+    sha256 = "GBJcsibolZP3oVOTSaiVqG2nMmvXonKTp5i/0NNODKY=";
+  };
+
+  nativeBuildInputs = [
+    cmake inkscape imagemagick optipng
+  ] ++ optionals withCrashReporter [ wrapQtAppsHook ];
+
+  buildInputs = [
+    zlib boost openal glm
+    freetype libGLU SDL2 libepoxy
+  ] ++ optionals withCrashReporter [ qtbase curl ]
+    ++ optionals stdenv.isLinux    [ gdb ];
+
+  cmakeFlags = [
+    "-DDATA_DIR_PREFIXES=$out/share"
+    "-DImageMagick_convert_EXECUTABLE=${imagemagick.out}/bin/convert"
+    "-DImageMagick_mogrify_EXECUTABLE=${imagemagick.out}/bin/mogrify"
+  ];
+
+  dontWrapQtApps = true;
+
+  postInstall = ''
+    ln -sf \
+      ${dejavu_fonts}/share/fonts/truetype/DejaVuSansMono.ttf \
+      $out/share/games/arx/misc/dejavusansmono.ttf
+  '' + optionalString withCrashReporter ''
+    wrapQtApp "$out/libexec/arxcrashreporter"
+  '';
+
+  meta = {
+    description = ''
+      A cross-platform, open source port of Arx Fatalis, a 2002
+      first-person role-playing game / dungeon crawler
+      developed by Arkane Studios.
+    '';
+    homepage = "https://arx-libertatis.org/";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ rnhmjoj ];
+    platforms = platforms.linux;
+  };
+
+}
diff --git a/nixpkgs/pkgs/games/asc/default.nix b/nixpkgs/pkgs/games/asc/default.nix
new file mode 100644
index 000000000000..94a16f60140d
--- /dev/null
+++ b/nixpkgs/pkgs/games/asc/default.nix
@@ -0,0 +1,85 @@
+{ fetchFromGitHub
+, lib
+, stdenv
+, SDL
+, SDL_image
+, SDL_mixer
+, SDL_sound
+, libsigcxx
+, physfs
+, boost
+, expat
+, freetype
+, libjpeg
+, wxGTK32
+, lua
+, perl
+, pkg-config
+, zlib
+, zip
+, bzip2
+, libpng
+, libtiff
+, fluidsynth
+, libmikmod
+, libvorbis
+, flac
+, libogg
+}:
+
+stdenv.mkDerivation rec {
+  pname = "asc";
+  version = "2.6.3.0";
+
+  src = fetchFromGitHub {
+    owner = "ValHaris";
+    repo = "asc-hq";
+    rev = "fa3bca082a5cea2b35812349f99b877f0113aef0";
+    sha256 = "atamYCN2mOqxV6auToTeWdpKuFfC+GLfLdRsfT0ouwQ=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [
+    SDL
+    SDL_image
+    SDL_mixer
+    SDL_sound
+    physfs
+    boost
+    expat
+    freetype
+    libjpeg
+    wxGTK32
+    lua
+    perl
+    zlib
+    zip
+    bzip2
+    libpng
+    libtiff
+    fluidsynth
+    libmikmod
+    flac
+    libvorbis
+    libogg
+    libsigcxx
+  ];
+
+  meta = with lib; {
+    description = "Turn based strategy game";
+
+    longDescription = ''
+      Advanced Strategic Command is a free, turn based strategy game. It is
+      designed in the tradition of the Battle Isle series from Bluebyte and is
+      currently available for Windows and Linux.
+    '';
+
+    homepage = "https://www.asc-hq.org/";
+
+    license = licenses.gpl2Plus;
+
+    maintainers = with maintainers; [ raskin ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/assaultcube/default.nix b/nixpkgs/pkgs/games/assaultcube/default.nix
new file mode 100644
index 000000000000..7164e66feebf
--- /dev/null
+++ b/nixpkgs/pkgs/games/assaultcube/default.nix
@@ -0,0 +1,98 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, makeDesktopItem
+, copyDesktopItems
+, openal
+, pkg-config
+, libogg
+, libvorbis
+, SDL2
+, SDL2_image
+, makeWrapper
+, zlib
+, file
+, client ? true, server ? true
+}:
+
+stdenv.mkDerivation rec {
+  pname = "assaultcube";
+  version = "1.3.0.2";
+
+  src = fetchFromGitHub {
+    owner = "assaultcube";
+    repo  = "AC";
+    rev = "v${version}";
+    sha256 = "0qv339zw9q5q1y7bghca03gw7z4v89sl4lbr6h3b7siy08mcwiz9";
+  };
+
+  nativeBuildInputs = [
+    makeWrapper
+    pkg-config
+    copyDesktopItems
+  ];
+
+  buildInputs = [
+    file
+    zlib
+  ] ++ lib.optionals client [
+    openal
+    SDL2
+    SDL2_image
+    libogg
+    libvorbis
+  ];
+
+  targets = (lib.optionalString server "server") + (lib.optionalString client " client");
+  makeFlags = [ "-C source/src" "CXX=${stdenv.cc.targetPrefix}c++" targets ];
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = pname;
+      desktopName = "AssaultCube";
+      comment = "A multiplayer, first-person shooter game, based on the CUBE engine. Fast, arcade gameplay.";
+      genericName = "First-person shooter";
+      categories = [ "Game" "ActionGame" "Shooter" ];
+      icon = "assaultcube";
+      exec = pname;
+    })
+  ];
+
+  gamedatadir = "/share/games/${pname}";
+
+  installPhase = ''
+    runHook preInstall
+
+    bindir=$out/bin
+
+    mkdir -p $bindir $out/$gamedatadir
+
+    cp -r config packages $out/$gamedatadir
+
+    if (test -e source/src/ac_client) then
+      cp source/src/ac_client $bindir
+      mkdir -p $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} \
+        --chdir "$out/$gamedatadir" --add-flags "--home=\$HOME/.assaultcube/v1.2next --init"
+    fi
+
+    if (test -e source/src/ac_server) then
+      cp source/src/ac_server $bindir
+      makeWrapper $out/bin/ac_server $out/bin/${pname}-server \
+        --chdir "$out/$gamedatadir" --add-flags "-Cconfig/servercmdline.txt"
+    fi
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Fast and fun first-person-shooter based on the Cube fps";
+    homepage = "https://assault.cubers.net";
+    platforms = platforms.linux; # should work on darwin with a little effort.
+    license = licenses.unfree;
+    maintainers = with maintainers; [ darkonion0 ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/astromenace/default.nix b/nixpkgs/pkgs/games/astromenace/default.nix
new file mode 100644
index 000000000000..f50739d114a0
--- /dev/null
+++ b/nixpkgs/pkgs/games/astromenace/default.nix
@@ -0,0 +1,40 @@
+{ fetchurl, lib, stdenv, cmake, xorg, libGLU, libGL, SDL, openal, fontconfig, freealut, freetype, libogg, libvorbis, runtimeShell }:
+
+stdenv.mkDerivation rec {
+  pname = "astromenace";
+  version = "1.4.1";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/openastromenace/astromenace-src-${version}.tar.bz2";
+    sha256 = "1rkz6lwjcd5mwv72kf07ghvx6z46kf3xs250mjbmnmjpn7r5sxwv";
+  };
+
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ xorg.libICE xorg.libX11 xorg.libXinerama libGLU libGL SDL openal fontconfig freealut freetype libogg libvorbis ];
+
+  postBuild = ''
+    ./AstroMenace --pack --rawdata=../RAW_VFS_DATA
+  '';
+
+  installPhase = ''
+    mkdir -p $out/bin
+
+    cp AstroMenace $out
+    cp gamedata.vfs $out
+
+    cat > $out/bin/AstroMenace << EOF
+    #!${runtimeShell}
+    $out/AstroMenace --dir=$out
+    EOF
+
+    chmod 755 $out/bin/AstroMenace
+  '';
+
+  meta = with lib; {
+    description = "Hardcore 3D space shooter with spaceship upgrade possibilities";
+    homepage = "https://www.viewizard.com/";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    mainProgram = "AstroMenace";
+  };
+}
diff --git a/nixpkgs/pkgs/games/atanks/default.nix b/nixpkgs/pkgs/games/atanks/default.nix
new file mode 100644
index 000000000000..197cadfea29c
--- /dev/null
+++ b/nixpkgs/pkgs/games/atanks/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, fetchurl, allegro }:
+
+stdenv.mkDerivation rec {
+  pname = "atanks";
+  version = "6.6";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/project/atanks/atanks/${pname}-${version}/${pname}-${version}.tar.gz";
+    sha256 = "sha256-vGse/J/H52JPrR2DUtcuknvg+6IWC7Jbtri9bGNwv0M=";
+  };
+
+  buildInputs = [ allegro ];
+
+  makeFlags = [ "PREFIX=$(out)/" "INSTALL=install" "CXX=g++" ];
+
+  meta = with lib; {
+    description = "Atomic Tanks ballistics game";
+    homepage = "http://atanks.sourceforge.net/";
+    maintainers = [ maintainers.raskin ];
+    platforms = platforms.linux;
+    license = licenses.gpl2;
+  };
+}
diff --git a/nixpkgs/pkgs/games/atlauncher/default.nix b/nixpkgs/pkgs/games/atlauncher/default.nix
new file mode 100644
index 000000000000..77fcdaaf8721
--- /dev/null
+++ b/nixpkgs/pkgs/games/atlauncher/default.nix
@@ -0,0 +1,59 @@
+{ copyDesktopItems, fetchurl, jre, lib, makeDesktopItem, makeWrapper, stdenv, udev, xorg }:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "atlauncher";
+  version = "3.4.35.3";
+
+  src = fetchurl {
+    url = "https://github.com/ATLauncher/ATLauncher/releases/download/v${finalAttrs.version}/ATLauncher-${finalAttrs.version}.jar";
+    hash = "sha256-2080rVGBBM3YZmmBVBfMhnCErLzxuRDDi4zmCniJYFY=";
+  };
+
+  env.ICON = fetchurl {
+    url = "https://atlauncher.com/assets/images/logo.svg";
+    hash = "sha256-XoqpsgLmkpa2SdjZvPkgg6BUJulIBIeu6mBsJJCixfo=";
+  };
+
+  dontUnpack = true;
+
+  buildInputs = [ ];
+  nativeBuildInputs = [ copyDesktopItems makeWrapper ];
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/bin $out/share/java
+    cp $src $out/share/java/ATLauncher.jar
+
+    makeWrapper ${jre}/bin/java $out/bin/${finalAttrs.pname} \
+      --prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath [ xorg.libXxf86vm udev ]}" \
+      --add-flags "-jar $out/share/java/ATLauncher.jar" \
+      --add-flags "--working-dir \"\''${XDG_DATA_HOME:-\$HOME/.local/share}/ATLauncher\"" \
+      --add-flags "--no-launcher-update"
+
+    mkdir -p $out/share/icons/hicolor/scalable/apps
+    cp $ICON $out/share/icons/hicolor/scalable/apps/${finalAttrs.pname}.svg
+
+    runHook postInstall
+  '';
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = finalAttrs.pname;
+      exec = finalAttrs.pname;
+      icon = finalAttrs.pname;
+      desktopName = "ATLauncher";
+      categories = [ "Game" ];
+    })
+  ];
+
+  meta = with lib; {
+    description = "A simple and easy to use Minecraft launcher which contains many different modpacks for you to choose from and play";
+    downloadPage = "https://atlauncher.com/downloads";
+    homepage = "https://atlauncher.com/";
+    license = licenses.gpl3;
+    maintainers = [ maintainers.getpsyched ];
+    platforms = platforms.all;
+    mainProgram = "atlauncher";
+  };
+})
diff --git a/nixpkgs/pkgs/games/augustus/default.nix b/nixpkgs/pkgs/games/augustus/default.nix
new file mode 100644
index 000000000000..5aec0186cfc4
--- /dev/null
+++ b/nixpkgs/pkgs/games/augustus/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, fetchFromGitHub, cmake, SDL2, SDL2_mixer, libpng }:
+
+stdenv.mkDerivation rec {
+  pname = "augustus";
+  version = "4.0.0";
+
+  src = fetchFromGitHub {
+    owner = "Keriew";
+    repo = "augustus";
+    rev = "v${version}";
+    sha256 = "sha256-UWJmxirRJJqvL4ZSjBvFepeKVvL77+WMp4YdZuFNEkg=";
+  };
+
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ SDL2 SDL2_mixer libpng ];
+
+  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.agpl3Only;
+    platforms = platforms.all;
+    broken = stdenv.isDarwin;
+    maintainers = with maintainers; [ Thra11 ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/azimuth/default.nix b/nixpkgs/pkgs/games/azimuth/default.nix
new file mode 100644
index 000000000000..ed03c2afd71c
--- /dev/null
+++ b/nixpkgs/pkgs/games/azimuth/default.nix
@@ -0,0 +1,51 @@
+{ lib, stdenv, fetchFromGitHub, SDL, which, installTool ? false }:
+
+stdenv.mkDerivation rec {
+  pname = "azimuth";
+  version = "1.0.3";
+
+  src = fetchFromGitHub {
+    owner  = "mdsteele";
+    repo   = "azimuth";
+    rev    = "v${version}";
+    sha256 = "1znfvpmqiixd977jv748glk5zc4cmhw5813zp81waj07r9b0828r";
+  };
+
+  nativeBuildInputs = [ which ];
+  buildInputs = [ SDL ];
+
+  env.NIX_CFLAGS_COMPILE = toString [ "-Wno-error=maybe-uninitialized" ];
+
+  preConfigure = ''
+    substituteInPlace data/azimuth.desktop \
+      --replace Exec=azimuth "Exec=$out/bin/azimuth" \
+      --replace "Version=%AZ_VERSION_NUMBER" "Version=${version}"
+  '';
+
+  makeFlags = [
+    "BUILDTYPE=release"
+    "INSTALLDIR=$(out)"
+  ] ++ (if installTool then ["INSTALLTOOL=true"] else ["INSTALLTOOL=false"]);
+
+
+  enableParallelBuilding = true;
+
+  meta = {
+    description = "A metroidvania game using only vectorial graphic";
+    longDescription = ''
+      Azimuth is a metroidvania game, and something of an homage to the previous
+      greats of the genre (Super Metroid in particular). You will need to pilot
+      your ship, explore the inside of the planet, fight enemies, overcome
+      obstacles, and uncover the storyline piece by piece. Azimuth features a
+      huge game world to explore, lots of little puzzles to solve, dozens of
+      weapons and upgrades to find and use, and a wide variety of enemies and
+      bosses to tangle with.
+    '';
+
+    license = lib.licenses.gpl3Plus;
+    homepage = "https://mdsteele.games/azimuth/index.html";
+    maintainers = with lib.maintainers; [ marius851000 ];
+    platforms = lib.platforms.linux;
+  };
+
+}
diff --git a/nixpkgs/pkgs/games/badlion-client/default.nix b/nixpkgs/pkgs/games/badlion-client/default.nix
new file mode 100644
index 000000000000..6772557a3ea5
--- /dev/null
+++ b/nixpkgs/pkgs/games/badlion-client/default.nix
@@ -0,0 +1,32 @@
+{ lib, fetchurl, appimageTools }:
+
+let
+  pname = "badlion-client";
+  version = "3.15.0";
+
+  src = fetchurl {
+    url = "https://client-updates-cdn77.badlion.net/BadlionClient";
+    hash = "sha256-HqMgY9+Xnp4uSTWr//REZGv3p7ivwLX97vxGD5wqu9E=";
+  };
+
+  appimageContents = appimageTools.extract { inherit pname version src; };
+in
+  appimageTools.wrapType2 rec {
+    inherit pname version src;
+
+    extraInstallCommands = ''
+      mv $out/bin/{${pname}-${version},${pname}}
+      install -Dm444 ${appimageContents}/BadlionClient.desktop $out/share/applications/BadlionClient.desktop
+      install -Dm444 ${appimageContents}/BadlionClient.png $out/share/pixmaps/BadlionClient.png
+      substituteInPlace $out/share/applications/BadlionClient.desktop \
+        --replace 'Exec=AppRun --no-sandbox %U' 'Exec=badlion-client'
+    '';
+
+    meta = with lib; {
+      description = "The Most Complete All-In-One Mod Library for Minecraft with 100+ Mods, FPS Improvements, and more";
+      homepage = "https://client.badlion.net";
+      license = with licenses; [ unfree ];
+      maintainers = with maintainers; [];
+      platforms = platforms.linux;
+    };
+  }
diff --git a/nixpkgs/pkgs/games/ballerburg/default.nix b/nixpkgs/pkgs/games/ballerburg/default.nix
new file mode 100644
index 000000000000..b15abdbc4703
--- /dev/null
+++ b/nixpkgs/pkgs/games/ballerburg/default.nix
@@ -0,0 +1,55 @@
+{ lib, stdenv, fetchurl, cmake, SDL, makeDesktopItem, copyDesktopItems
+, imagemagick }:
+
+let
+
+  icon = fetchurl {
+    url = "https://baller.tuxfamily.org/king.png";
+    sha256 = "1xq2h87s648wjpjl72ds3xnnk2jp8ghbkhjzh2g4hpkq2zdz90hy";
+  };
+
+in stdenv.mkDerivation rec {
+  pname = "ballerburg";
+  version = "1.2.0";
+
+  src = fetchurl {
+    url = "https://download.tuxfamily.org/baller/ballerburg-${version}.tar.gz";
+    sha256 = "sha256-BiX0shPBGA8sshee8rxs41x+mdsrJzBqhpDDic6sYwA=";
+  };
+
+  nativeBuildInputs = [ cmake copyDesktopItems imagemagick ];
+
+  buildInputs = [ SDL ];
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "Ballerburg";
+      desktopName = "Ballerburg SDL";
+      exec = "_NET_WM_ICON=ballerburg ballerburg";
+      comment = meta.description;
+      icon = "ballerburg";
+      categories = [ "Game" ];
+    })
+  ];
+
+  postInstall = ''
+    # Generate and install icon files
+    for size in 16 32 48 64 72 96 128 192 512 1024; do
+      mkdir -p $out/share/icons/hicolor/"$size"x"$size"/apps
+      convert ${icon} -sample "$size"x"$size" \
+        -background white -gravity south -extent "$size"x"$size" \
+        $out/share/icons/hicolor/"$size"x"$size"/apps/ballerburg.png
+    done
+  '';
+
+  meta = with lib; {
+    description = "Classic cannon combat game";
+    longDescription = ''
+      Two castles, separated by a mountain, try to defeat each other with their cannonballs,
+      either by killing the opponent's king or by weakening the opponent enough so that the king capitulates.'';
+    homepage = "https://baller.tuxfamily.org/";
+    license = licenses.gpl3Plus;
+    maintainers = [ maintainers.j0hax ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/games/banner/default.nix b/nixpkgs/pkgs/games/banner/default.nix
new file mode 100644
index 000000000000..befb29f6ffc9
--- /dev/null
+++ b/nixpkgs/pkgs/games/banner/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  pname = "banner";
+  version = "1.3.5";
+
+  src = fetchFromGitHub {
+    owner = "pronovic";
+    repo = "banner";
+    rev = "BANNER_V${version}";
+    sha256 = "ISSnGzrFSzSj/+KxgeFtaw4H+4Ea5x5S5C8xjcjKWqQ=";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/pronovic/banner";
+    description = "Print large banners to ASCII terminals";
+    license = licenses.gpl2Only;
+
+    longDescription = ''
+      An implementation of the traditional Unix-program used to display
+      large characters.
+    '';
+
+    platforms = platforms.all;
+    maintainers = with maintainers; [ pSub ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/bastet/default.nix b/nixpkgs/pkgs/games/bastet/default.nix
new file mode 100644
index 000000000000..0b9f41507303
--- /dev/null
+++ b/nixpkgs/pkgs/games/bastet/default.nix
@@ -0,0 +1,45 @@
+{ lib, stdenv, fetchFromGitHub, fetchpatch, ncurses, boost }:
+
+stdenv.mkDerivation rec {
+  pname = "bastet";
+  version = "0.43.2";
+  buildInputs = [ ncurses boost ];
+
+  src = fetchFromGitHub {
+    owner = "fph";
+    repo = "bastet";
+    rev = version;
+    sha256 = "09kamxapm9jw9przpsgjfg33n9k94bccv65w95dakj0br33a75wn";
+  };
+
+  patches = [
+    # Compatibility with new Boost
+    (fetchpatch {
+      url = "https://github.com/fph/bastet/commit/0e03f8d4d6bc6949cf1c447e632ce0d1b98c4be1.patch";
+      sha256 = "1475hisbm44jirsrhdlnddppsyn83xmvcx09gfkm9drcix05alzj";
+    })
+
+    # Fix pending upstream inclusion for ncurses-6.3:
+    #  https://github.com/fph/bastet/pull/21
+    (fetchpatch {
+      name = "ncurses-6.3.patch";
+      url = "https://github.com/fph/bastet/commit/54a6d127351ea2c62f50efafe97c5b02e23e86a7.patch";
+      sha256 = "14v95b0m16m6ycd82i3wpp81kbmj6qz029b1m5483dkk6mwz98iy";
+    })
+  ];
+
+  installPhase = ''
+    mkdir -p "$out"/bin
+    cp bastet "$out"/bin/
+    mkdir -p "$out"/share/man/man6
+    cp bastet.6 "$out"/share/man/man6
+  '';
+
+  meta = with lib; {
+    description = "Tetris clone with 'bastard' block-choosing AI";
+    homepage = "http://fph.altervista.org/prog/bastet.html";
+    license = licenses.gpl3;
+    maintainers = [ maintainers.dezgeg ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/black-hole-solver/default.nix b/nixpkgs/pkgs/games/black-hole-solver/default.nix
new file mode 100644
index 000000000000..601aaeb1d90d
--- /dev/null
+++ b/nixpkgs/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.12.0";
+
+  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 = "sha256-0y8yU291cykliPQbsNha5C1WE3bCGNxKtrrf5JBKN6c=";
+  };
+
+  nativeBuildInputs = [ cmake perl pkg-config python3 ];
+
+  buildInputs = [ rinutils PathTiny ];
+
+  prePatch = ''
+    patchShebangs ./scripts
+  '';
+
+}
diff --git a/nixpkgs/pkgs/games/blackshades/default.nix b/nixpkgs/pkgs/games/blackshades/default.nix
new file mode 100644
index 000000000000..7f1cd29c9d54
--- /dev/null
+++ b/nixpkgs/pkgs/games/blackshades/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, stdenv
+, fetchFromSourcehut
+, glfw
+, libGL
+, libGLU
+, libsndfile
+, openal
+, zig_0_11
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "blackshades";
+  version = "2.5.1";
+
+  src = fetchFromSourcehut {
+    owner = "~cnx";
+    repo = "blackshades";
+    rev = finalAttrs.version;
+    fetchSubmodules = true;
+    hash = "sha256-qdpXpuXHr9w2XMfgOVveWv3JoqdJHVB8TCqZdyaw/DM=";
+  };
+
+  nativeBuildInputs = [ zig_0_11.hook ];
+
+  buildInputs = [
+    glfw
+    libGLU
+    libGL
+    libsndfile
+    openal
+  ];
+
+  meta = {
+    homepage = "https://sr.ht/~cnx/blackshades";
+    description = "A psychic bodyguard FPS";
+    changelog = "https://git.sr.ht/~cnx/blackshades/refs/${finalAttrs.version}";
+    mainProgram = "blackshades";
+    license = lib.licenses.gpl3Plus;
+    maintainers = with lib.maintainers; [ McSinyx viric ];
+    platforms = lib.platforms.linux;
+  };
+})
diff --git a/nixpkgs/pkgs/games/blightmud/default.nix b/nixpkgs/pkgs/games/blightmud/default.nix
new file mode 100644
index 000000000000..3267c36a370e
--- /dev/null
+++ b/nixpkgs/pkgs/games/blightmud/default.nix
@@ -0,0 +1,68 @@
+{ stdenv
+, lib
+, fetchFromGitHub
+, rustPlatform
+, pkg-config
+, alsa-lib
+, openssl
+, withTTS ? false
+, speechd
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "blightmud";
+  version = "5.3.0";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-e9Uo0IJYL9/6/nNL27zfUYnsTwDaOJOcR2CY6t++jDE=";
+  };
+
+  cargoHash = "sha256-QSgTpmSojZrwZ0RsUL6c2xO310RZX3gkyGl6oNf6pYI=";
+
+  buildFeatures = lib.optional withTTS "tts";
+
+  nativeBuildInputs = [ pkg-config rustPlatform.bindgenHook ];
+
+  buildInputs = [ alsa-lib openssl ] ++ lib.optionals withTTS [ speechd ];
+
+  checkFlags =
+    let
+      # Most of Blightmud's unit tests pass without trouble in the isolated
+      # Nixpkgs build env. The following tests need to be skipped.
+      skipList = [
+        "test_connect"
+        "test_gmcp_negotiation"
+        "test_ttype_negotiation"
+        "test_reconnect"
+        "test_is_connected"
+        "test_mud"
+        "test_server"
+        "test_lua_script"
+        "timer_test"
+        "validate_assertion_fail"
+        "regex_smoke_test"
+      ];
+      skipFlag = test: "--skip " + test;
+    in
+    builtins.concatStringsSep " " (builtins.map skipFlag skipList);
+
+  meta = with lib; {
+    description = "A terminal MUD client written in Rust";
+    longDescription = ''
+      Blightmud is a terminal client for connecting to Multi User Dungeon (MUD)
+      games. It is written in Rust and supports TLS, GMCP, MSDP, MCCP2, tab
+      completion, text searching and a split view for scrolling. Blightmud can
+      be customized with Lua scripting for aliases, triggers, timers, customized
+      status bars, and more. Blightmud supports several accessibility features
+      including an optional built-in text-to-speech engine and a screen reader
+      friendly mode.
+    '';
+    homepage = "https://github.com/Blightmud/Blightmud";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ cpu ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/blobby/blobby.sh b/nixpkgs/pkgs/games/blobby/blobby.sh
new file mode 100644
index 000000000000..3171c5a80b1b
--- /dev/null
+++ b/nixpkgs/pkgs/games/blobby/blobby.sh
@@ -0,0 +1,10 @@
+#! @shell@
+
+test -d ~/.blobby || {
+  mkdir ~/.blobby
+  cp -r "@out@/share/blobby"/* ~/.blobby
+  chmod u+w -R ~/.blobby
+  ( cd ~/.blobby; for i in *.zip; do @unzip@/bin/unzip "$i"; done )
+}
+
+exec @out@/bin/blobby.bin "$@"
diff --git a/nixpkgs/pkgs/games/blobby/default.nix b/nixpkgs/pkgs/games/blobby/default.nix
new file mode 100644
index 000000000000..27371b905417
--- /dev/null
+++ b/nixpkgs/pkgs/games/blobby/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv, fetchurl, SDL2, SDL2_image, libGLU, libGL, cmake, physfs, boost, zip, zlib, unzip, pkg-config }:
+
+stdenv.mkDerivation rec {
+  pname = "blobby-volley";
+  version = "1.1.1";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/blobby/Blobby%20Volley%202%20%28Linux%29/1.1.1/blobby2-linux-1.1.1.tar.gz";
+    sha256 = "sha256-NX7lE+adO1D2f8Bj1Ky3lZpf6Il3gX8KqxTMxw2yFLo=";
+  };
+
+  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}
+    substituteAll "${./blobby.sh}" "$out/bin/blobby"
+    chmod a+x "$out/bin/blobby"
+  '';
+
+  meta = with lib; {
+    description = "A blobby volleyball game";
+    license = licenses.bsd3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ raskin ];
+    homepage = "https://blobbyvolley.de/";
+    downloadPage = "https://sourceforge.net/projects/blobby/files/Blobby%20Volley%202%20%28Linux%29/";
+    mainProgram = "blobby";
+  };
+}
diff --git a/nixpkgs/pkgs/games/blobwars/blobwars-2.00-glibc-2.38.patch b/nixpkgs/pkgs/games/blobwars/blobwars-2.00-glibc-2.38.patch
new file mode 100644
index 000000000000..4fe3e373afda
--- /dev/null
+++ b/nixpkgs/pkgs/games/blobwars/blobwars-2.00-glibc-2.38.patch
@@ -0,0 +1,11 @@
+--- a/src/headers.h
++++ b/src/headers.h
+@@ -56,7 +56,7 @@ extern DECLSPEC int SDLCALL SDL_GetGamma(float *red, float *green, float *blue);
+ #define textdomain(x) while(false)
+ #endif
+ 
+-#if !defined(OpenBSD) && !defined(FreeBSD) && !defined(__APPLE__)
++#if !defined(OpenBSD) && !defined(FreeBSD) && !defined(__APPLE__) && !(defined(__GLIBC__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 38)
+ static inline void strlcat(char *dest, const char *src, size_t n) { strncat(dest, src, n - 1); }
+ static inline void strlcpy(char *dest, const char *src, size_t n) { strncpy(dest, src, n); dest[n - 1] = 0; }
+ #endif
diff --git a/nixpkgs/pkgs/games/blobwars/default.nix b/nixpkgs/pkgs/games/blobwars/default.nix
new file mode 100644
index 000000000000..dd94fc109696
--- /dev/null
+++ b/nixpkgs/pkgs/games/blobwars/default.nix
@@ -0,0 +1,36 @@
+{ 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";
+  };
+
+  patches = [ ./blobwars-2.00-glibc-2.38.patch ];
+
+  nativeBuildInputs = [ pkg-config gettext ];
+  buildInputs = [ SDL2 SDL2_image SDL2_mixer SDL2_net SDL2_ttf zlib ];
+  env.NIX_CFLAGS_COMPILE = toString [ "-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/nixpkgs/pkgs/games/blockattack/default.nix b/nixpkgs/pkgs/games/blockattack/default.nix
new file mode 100644
index 000000000000..6deba7987ada
--- /dev/null
+++ b/nixpkgs/pkgs/games/blockattack/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, SDL2
+, SDL2_image
+, SDL2_mixer
+, SDL2_ttf
+, boost
+, cmake
+, gettext
+, physfs
+, pkg-config
+, zip
+}:
+
+stdenv.mkDerivation rec {
+  pname = "blockattack";
+  version = "2.8.0";
+
+  src = fetchFromGitHub {
+    owner = "blockattack";
+    repo = "blockattack-game";
+    rev = "v${version}";
+    hash = "sha256-2oKesdr2eNZhDlGrFRiH5/8APFkGJfxPCNvzFoIumdQ=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+    gettext
+    zip
+  ];
+
+  buildInputs = [
+    SDL2
+    SDL2_image
+    SDL2_mixer
+    SDL2_ttf
+    SDL2_ttf
+    boost
+    physfs
+  ];
+
+  preConfigure = ''
+    patchShebangs packdata.sh source/misc/translation/*.sh
+    chmod +x ./packdata.sh
+    ./packdata.sh
+  '';
+
+  meta = with lib; {
+    homepage = "https://blockattack.net/";
+    description = "An open source clone of Panel de Pon (aka Tetris Attack)";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ AndersonTorres ];
+    platforms = platforms.unix;
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/games/boohu/default.nix b/nixpkgs/pkgs/games/boohu/default.nix
new file mode 100644
index 000000000000..708d8d7510bc
--- /dev/null
+++ b/nixpkgs/pkgs/games/boohu/default.nix
@@ -0,0 +1,29 @@
+{ lib, fetchurl, buildGoModule }:
+
+buildGoModule rec {
+  pname = "boohu";
+  version = "0.14.0";
+
+  src = fetchurl {
+    url = "https://download.tuxfamily.org/boohu/downloads/boohu-${version}.tar.gz";
+    hash = "sha256-IB59C5/uuHP6LtKLypjpgHOo0MR9bFdCbudaRa+h7lI=";
+  };
+
+  vendorHash = "sha256-AVK4zE/Hs9SN8Qj2WYj/am2B0R74QKYoMNf3sRRjnU4=";
+
+  ldflags = [ "-s" "-w" ];
+
+  meta = with lib; {
+    description = "A new coffee-break roguelike game";
+    longDescription = ''
+      Break Out Of Hareka's Underground (Boohu) is a roguelike game mainly
+      inspired from DCSS and its tavern, with some ideas from Brogue, but
+      aiming for very short games, almost no character building, and a
+      simplified inventory.
+    '';
+    homepage = "https://download.tuxfamily.org/boohu/index.html";
+    license = licenses.isc;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/braincurses/default.nix b/nixpkgs/pkgs/games/braincurses/default.nix
new file mode 100644
index 000000000000..f3f862b97ef9
--- /dev/null
+++ b/nixpkgs/pkgs/games/braincurses/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, fetchFromGitHub, ncurses }:
+
+stdenv.mkDerivation rec {
+  pname = "braincurses";
+  version = "1.1.0";
+
+  src = fetchFromGitHub {
+    owner = "bderrly";
+    repo = "braincurses";
+    rev = version;
+    sha256 = "0gpny9wrb0zj3lr7iarlgn9j4367awj09v3hhxz9r9a6yhk4anf5";
+  };
+
+  buildInputs = [ ncurses ];
+
+  # There is no install target in the Makefile
+  installPhase = ''
+    install -Dt $out/bin braincurses
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/bderrly/braincurses";
+    description = "A version of the classic game Mastermind";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ dotlambda ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/brogue-ce/default.nix b/nixpkgs/pkgs/games/brogue-ce/default.nix
new file mode 100644
index 000000000000..77e58ed5a1a6
--- /dev/null
+++ b/nixpkgs/pkgs/games/brogue-ce/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, makeDesktopItem
+, copyDesktopItems
+, SDL2
+, SDL2_image
+}:
+
+stdenv.mkDerivation rec {
+  pname = "brogue-ce";
+  version = "1.13";
+
+  src = fetchFromGitHub {
+    owner = "tmewett";
+    repo = "BrogueCE";
+    rev = "v${version}";
+    hash = "sha256-FUIdi1Ytn+INeD9550MW41qXtLb6in0QS3Snt8QaXUA=";
+  };
+
+  postPatch = ''
+    substituteInPlace linux/brogue-multiuser.sh \
+      --replace broguedir= "broguedir=$out/opt/brogue-ce #"
+  '';
+
+  nativeBuildInputs = [
+    copyDesktopItems
+  ];
+
+  buildInputs = [
+    SDL2
+    SDL2_image
+  ];
+
+  makeFlags = [ "DATADIR=$(out)/opt/brogue-ce" ];
+
+  desktopItems = [(makeDesktopItem {
+    name = "brogue-ce";
+    desktopName = "Brogue CE";
+    genericName = "Roguelike";
+    comment = "Brave the Dungeons of Doom!";
+    icon = "brogue-ce";
+    exec = "brogue-ce";
+    categories = [ "Game" "AdventureGame" ];
+  })];
+
+  installPhase = ''
+    runHook preInstall
+    mkdir -p $out/opt
+    cp -r bin $out/opt/brogue-ce
+    install -Dm755 linux/brogue-multiuser.sh $out/bin/brogue-ce
+    install -Dm 644 bin/assets/icon.png $out/share/icons/hicolor/256x256/apps/brogue-ce.png
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "A community-lead fork of the minimalist roguelike game Brogue";
+    homepage = "https://github.com/tmewett/BrogueCE";
+    license = licenses.agpl3;
+    maintainers = with maintainers; [ AndersonTorres fgaz ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/games/brogue/default.nix b/nixpkgs/pkgs/games/brogue/default.nix
new file mode 100644
index 000000000000..0cd3e779c563
--- /dev/null
+++ b/nixpkgs/pkgs/games/brogue/default.nix
@@ -0,0 +1,59 @@
+{ lib, stdenv, fetchurl, fetchpatch, SDL, ncurses, libtcod, makeDesktopItem }:
+
+stdenv.mkDerivation rec {
+  pname = "brogue";
+  version = "1.7.5";
+
+  src = fetchurl {
+    url = "https://sites.google.com/site/broguegame/brogue-${version}-linux-amd64.tbz2";
+    sha256 = "0i042zb3axjf0cpgpdh8hvfn66dbfizidyvw0iymjk2n760z2kx7";
+  };
+  patches = [
+    # Pull upstream fix for -fno-common toolchains:
+    #  https://github.com/tmewett/BrogueCE/pull/63
+    (fetchpatch {
+      name = "fno-common.patch";
+      url = "https://github.com/tmewett/BrogueCE/commit/2c7ed0c48d9efd06bf0a2589ba967c0a22a8fa87.patch";
+      sha256 = "19lr2fa25dh79klm4f4kqyyqq7w5xmw9z0fvylkcckqvcv7dwhp3";
+    })
+  ];
+
+  prePatch = ''
+    sed -i Makefile -e 's,LIBTCODDIR=.*,LIBTCODDIR=${libtcod},g' \
+                    -e 's,sdl-config,${lib.getDev SDL}/bin/sdl-config,g'
+    sed -i src/platform/tcod-platform.c -e "s,fonts/font,$out/share/brogue/fonts/font,g"
+    make clean
+    rm -rf src/libtcod*
+  '';
+
+  buildInputs = [ SDL ncurses libtcod ];
+
+  desktopItem = makeDesktopItem {
+    name = "brogue";
+    desktopName = "Brogue";
+    genericName = "Roguelike";
+    comment = "Brave the Dungeons of Doom!";
+    icon = "brogue";
+    exec = "brogue";
+    categories = [ "Game" "AdventureGame" ];
+  };
+
+  installPhase = ''
+    install -m 555 -D bin/brogue $out/bin/brogue
+    install -m 444 -D ${desktopItem}/share/applications/brogue.desktop $out/share/applications/brogue.desktop
+    install -m 444 -D bin/brogue-icon.png $out/share/icons/hicolor/256x256/apps/brogue.png
+    mkdir -p $out/share/brogue
+    cp -r bin/fonts $out/share/brogue/
+  '';
+
+  # fix crash; shouldn’t be a security risk because it’s an offline game
+  hardeningDisable = [ "stackprotector" "fortify" ];
+
+  meta = with lib; {
+    description = "A roguelike game";
+    homepage = "https://sites.google.com/site/broguegame/";
+    license = licenses.agpl3;
+    maintainers =  with maintainers; [ AndersonTorres fgaz ];
+    platforms = [ "x86_64-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/brutalmaze/default.nix b/nixpkgs/pkgs/games/brutalmaze/default.nix
new file mode 100644
index 000000000000..8f8930ce0c63
--- /dev/null
+++ b/nixpkgs/pkgs/games/brutalmaze/default.nix
@@ -0,0 +1,34 @@
+{ lib, fetchFromSourcehut, python3Packages }:
+
+python3Packages.buildPythonApplication rec {
+  pname = "brutalmaze";
+  version = "1.1.1";
+  format = "pyproject";
+  disabled = python3Packages.pythonOlder "3.7";
+
+  src = fetchFromSourcehut {
+    owner = "~cnx";
+    repo = pname;
+    rev = version;
+    sha256 = "1m105iq378mypj64syw59aldbm6bj4ma4ynhc50gafl656fabg4y";
+  };
+
+  nativeBuildInputs = with python3Packages; [
+    flit-core
+  ];
+
+  propagatedBuildInputs = with python3Packages; [
+    loca
+    palace
+    pygame
+  ];
+
+  doCheck = false; # there's no test
+
+  meta = with lib; {
+    description = "Minimalist thrilling shoot 'em up game";
+    homepage = "https://brutalmaze.rtfd.io";
+    license = licenses.agpl3Plus;
+    maintainers = [ maintainers.McSinyx ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/bsdgames/default.nix b/nixpkgs/pkgs/games/bsdgames/default.nix
new file mode 100644
index 000000000000..c837ba39b444
--- /dev/null
+++ b/nixpkgs/pkgs/games/bsdgames/default.nix
@@ -0,0 +1,69 @@
+{ lib, stdenv, fetchurl, ncurses, openssl, flex, bison, less, miscfiles }:
+
+stdenv.mkDerivation rec {
+  pname = "bsd-games";
+  version = "2.17";
+
+  src = fetchurl {
+    url = "mirror://ibiblioPubLinux/games/${pname}-${version}.tar.gz";
+    hash = "sha256-Bm+SSu9sHF6pRvWI428wMCH138CTlEc48CXY7bxv/2A=";
+  };
+
+  buildInputs = [ ncurses openssl flex bison ];
+
+  patches = [
+    # Remove UTMPX support on Makefrag file
+    (fetchurl {
+      url = "http://svn.exactcode.de/t2/trunk/package/games/bsd-games/dm-noutmpx.patch";
+      sha256 = "1k3qp3jj0dksjr4dnppv6dvkwslrgk9c7p2n9vipqildpxgqp7w2";
+    })
+  ];
+
+  hardeningDisable = [ "format" ];
+
+  makeFlags = [ "STRIP=" ];
+
+  preConfigure = ''
+    cat > config.params << EOF
+    bsd_games_cfg_man6dir=$out/share/man/man6
+    bsd_games_cfg_man8dir=$out/share/man/man8
+    bsd_games_cfg_man5dir=$out/share/man/man5
+    bsd_games_cfg_wtf_acronymfile=$out/share/misc/acronyms
+    bsd_games_cfg_fortune_dir=$out/share/games/fortune
+    bsd_games_cfg_quiz_dir=$out/share/games/quiz
+    bsd_games_cfg_gamesdir=$out/bin
+    bsd_games_cfg_sbindir=$out/bin
+    bsd_games_cfg_usrbindir=$out/bin
+    bsd_games_cfg_libexecdir=$out/lib/games/dm
+    bsd_games_cfg_docdir=$out/share/doc/bsd-games
+    bsd_games_cfg_sharedir=$out/share/games
+    bsd_games_cfg_varlibdir=.
+    bsd_games_cfg_non_interactive=y
+    bsd_games_cfg_no_build_dirs="dab hack phantasia sail"
+    bsd_games_cfg_dictionary_src=${miscfiles}/share/web2
+    bsd_games_cfg_pager=${less}
+    EOF
+
+    sed -e s/getline/bsdgames_local_getline/g -i $(grep getline -rl .)
+  '';
+
+  postConfigure = ''
+    sed -i -e 's,/usr,'$out, \
+       -e "s,-o root -g root, ," \
+       -e "s,-o root -g games, ," \
+       -e "s,.*chown.*,true," \
+       -e 's/INSTALL_VARDATA.*/INSTALL_VARDATA := true/' \
+       -e 's/INSTALL_HACKDIR.*/INSTALL_HACKDIR := true/' \
+       -e 's/INSTALL_DM.*/INSTALL_DM := true/' \
+       -e 's/INSTALL_SCORE_FILE.*/INSTALL_SCORE_FILE := true/' \
+       Makeconfig install-man
+  '';
+
+  meta = {
+    homepage = "http://www.t2-project.org/packages/bsd-games.html";
+    description = "Ports of all the games from NetBSD-current that are free";
+    license = lib.licenses.free;
+    maintainers = with lib.maintainers; [viric];
+    platforms = with lib.platforms; linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/btanks/default.nix b/nixpkgs/pkgs/games/btanks/default.nix
new file mode 100644
index 000000000000..f1f2e84a614d
--- /dev/null
+++ b/nixpkgs/pkgs/games/btanks/default.nix
@@ -0,0 +1,51 @@
+{ lib, stdenv, fetchurl, fetchpatch, scons, pkg-config, SDL, libGL, zlib, smpeg
+, SDL_image, libvorbis, expat, zip, lua }:
+
+stdenv.mkDerivation rec {
+  pname = "btanks";
+  version = "0.9.8083";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/${pname}/${pname}-${version}.tar.bz2";
+    hash = "sha256-P9LOaitF96YMOxFPqa/xPLPdn7tqZc3JeYt2xPosQ0E=";
+  };
+
+  nativeBuildInputs = [ scons pkg-config ];
+
+  buildInputs = [ SDL libGL zlib smpeg SDL_image libvorbis expat zip lua ];
+
+  enableParallelBuilding = true;
+
+  env.NIX_CFLAGS_COMPILE = "-I${SDL_image}/include/SDL";
+
+  patches = [
+    (fetchpatch {
+      name = "lua52.patch";
+      url = "https://aur.archlinux.org/cgit/aur.git/plain/lua52.patch?h=btanks&id=cd0e016963238f16209baa2da658aa3fad36e33d";
+      hash = "sha256-Xwl//sfGprhg71jf+X3q8qxdB+5ZtqJrjBxS8+cw5UY=";
+    })
+    (fetchpatch {
+      url = "https://salsa.debian.org/games-team/btanks/-/raw/debian/0.9.8083-9/debian/patches/gcc-4.7.patch";
+      hash = "sha256-JN7D+q63EvKJX9wAEQgcVqE1VZzMa4Y1CPIlA3uYtLc=";
+    })
+    (fetchpatch {
+      url = "https://salsa.debian.org/games-team/btanks/-/raw/debian/0.9.8083-9/debian/patches/pow10f.patch";
+      hash = "sha256-6QFP1GTwqXnjfekzEiIpWKCD6HOcGusYW+02sUE6hcA=";
+    })
+    (fetchpatch {
+      url = "https://salsa.debian.org/games-team/btanks/-/raw/debian/0.9.8083-9/debian/patches/python3.patch";
+      hash = "sha256-JpK409Myi8mxQaunmLFKKh1NKvKLXpNHHsDvRee8OoQ=";
+    })
+    (fetchpatch {
+      url = "https://salsa.debian.org/games-team/btanks/-/raw/debian/0.9.8083-9/debian/patches/scons.patch";
+      hash = "sha256-JCvBY2fOV8Sc/mpvEsJQv1wKcS1dHqYxvRk6I9p7ZKc=";
+    })
+  ];
+
+  meta = with lib; {
+    description = "Fast 2d tank arcade game";
+    homepage = "https://sourceforge.net/projects/btanks/";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/bugdom/default.nix b/nixpkgs/pkgs/games/bugdom/default.nix
new file mode 100644
index 000000000000..01db213de985
--- /dev/null
+++ b/nixpkgs/pkgs/games/bugdom/default.nix
@@ -0,0 +1,69 @@
+{ lib, stdenv, fetchFromGitHub, SDL2, IOKit, Foundation, cmake, makeWrapper }:
+
+stdenv.mkDerivation rec {
+  pname = "bugdom";
+  version = "1.3.3";
+
+  src = fetchFromGitHub {
+    owner = "jorio";
+    repo = pname;
+    rev = version;
+    hash = "sha256-oe7xxvoL82YF+EoIJDK6AfN3PmpqeGRlIsbaGx8xGeM=";
+    fetchSubmodules = true;
+  };
+
+  postPatch = lib.optionalString stdenv.hostPlatform.isDarwin ''
+    # Expects SDL2.framework in specific location, which we don't have
+    # Passing this in cmakeFlags doesn't work because the path is hard-coded for Darwin
+    substituteInPlace cmake/FindSDL2.cmake \
+      --replace 'set(SDL2_LIBRARIES' 'set(SDL2_LIBRARIES "${SDL2}/lib/libSDL2.dylib") #'
+    # Expects plutil, which we don't have
+    sed -i '/plutil/d' CMakeLists.txt
+  '';
+
+  buildInputs = [
+    SDL2
+  ] ++ lib.optionals stdenv.hostPlatform.isDarwin [
+    IOKit
+    Foundation
+  ];
+
+  nativeBuildInputs = [
+    cmake
+    makeWrapper
+  ];
+
+  cmakeFlags = lib.optionals stdenv.hostPlatform.isDarwin [
+    "-DCMAKE_OSX_ARCHITECTURES=${stdenv.hostPlatform.darwinArch}"
+    # Expects SDL2.framework in specific location, which we don't have
+    "-DSDL2_INCLUDE_DIRS=${SDL2.dev}/include/SDL2"
+  ];
+
+  installPhase = ''
+    runHook preInstall
+
+  '' + (if stdenv.hostPlatform.isDarwin then ''
+    mkdir -p $out/{bin,Applications}
+    mv {,$out/Applications/}Bugdom.app
+    makeWrapper $out/{Applications/Bugdom.app/Contents/MacOS,bin}/Bugdom
+  '' else ''
+    mkdir -p $out/share/bugdom
+    mv Data $out/share/bugdom
+    install -Dm755 {.,$out/bin}/Bugdom
+    wrapProgram $out/bin/Bugdom --run "cd $out/share/bugdom"
+    install -Dm644 $src/packaging/bugdom.desktop $out/share/applications/bugdom.desktop
+    install -Dm644 $src/packaging/bugdom-desktopicon.png $out/share/pixmaps/bugdom-desktopicon.png
+  '') + ''
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "A port of Bugdom, a 1999 Macintosh game by Pangea Software, for modern operating systems";
+    homepage = "https://github.com/jorio/Bugdom";
+    license = with licenses; [ cc-by-sa-40 ];
+    maintainers = with maintainers; [ lux ];
+    mainProgram = "Bugdom";
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/games/bzflag/default.nix b/nixpkgs/pkgs/games/bzflag/default.nix
new file mode 100644
index 000000000000..7f43e8949b70
--- /dev/null
+++ b/nixpkgs/pkgs/games/bzflag/default.nix
@@ -0,0 +1,25 @@
+{ stdenv, lib, fetchurl, pkg-config
+, curl, SDL2, libGLU, libGL, glew, ncurses, c-ares
+, Carbon, CoreServices }:
+
+stdenv.mkDerivation rec {
+  pname = "bzflag";
+  version = "2.4.26";
+
+  src = fetchurl {
+    url = "https://download.bzflag.org/${pname}/source/${version}/${pname}-${version}.tar.bz2";
+    sha256 = "sha256-AYMEBf8mrR3FlafgaVyCTCeG5niGjZ/4Iq6xSsdIEBQ=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ curl SDL2 libGLU libGL glew ncurses c-ares ]
+    ++ lib.optionals stdenv.isDarwin [ Carbon CoreServices ];
+
+  meta = with lib; {
+    description = "Multiplayer 3D Tank game";
+    homepage = "https://bzflag.org/";
+    license = licenses.lgpl21Plus;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/cataclysm-dda/builder.nix b/nixpkgs/pkgs/games/cataclysm-dda/builder.nix
new file mode 100644
index 000000000000..24128875f3a1
--- /dev/null
+++ b/nixpkgs/pkgs/games/cataclysm-dda/builder.nix
@@ -0,0 +1,49 @@
+{ stdenvNoCC, lib, type }:
+
+assert lib.elem type [
+  "mod"
+  "soundpack"
+  "tileset"
+];
+
+{ modName, version, src, ... } @ args:
+
+stdenvNoCC.mkDerivation (args // rec {
+  pname = args.pname or "cataclysm-dda-${type}-${modName}";
+
+  modRoot = args.modRoot or ".";
+
+  configurePhase = args.configurePhase or ''
+    runHook preConfigure
+    runHook postConfigure
+  '';
+
+  buildPhase = args.buildPhase or ''
+    runHook preBuild
+    runHook postBuild
+  '';
+
+  checkPhase = args.checkPhase or ''
+    runHook preCheck
+    runHook postCheck
+  '';
+
+  installPhase = let
+    baseDir = {
+      mod = "mods";
+      soundpack = "sound";
+      tileset = "gfx";
+    }.${type};
+  in args.installPhase or ''
+    runHook preInstall
+    destdir="$out/share/cataclysm-dda/${baseDir}"
+    mkdir -p "$destdir"
+    cp -R "${modRoot}" "$destdir/${modName}"
+    runHook postInstall
+  '';
+
+  passthru = {
+    forTiles = true;
+    forCurses = type == "mod";
+  };
+})
diff --git a/nixpkgs/pkgs/games/cataclysm-dda/common.nix b/nixpkgs/pkgs/games/cataclysm-dda/common.nix
new file mode 100644
index 000000000000..fb54efee1dd5
--- /dev/null
+++ b/nixpkgs/pkgs/games/cataclysm-dda/common.nix
@@ -0,0 +1,103 @@
+{ lib, stdenv, runtimeShell, pkg-config, gettext, ncurses, CoreFoundation
+, tiles, SDL2, SDL2_image, SDL2_mixer, SDL2_ttf, freetype, Cocoa
+, debug
+, useXdgDir
+}:
+
+let
+  inherit (lib) optionals optionalString;
+
+  cursesDeps = [ gettext ncurses ]
+    ++ optionals stdenv.isDarwin [ CoreFoundation ];
+
+  tilesDeps = [ SDL2 SDL2_image SDL2_mixer SDL2_ttf freetype ]
+    ++ optionals stdenv.isDarwin [ Cocoa ];
+
+  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 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
+    #!${runtimeShell}
+    $out/bin/cataclysm-tiles
+    EOF
+    chmod 555 $launcher
+  '';
+in
+
+stdenv.mkDerivation {
+  pname = "cataclysm-dda";
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = cursesDeps ++ optionals tiles tilesDeps;
+
+  postPatch = ''
+    patchShebangs lang/compile_mo.sh
+  '';
+
+  makeFlags = [
+    "PREFIX=$(out)" "LANGUAGES=all"
+    (if useXdgDir then "USE_XDG_DIR=1" else "USE_HOME_DIR=1")
+  ] ++ optionals (!debug) [
+    "RELEASE=1"
+  ] ++ optionals tiles [
+    "TILES=1" "SOUND=1"
+  ] ++ optionals stdenv.isDarwin [
+    "NATIVE=osx"
+    "CLANG=1"
+    "OSX_MIN=${stdenv.hostPlatform.darwinMinVersion}"
+  ];
+
+  postInstall = optionalString tiles
+  ( if !stdenv.isDarwin
+    then patchDesktopFile
+    else installMacOSAppLauncher
+  );
+
+  dontStrip = debug;
+  enableParallelBuilding = true;
+
+  passthru = {
+    isTiles = tiles;
+    isCurses = !tiles;
+  };
+
+  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.
+      Surviving is difficult: you have been thrown, ill-equipped, into a
+      landscape now riddled with monstrosities of which flesh eating zombies are
+      neither the strangest nor the deadliest.
+
+      Yet with care and a little luck, many things are possible. You may try to
+      eke out an existence in the forests silently executing threats and
+      providing sustenance with your longbow. You can ride into town in a
+      jerry-rigged vehicle, all guns blazing, to settle matters in a fug of
+      smoke from your molotovs. You could take a more measured approach and
+      construct an impregnable fortress, surrounded by traps to protect you from
+      the horrors without. The longer you survive, the more skilled and adapted
+      you will get and the better equipped and armed to deal with the threats
+      you are presented with.
+
+      In the course of your ordeal there will be opportunities and temptations
+      to improve or change your very nature. There are tales of survivors fitted
+      with extraordinary cybernetics giving great power and stories too of
+      gravely mutated survivors who, warped by their ingestion of exotic
+      substances or radiation, now more closely resemble insects, birds or fish
+      than their original form.
+    '';
+    homepage = "https://cataclysmdda.org/";
+    license = licenses.cc-by-sa-30;
+    maintainers = with maintainers; [ mnacamura DeeUnderscore ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/games/cataclysm-dda/default.nix b/nixpkgs/pkgs/games/cataclysm-dda/default.nix
new file mode 100644
index 000000000000..1649cd031a4b
--- /dev/null
+++ b/nixpkgs/pkgs/games/cataclysm-dda/default.nix
@@ -0,0 +1,43 @@
+{ newScope, darwin }:
+
+let
+  callPackage = newScope self;
+
+  stable = rec {
+    tiles = callPackage ./stable.nix {
+      inherit (darwin.apple_sdk.frameworks) CoreFoundation Cocoa;
+    };
+
+    curses = tiles.override { tiles = false; };
+  };
+
+  git = rec {
+    tiles = callPackage ./git.nix {
+      inherit (darwin.apple_sdk.frameworks) CoreFoundation Cocoa;
+    };
+
+    curses = tiles.override { tiles = false; };
+  };
+
+  lib = callPackage ./lib.nix {};
+
+  pkgs = callPackage ./pkgs {};
+
+  self = {
+    inherit
+    callPackage
+    stable
+    git;
+
+    inherit (lib)
+    buildMod
+    buildSoundPack
+    buildTileSet
+    wrapCDDA
+    attachPkgs;
+
+    inherit pkgs;
+  };
+in
+
+self
diff --git a/nixpkgs/pkgs/games/cataclysm-dda/git.nix b/nixpkgs/pkgs/games/cataclysm-dda/git.nix
new file mode 100644
index 000000000000..c7090838b862
--- /dev/null
+++ b/nixpkgs/pkgs/games/cataclysm-dda/git.nix
@@ -0,0 +1,41 @@
+{ stdenv, lib, callPackage, CoreFoundation, fetchFromGitHub, pkgs, wrapCDDA, attachPkgs
+, tiles ? true, Cocoa
+, debug ? false
+, useXdgDir ? false
+, version ? "2022-08-20"
+, rev ? "f65b2bc4c6dea24bd9a993b8df146e5698e7e36f"
+, sha256 ? "sha256-00Tp9OmsM39PYwAJXKKRS9zmn7KsGQ9s1eVmEqghkpw="
+}:
+
+let
+  common = callPackage ./common.nix {
+    inherit CoreFoundation tiles Cocoa debug useXdgDir;
+  };
+
+  self = common.overrideAttrs (common: rec {
+    pname = common.pname + "-git";
+    inherit version;
+
+    src = fetchFromGitHub {
+      owner = "CleverRaven";
+      repo = "Cataclysm-DDA";
+      inherit rev sha256;
+    };
+
+    patches = [
+      # Unconditionally look for translation files in $out/share/locale
+      ./locale-path.patch
+    ];
+
+    makeFlags = common.makeFlags ++ [
+      "VERSION=git-${version}-${lib.substring 0 8 src.rev}"
+    ];
+
+    meta = common.meta // {
+      maintainers = with lib.maintainers;
+      common.meta.maintainers ++ [ rardiol ];
+    };
+  });
+in
+
+attachPkgs pkgs self
diff --git a/nixpkgs/pkgs/games/cataclysm-dda/lib.nix b/nixpkgs/pkgs/games/cataclysm-dda/lib.nix
new file mode 100644
index 000000000000..f2b38a16aa53
--- /dev/null
+++ b/nixpkgs/pkgs/games/cataclysm-dda/lib.nix
@@ -0,0 +1,46 @@
+{ callPackage }:
+
+rec {
+  buildMod = callPackage ./builder.nix {
+    type = "mod";
+  };
+
+  buildSoundPack = callPackage ./builder.nix {
+    type = "soundpack";
+  };
+
+  buildTileSet = callPackage ./builder.nix {
+    type = "tileset";
+  };
+
+  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/nixpkgs/pkgs/games/cataclysm-dda/locale-path.patch b/nixpkgs/pkgs/games/cataclysm-dda/locale-path.patch
new file mode 100644
index 000000000000..03f103a548fd
--- /dev/null
+++ b/nixpkgs/pkgs/games/cataclysm-dda/locale-path.patch
@@ -0,0 +1,18 @@
+diff --git a/src/translations.cpp b/src/translations.cpp
+index 76bdfd0..6dd6109 100644
+--- a/src/translations.cpp
++++ b/src/translations.cpp
+@@ -61,13 +61,11 @@ std::string locale_dir()
+ #define BSD
+ #endif
+ 
+-#if !defined(__ANDROID__) && ((defined(__linux__) || defined(BSD) || (defined(MACOSX) && !defined(TILES))))
+     if( !PATH_INFO::base_path().empty() ) {
+         loc_dir = PATH_INFO::base_path() + "share/locale";
+     } else {
+         loc_dir = PATH_INFO::langdir();
+     }
+-#endif
+ #endif // LOCALIZE
+     return loc_dir;
+ }
diff --git a/nixpkgs/pkgs/games/cataclysm-dda/pkgs/default.nix b/nixpkgs/pkgs/games/cataclysm-dda/pkgs/default.nix
new file mode 100644
index 000000000000..72b2c814389a
--- /dev/null
+++ b/nixpkgs/pkgs/games/cataclysm-dda/pkgs/default.nix
@@ -0,0 +1,29 @@
+{ lib, callPackage, build ? null }:
+
+let
+  pkgs = {
+    mod = {
+    };
+
+    soundpack = {
+    };
+
+    tileset = {
+      UndeadPeople = callPackage ./tilesets/UndeadPeople {};
+    };
+  };
+
+  pkgs' = lib.mapAttrs (_: mods: lib.filterAttrs isAvailable mods) pkgs;
+
+  isAvailable = _: mod:
+  if (build == null) then
+    true
+  else if build.isTiles then
+    mod.forTiles or false
+  else if build.isCurses then
+    mod.forCurses or false
+  else
+    false;
+in
+
+lib.makeExtensible (_: pkgs')
diff --git a/nixpkgs/pkgs/games/cataclysm-dda/pkgs/tilesets/UndeadPeople/default.nix b/nixpkgs/pkgs/games/cataclysm-dda/pkgs/tilesets/UndeadPeople/default.nix
new file mode 100644
index 000000000000..07465d137c3e
--- /dev/null
+++ b/nixpkgs/pkgs/games/cataclysm-dda/pkgs/tilesets/UndeadPeople/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildTileSet, fetchFromGitHub }:
+
+buildTileSet {
+  modName = "UndeadPeople";
+  version = "2020-07-08";
+
+  src = fetchFromGitHub {
+    owner = "jmz-b";
+    repo = "UndeadPeopleTileset";
+    rev = "f7f13b850fafe2261deee051f45d9c611a661534";
+    sha256 = "0r06srjr7rq51jk9yfyxz80nfgb98mkn86cbcjfxpibgbqvcp0zm";
+  };
+
+  modRoot = "MSX++UnDeadPeopleEdition";
+
+  meta = with lib; {
+    description = "Cataclysm DDA tileset based on MSX++ tileset";
+    homepage = "https://github.com/jmz-b/UndeadPeopleTileset";
+    license = licenses.unfree;
+    maintainers = with maintainers; [ mnacamura ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/games/cataclysm-dda/stable.nix b/nixpkgs/pkgs/games/cataclysm-dda/stable.nix
new file mode 100644
index 000000000000..0e4ca1aad882
--- /dev/null
+++ b/nixpkgs/pkgs/games/cataclysm-dda/stable.nix
@@ -0,0 +1,53 @@
+{ lib
+, callPackage
+, CoreFoundation
+, fetchFromGitHub
+, fetchpatch
+, pkgs
+, wrapCDDA
+, attachPkgs
+, tiles ? true
+, Cocoa
+, debug ? false
+, useXdgDir ? false
+}:
+
+let
+  common = callPackage ./common.nix {
+    inherit CoreFoundation tiles Cocoa debug useXdgDir;
+  };
+
+  self = common.overrideAttrs (common: rec {
+    version = "0.G";
+
+    src = fetchFromGitHub {
+      owner = "CleverRaven";
+      repo = "Cataclysm-DDA";
+      rev = version;
+      sha256 = "sha256-Hda0dVVHNeZ8MV5CaCbSpdOCG2iqQEEmXdh16vwIBXk=";
+    };
+
+    patches = [
+      # Unconditionally look for translation files in $out/share/locale
+      ./locale-path.patch
+    ];
+
+    makeFlags = common.makeFlags ++ [
+      # Makefile declares version as 0.F, with no minor release number
+      "VERSION=${version}"
+    ];
+
+    env.NIX_CFLAGS_COMPILE = toString [
+      # Needed with GCC 12
+      "-Wno-error=array-bounds"
+    ];
+
+    meta = common.meta // {
+      maintainers = with lib.maintainers;
+        common.meta.maintainers;
+      changelog = "https://github.com/CleverRaven/Cataclysm-DDA/blob/${version}/data/changelog.txt";
+    };
+  });
+in
+
+attachPkgs pkgs self
diff --git a/nixpkgs/pkgs/games/cataclysm-dda/wrapper.nix b/nixpkgs/pkgs/games/cataclysm-dda/wrapper.nix
new file mode 100644
index 000000000000..28189fa7375a
--- /dev/null
+++ b/nixpkgs/pkgs/games/cataclysm-dda/wrapper.nix
@@ -0,0 +1,47 @@
+{ lib, symlinkJoin, makeWrapper }:
+
+unwrapped:
+
+pkgsSpec:
+
+let
+  mods = if lib.isFunction pkgsSpec
+         then pkgsSpec unwrapped.pkgs
+         else pkgsSpec;
+in
+
+if builtins.length mods == 0
+then unwrapped
+else symlinkJoin {
+  name = unwrapped.name + "-with-mods";
+
+  paths = [ unwrapped ] ++ mods;
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  postBuild = ''
+    if [ -x $out/bin/cataclysm ]; then
+        wrapProgram $out/bin/cataclysm \
+            --add-flags "--datadir $out/share/cataclysm-dda/"
+    fi
+    if [ -x $out/bin/cataclysm-tiles ]; then
+        wrapProgram $out/bin/cataclysm-tiles \
+            --add-flags "--datadir $out/share/cataclysm-dda/"
+    fi
+
+    # Launch the wrapped program
+    replaceProgram() {
+        cp "$1" "''${1}.bk"
+        unlink "$1"
+        mv "''${1}.bk" "$1"
+        sed -i "$1" -e "s,${builtins.storeDir}/.\+\(/bin/cataclysm-tiles\),$out\1,"
+    }
+    for script in "$out/share/applications/cataclysm-dda.desktop" \
+                  "$out/Applications/Cataclysm.app/Contents/MacOS/Cataclysm.sh"
+    do
+        if [ -e "$script" ]; then
+            replaceProgram "$script"
+        fi
+    done
+  '';
+}
diff --git a/nixpkgs/pkgs/games/cbonsai/default.nix b/nixpkgs/pkgs/games/cbonsai/default.nix
new file mode 100644
index 000000000000..2dc131aba6db
--- /dev/null
+++ b/nixpkgs/pkgs/games/cbonsai/default.nix
@@ -0,0 +1,29 @@
+{ stdenv, lib, fetchFromGitLab, ncurses, pkg-config, nix-update-script, scdoc }:
+
+stdenv.mkDerivation rec {
+  pname = "cbonsai";
+  version = "1.3.1";
+
+  src = fetchFromGitLab {
+    owner = "jallbrit";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-XFK6DiIb8CzVubTnEMkqRW8xZkX/SWjUsrfS+I7LOs8=";
+  };
+
+  nativeBuildInputs = [ pkg-config scdoc ];
+  buildInputs = [ ncurses ];
+
+  makeFlags = [ "CC=${stdenv.cc.targetPrefix}cc" ];
+  installFlags = [ "PREFIX=$(out)" ];
+
+  passthru.updateScript = nix-update-script { };
+
+  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/nixpkgs/pkgs/games/cdogs-sdl/default.nix b/nixpkgs/pkgs/games/cdogs-sdl/default.nix
new file mode 100644
index 000000000000..5c74b10ef32a
--- /dev/null
+++ b/nixpkgs/pkgs/games/cdogs-sdl/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, pkg-config
+, SDL2
+, SDL2_image
+, SDL2_mixer
+, cmake
+, gtk3-x11
+, python3
+, protobuf
+}:
+
+stdenv.mkDerivation rec {
+  pname = "cdogs-sdl";
+  version = "1.5.0";
+
+  src = fetchFromGitHub {
+    repo = pname;
+    owner = "cxong";
+    rev = version;
+    sha256 = "sha256-XSq0TK3ZuLOa8JJnp/Qxt16Ru3p35tq5FOo4+tv+c60=";
+  };
+
+  postPatch = ''
+    patchShebangs src/proto/nanopb/generator/*
+  '';
+
+  cmakeFlags = [
+    "-DCDOGS_DATA_DIR=${placeholder "out"}/"
+    "-DCMAKE_C_FLAGS=-Wno-error=array-bounds"
+  ];
+
+  env.NIX_CFLAGS_COMPILE = toString [
+    # Needed with GCC 12
+    "-Wno-error=stringop-overflow"
+  ];
+
+  nativeBuildInputs = [
+    pkg-config
+    cmake
+    (python3.withPackages (pp: with pp; [ pp.protobuf setuptools ]))
+  ];
+
+  buildInputs = [
+    SDL2
+    SDL2_image
+    SDL2_mixer
+    gtk3-x11
+    protobuf
+  ];
+
+  # inlining failed in call to 'tinydir_open': --param max-inline-insns-single limit reached
+  hardeningDisable = [ "fortify3" ];
+
+  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;
+    broken = stdenv.isDarwin; # never built on Hydra https://hydra.nixos.org/job/nixpkgs/trunk/cdogs-sdl.x86_64-darwin
+  };
+}
diff --git a/nixpkgs/pkgs/games/cgoban/default.nix b/nixpkgs/pkgs/games/cgoban/default.nix
new file mode 100644
index 000000000000..3d202985f1b0
--- /dev/null
+++ b/nixpkgs/pkgs/games/cgoban/default.nix
@@ -0,0 +1,39 @@
+{ 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/";
+    sourceProvenance = with sourceTypes; [ binaryBytecode ];
+    license = licenses.free;
+    maintainers = with maintainers; [ savannidgerinel ];
+    platforms = adoptopenjdk-jre-bin.meta.platforms;
+  };
+}
diff --git a/nixpkgs/pkgs/games/chessdb/default.nix b/nixpkgs/pkgs/games/chessdb/default.nix
new file mode 100644
index 000000000000..db6214bdf096
--- /dev/null
+++ b/nixpkgs/pkgs/games/chessdb/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, fetchurl, tcl, tk, libX11, makeWrapper }:
+
+stdenv.mkDerivation rec {
+  pname = "chessdb";
+  version = "3.6.19-beta-1";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/chessdb/ChessDB-${version}.tar.gz";
+    sha256 = "0brc3wln3bxp979iqj2w1zxpfd0pch8zzazhdmwf7acww4hrsz62";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ tcl tk libX11 ];
+
+  makeFlags = [
+    "BINDIR=$(out)/bin"
+    "SHAREDIR=$(out)/share/chessdb"
+    "SOUNDSDIR=$(out)/share/chessdb/sounds"
+    "TBDIR=$(out)/share/chessdb/tablebases"
+    "MANDIR=$(out)/man"
+  ];
+
+  meta = {
+    homepage = "https://chessdb.sourceforge.net/";
+    description = "A free chess database";
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/chessx/default.nix b/nixpkgs/pkgs/games/chessx/default.nix
new file mode 100644
index 000000000000..b49fb2c89473
--- /dev/null
+++ b/nixpkgs/pkgs/games/chessx/default.nix
@@ -0,0 +1,73 @@
+{ stdenv
+, lib
+, pkg-config
+, zlib
+, qtbase
+, qtsvg
+, qttools
+, qtmultimedia
+, qmake
+, fetchpatch
+, fetchurl
+, wrapQtAppsHook
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "chessx";
+  version = "1.6.0";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/chessx/chessx-${finalAttrs.version}.tgz";
+    hash = "sha256-76YOe1WpB+vdEoEKGTHeaWJLpCVE4RoyYu1WLy3Dxhg=";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+    qmake
+    wrapQtAppsHook
+  ];
+
+  buildInputs = [
+    qtbase
+    qtmultimedia
+    qtsvg
+    qttools
+    zlib
+  ];
+
+  patches =
+    # needed to backport patches to successfully build, due to broken release
+    let
+      repo = "https://github.com/Isarhamster/chessx/";
+    in
+    [
+      (fetchpatch {
+        url = "${repo}/commit/9797d46aa28804282bd58ce139b22492ab6881e6.diff";
+        hash = "sha256-RnIf6bixvAvyp1CKuri5LhgYFqhDNiAVYWUmSUDMgVw=";
+      })
+      (fetchpatch {
+        url = "${repo}/commit/4fab4d2f649d1cae2b54464c4e28337d1f20c214.diff";
+        hash = "sha256-EJVHricN+6uabKLfn77t8c7JjO7tMmZGsj7ZyQUGcXA=";
+      })
+    ];
+
+  enableParallelBuilding = true;
+
+  installPhase = ''
+    runHook preInstall
+
+    install -Dm555 release/chessx -t "$out/bin"
+    install -Dm444 unix/chessx.desktop -t "$out/share/applications"
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    homepage = "https://chessx.sourceforge.io/";
+    description = "Browse and analyse chess games";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ eclairevoyant luispedro ];
+    platforms = platforms.linux;
+    mainProgram = "chessx";
+  };
+})
diff --git a/nixpkgs/pkgs/games/chiaki/default.nix b/nixpkgs/pkgs/games/chiaki/default.nix
new file mode 100644
index 000000000000..e450f472e8d5
--- /dev/null
+++ b/nixpkgs/pkgs/games/chiaki/default.nix
@@ -0,0 +1,66 @@
+{ lib, stdenv
+, fetchgit
+, cmake
+, pkg-config
+, protobuf
+, python3Packages
+, ffmpeg
+, libopus
+, mkDerivation
+, qtbase
+, qtmultimedia
+, qtsvg
+, SDL2
+, libevdev
+, udev
+, qtmacextras
+}:
+
+mkDerivation rec {
+  pname = "chiaki";
+  version = "2.2.0";
+
+  src = fetchgit {
+    url = "https://git.sr.ht/~thestr4ng3r/chiaki";
+    rev = "v${version}";
+    fetchSubmodules = true;
+    hash = "sha256-mLx2ygMlIuDJt9iT4nIj/dcLGjMvvmneKd49L7C3BQk=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+    protobuf
+    python3Packages.protobuf
+    python3Packages.python
+    python3Packages.setuptools
+  ];
+
+  buildInputs = [
+    ffmpeg
+    libopus
+    qtbase
+    qtmultimedia
+    qtsvg
+    protobuf
+    SDL2
+  ] ++ lib.optionals stdenv.isLinux [
+    libevdev
+    udev
+  ] ++ lib.optionals stdenv.isDarwin [
+    qtmacextras
+  ];
+
+  doCheck = true;
+
+  installCheckPhase = "$out/bin/chiaki --help";
+
+  meta = with lib; {
+    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;
+    mainProgram = "chiaki";
+  };
+}
diff --git a/nixpkgs/pkgs/games/chiaki4deck/default.nix b/nixpkgs/pkgs/games/chiaki4deck/default.nix
new file mode 100644
index 000000000000..fcb2ed831fb7
--- /dev/null
+++ b/nixpkgs/pkgs/games/chiaki4deck/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, fetchFromGitHub
+, mkDerivation
+, cmake
+, pkg-config
+, protobuf
+, python3
+, ffmpeg_6
+, libopus
+, qtbase
+, qtmultimedia
+, qtsvg
+, SDL2
+, libevdev
+, udev
+, hidapi
+, fftw
+, speexdsp
+}:
+
+mkDerivation rec {
+  pname = "chiaki4deck";
+  version = "1.5.1";
+
+  src = fetchFromGitHub {
+    owner = "streetpea";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-XNpD9JPbckiq0HgpV/QJR8hDmvGTptxBMoGihHz44lc=";
+    fetchSubmodules = true;
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+    protobuf
+    python3
+    python3.pkgs.wrapPython
+    python3.pkgs.protobuf
+    python3.pkgs.setuptools
+  ];
+
+  buildInputs = [
+    ffmpeg_6
+    libopus
+    qtbase
+    qtmultimedia
+    qtsvg
+    protobuf
+    SDL2
+    hidapi
+    fftw
+    libevdev
+    udev
+    speexdsp
+  ];
+
+  pythonPath = [
+    python3.pkgs.requests
+  ];
+
+  postInstall = ''
+    install -Dm755 $src/scripts/psn-account-id.py $out/bin/psn-account-id
+  '';
+
+  postFixup = ''
+    wrapPythonPrograms
+  '';
+
+  meta = with lib; {
+    homepage = "https://streetpea.github.io/chiaki4deck/";
+    description = "Fork of Chiaki (Open Source Playstation Remote Play) with Enhancements for Steam Deck";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ devusb ];
+    platforms = platforms.linux;
+    mainProgram = "chiaki";
+  };
+}
diff --git a/nixpkgs/pkgs/games/chromium-bsu/default.nix b/nixpkgs/pkgs/games/chromium-bsu/default.nix
new file mode 100644
index 000000000000..1ab2fb8722b0
--- /dev/null
+++ b/nixpkgs/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/nixpkgs/pkgs/games/ckan/default.nix b/nixpkgs/pkgs/games/ckan/default.nix
new file mode 100644
index 000000000000..2f36fa75581d
--- /dev/null
+++ b/nixpkgs/pkgs/games/ckan/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, fetchurl, makeWrapper, mono, gtk2, curl }:
+
+stdenv.mkDerivation rec {
+  pname = "ckan";
+  version = "1.34.2";
+
+  src = fetchurl {
+    url = "https://github.com/KSP-CKAN/CKAN/releases/download/v${version}/ckan.exe";
+    sha256 = "sha256-MUaKgtLHVsrUy55lHella2YCblLGdnj0530qC5la2IE=";
+  };
+
+  dontUnpack = true;
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ mono ];
+
+  libraries = lib.makeLibraryPath [ gtk2 curl ];
+
+  buildPhase = "true";
+
+  installPhase = ''
+    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 = with lib; {
+    description = "Mod manager for Kerbal Space Program";
+    homepage = "https://github.com/KSP-CKAN/CKAN";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Baughn ymarkus ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/games/cl-wordle/default.nix b/nixpkgs/pkgs/games/cl-wordle/default.nix
new file mode 100644
index 000000000000..505c5166e42a
--- /dev/null
+++ b/nixpkgs/pkgs/games/cl-wordle/default.nix
@@ -0,0 +1,24 @@
+{ lib, rustPlatform, fetchFromGitHub }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "cl-wordle";
+  version = "0.5.0";
+
+  src = fetchFromGitHub {
+    owner = "conradludgate";
+    repo = "wordle";
+    rev = "v${version}";
+    sha256 = "sha256-wFTvzAzboUFQg3fauIwIdRChK7rmLES92jK+8ff1D3s=";
+  };
+
+  cargoSha256 = "sha256-PtJbLpAUH44alupFY6wX++t/QsKknn5bXvnXzdYsd9o=";
+
+  meta = with lib; {
+    description = "Wordle TUI in Rust";
+    homepage = "https://github.com/conradludgate/wordle";
+    # repo has no license, but crates.io says it's MIT
+    license = licenses.mit;
+    maintainers = with maintainers; [ lom ];
+    mainProgram = "wordle";
+  };
+}
diff --git a/nixpkgs/pkgs/games/classicube/default.nix b/nixpkgs/pkgs/games/classicube/default.nix
new file mode 100644
index 000000000000..c6805cc58343
--- /dev/null
+++ b/nixpkgs/pkgs/games/classicube/default.nix
@@ -0,0 +1,102 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, dos2unix
+, makeWrapper
+, makeDesktopItem
+, copyDesktopItems
+, libX11
+, libXi
+, libGL
+, curl
+, openal
+, liberation_ttf
+}:
+
+stdenv.mkDerivation rec {
+  pname = "ClassiCube";
+  version = "1.3.6";
+
+  src = fetchFromGitHub {
+    owner = "UnknownShadow200";
+    repo = "ClassiCube";
+    rev = version;
+    sha256 = "sha256-7VPn5YXNoAR3ftYMDQuQRqeMCrbyB56ir1sQWBiPWAI=";
+  };
+
+  nativeBuildInputs = [ dos2unix makeWrapper copyDesktopItems ];
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = pname;
+      desktopName = pname;
+      genericName = "Sandbox Block Game";
+      exec = "ClassiCube";
+      icon = "CCicon";
+      comment = "Minecraft Classic inspired sandbox game";
+      categories = [ "Game" ];
+    })
+  ];
+
+  prePatch = ''
+    # The ClassiCube sources have DOS-style newlines
+    # which causes problems with diff/patch.
+    dos2unix 'src/Platform_Posix.c' 'src/Core.h'
+  '';
+
+  patches = [
+    # Fix hardcoded font paths
+    ./font-location.patch
+    # For some reason, the Makefile doesn't link
+    # with libcurl and openal when ClassiCube requires them.
+    ./fix-linking.patch
+  ];
+
+  font_path = "${liberation_ttf}/share/fonts/truetype";
+
+  enableParallelBuilding = true;
+
+  postPatch = ''
+    # ClassiCube hardcodes locations of fonts.
+    # This changes the hardcoded location
+    # to the path of liberation_ttf instead
+    substituteInPlace src/Platform_Posix.c \
+      --replace '%NIXPKGS_FONT_PATH%' "${font_path}"
+    # ClassiCube's Makefile hardcodes JOBS=1 for some reason,
+    # even though it works perfectly well multi-threaded.
+    substituteInPlace Makefile \
+      --replace 'JOBS=1' "JOBS=$NIX_BUILD_CORES"
+  '';
+
+  buildInputs = [ libX11 libXi libGL curl openal liberation_ttf ];
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p "$out/bin"
+    cp 'ClassiCube' "$out/bin"
+    # ClassiCube puts downloaded resources
+    # next to the location of the executable by default.
+    # This doesn't work with Nix
+    # as the location of the executable is read-only.
+    # We wrap the program to make it put its resources
+    # in ~/.local/share instead.
+    wrapProgram "$out/bin/ClassiCube" \
+      --run 'mkdir -p "$HOME/.local/share/ClassiCube"' \
+      --run 'cd       "$HOME/.local/share/ClassiCube"'
+
+    mkdir -p "$out/share/icons/hicolor/256x256/apps"
+    cp misc/CCicon.png "$out/share/icons/hicolor/256x256/apps"
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    homepage = "https://www.classicube.net/";
+    description = "A lightweight, custom Minecraft Classic/ClassiCube client with optional additions written from scratch in C";
+    license = licenses.bsd3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ _360ied ];
+    mainProgram = "ClassiCube";
+  };
+}
diff --git a/nixpkgs/pkgs/games/classicube/fix-linking.patch b/nixpkgs/pkgs/games/classicube/fix-linking.patch
new file mode 100644
index 000000000000..4fc0e826cb4a
--- /dev/null
+++ b/nixpkgs/pkgs/games/classicube/fix-linking.patch
@@ -0,0 +1,13 @@
+diff --git a/Makefile b/Makefile
+index 83188ce..3439cdb 100644
+--- a/Makefile
++++ b/Makefile
+@@ -40,7 +40,7 @@ LIBS=-mwindows -lws2_32 -lwininet -lwinmm -limagehlp -lcrypt32 -ld3d9
+ endif
+ 
+ ifeq ($(PLAT),linux)
+-LIBS=-lX11 -lXi -lpthread -lGL -lm -ldl
++LIBS=-lX11 -lXi -lpthread -lGL -lm -ldl -lcurl -lopenal
+ endif
+ 
+ ifeq ($(PLAT),sunos)
diff --git a/nixpkgs/pkgs/games/classicube/font-location.patch b/nixpkgs/pkgs/games/classicube/font-location.patch
new file mode 100644
index 000000000000..bb7d383236f5
--- /dev/null
+++ b/nixpkgs/pkgs/games/classicube/font-location.patch
@@ -0,0 +1,16 @@
+diff --git a/src/Platform_Posix.c b/src/Platform_Posix.c
+index bca992d..3540afa 100644
+--- a/src/Platform_Posix.c
++++ b/src/Platform_Posix.c
+@@ -440,9 +440,8 @@ void Platform_LoadSysFonts(void) {
+ 		String_FromConst("/Library/Fonts")
+ 	};
+ #else
+-	static const cc_string dirs[] = {
+-		String_FromConst("/usr/share/fonts"),
+-		String_FromConst("/usr/local/share/fonts")
++	static const cc_string dirs[] = {
++		String_FromConst("%NIXPKGS_FONT_PATH%")
+ 	};
+ #endif
+ 	for (i = 0; i < Array_Elems(dirs); i++) {
diff --git a/nixpkgs/pkgs/games/clonehero/default.nix b/nixpkgs/pkgs/games/clonehero/default.nix
new file mode 100644
index 000000000000..daebe74e30b4
--- /dev/null
+++ b/nixpkgs/pkgs/games/clonehero/default.nix
@@ -0,0 +1,123 @@
+{ lib
+, stdenv
+, fetchurl
+, autoPatchelfHook
+, gtk3
+, zlib
+, alsa-lib
+, dbus
+, libGL
+, libXcursor
+, libXext
+, libXi
+, libXinerama
+, libxkbcommon
+, libXrandr
+, libXScrnSaver
+, libXxf86vm
+, udev
+, vulkan-loader # (not used by default, enable in settings menu)
+, wayland # (not used by default, enable with SDL_VIDEODRIVER=wayland - doesn't support HiDPI)
+, makeDesktopItem
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "clonehero";
+  version = "1.0.0.4080";
+
+  src = fetchurl {
+    url = "https://github.com/clonehero-game/releases/releases/download/V${finalAttrs.version}/CloneHero-linux.tar.xz";
+    hash = "sha256-YWLV+wgQ9RfKRSSWh/x0PMjB6tFA4YpHb9WtYOOgZZI=";
+  };
+
+  outputs = [ "out" "doc" ];
+
+  nativeBuildInputs = [ autoPatchelfHook ];
+
+  buildInputs = [
+    # Load-time libraries (loaded from DT_NEEDED section in ELF binary)
+    alsa-lib
+    gtk3
+    stdenv.cc.cc.lib
+    zlib
+
+    # Run-time libraries (loaded with dlopen)
+    dbus
+    libGL
+    libXcursor
+    libXext
+    libXi
+    libXinerama
+    libxkbcommon
+    libXrandr
+    libXScrnSaver
+    libXxf86vm
+    udev
+    vulkan-loader
+    wayland
+  ];
+
+  desktopItem = makeDesktopItem {
+    name = "clonehero";
+    desktopName = "Clone Hero";
+    comment = finalAttrs.meta.description;
+    icon = "clonehero";
+    exec = "clonehero";
+    categories = [ "Game" ];
+  };
+
+  installPhase = ''
+    runHook preInstall
+
+    install -Dm755 clonehero "$out/bin/clonehero"
+    install -Dm644 UnityPlayer.so "$out/libexec/clonehero/UnityPlayer.so"
+
+    mkdir -p "$out/share/pixmaps"
+    cp -r clonehero_Data "$out/share/clonehero"
+    ln -s "$out/share/clonehero" "$out/bin/clonehero_Data"
+    ln -s "$out/share/clonehero/Resources/UnityPlayer.png" "$out/share/pixmaps/clonehero.png"
+    install -Dm644 "$desktopItem/share/applications/clonehero.desktop" "$out/share/applications/clonehero.desktop"
+
+    mkdir -p "$doc/share/doc/clonehero"
+    cp -r CLONE_HERO_MANUAL.{pdf,txt} Custom EULA.txt THIRDPARTY.txt "$doc/share/doc/clonehero"
+
+    runHook postInstall
+  '';
+
+  # Patch required run-time libraries as load-time libraries
+  #
+  # Libraries found with:
+  # > strings UnityPlayer.so | grep '\.so'
+  # and:
+  # > LD_DEBUG=libs clonehero
+  postFixup = ''
+    patchelf \
+      --add-needed libasound.so.2 \
+      --add-needed libdbus-1.so.3 \
+      --add-needed libGL.so.1 \
+      --add-needed libpthread.so.0 \
+      --add-needed libudev.so.1 \
+      --add-needed libvulkan.so.1 \
+      --add-needed libwayland-client.so.0 \
+      --add-needed libwayland-cursor.so.0 \
+      --add-needed libwayland-egl.so.1 \
+      --add-needed libX11.so.6 \
+      --add-needed libXcursor.so.1 \
+      --add-needed libXext.so.6 \
+      --add-needed libXi.so.6 \
+      --add-needed libXinerama.so.1 \
+      --add-needed libxkbcommon.so.0 \
+      --add-needed libXrandr.so.2 \
+      --add-needed libXss.so.1 \
+      --add-needed libXxf86vm.so.1 \
+      "$out/libexec/clonehero/UnityPlayer.so"
+  '';
+
+  meta = with lib; {
+    description = "Clone of Guitar Hero and Rockband-style games";
+    homepage = "https://clonehero.net";
+    license = licenses.unfree;
+    maintainers = with maintainers; [ kira-bruneau syboxez ];
+    platforms = [ "x86_64-linux" ];
+  };
+})
diff --git a/nixpkgs/pkgs/games/cockatrice/default.nix b/nixpkgs/pkgs/games/cockatrice/default.nix
new file mode 100644
index 000000000000..0d8b925faa2b
--- /dev/null
+++ b/nixpkgs/pkgs/games/cockatrice/default.nix
@@ -0,0 +1,29 @@
+{ lib, fetchFromGitHub, mkDerivation, cmake, protobuf
+, qtbase, qtmultimedia, qttools, qtwebsockets, wrapQtAppsHook
+}:
+
+mkDerivation rec {
+  pname = "cockatrice";
+  version = "2023-09-14-Release-2.9.0";
+
+  src = fetchFromGitHub {
+    owner = "Cockatrice";
+    repo = "Cockatrice";
+    rev = version;
+    sha256 = "sha256-mzYh0qRKiHY64LnoOfF4kDEO06IW1SrCqEiOlu81Fso=";
+  };
+
+  buildInputs = [
+     qtbase qtmultimedia protobuf qttools qtwebsockets
+  ];
+
+  nativeBuildInputs = [ cmake wrapQtAppsHook ];
+
+  meta = {
+    homepage = "https://github.com/Cockatrice/Cockatrice";
+    description = "A cross-platform virtual tabletop for multiplayer card games";
+    license = lib.licenses.gpl2Plus;
+    maintainers = with lib.maintainers; [ evanjs ];
+    platforms = with lib.platforms; linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/colobot/data.nix b/nixpkgs/pkgs/games/colobot/data.nix
new file mode 100644
index 000000000000..761c68c15e81
--- /dev/null
+++ b/nixpkgs/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.2.0-alpha";
+
+  src = fetchFromGitHub {
+    owner = "colobot";
+    repo = "colobot-data";
+    rev = "colobot-gold-${version}";
+    sha256 = "sha256-yzIbAzrGsDe6hO0GHF9gjnj7IE8B7+5LDbvjZi4Wtms=";
+  };
+
+  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/nixpkgs/pkgs/games/colobot/default.nix b/nixpkgs/pkgs/games/colobot/default.nix
new file mode 100644
index 000000000000..e1070843811c
--- /dev/null
+++ b/nixpkgs/pkgs/games/colobot/default.nix
@@ -0,0 +1,41 @@
+{ 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.2.0-alpha";
+
+  src = fetchFromGitHub {
+    owner = "colobot";
+    repo = pname;
+    rev = "colobot-gold-${version}";
+    sha256 = "sha256-Nu7NyicNIk5yza9sXfd4KbGdB65guVuGREd6rwRU3lU=";
+  };
+
+  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/nixpkgs/pkgs/games/commandergenius/default.nix b/nixpkgs/pkgs/games/commandergenius/default.nix
new file mode 100644
index 000000000000..725cc5231c7e
--- /dev/null
+++ b/nixpkgs/pkgs/games/commandergenius/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv, fetchFromGitLab, SDL2, SDL2_image, pkg-config
+, libvorbis, libGL, boost, cmake, zlib, curl, SDL2_mixer, python3
+}:
+
+stdenv.mkDerivation rec {
+  pname = "commandergenius";
+  version = "2.3.3";
+
+  src = fetchFromGitLab {
+    owner = "Dringgstein";
+    repo = "Commander-Genius";
+    rev = "v${version}";
+    sha256 = "04nb23wwvc3yywz3cr6gvn02fa7psfs22ssg4wk12s08z1azvz3h";
+  };
+
+  buildInputs = [ SDL2 SDL2_image SDL2_mixer libGL boost libvorbis zlib curl python3 ];
+
+  preConfigure = ''
+    export cmakeFlags="$cmakeFlags -DCMAKE_INSTALL_PREFIX=$out -DSHAREDIR=$out/share"
+    export makeFlags="$makeFlags DESTDIR=$(out)"
+  '';
+
+  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 lib; {
+    description = "Modern Interpreter for the Commander Keen Games";
+    longDescription = ''
+      Commander Genius is an open-source clone of
+      Commander Keen which allows you to play
+      the games, and some of the mods
+      made for it. All of the original data files
+      are required to do so
+    '';
+    homepage = "https://github.com/gerstrong/Commander-Genius";
+    maintainers = with maintainers; [ hce ];
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/construo/default.nix b/nixpkgs/pkgs/games/construo/default.nix
new file mode 100644
index 000000000000..2565d8599a53
--- /dev/null
+++ b/nixpkgs/pkgs/games/construo/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv
+, fetchurl
+, libX11
+, zlib
+, xorgproto
+, libGL ? null
+, libGLU ? null
+, freeglut ? null
+}:
+
+stdenv.mkDerivation rec {
+  pname = "construo";
+  version = "0.2.3";
+
+  src = fetchurl {
+    url = "https://github.com/Construo/construo/releases/download/v${version}/${pname}-${version}.tar.gz";
+    sha256 = "1wmj527hbj1qv44cdsj6ahfjrnrjwg2dp8gdick8nd07vm062qxa";
+  };
+
+  buildInputs = [ libX11 zlib xorgproto ]
+    ++ lib.optional (libGL != null) libGL
+    ++ lib.optional (libGLU != null) libGLU
+    ++ lib.optional (freeglut != null) freeglut;
+
+  preConfigure = ''
+    substituteInPlace src/Makefile.in \
+      --replace games bin
+  '';
+
+  meta = {
+    description = "Masses and springs simulation game";
+    homepage = "http://fs.fsf.org/construo/";
+    license = lib.licenses.gpl3;
+  };
+}
diff --git a/nixpkgs/pkgs/games/corsix-th/default.nix b/nixpkgs/pkgs/games/corsix-th/default.nix
new file mode 100644
index 000000000000..0dd8edb59820
--- /dev/null
+++ b/nixpkgs/pkgs/games/corsix-th/default.nix
@@ -0,0 +1,44 @@
+{ stdenv
+, lib
+, fetchFromGitHub
+, cmake
+, doxygen
+, ffmpeg
+, freetype
+, lua
+, makeWrapper
+, SDL2
+, SDL2_mixer
+, timidity
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "corsix-th";
+  version = "0.67";
+
+  src = fetchFromGitHub {
+    owner = "CorsixTH";
+    repo = "CorsixTH";
+    rev = "v${finalAttrs.version}";
+    hash = "sha256-WA/VJqHXzBfVUBNtxCVsGBRzSRQ0pvDvAy03ntc0KZE=";
+  };
+
+  luaEnv = lua.withPackages(p: with p; [ luafilesystem lpeg luasec luasocket ]);
+  nativeBuildInputs = [ cmake doxygen makeWrapper ];
+  buildInputs = [ ffmpeg freetype lua finalAttrs.luaEnv SDL2 SDL2_mixer timidity ];
+  cmakeFlags = [ "-Wno-dev" ];
+
+  postInstall = ''
+    wrapProgram $out/bin/corsix-th \
+    --set LUA_PATH "$LUA_PATH" \
+    --set LUA_CPATH "$LUA_CPATH"
+  '';
+
+  meta = with lib; {
+    description = "A reimplementation of the 1997 Bullfrog business sim Theme Hospital.";
+    homepage = "https://corsixth.com/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hughobrien ];
+    platforms = platforms.linux;
+  };
+})
diff --git a/nixpkgs/pkgs/games/crack-attack/crack-attack-1.1.14-gcc43.patch b/nixpkgs/pkgs/games/crack-attack/crack-attack-1.1.14-gcc43.patch
new file mode 100644
index 000000000000..fb2910d128ee
--- /dev/null
+++ b/nixpkgs/pkgs/games/crack-attack/crack-attack-1.1.14-gcc43.patch
@@ -0,0 +1,10 @@
+--- crack-attack-1.1.14/src/Game.h
++++ crack-attack-1.1.14/src/Game.h
+@@ -34,6 +34,7 @@
+ #include <climits>
+ #include <cstdlib>
+ #include <cmath>
++#include <cstring>
+ 
+ #ifdef __MINGW32__
+ #  include <windows.h>
diff --git a/nixpkgs/pkgs/games/crack-attack/crack-attack-1.1.14-glut.patch b/nixpkgs/pkgs/games/crack-attack/crack-attack-1.1.14-glut.patch
new file mode 100644
index 000000000000..4daea4c53a28
--- /dev/null
+++ b/nixpkgs/pkgs/games/crack-attack/crack-attack-1.1.14-glut.patch
@@ -0,0 +1,10 @@
+--- crack-attack-1.1.14/src/Attack.cxx
++++ crack-attack-1.1.14/src/Attack.cxx
+@@ -83,6 +83,7 @@
+   int height = -1, width = -1;
+   
+   player_name[0] = '\0';
++  glutInit(&argc, argv);
+   parseCommandLine(argc, argv, mode, port, host_name, player_name, height, width);
+   run_crack_attack(mode, port, host_name, player_name, height, width);
+ 
diff --git a/nixpkgs/pkgs/games/crack-attack/default.nix b/nixpkgs/pkgs/games/crack-attack/default.nix
new file mode 100644
index 000000000000..69395e1c44aa
--- /dev/null
+++ b/nixpkgs/pkgs/games/crack-attack/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv, fetchurl, pkg-config, gtk2, freeglut, SDL, SDL_mixer, libGLU, libGL, libXi, libXmu }:
+
+stdenv.mkDerivation rec {
+  pname = "crack-attack";
+  version = "1.1.14";
+
+  src = fetchurl {
+    url = "mirror://savannah/crack-attack/crack-attack-${version}.tar.gz";
+    sha256 = "1sakj9a2q05brpd7lkqxi8q30bccycdzd96ns00s6jbxrzjlijkm";
+  };
+
+  patches = [
+    ./crack-attack-1.1.14-gcc43.patch
+    ./crack-attack-1.1.14-glut.patch
+  ];
+
+  configureFlags = [
+    "--enable-sound=yes"
+    "--prefix=${placeholder "out"}"
+    "--datadir=${placeholder "out"}/share"
+  ];
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ gtk2 freeglut SDL SDL_mixer libGLU libGL libXi libXmu ];
+
+  hardeningDisable = [ "format" ];
+  enableParallelBuilding = true;
+
+  meta = {
+    description = "A fast-paced puzzle game inspired by the classic Super NES title Tetris Attack!";
+    homepage = "https://www.nongnu.org/crack-attack/";
+    license = lib.licenses.gpl2;
+    platforms = lib.platforms.linux;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/crawl/crawl_purify.patch b/nixpkgs/pkgs/games/crawl/crawl_purify.patch
new file mode 100644
index 000000000000..8650141744d6
--- /dev/null
+++ b/nixpkgs/pkgs/games/crawl/crawl_purify.patch
@@ -0,0 +1,33 @@
+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 @@
+ #! /bin/sh
+ 
+-FONTDIRS="/usr/share/fonts /usr/local/share/fonts /usr/*/lib/X11/fonts"
++FONTDIRS="${fontsPath}/share/fonts"
+ 
+ name=$1
+ [ "$name" ] || { echo "Usage: $0 <fontname.ttf>" >&2; exit 100; }
+@@ -11,6 +11,6 @@ name=$1
+         for dir in $FONTDIRS; do
+             [ -d "$dir" ] && echo "$dir"
+         done
+-    } | xargs -I% find % \( -type f -o -type l \) -iname "$name" -print \
++    } | xargs -I% find -L % \( -type f -o -type l \) -iname "$name" -print \
+       | 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 @@
+ # else
+ #  include <SDL2/SDL.h>
+ # endif
+-# include <SDL_image.h>
++# include <SDL2/SDL_image.h>
+ # if defined(USE_SOUND) && !defined(WINMM_PLAY_SOUNDS)
+ #  include <SDL2/SDL_mixer.h>
+ # endif
diff --git a/nixpkgs/pkgs/games/crawl/default.nix b/nixpkgs/pkgs/games/crawl/default.nix
new file mode 100644
index 000000000000..fa409987ff81
--- /dev/null
+++ b/nixpkgs/pkgs/games/crawl/default.nix
@@ -0,0 +1,77 @@
+{ 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, buildPackages
+
+# MacOS / Darwin builds
+, darwin ? null
+}:
+
+stdenv.mkDerivation rec {
+  pname = "crawl${lib.optionalString tileMode "-tiles"}";
+  version = "0.29.0";
+
+  src = fetchFromGitHub {
+    owner = "crawl";
+    repo = "crawl";
+    rev = version;
+    sha256 = "sha256-SM8dSDV+88QGMqoFkITop1PHh9EakdgiV4tkXCw9pjM=";
+  };
+
+  # Patch hard-coded paths and remove force library builds
+  patches = [ ./crawl_purify.patch ];
+
+  nativeBuildInputs = [ pkg-config which perl pngcrush advancecomp ];
+
+  # Still unstable with luajit
+  buildInputs = [ lua5_1 zlib sqlite ncurses ]
+                ++ (with python3.pkgs; [ pyyaml ])
+                ++ lib.optionals tileMode [ libpng SDL2 SDL2_image freetype libGLU libGL ]
+                ++ lib.optional enableSound SDL2_mixer
+                ++ (lib.optionals stdenv.isDarwin (
+                  assert (lib.assertMsg (darwin != null) "Must have darwin frameworks available for darwin builds");
+                  with darwin.apple_sdk.frameworks; [
+                    AppKit AudioUnit CoreAudio ForceFeedback Carbon IOKit OpenGL
+                   ]
+                ));
+
+  preBuild = ''
+    cd crawl-ref/source
+    echo "${version}" > util/release_ver
+    patchShebangs 'util'
+    patchShebangs util/gen-mi-enum
+    rm -rf contrib
+  '';
+
+  fontsPath = lib.optionalString tileMode dejavu_fonts;
+
+  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"
+                ++ lib.optional enableSound "SOUND=y";
+
+  postInstall = ''
+    ${lib.optionalString tileMode "mv $out/bin/crawl $out/bin/crawl-tiles"}
+    sed -i 's#/usr/games/##' debian/crawl${lib.optionalString tileMode "-tiles"}.desktop
+    install -m 444 -D debian/crawl${lib.optionalString tileMode "-tiles"}.desktop \
+      $out/share/applications/crawl${lib.optionalString tileMode "-tiles"}.desktop
+    install -m 444 -D dat/tiles/stone_soup_icon-512x512.png $out/share/icons/hicolor/512x512/apps/crawl.png
+  '';
+
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    description = "Open-source, single-player, role-playing roguelike game";
+    homepage = "http://crawl.develz.org/";
+    longDescription = ''
+      Dungeon Crawl: Stone Soup, an open-source, single-player, role-playing
+      roguelike game of exploration and treasure-hunting in dungeons filled
+      with dangerous and unfriendly monsters in a quest to rescue the
+      mystifyingly fabulous Orb of Zot.
+    '';
+    platforms = platforms.linux ++ platforms.darwin;
+    license = with licenses; [ gpl2Plus bsd2 bsd3 mit licenses.zlib cc0 ];
+    maintainers = [ maintainers.abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/crossfire/crossfire-arch.nix b/nixpkgs/pkgs/games/crossfire/crossfire-arch.nix
new file mode 100644
index 000000000000..c09f474e70c7
--- /dev/null
+++ b/nixpkgs/pkgs/games/crossfire/crossfire-arch.nix
@@ -0,0 +1,27 @@
+{ stdenv, lib, fetchsvn,
+  version, rev, sha256 }:
+
+stdenv.mkDerivation rec {
+  pname = "crossfire-arch";
+  version = rev;
+
+  src = fetchsvn {
+    url = "http://svn.code.sf.net/p/crossfire/code/arch/trunk/";
+    inherit sha256;
+    rev = "r${rev}";
+  };
+
+  installPhase = ''
+    mkdir -p "$out"
+    cp -a . "$out/"
+  '';
+
+  meta = with lib; {
+    description = "Archetype data for the Crossfire free MMORPG";
+    homepage = "http://crossfire.real-time.com/";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    hydraPlatforms = [];
+    maintainers = with maintainers; [ ToxicFrog ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/crossfire/crossfire-client.nix b/nixpkgs/pkgs/games/crossfire/crossfire-client.nix
new file mode 100644
index 000000000000..0d335b4f529a
--- /dev/null
+++ b/nixpkgs/pkgs/games/crossfire/crossfire-client.nix
@@ -0,0 +1,32 @@
+{ stdenv, lib, fetchsvn
+, cmake, pkg-config, perl, vala
+, gtk2, pcre, zlib, libpng, fribidi, harfbuzzFull, xorg, util-linux, curl
+, SDL, SDL_image, SDL_mixer, libselinux, libsepol
+, version, rev, sha256
+}:
+
+stdenv.mkDerivation rec {
+  pname = "crossfire-client";
+  version = rev;
+
+  src = fetchsvn {
+    url = "http://svn.code.sf.net/p/crossfire/code/client/trunk/";
+    inherit sha256;
+    rev = "r${rev}";
+  };
+
+  nativeBuildInputs = [ cmake pkg-config perl vala ];
+  buildInputs = [
+    gtk2 pcre zlib libpng fribidi harfbuzzFull xorg.libpthreadstubs
+    xorg.libXdmcp curl SDL SDL_image SDL_mixer util-linux libselinux libsepol
+  ];
+  hardeningDisable = [ "format" ];
+
+  meta = with lib; {
+    description = "GTKv2 client for the Crossfire free MMORPG";
+    homepage = "http://crossfire.real-time.com/";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ ToxicFrog ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/crossfire/crossfire-maps.nix b/nixpkgs/pkgs/games/crossfire/crossfire-maps.nix
new file mode 100644
index 000000000000..cb514a90d169
--- /dev/null
+++ b/nixpkgs/pkgs/games/crossfire/crossfire-maps.nix
@@ -0,0 +1,27 @@
+{ stdenv, lib, fetchsvn,
+  version, rev, sha256 }:
+
+stdenv.mkDerivation rec {
+  pname = "crossfire-maps";
+  version = rev;
+
+  src = fetchsvn {
+    url = "http://svn.code.sf.net/p/crossfire/code/maps/trunk/";
+    inherit sha256;
+    rev = "r${rev}";
+  };
+
+  installPhase = ''
+    mkdir -p "$out"
+    cp -a . "$out/"
+  '';
+
+  meta = with lib; {
+    description = "Map data for the Crossfire free MMORPG";
+    homepage = "http://crossfire.real-time.com/";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    hydraPlatforms = [];
+    maintainers = with maintainers; [ ToxicFrog ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/crossfire/crossfire-server.nix b/nixpkgs/pkgs/games/crossfire/crossfire-server.nix
new file mode 100644
index 000000000000..9827aa76c526
--- /dev/null
+++ b/nixpkgs/pkgs/games/crossfire/crossfire-server.nix
@@ -0,0 +1,52 @@
+{ stdenv
+, lib
+, fetchsvn
+, autoreconfHook
+, autoconf
+, automake
+, libtool
+, flex
+, perl
+, check
+, pkg-config
+, python39 # crossfire-server relies on a parser wich was removed in python >3.9
+, version
+, rev
+, sha256
+, maps
+, arch
+}:
+
+stdenv.mkDerivation rec {
+  pname = "crossfire-server";
+  version = rev;
+
+  src = fetchsvn {
+    url = "http://svn.code.sf.net/p/crossfire/code/server/trunk/";
+    inherit sha256;
+    rev = "r${rev}";
+  };
+
+  nativeBuildInputs = [ autoconf automake libtool flex perl check pkg-config python39 ];
+  hardeningDisable = [ "format" ];
+
+  preConfigure = ''
+    ln -s ${arch} lib/arch
+    ln -s ${maps} lib/maps
+    sh autogen.sh
+  '';
+
+  configureFlags = [ "--with-python=${python39}" ];
+
+  postInstall = ''
+    ln -s ${maps} "$out/share/crossfire/maps"
+  '';
+
+  meta = with lib; {
+    description = "Server for the Crossfire free MMORPG";
+    homepage = "http://crossfire.real-time.com/";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ ToxicFrog ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/crossfire/default.nix b/nixpkgs/pkgs/games/crossfire/default.nix
new file mode 100644
index 000000000000..7d0716df3d9b
--- /dev/null
+++ b/nixpkgs/pkgs/games/crossfire/default.nix
@@ -0,0 +1,28 @@
+{ callPackage, ... }:
+
+rec {
+  crossfire-client = callPackage ./crossfire-client.nix {
+    version = "1.75.0";
+    rev = "21760";
+    sha256 = "0b42sak8hj60nywfswkps777asy9p8r9wsn7pmj2nqbd29ng1p9d";
+  };
+
+  crossfire-server = callPackage ./crossfire-server.nix {
+    version = "latest";
+    rev = "22111";
+    sha256 = "04fjif6zv642n2zlw27cgzkak2kknwrxqzg42bvzl7q901bsr9l7";
+    maps = crossfire-maps; arch = crossfire-arch;
+  };
+
+  crossfire-arch = callPackage ./crossfire-arch.nix {
+    version = "latest";
+    rev = "22111";
+    sha256 = "0l4rp3idvbhknpxxs0w4i4nqfg01wblzm4v4j375xwxxbf00j0ms";
+  };
+
+  crossfire-maps = callPackage ./crossfire-maps.nix {
+    version = "latest";
+    rev = "22111";
+    sha256 = "1dwfc84acjvbjgjakkb8z8pdlksbsn90j0z8z8rq37lqx0kx1sap";
+  };
+}
diff --git a/nixpkgs/pkgs/games/crrcsim/default.nix b/nixpkgs/pkgs/games/crrcsim/default.nix
new file mode 100644
index 000000000000..741f402870a8
--- /dev/null
+++ b/nixpkgs/pkgs/games/crrcsim/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, fetchurl, libGLU, libGL, SDL, SDL_mixer, plib, libjpeg }:
+let
+  version = "0.9.13";
+in
+stdenv.mkDerivation rec {
+  pname = "crrcsim";
+  inherit version;
+
+  src = fetchurl {
+    url = "mirror://sourceforge/crrcsim/${pname}-${version}.tar.gz";
+    sha256 = "abe59b35ebb4322f3c48e6aca57dbf27074282d4928d66c0caa40d7a97391698";
+  };
+
+  buildInputs = [
+    libGLU libGL SDL SDL_mixer plib libjpeg
+  ];
+
+  patches = [
+    ./gcc6.patch
+  ];
+
+  meta = {
+    description = "A model-airplane flight simulator";
+    maintainers = with lib.maintainers; [ raskin ];
+    platforms = [ "i686-linux" "x86_64-linux" ];
+    license = lib.licenses.gpl2;
+  };
+}
diff --git a/nixpkgs/pkgs/games/crrcsim/gcc6.patch b/nixpkgs/pkgs/games/crrcsim/gcc6.patch
new file mode 100644
index 000000000000..c19f28c514d7
--- /dev/null
+++ b/nixpkgs/pkgs/games/crrcsim/gcc6.patch
@@ -0,0 +1,13 @@
+diff --git c/src/mod_video/crrc_animation.cpp i/src/mod_video/crrc_animation.cpp
+index ee7d7f4..855b106 100644
+--- c/src/mod_video/crrc_animation.cpp
++++ i/src/mod_video/crrc_animation.cpp
+@@ -84,7 +84,7 @@ void createAnimation(SimpleXMLTransfer *animation, ssgEntity* model)
+       else
+       {
+         std::cerr << "createAnimation: unknown animation type \'"
+-                  << type << "\'" << std::cerr;
++                  << type << "\'" << std::endl;
+       }
+       
+       if (anim != NULL)
diff --git a/nixpkgs/pkgs/games/curseofwar/default.nix b/nixpkgs/pkgs/games/curseofwar/default.nix
new file mode 100644
index 000000000000..fef456816ff2
--- /dev/null
+++ b/nixpkgs/pkgs/games/curseofwar/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv
+, fetchFromGitHub
+, ncurses
+, SDL
+}:
+
+stdenv.mkDerivation rec {
+  pname = "curseofwar";
+  version = "1.3.0";
+
+  src = fetchFromGitHub {
+    owner = "a-nikolaev";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1wd71wdnj9izg5d95m81yx3684g4zdi7fsy0j5wwnbd9j34ilz1i";
+  };
+
+  buildInputs = [
+    ncurses
+    SDL
+  ];
+
+  makeFlags = (lib.optionals (SDL != null) [ "SDL=yes" ]) ++ [
+    "PREFIX=$(out)"
+    # force platform's cc on darwin, otherwise gcc is used
+    "CC=${stdenv.cc.targetPrefix}cc"
+  ];
+
+  meta = with lib; {
+    description = "A fast-paced action strategy game";
+    homepage = "https://a-nikolaev.github.io/curseofwar/";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ fgaz ];
+    platforms = platforms.all;
+  };
+}
+
diff --git a/nixpkgs/pkgs/games/cutechess/default.nix b/nixpkgs/pkgs/games/cutechess/default.nix
new file mode 100644
index 000000000000..5e374afa1bca
--- /dev/null
+++ b/nixpkgs/pkgs/games/cutechess/default.nix
@@ -0,0 +1,45 @@
+{ stdenv
+, fetchFromGitHub
+, cmake
+, pkg-config
+, wrapQtAppsHook
+, qtbase
+, lib
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "cutechess";
+  version = "1.3.1";
+
+  src = fetchFromGitHub {
+    owner = "cutechess";
+    repo = "cutechess";
+    rev = "v${finalAttrs.version}";
+    hash = "sha256-P44Twbw2MGz+oTzPwMFCe73zPxAex6uYjSTtaUypfHw=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+    wrapQtAppsHook
+  ];
+  buildInputs = [
+    qtbase
+  ];
+
+  postInstall = ''
+    install -Dm555 cutechess{,-cli} -t $out/bin/
+    install -Dm444 libcutechess.a -t $out/lib/
+    install -Dm444 $src/docs/cutechess-cli.6 -t $out/share/man/man6/
+    install -Dm444 $src/docs/cutechess-engines.json.5 -t $out/share/man/man5/
+  '';
+
+  meta = with lib; {
+    description = "GUI, CLI, and library for playing chess";
+    homepage = "https://cutechess.com/";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ eclairevoyant ];
+    platforms = with platforms; (linux ++ windows);
+    mainProgram = "cutechess";
+  };
+})
diff --git a/nixpkgs/pkgs/games/cutemaze/default.nix b/nixpkgs/pkgs/games/cutemaze/default.nix
new file mode 100644
index 000000000000..a0f2d725d4bf
--- /dev/null
+++ b/nixpkgs/pkgs/games/cutemaze/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, stdenv
+, fetchurl
+, cmake
+, qttools
+, wrapQtAppsHook
+, qtbase
+, qtwayland
+, qtsvg
+}:
+
+stdenv.mkDerivation rec {
+  pname = "cutemaze";
+  version = "1.3.2";
+
+  src = fetchurl {
+    url = "https://gottcode.org/cutemaze/${pname}-${version}.tar.bz2";
+    hash = "sha256-hjDlY18O+VDJR68vwrIZwsQAa40xU+V3bCAA4GFHJEQ=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    qttools
+    wrapQtAppsHook
+  ];
+
+  buildInputs = [
+    qtbase
+    qtsvg
+  ] ++ lib.optionals stdenv.isLinux [
+    qtwayland
+  ];
+
+  installPhase = if stdenv.isDarwin then ''
+    runHook preInstall
+
+    mkdir -p $out/Applications
+    mv CuteMaze.app $out/Applications
+    makeWrapper $out/Applications/CuteMaze.app/Contents/MacOS/CuteMaze $out/bin/cutemaze
+
+    runHook postInstall
+  '' else null;
+
+  meta = with lib; {
+    changelog = "https://github.com/gottcode/cutemaze/blob/v${version}/ChangeLog";
+    description = "Simple, top-down game in which mazes are randomly generated";
+    homepage = "https://gottcode.org/cutemaze/";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ dotlambda ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/games/cuyo/default.nix b/nixpkgs/pkgs/games/cuyo/default.nix
new file mode 100644
index 000000000000..871812e097a9
--- /dev/null
+++ b/nixpkgs/pkgs/games/cuyo/default.nix
@@ -0,0 +1,21 @@
+{ 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 = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.linux;
+  };
+
+}
diff --git a/nixpkgs/pkgs/games/darkplaces/default.nix b/nixpkgs/pkgs/games/darkplaces/default.nix
new file mode 100644
index 000000000000..876e0025976f
--- /dev/null
+++ b/nixpkgs/pkgs/games/darkplaces/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, zlib
+, libjpeg
+, SDL2
+, libvorbis
+}:
+stdenv.mkDerivation rec {
+  pname = "darkplaces";
+  version = "unstable-2022-05-10";
+
+  src = fetchFromGitHub {
+    owner = "DarkPlacesEngine";
+    repo = "darkplaces";
+    rev = "f16954a9d40168253ac5d9890dabcf7dbd266cd9";
+    hash = "sha256-5KsUcgHbuzFUE6LcclqI8VPSFbXZzBnxzOBB9Kf8krI=";
+  };
+
+  buildInputs = [
+    zlib
+    libjpeg
+    SDL2
+  ];
+
+  buildFlags = [ "release" ];
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/bin
+    install -m755 darkplaces-sdl $out/bin/darkplaces
+    install -m755 darkplaces-dedicated $out/bin/darkplaces-dedicated
+
+    runHook postInstall
+  '';
+
+  postFixup = ''
+    patchelf \
+      --add-needed ${libvorbis}/lib/libvorbisfile.so \
+      --add-needed ${libvorbis}/lib/libvorbis.so \
+      $out/bin/darkplaces
+  '';
+
+  meta = with lib; {
+    homepage = "https://www.icculus.org/twilight/darkplaces/";
+    description = "A quake 1 engine implementation by LadyHavoc";
+    longDescription = ''
+      A game engine based on the Quake 1 engine by id Software.
+      It improves and builds upon the original 1996 engine by adding modern
+      rendering features, and expanding upon the engine's native game code
+      language QuakeC, as well as supporting additional map and model formats.
+    '';
+    maintainers = with maintainers; [ necrophcodr ];
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/ddnet/default.nix b/nixpkgs/pkgs/games/ddnet/default.nix
new file mode 100644
index 000000000000..ddd3538ece50
--- /dev/null
+++ b/nixpkgs/pkgs/games/ddnet/default.nix
@@ -0,0 +1,130 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cargo
+, cmake
+, ninja
+, pkg-config
+, rustPlatform
+, rustc
+, curl
+, freetype
+, libGLU
+, libnotify
+, libogg
+, libX11
+, opusfile
+, pcre
+, python3
+, SDL2
+, sqlite
+, wavpack
+, ffmpeg
+, x264
+, vulkan-headers
+, vulkan-loader
+, glslang
+, spirv-tools
+, gtest
+, Carbon
+, Cocoa
+, OpenGL
+, Security
+, buildClient ? true
+}:
+
+stdenv.mkDerivation rec {
+  pname = "ddnet";
+  version = "17.4.2";
+
+  src = fetchFromGitHub {
+    owner = "ddnet";
+    repo = pname;
+    rev = version;
+    hash = "sha256-cu6EmCaT8nMCcXUwvZdWog/4bvHQo9+DZHDHRvun2E4=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    name = "${pname}-${version}";
+    inherit src;
+    hash = "sha256-O4ORWuTlmEMsTpMEhnauNfXOKWfg8hB32rZKRe8Nmp4=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    ninja
+    pkg-config
+    rustc
+    cargo
+    rustPlatform.cargoSetupHook
+  ];
+
+  nativeCheckInputs = [
+    gtest
+  ];
+
+  buildInputs = [
+    curl
+    libnotify
+    pcre
+    python3
+    sqlite
+  ] ++ lib.optionals buildClient ([
+    freetype
+    libGLU
+    libogg
+    opusfile
+    SDL2
+    wavpack
+    ffmpeg
+    x264
+    vulkan-loader
+    vulkan-headers
+    glslang
+    spirv-tools
+  ] ++ lib.optionals stdenv.isLinux [
+    libX11
+  ] ++ lib.optionals stdenv.isDarwin [
+    Carbon
+    Cocoa
+    OpenGL
+    Security
+  ]);
+
+  postPatch = ''
+    substituteInPlace src/engine/shared/storage.cpp \
+      --replace /usr/ $out/
+  '';
+
+  cmakeFlags = [
+    "-DAUTOUPDATE=OFF"
+    "-DCLIENT=${if buildClient then "ON" else "OFF"}"
+  ];
+
+  doCheck = true;
+  checkTarget = "run_tests";
+
+  postInstall = lib.optionalString (!buildClient) ''
+    # DDNet's CMakeLists.txt automatically installs .desktop
+    # shortcuts and icons for the client, even if the client
+    # is not supposed to be built
+    rm -rf $out/share/applications
+    rm -rf $out/share/icons
+    rm -rf $out/share/metainfo
+  '';
+
+  meta = with lib; {
+    description = "A Teeworlds modification with a unique cooperative gameplay.";
+    longDescription = ''
+      DDraceNetwork (DDNet) is an actively maintained version of DDRace,
+      a Teeworlds modification with a unique cooperative gameplay.
+      Help each other play through custom maps with up to 64 players,
+      compete against the best in international tournaments,
+      design your own maps, or run your own server.
+    '';
+    homepage = "https://ddnet.org";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ sirseruju lom ncfavier ];
+    mainProgram = "DDNet";
+  };
+}
diff --git a/nixpkgs/pkgs/games/deliantra/0001-abs.patch b/nixpkgs/pkgs/games/deliantra/0001-abs.patch
new file mode 100644
index 000000000000..d116317e243a
--- /dev/null
+++ b/nixpkgs/pkgs/games/deliantra/0001-abs.patch
@@ -0,0 +1,17 @@
+--- a/utils/cfhq2xa.C
++++ b/utils/cfhq2xa.C
+@@ -182,10 +182,10 @@ static inline bool Diff (pixel w1, pixel w2)
+   pixel YUV1 = RGBAtoYUVA (w1);
+   pixel YUV2 = RGBAtoYUVA (w2);
+
+-  return ((abs (((YUV1 >> Rshift) & Cmask) - ((YUV2 >> Rshift) & Cmask)) > trY) ||
+-          (abs (((YUV1 >> Gshift) & Cmask) - ((YUV2 >> Gshift) & Cmask)) > trU) ||
+-          (abs (((YUV1 >> Bshift) & Cmask) - ((YUV2 >> Bshift) & Cmask)) > trV) ||
+-          (abs (((YUV1 >> Ashift) & Cmask) - ((YUV2 >> Ashift) & Cmask)) > trA) );
++  return ((abs ((signed int)((YUV1 >> Rshift) & Cmask) - (signed int)((YUV2 >> Rshift) & Cmask)) > trY) ||
++          (abs ((signed int)((YUV1 >> Gshift) & Cmask) - (signed int)((YUV2 >> Gshift) & Cmask)) > trU) ||
++          (abs ((signed int)((YUV1 >> Bshift) & Cmask) - (signed int)((YUV2 >> Bshift) & Cmask)) > trV) ||
++          (abs ((signed int)((YUV1 >> Ashift) & Cmask) - (signed int)((YUV2 >> Ashift) & Cmask)) > trA) );
+ }
+
+ static void
diff --git a/nixpkgs/pkgs/games/deliantra/0002-datadir.patch b/nixpkgs/pkgs/games/deliantra/0002-datadir.patch
new file mode 100644
index 000000000000..1c8e847d88c6
--- /dev/null
+++ b/nixpkgs/pkgs/games/deliantra/0002-datadir.patch
@@ -0,0 +1,11 @@
+--- a/utils/cfutil.in
++++ b/utils/cfutil.in
+@@ -27,7 +27,7 @@ use common::sense;
+ my $prefix      = "@prefix@";
+ my $exec_prefix = "@exec_prefix@";
+ my $datarootdir = "@datarootdir@";
+-my $DATADIR     = "@datadir@/@PACKAGE@";
++my $DATADIR     = $ENV{'DELIANTRA_DATADIR'} || "@datadir@/@PACKAGE@";
+
+ my $CONVERT  = "@CONVERT@";
+ my $IDENTIFY = "@IDENTIFY@";
diff --git a/nixpkgs/pkgs/games/deliantra/0003-swap.patch b/nixpkgs/pkgs/games/deliantra/0003-swap.patch
new file mode 100644
index 000000000000..fa4e2bdec425
--- /dev/null
+++ b/nixpkgs/pkgs/games/deliantra/0003-swap.patch
@@ -0,0 +1,14 @@
+--- a/include/util.h
++++ b/include/util.h
+@@ -449,6 +449,11 @@ struct slice_allocator
+   {
+     p->~Tp ();
+   }
++
++  bool operator ==(const slice_allocator &) const
++  {
++    return true;
++  }
+ };
+ 
+ // basically a memory area, but refcounted
diff --git a/nixpkgs/pkgs/games/deliantra/arch.nix b/nixpkgs/pkgs/games/deliantra/arch.nix
new file mode 100644
index 000000000000..2201ca2d1f5f
--- /dev/null
+++ b/nixpkgs/pkgs/games/deliantra/arch.nix
@@ -0,0 +1,25 @@
+{ stdenv, lib, fetchurl, deliantra-server }:
+
+stdenv.mkDerivation rec {
+  pname = "deliantra-arch";
+  version = "3.1";
+
+  src = fetchurl {
+    url = "http://dist.schmorp.de/deliantra/${pname}-${version}.tar.xz";
+    sha256 = "1xzhv48g90hwkzgx9nfjm81ivg6hchkik9ldimi8ijb4j393kvsz";
+  };
+
+  installPhase = ''
+    mkdir -p "$out"
+    export DELIANTRA_DATADIR="$out"
+    ${deliantra-server}/bin/cfutil --install-arch .
+  '';
+
+  meta = with lib; {
+    description = "Archetype data for the Deliantra free MMORPG";
+    homepage = "http://www.deliantra.net/";
+    license = with licenses; [ gpl2Plus agpl3Plus ];
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ ToxicFrog ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/deliantra/data.nix b/nixpkgs/pkgs/games/deliantra/data.nix
new file mode 100644
index 000000000000..31ed7d0f0118
--- /dev/null
+++ b/nixpkgs/pkgs/games/deliantra/data.nix
@@ -0,0 +1,21 @@
+{ stdenv, lib, fetchurl, deliantra-maps, deliantra-arch, deliantra-server, symlinkJoin }:
+
+symlinkJoin rec {
+  name = "deliantra-data-${version}";
+  version = "M${deliantra-maps.version}+A${deliantra-arch.version}";
+
+  paths = [
+    deliantra-maps
+    deliantra-arch
+    "${deliantra-server}/share/deliantra-server"
+  ];
+
+  meta = with lib; {
+    description = "Combined game data (maps + archetypes) for the Deliantra free MMORPG";
+    homepage = "http://www.deliantra.net/";
+    license = with licenses; [ gpl2Plus agpl3Plus ];
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ ToxicFrog ];
+    hydraPlatforms = [];
+  };
+}
diff --git a/nixpkgs/pkgs/games/deliantra/maps.nix b/nixpkgs/pkgs/games/deliantra/maps.nix
new file mode 100644
index 000000000000..1f87178102a0
--- /dev/null
+++ b/nixpkgs/pkgs/games/deliantra/maps.nix
@@ -0,0 +1,25 @@
+{ stdenv, lib, fetchurl, deliantra-server }:
+
+stdenv.mkDerivation rec {
+  pname = "deliantra-maps";
+  version = "3.1";
+
+  src = fetchurl {
+    url = "http://dist.schmorp.de/deliantra/${pname}-${version}.tar.xz";
+    sha256 = "0zbwzya28s1xpnbrmqkqvfrzns03zdjd8a9w9nk665aif6rw2zbz";
+  };
+
+  installPhase = ''
+    mkdir -p "$out/maps"
+    export DELIANTRA_DATADIR="$out"
+    ${deliantra-server}/bin/cfutil --install-maps .
+  '';
+
+  meta = with lib; {
+    description = "Map data for the Deliantra free MMORPG";
+    homepage = "http://www.deliantra.net/";
+    license = with licenses; [ gpl2Plus agpl3Plus ];
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ ToxicFrog ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/deliantra/server.nix b/nixpkgs/pkgs/games/deliantra/server.nix
new file mode 100644
index 000000000000..08889dd2302d
--- /dev/null
+++ b/nixpkgs/pkgs/games/deliantra/server.nix
@@ -0,0 +1,55 @@
+{ stdenv, lib, fetchurl, perlPackages
+, autoconf, perl, gperf, optipng, pngnq, rsync, imagemagick, blitz
+, pkg-config, glib, boost, makeWrapper
+}:
+
+let
+  perl-deps = with perlPackages; [
+    AnyEvent AnyEventAIO AnyEventBDB AnyEventIRC
+    CompressLZF commonsense Coro CoroEV
+    Deliantra DigestSHA1 EV PodPOM SafeHole URI YAMLLibYAML
+  ];
+in
+stdenv.mkDerivation rec {
+  pname = "deliantra-server";
+  version = "3.1";
+
+  src = fetchurl {
+    url = "http://dist.schmorp.de/deliantra/${pname}-${version}.tar.xz";
+    sha256 = "0v0m2m9fxq143aknh7jb3qj8bnpjrs3bpbbx07c18516y3izr71d";
+  };
+
+  nativeBuildInputs = [
+    autoconf perl gperf optipng pngnq rsync imagemagick
+    pkg-config makeWrapper
+  ];
+
+  propagatedBuildInputs = perl-deps;
+
+  buildInputs = [
+    blitz boost glib
+  ];
+
+  hardeningDisable = [ "format" ];
+
+  patches = [
+    ./0001-abs.patch
+    ./0002-datadir.patch
+    ./0003-swap.patch
+  ];
+
+  env.CXXFLAGS = "-std=c++11";
+
+  postFixup = ''
+    wrapProgram $out/bin/cfutil --prefix PERL5LIB : $PERL5LIB
+    wrapProgram $out/bin/deliantra-server --prefix PERL5LIB : $PERL5LIB
+  '';
+
+  meta = with lib; {
+    description = "Server for the Deliantra free MMORPG";
+    homepage = "http://www.deliantra.net/";
+    license = with licenses; [ gpl2Plus agpl3Plus ];
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ ToxicFrog ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/devilutionx/default.nix b/nixpkgs/pkgs/games/devilutionx/default.nix
new file mode 100644
index 000000000000..94838596a129
--- /dev/null
+++ b/nixpkgs/pkgs/games/devilutionx/default.nix
@@ -0,0 +1,129 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, fetchpatch
+, fetchurl
+, bzip2
+, cmake
+, pkg-config
+, gettext
+, libsodium
+, SDL2
+, SDL_audiolib
+, SDL2_image
+, fmt
+, libpng
+, smpq
+}:
+
+let
+  # TODO: submit a PR upstream to allow system copies of these libraries where possible
+
+  # fork with patches, far behind upstream
+  asio = fetchurl {
+    url = "https://github.com/diasurgical/asio/archive/ebeff99f539da23d27c2e8d4bdbc1ee011968644.tar.gz";
+    sha256 = "0vhb4cig40mm0a98i74grpmfkcmby8zxg6vqa38dpryxpgvp5fw8";
+  };
+
+  # fork with patches, upstream seems to be dead
+  libmpq = fetchurl {
+    url = "https://github.com/diasurgical/libmpq/archive/0f10bd1600f406b13932bf5351ba713361262184.tar.gz";
+    sha256 = "sha256-7hc/Xtsg8WJIJljLydS7hLZA9lEEHWhsCteyrxK68qE=";
+  };
+
+  # not "real" package with pkg-config or cmake file, just collection of source files
+  libsmackerdec = fetchurl {
+    url = "https://github.com/diasurgical/libsmackerdec/archive/2997ee0e41e91bb723003bc09234be553b190e38.tar.gz";
+    sha256 = "sha256-QMDcIZQ94i4VPVanmSxiGkKgxWx82DP4uE+Q5I2nU+o=";
+  };
+
+  # fork with patches, far behind upstream
+  libzt = fetchFromGitHub {
+    owner = "diasurgical";
+    repo = "libzt";
+    fetchSubmodules = true;
+    rev = "37a2efb0b925df632299ef07dc78c0af5f6b4756";
+    sha256 = "sha256-+o4ZTVqh4MDZES9m7mkfkMRlRDMBytDBuA0QIlnp73U=";
+  };
+
+  # missing pkg-config and/or cmake file
+  simpleini = fetchurl {
+    url = "https://github.com/brofield/simpleini/archive/9b3ed7ec815997bc8c5b9edf140d6bde653e1458.tar.gz";
+    sha256 = "sha256-93kuyp8/ew7okW/6ThJMtLMZsR1YSeFcXu9Y65ELBFE==";
+  };
+in
+
+stdenv.mkDerivation rec {
+  pname = "devilutionx";
+  version = "1.4.1";
+
+  src = fetchFromGitHub {
+    owner = "diasurgical";
+    repo = "devilutionX";
+    rev = version;
+    sha256 = "sha256-l0BhL+DXtkG2PdFqmkL0KJv41zl3N/AcuLmzw2j3jXY=";
+  };
+
+  postPatch = ''
+    substituteInPlace Source/init.cpp --replace "/usr/share/diasurgical/devilutionx/" "${placeholder "out"}/share/diasurgical/devilutionx/"
+
+    # download dependencies ahead of time
+    substituteInPlace 3rdParty/asio/CMakeLists.txt --replace "${asio.url}" "${asio}"
+    substituteInPlace 3rdParty/libmpq/CMakeLists.txt --replace "${libmpq.url}" "${libmpq}"
+    substituteInPlace 3rdParty/libsmackerdec/CMakeLists.txt --replace "${libsmackerdec.url}" "${libsmackerdec}"
+    substituteInPlace 3rdParty/libzt/CMakeLists.txt \
+      --replace "GIT_REPOSITORY https://github.com/diasurgical/libzt.git" "" \
+      --replace "GIT_TAG ${libzt.rev}" "SOURCE_DIR ${libzt}"
+    substituteInPlace 3rdParty/simpleini/CMakeLists.txt --replace "${simpleini.url}" "${simpleini}"
+  '';
+
+  cmakeFlags = [
+    "-DBINARY_RELEASE=ON"
+    "-DVERSION_NUM=${version}"
+  ];
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+    gettext
+    smpq # used to build devilutionx.mpq
+  ];
+
+  buildInputs = [
+    bzip2
+    fmt
+    libpng
+    libsodium
+    SDL2
+    SDL_audiolib
+    SDL2_image
+  ];
+
+  installPhase = ''
+    runHook preInstall
+
+  '' + (if stdenv.isDarwin then ''
+    mkdir -p $out/Applications
+    mv devilutionx.app $out/Applications
+  '' else ''
+    install -Dm755 -t $out/bin devilutionx
+    install -Dm755 -t $out/share/diasurgical/devilutionx devilutionx.mpq
+    install -Dm755 -t $out/share/applications ../Packaging/nix/devilutionx-hellfire.desktop ../Packaging/nix/devilutionx.desktop
+    install -Dm755 ../Packaging/resources/icon.png $out/share/icons/hicolor/512x512/apps/devilutionx.png
+    install -Dm755 ../Packaging/resources/hellfire.png $out/share/icons/hicolor/512x512/apps/devilutionx-hellfire.png
+    install -Dm755 ../Packaging/resources/icon_32.png $out/share/icons/hicolor/32x32/apps/devilutionx.png
+    install -Dm755 ../Packaging/resources/hellfire_32.png $out/share/icons/hicolor/32x32/apps/devilutionx-hellfire.png
+  '') + ''
+
+    runHook postInstall
+  '';
+
+  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 = with maintainers; [ karolchmist aanderse ];
+    platforms = platforms.linux ++ platforms.windows;
+  };
+}
diff --git a/nixpkgs/pkgs/games/domination/default.nix b/nixpkgs/pkgs/games/domination/default.nix
new file mode 100644
index 000000000000..8bf1c2a9ec31
--- /dev/null
+++ b/nixpkgs/pkgs/games/domination/default.nix
@@ -0,0 +1,108 @@
+{ lib, stdenv
+, fetchsvn
+# jdk8 is needed for building, but the game runs on newer jres as well
+, jdk8
+, jre
+, ant
+, makeWrapper
+, makeDesktopItem
+, copyDesktopItems
+, nixosTests
+}:
+
+let
+  desktopItem = makeDesktopItem {
+    name = "domination";
+    desktopName = "Domination";
+    exec = "domination";
+    icon = "domination";
+  };
+  editorDesktopItem = makeDesktopItem {
+    name = "domination-map-editor";
+    desktopName = "Domination Map Editor";
+    exec = "domination-map-editor";
+    icon = "domination";
+  };
+
+in stdenv.mkDerivation {
+  pname = "domination";
+  version = "1.2.9";
+
+  # 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 = "2470";
+    hash = "sha256-ghq7EGg++mTOzA3ASzXhk97fzy5/n9vyaRzxp12X3/4=";
+  };
+
+  nativeBuildInputs = [
+    jdk8
+    ant
+    makeWrapper
+    copyDesktopItems
+  ];
+
+  buildPhase = ''
+    runHook preBuild
+    cd swingUI
+    ant
+    runHook postBuild
+  '';
+
+  desktopItems = [
+    desktopItem
+    editorDesktopItem
+  ];
+
+  installPhase = ''
+    runHook preInstall
+    # 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 \
+      --chdir "$out/share/domination" \
+      --add-flags "-jar $out/share/domination/Domination.jar"
+    makeWrapper ${jre}/bin/java $out/bin/domination-map-editor \
+      --chdir "$out/share/domination" \
+      --add-flags "-cp $out/share/domination/Domination.jar net.yura.domination.ui.swinggui.SwingGUIFrame"
+
+    install -Dm644 build/game/resources/icon.png $out/share/pixmaps/domination.png
+    runHook postInstall
+  '';
+
+  passthru.tests = {
+    domination-starts = nixosTests.domination;
+  };
+
+  meta = with lib; {
+    homepage = "https://domination.sourceforge.net/";
+    downloadPage = "https://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.
+    '';
+    sourceProvenance = with sourceTypes; [
+      fromSource
+      binaryBytecode  # source bundles dependencies as jars
+    ];
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ fgaz ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/games/doom-ports/chocolate-doom/default.nix b/nixpkgs/pkgs/games/doom-ports/chocolate-doom/default.nix
new file mode 100644
index 000000000000..30fe2010b022
--- /dev/null
+++ b/nixpkgs/pkgs/games/doom-ports/chocolate-doom/default.nix
@@ -0,0 +1,49 @@
+{ lib, stdenv, autoreconfHook, pkg-config, SDL2, SDL2_mixer, SDL2_net
+, fetchFromGitHub, fetchpatch, python3 }:
+
+stdenv.mkDerivation rec {
+  pname = "chocolate-doom";
+  version = "3.0.1";
+
+  src = fetchFromGitHub {
+    owner = "chocolate-doom";
+    repo = pname;
+    rev = "${pname}-${version}";
+    sha256 = "1zlcqhd49c5n8vaahgaqrc2y10z86xng51sbd82xm3rk2dly25jp";
+  };
+
+  patches = [
+    # Pull upstream patch to fix builx against gcc-10:
+    #   https://github.com/chocolate-doom/chocolate-doom/pull/1257
+    (fetchpatch {
+      name = "fno-common.patch";
+      url = "https://github.com/chocolate-doom/chocolate-doom/commit/a8fd4b1f563d24d4296c3e8225c8404e2724d4c2.patch";
+      sha256 = "1dmbygn952sy5n8qqp0asg11pmygwgygl17lrj7i0fxa0nrhixhj";
+    })
+  ];
+
+  outputs = [ "out" "man" ];
+
+  postPatch = ''
+    sed -e 's#/games#/bin#g' -i src{,/setup}/Makefile.am
+    patchShebangs --build man/{simplecpp,docgen}
+  '';
+
+  nativeBuildInputs = [
+    autoreconfHook
+    pkg-config
+    # for documentation
+    python3
+  ];
+  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 = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.unix;
+    hydraPlatforms = lib.platforms.linux; # darwin times out
+    maintainers = with lib.maintainers; [ MP2E ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/doom-ports/crispy-doom/default.nix b/nixpkgs/pkgs/games/doom-ports/crispy-doom/default.nix
new file mode 100644
index 000000000000..a4a0fc08730d
--- /dev/null
+++ b/nixpkgs/pkgs/games/doom-ports/crispy-doom/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv, autoreconfHook, pkg-config, SDL2, SDL2_mixer, SDL2_net, fetchFromGitHub, python3 }:
+
+stdenv.mkDerivation rec {
+  pname = "crispy-doom";
+  version = "6.0";
+
+  src = fetchFromGitHub {
+    owner = "fabiangreffrath";
+    repo = pname;
+    rev = "${pname}-${version}";
+    sha256 = "sha256-s/TAg0Di8Pkdjhk38c8OanmngjLqA8iEPweVRf1qwQI=";
+  };
+
+  postPatch = ''
+    sed -e 's#/games#/bin#g' -i src{,/setup}/Makefile.am
+    for script in $(grep -lr '^#!/usr/bin/env python3$'); do patchShebangs $script; done
+  '';
+
+  nativeBuildInputs = [ autoreconfHook pkg-config python3 ];
+  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";
+    longDescription = ''
+      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 = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.unix;
+    maintainers = with lib.maintainers; [ neonfuz ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/doom-ports/dhewm3/default.nix b/nixpkgs/pkgs/games/doom-ports/dhewm3/default.nix
new file mode 100644
index 000000000000..20e9f986f0c9
--- /dev/null
+++ b/nixpkgs/pkgs/games/doom-ports/dhewm3/default.nix
@@ -0,0 +1,45 @@
+{ lib, stdenv, fetchFromGitHub, cmake, SDL2, libGLU, libGL, zlib, libjpeg, libogg, libvorbis
+, openal, curl, copyDesktopItems, makeDesktopItem }:
+
+stdenv.mkDerivation rec {
+  pname = "dhewm3";
+  version = "1.5.2";
+
+  src = fetchFromGitHub {
+    owner = "dhewm";
+    repo = "dhewm3";
+    rev = version;
+    sha256 = "sha256-3ONOP/pRp04rxehXxgCCan1fPCqAs2bVDU/R4HPN1xQ=";
+  };
+
+  # Add libGLU libGL linking
+  patchPhase = ''
+    sed -i 's/\<idlib\()\?\)$/idlib GL\1/' neo/CMakeLists.txt
+  '';
+
+  preConfigure = ''
+    cd "$(ls -d dhewm3-*.src)"/neo
+  '';
+
+  nativeBuildInputs = [ cmake copyDesktopItems ];
+  buildInputs = [ SDL2 libGLU libGL zlib libjpeg libogg libvorbis openal curl ];
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "dhewm3";
+      exec = "dhewm3";
+      desktopName = "Doom 3";
+      categories = [ "Game" ];
+    })
+  ];
+
+  hardeningDisable = [ "format" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/dhewm/dhewm3";
+    description = "Doom 3 port to SDL";
+    license = lib.licenses.gpl3;
+    maintainers = with maintainers; [ MP2E ];
+    platforms = with platforms; linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/doom-ports/doomretro/default.nix b/nixpkgs/pkgs/games/doom-ports/doomretro/default.nix
new file mode 100644
index 000000000000..5e6fa7ad9d18
--- /dev/null
+++ b/nixpkgs/pkgs/games/doom-ports/doomretro/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, pkg-config
+, SDL2
+, SDL2_image
+, SDL2_mixer
+, Cocoa
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "doomretro";
+  version = "5.1.3";
+
+  src = fetchFromGitHub {
+    owner = "bradharding";
+    repo = "doomretro";
+    rev = "v${finalAttrs.version}";
+    hash = "sha256-hwjz9nzhasDIeFlmPIwBNhJjrNfZ8ksttx5A7WSomBQ=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+  ];
+
+  buildInputs = [
+    SDL2
+    SDL2_image
+    SDL2_mixer
+  ] ++ lib.optionals stdenv.hostPlatform.isDarwin [
+    Cocoa
+  ];
+
+  meta = {
+    homepage = "https://www.doomretro.com/";
+    description = "A classic, refined DOOM source port";
+    longDescription = ''
+      DOOM Retro is the classic, refined DOOM source port for Windows PC. It
+      represents how I like my DOOM to be today, in all its dark and gritty,
+      unapologetically pixelated glory. I have strived to craft a unique and
+      cohesive set of compelling features, while continuing to uphold my respect
+      for that classic, nostalgic DOOM experience many of us, after all this
+      time, still hold dear.
+
+      DOOM Retro has been under relentless, meticulous development since its
+      debut on December 10, 2013 commemorating DOOM's 20th anniversary, and it
+      has absolutely no intention of stopping. Its source code was originally
+      derived from Chocolate DOOM but is now very much its own beast. It does
+      include the usual, necessary enhancements that you'll find in all those
+      other DOOM source ports out there, but it also has many of its own cool,
+      original ideas that continues to set itself apart.
+
+      DOOM Retro is and always will be intentionally minimalistic in its
+      approach, and does a few things differently. It supports all vanilla,
+      limit removing, BOOM, MBF and MBF21-compatible maps and mods. In order to
+      freely implement certain features, and due to the nature of DOOM demos,
+      DOOM Retro does not support their recording or playback.
+
+      DOOM Retro is singleplayer only. Written in C, and released as free, open
+      source software under version 3 of the GNU General Public License, DOOM
+      Retro's 100,000 or so lines of code are diligently maintained in this
+      public Git repository and regularly compiled into both 32 and 64-bit
+      Windows apps using Microsoft Visual Studio Community 2022. Although next
+      to no support is provided, DOOM Retro's source code may also be compiled
+      and run under Linux and macOS.
+    '';
+    changelog = "https://github.com/bradharding/doomretro/releases/tag/${finalAttrs.src.rev}";
+    license = lib.licenses.gpl3Plus;
+    maintainers = with lib.maintainers; [ AndersonTorres ];
+    platforms = lib.platforms.unix;
+  };
+})
diff --git a/nixpkgs/pkgs/games/doom-ports/doomrunner/default.nix b/nixpkgs/pkgs/games/doom-ports/doomrunner/default.nix
new file mode 100644
index 000000000000..3c1e574ca5b1
--- /dev/null
+++ b/nixpkgs/pkgs/games/doom-ports/doomrunner/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, stdenv
+, qtbase
+, qmake
+, makeDesktopItem
+, wrapQtAppsHook
+, imagemagick
+, fetchFromGitHub
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "doomrunner";
+  version = "1.8.1";
+
+  src = fetchFromGitHub {
+    owner = "Youda008";
+    repo = "DoomRunner";
+    rev = "v${finalAttrs.version}";
+    hash = "sha256-mUtUXDcQXs5zTh9Msb3dXFicIsfbZpE9M8OPqtajDhw=";
+  };
+
+  buildInputs = [ qtbase ];
+  nativeBuildInputs = [ qmake wrapQtAppsHook imagemagick ];
+
+  makeFlags = [
+    "INSTALL_ROOT=${placeholder "out"}"
+  ];
+
+  postInstall = ''
+    mkdir -p $out/{bin,share/applications}
+    install -Dm755 $out/usr/bin/DoomRunner $out/bin/DoomRunner
+
+    for size in 16 24 32 48 64 128; do
+      mkdir -p $out/share/icons/hicolor/"$size"x"$size"/apps
+      convert -background none -resize "$size"x"$size" $PWD/Resources/DoomRunner.ico -flatten $out/share/icons/hicolor/"$size"x"$size"/apps/DoomRunner.png
+    done;
+
+    install -m 444 -D "$desktopItem/share/applications/"* -t $out/share/applications/
+    rm -rf $out/usr
+  '';
+
+  desktopItem = makeDesktopItem {
+    name = "DoomRunner";
+    desktopName = "DoomRunner";
+    comment = "Preset-oriented graphical launcher of ZDoom and derivatives";
+    categories = [ "Game" ];
+    icon = "DoomRunner";
+    type = "Application";
+    exec = "DoomRunner";
+  };
+
+  meta = with lib; {
+    description = "Graphical launcher of ZDoom and derivatives";
+    homepage = "https://github.com/Youda008/DoomRunner/";
+    changelog = "https://github.com/Youda008/DoomRunner/blob/${finalAttrs.src.rev}/changelog.txt";
+    license = licenses.gpl3Only;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ keenanweaver ];
+  };
+})
diff --git a/nixpkgs/pkgs/games/doom-ports/doomseeker/default.nix b/nixpkgs/pkgs/games/doom-ports/doomseeker/default.nix
new file mode 100644
index 000000000000..48ea1a0296cf
--- /dev/null
+++ b/nixpkgs/pkgs/games/doom-ports/doomseeker/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, mkDerivation, cmake, fetchFromBitbucket, pkg-config, qtbase, qttools, qtmultimedia, zlib, bzip2, xxd }:
+
+mkDerivation {
+  pname = "doomseeker";
+  version = "2018-03-05";
+
+  src = fetchFromBitbucket {
+    owner = "Doomseeker";
+    repo = "doomseeker";
+    rev = "c2c7f37b1afb";
+    sha256 = "17fna3a604miqsvply3klnmypps4ifz8axgd3pj96z46ybxs8akw";
+  };
+
+  patches = [ ./fix_paths.patch ./qt_build_fix.patch ];
+
+  nativeBuildInputs = [ cmake qttools pkg-config xxd ];
+  buildInputs = [ qtbase qtmultimedia zlib bzip2 ];
+
+  hardeningDisable = lib.optional stdenv.isDarwin "format";
+
+  meta = with lib; {
+    homepage = "http://doomseeker.drdteam.org/";
+    description = "Multiplayer server browser for many Doom source ports";
+    license = licenses.gpl2;
+    platforms = platforms.unix;
+    maintainers = [ maintainers.MP2E ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/doom-ports/doomseeker/fix_paths.patch b/nixpkgs/pkgs/games/doom-ports/doomseeker/fix_paths.patch
new file mode 100644
index 000000000000..08654c2384cb
--- /dev/null
+++ b/nixpkgs/pkgs/games/doom-ports/doomseeker/fix_paths.patch
@@ -0,0 +1,40 @@
+diff -ru3 source-old/src/core/datapaths.cpp source-new/src/core/datapaths.cpp
+--- source-old/src/core/datapaths.cpp	1970-01-01 03:00:01.000000000 +0300
++++ source-new/src/core/datapaths.cpp	2018-03-04 00:10:25.247262567 +0300
+@@ -335,7 +335,7 @@
+ 	paths.append(workingDirectory());
+ 	paths.append("./");
+ #ifndef Q_OS_WIN32
+-	paths.append(INSTALL_PREFIX "/" INSTALL_LIBDIR "/doomseeker/");
++	paths.append(INSTALL_PREFIX "/lib/doomseeker/");
+ #endif
+ 	paths = uniquePaths(paths);
+ 	return Strings::combineManyPaths(paths, "engines/");
+diff -ru3 source-old/src/core/pathfinder/pathfinder.cpp source-new/src/core/pathfinder/pathfinder.cpp
+--- source-old/src/core/pathfinder/pathfinder.cpp	1970-01-01 03:00:01.000000000 +0300
++++ source-new/src/core/pathfinder/pathfinder.cpp	2018-03-04 00:09:34.862556976 +0300
+@@ -128,9 +128,7 @@
+ 		<< DataPaths::programFilesDirectory(DataPaths::x64)
+ 		<< DataPaths::programFilesDirectory(DataPaths::x86);
+ #else
+-	paths << "/usr/bin" << "/usr/local/bin" << "/usr/share/bin"
+-		<< "/usr/games/" << "/usr/local/games/"
+-		<< "/usr/share/games/" << gDefaultDataPaths->workingDirectory() << ".";
++	paths << gDefaultDataPaths->workingDirectory() << ".";
+ #endif
+ 	QStringList pathsCopy(paths);
+ 	foreach (const QString &path, pathsCopy)
+diff -ru3 source-old/src/core/pathfinder/wadpathfinder.cpp source-new/src/core/pathfinder/wadpathfinder.cpp
+--- source-old/src/core/pathfinder/wadpathfinder.cpp	1970-01-01 03:00:01.000000000 +0300
++++ source-new/src/core/pathfinder/wadpathfinder.cpp	2018-03-04 00:09:56.822865339 +0300
+@@ -84,10 +84,6 @@
+ 		QStringList defaultPaths()

+ 		{

+ 			QStringList paths;

+-			#ifdef Q_OS_UNIX

+-			paths << "/usr/local/share/games/doom/"

+-				<< "/usr/share/games/doom/";

+-			#endif

+ 			return paths;

+ 		}

+ };

diff --git a/nixpkgs/pkgs/games/doom-ports/doomseeker/qt_build_fix.patch b/nixpkgs/pkgs/games/doom-ports/doomseeker/qt_build_fix.patch
new file mode 100644
index 000000000000..e21b53b3cc53
--- /dev/null
+++ b/nixpkgs/pkgs/games/doom-ports/doomseeker/qt_build_fix.patch
@@ -0,0 +1,47 @@
+diff -r c2c7f37b1afb src/core/gui/irc/ircdock.cpp
+--- a/src/core/gui/irc/ircdock.cpp	Tue Mar 06 00:14:23 2018 +0100
++++ b/src/core/gui/irc/ircdock.cpp	Sat Jul 28 16:53:04 2018 -0700
+@@ -32,6 +32,7 @@
+ #include <QInputDialog>
+ #include <QMessageBox>
+ #include <QToolBar>
++#include <QTabBar>
+ 
+ DClass<IRCDock> : public Ui::IRCDock
+ {
+diff -r c2c7f37b1afb src/core/gui/logdock.cpp
+--- a/src/core/gui/logdock.cpp	Tue Mar 06 00:14:23 2018 +0100
++++ b/src/core/gui/logdock.cpp	Sat Jul 28 16:53:04 2018 -0700
+@@ -21,6 +21,8 @@
+ // Copyright (C) 2009 "Zalewa" <zalewapl@gmail.com>
+ //------------------------------------------------------------------------------
+ 
++#include <QAction>
++
+ #include "clipboard.h"
+ #include "logdock.h"
+ #include "log.h"
+diff -r c2c7f37b1afb src/core/gui/serverdetailsdock.cpp
+--- a/src/core/gui/serverdetailsdock.cpp	Tue Mar 06 00:14:23 2018 +0100
++++ b/src/core/gui/serverdetailsdock.cpp	Sat Jul 28 16:53:04 2018 -0700
+@@ -21,6 +21,7 @@
+ // Copyright (C) 2014 Braden "Blzut3" Obrzut <admin@maniacsvault.net>
+ //------------------------------------------------------------------------------
+ 
++#include <QAction>
+ #include <QBoxLayout>
+ 
+ #include "serverdetailsdock.h"
+diff -r c2c7f37b1afb src/core/gui/serverfilterdock.cpp
+--- a/src/core/gui/serverfilterdock.cpp	Tue Mar 06 00:14:23 2018 +0100
++++ b/src/core/gui/serverfilterdock.cpp	Sat Jul 28 16:53:04 2018 -0700
+@@ -20,6 +20,9 @@
+ //------------------------------------------------------------------------------
+ // Copyright (C) 2011 "Zalewa" <zalewapl@gmail.com>
+ //------------------------------------------------------------------------------
++
++#include <QAction>
++
+ #include "serverfilterdock.h"
+ #include "ui_serverfilterdock.h"
+ 
diff --git a/nixpkgs/pkgs/games/doom-ports/enyo-launcher/default.nix b/nixpkgs/pkgs/games/doom-ports/enyo-launcher/default.nix
new file mode 100644
index 000000000000..8bc782bb36a8
--- /dev/null
+++ b/nixpkgs/pkgs/games/doom-ports/enyo-launcher/default.nix
@@ -0,0 +1,25 @@
+{ mkDerivation, lib, fetchFromGitLab, cmake, qtbase }:
+
+mkDerivation rec {
+  pname = "enyo-launcher";
+  version = "2.0.6";
+
+  src = fetchFromGitLab {
+    owner = "sdcofer70";
+    repo = "enyo-launcher";
+    rev = version;
+    sha256 = "sha256-k6Stc1tQOcdS//j+bFUNfnOUlwuhIPKxf9DHU+ng164=";
+  };
+
+  nativeBuildInputs = [ cmake ];
+
+  buildInputs = [ qtbase ];
+
+  meta = {
+    homepage = "https://gitlab.com/sdcofer70/enyo-launcher";
+    description = "Frontend for Doom engines";
+    license = lib.licenses.gpl3Plus;
+    platforms = lib.platforms.unix;
+    maintainers = [ lib.maintainers.usrfriendly ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/doom-ports/eternity-engine/default.nix b/nixpkgs/pkgs/games/doom-ports/eternity-engine/default.nix
new file mode 100644
index 000000000000..cdff7fab1e12
--- /dev/null
+++ b/nixpkgs/pkgs/games/doom-ports/eternity-engine/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, cmake, libGL, SDL2, SDL2_mixer, SDL2_net, fetchFromGitHub, makeWrapper }:
+
+stdenv.mkDerivation rec {
+  pname = "eternity-engine";
+  version = "4.02.00";
+  src = fetchFromGitHub {
+    owner = "team-eternity";
+    repo = "eternity";
+    rev = version;
+    sha256 = "0dlz7axbiw003bgwk2hl43w8r2bwnxhi042i1xwdiwaja0cpnf5y";
+    fetchSubmodules = true;
+  };
+
+  nativeBuildInputs = [ cmake makeWrapper ];
+  buildInputs = [ libGL SDL2 SDL2_mixer SDL2_net ];
+
+  installPhase = ''
+    install -Dm755 eternity/eternity $out/lib/eternity/eternity
+    cp -r $src/base $out/lib/eternity/base
+    mkdir $out/bin
+    makeWrapper $out/lib/eternity/eternity $out/bin/eternity
+  '';
+
+  meta = {
+    homepage = "https://doomworld.com/eternity";
+    description = "New school Doom port by James Haley";
+    license = lib.licenses.gpl3;
+    platforms = lib.platforms.linux;
+    maintainers = with lib.maintainers; [ MP2E ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/doom-ports/eureka-editor/default.nix b/nixpkgs/pkgs/games/doom-ports/eureka-editor/default.nix
new file mode 100644
index 000000000000..6beae458d293
--- /dev/null
+++ b/nixpkgs/pkgs/games/doom-ports/eureka-editor/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv, fetchzip, fltk, zlib, xdg-utils, xorg, libjpeg, libGLU }:
+
+stdenv.mkDerivation rec {
+  pname = "eureka-editor";
+  version = "1.27b";
+
+  src = fetchzip {
+    url = "mirror://sourceforge/eureka-editor/Eureka/${lib.versions.majorMinor version}/eureka-${version}-source.tar.gz";
+    sha256 = "075w7xxsgbgh6dhndc1pfxb2h1s5fhsw28yl1c025gmx9bb4v3bf";
+  };
+
+  buildInputs = [ fltk zlib xdg-utils libjpeg xorg.libXinerama libGLU ];
+
+  enableParallelBuilding = true;
+
+  postPatch = ''
+    substituteInPlace src/main.cc --replace /usr/local $out
+    substituteInPlace Makefile    --replace /usr/local $out
+  '';
+
+  preInstall = ''
+    mkdir -p $out/bin $out/share/applications $out/share/icons $out/man/man6
+    cp misc/eureka.desktop $out/share/applications
+    cp misc/eureka.ico $out/share/icons
+    cp misc/eureka.6 $out/man/man6
+  '';
+
+  meta = with lib; {
+    homepage = "https://eureka-editor.sourceforge.net";
+    description = "A map editor for the classic DOOM games, and a few related games such as Heretic and Hexen";
+    license = licenses.gpl2Plus;
+    platforms = platforms.all;
+    badPlatforms = platforms.darwin;
+    maintainers = with maintainers; [ neonfuz ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/doom-ports/gzdoom/default.nix b/nixpkgs/pkgs/games/doom-ports/gzdoom/default.nix
new file mode 100644
index 000000000000..768a4936d821
--- /dev/null
+++ b/nixpkgs/pkgs/games/doom-ports/gzdoom/default.nix
@@ -0,0 +1,114 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, makeWrapper
+, makeDesktopItem
+, copyDesktopItems
+, SDL2
+, bzip2
+, cmake
+, fluidsynth
+, game-music-emu
+, gtk3
+, imagemagick
+, libGL
+, libjpeg
+, libsndfile
+, libvpx
+, libwebp
+, mpg123
+, ninja
+, openal
+, pkg-config
+, vulkan-loader
+, zlib
+, zmusic
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gzdoom";
+  version = "4.11.3";
+
+  src = fetchFromGitHub {
+    owner = "ZDoom";
+    repo = "gzdoom";
+    rev = "g${version}";
+    fetchSubmodules = true;
+    hash = "sha256-pY+5R3W/9pJGiBoDFkxxpuP0I2ZLb+Q/s5UYU20G748=";
+  };
+
+  outputs = [ "out" "doc" ];
+
+  nativeBuildInputs = [
+    cmake
+    copyDesktopItems
+    imagemagick
+    makeWrapper
+    ninja
+    pkg-config
+  ];
+
+  buildInputs = [
+    SDL2
+    bzip2
+    fluidsynth
+    game-music-emu
+    gtk3
+    libGL
+    libjpeg
+    libsndfile
+    libvpx
+    libwebp
+    mpg123
+    openal
+    vulkan-loader
+    zlib
+    zmusic
+  ];
+
+  postPatch = ''
+    substituteInPlace tools/updaterevision/UpdateRevision.cmake \
+      --replace "ret_var(Tag)" "ret_var(\"${src.rev}\")" \
+      --replace "ret_var(Timestamp)" "ret_var(\"1970-00-00 00:00:00 +0000\")" \
+      --replace "ret_var(Hash)" "ret_var(\"${src.rev}\")"
+  '';
+
+  cmakeFlags = [
+    "-DDYN_GTK=OFF"
+    "-DDYN_OPENAL=OFF"
+  ];
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "gzdoom";
+      exec = "gzdoom";
+      desktopName = "GZDoom";
+      comment = meta.description;
+      icon = "gzdoom";
+      categories = [ "Game" ];
+    })
+  ];
+
+  postInstall = ''
+    mv $out/bin/gzdoom $out/share/games/doom/gzdoom
+    makeWrapper $out/share/games/doom/gzdoom $out/bin/gzdoom
+
+    for size in 16 24 32 48 64 128; do
+      mkdir -p $out/share/icons/hicolor/"$size"x"$size"/apps
+      convert -background none -resize "$size"x"$size" $src/src/win32/icon1.ico -flatten \
+        $out/share/icons/hicolor/"$size"x"$size"/apps/gzdoom.png
+    done;
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/ZDoom/gzdoom";
+    description = "Modder-friendly OpenGL and Vulkan source port based on the DOOM engine";
+    longDescription = ''
+      GZDoom is a feature centric port for all DOOM engine games, based on
+      ZDoom, adding an OpenGL renderer and powerful scripting capabilities.
+    '';
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ azahi lassulus ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/doom-ports/odamex/default.nix b/nixpkgs/pkgs/games/doom-ports/odamex/default.nix
new file mode 100644
index 000000000000..5fc1b57be5dc
--- /dev/null
+++ b/nixpkgs/pkgs/games/doom-ports/odamex/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, stdenv
+, fetchurl
+, cmake
+, pkg-config
+, makeWrapper
+, SDL
+, SDL_mixer
+, SDL_net
+, wxGTK32
+}:
+
+stdenv.mkDerivation rec {
+  pname = "odamex";
+  version = "0.9.5";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/${pname}/${pname}-src-${version}.tar.bz2";
+    sha256 = "sha256-WBqO5fWzemw1kYlY192v0nnZkbIEVuWmjWYMy+1ODPQ=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+    makeWrapper
+  ];
+
+  buildInputs = [
+    SDL
+    SDL_mixer
+    SDL_net
+    wxGTK32
+  ];
+
+  installPhase = ''
+    runHook preInstall
+  '' + (if stdenv.isDarwin then ''
+    mkdir -p $out/{Applications,bin}
+    mv odalaunch/odalaunch.app $out/Applications
+    makeWrapper $out/{Applications/odalaunch.app/Contents/MacOS,bin}/odalaunch
+  '' else ''
+    make install
+  '') + ''
+    runHook postInstall
+  '';
+
+  meta = {
+    homepage = "http://odamex.net/";
+    description = "A client/server port for playing old-school Doom online";
+    license = lib.licenses.gpl2Only;
+    platforms = lib.platforms.unix;
+    maintainers = with lib.maintainers; [ MP2E ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/doom-ports/prboom-plus/default.nix b/nixpkgs/pkgs/games/doom-ports/prboom-plus/default.nix
new file mode 100644
index 000000000000..2d9be1073fa3
--- /dev/null
+++ b/nixpkgs/pkgs/games/doom-ports/prboom-plus/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, SDL2
+, SDL2_mixer
+, SDL2_image
+, SDL2_net
+, fluidsynth
+, soundfont-fluid
+, portmidi
+, dumb
+, libvorbis
+, libmad
+, pcre
+}:
+
+stdenv.mkDerivation rec {
+  pname = "prboom-plus";
+  version = "2.6.66";
+
+  src = fetchFromGitHub {
+    owner = "coelckers";
+    repo = "prboom-plus";
+    rev = "v${version}";
+    sha256 = "sha256-moU/bZ2mS1QfKPP6HaAwWP1nRNZ4Ue5DFl9zBBrJiHw=";
+  };
+
+  sourceRoot = "${src.name}/prboom2";
+
+  nativeBuildInputs = [
+    cmake
+  ];
+
+  buildInputs = [
+    SDL2
+    SDL2_mixer
+    SDL2_image
+    SDL2_net
+    fluidsynth
+    portmidi
+    dumb
+    libvorbis
+    libmad
+    pcre
+  ];
+
+  # Fixes impure path to soundfont
+  prePatch = ''
+    substituteInPlace src/m_misc.c --replace \
+      "/usr/share/sounds/sf3/default-GM.sf3" \
+      "${soundfont-fluid}/share/soundfonts/FluidR3_GM2-2.sf2"
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/coelckers/prboom-plus";
+    description = "An advanced, Vanilla-compatible Doom engine based on PrBoom";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.ashley ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/doom-ports/rbdoom-3-bfg/default.nix b/nixpkgs/pkgs/games/doom-ports/rbdoom-3-bfg/default.nix
new file mode 100644
index 000000000000..7ec57b715138
--- /dev/null
+++ b/nixpkgs/pkgs/games/doom-ports/rbdoom-3-bfg/default.nix
@@ -0,0 +1,88 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, fetchpatch
+, cmake
+, directx-shader-compiler
+, libGLU
+, libpng
+, libjpeg_turbo
+, openal
+, rapidjson
+, SDL2
+, vulkan-headers
+, vulkan-loader
+, zlib
+}:
+
+stdenv.mkDerivation rec {
+  pname = "rbdoom-3-bfg";
+  version = "1.5.1";
+
+  src = fetchFromGitHub {
+    owner = "RobertBeckebans";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-bjjeTdbQDWTibSrIWhCnr6F0Ef17efLgWGQAAwezjUw=";
+    fetchSubmodules = true;
+  };
+
+  patches = fetchpatch {
+    name = "replace-HLSL-ternary-operators.patch";
+    url = "https://github.com/RobertBeckebans/RBDOOM-3-BFG/commit/feffa4a4dd9a2a5f3c608f720cde41bea37797d3.patch";
+    hash = "sha256-aR1eoWZL3+ps7P7yFXFvGsMFxpUSBDiyBsja/ISin4I=";
+  };
+
+  postPatch = ''
+    substituteInPlace neo/extern/nvrhi/tools/shaderCompiler/CMakeLists.txt \
+      --replace "AppleClang" "Clang"
+  '';
+
+  nativeBuildInputs = [
+    cmake
+    directx-shader-compiler
+  ];
+
+  buildInputs = [
+    libGLU
+    libpng
+    libjpeg_turbo
+    openal
+    rapidjson
+    SDL2
+    vulkan-headers
+    vulkan-loader
+    zlib
+  ];
+
+  cmakeDir = "../neo";
+  cmakeFlags = [
+    "-DFFMPEG=OFF"
+    "-DBINKDEC=ON"
+    "-DUSE_SYSTEM_LIBGLEW=ON"
+    "-DUSE_SYSTEM_LIBPNG=ON"
+    "-DUSE_SYSTEM_LIBJPEG=ON"
+    "-DUSE_SYSTEM_RAPIDJSON=ON"
+    "-DUSE_SYSTEM_ZLIB=ON"
+  ];
+
+  # it caused build failure
+  hardeningDisable = [ "fortify3" ];
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/bin
+    install RBDoom3BFG $out/bin/RBDoom3BFG
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/RobertBeckebans/RBDOOM-3-BFG";
+    description = "Doom 3 BFG Edition with modern engine features";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ Zaechus ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/games/doom-ports/slade/default.nix b/nixpkgs/pkgs/games/doom-ports/slade/default.nix
new file mode 100644
index 000000000000..9e9fc837e820
--- /dev/null
+++ b/nixpkgs/pkgs/games/doom-ports/slade/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, pkg-config
+, which
+, zip
+, wxGTK
+, gtk3
+, sfml
+, fluidsynth
+, curl
+, freeimage
+, ftgl
+, glew
+, lua
+, mpg123
+}:
+
+stdenv.mkDerivation rec {
+  pname = "slade";
+  version = "3.2.4";
+
+  src = fetchFromGitHub {
+    owner = "sirjuddington";
+    repo = "SLADE";
+    rev = version;
+    sha256 = "sha256-CN01w+sXXRqvQqu1whePAb+phVx+VM8tL2NusfnCyF8=";
+  };
+
+  postPatch = lib.optionalString (!stdenv.hostPlatform.isx86) ''
+    sed -i '/-msse/d' src/CMakeLists.txt
+  '';
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+    which
+    zip
+  ];
+
+  buildInputs = [
+    wxGTK
+    gtk3
+    sfml
+    fluidsynth
+    curl
+    freeimage
+    ftgl
+    glew
+    lua
+    mpg123
+  ];
+
+  cmakeFlags = [
+    "-DwxWidgets_LIBRARIES=${wxGTK}/lib"
+  ];
+
+  env.NIX_CFLAGS_COMPILE = "-Wno-narrowing";
+
+  meta = with lib; {
+    description = "Doom editor";
+    homepage = "http://slade.mancubus.net/";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/doom-ports/slade/git.nix b/nixpkgs/pkgs/games/doom-ports/slade/git.nix
new file mode 100644
index 000000000000..7ecc5d5d1b6a
--- /dev/null
+++ b/nixpkgs/pkgs/games/doom-ports/slade/git.nix
@@ -0,0 +1,73 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, pkg-config
+, which
+, zip
+, wxGTK
+, gtk3
+, sfml
+, fluidsynth
+, curl
+, freeimage
+, ftgl
+, glew
+, lua
+, mpg123
+, unstableGitUpdater
+}:
+
+stdenv.mkDerivation rec {
+  pname = "slade";
+  version = "unstable-2023-09-30";
+
+  src = fetchFromGitHub {
+    owner = "sirjuddington";
+    repo = "SLADE";
+    rev = "d05af4bd3a9a655dfe17d02760bab3542cc0b909";
+    sha256 = "sha256-lzTSE0WH+4fOad9E/pL3LDc4L151W0hFEmD0zsS0gpQ=";
+  };
+
+  postPatch = lib.optionalString (!stdenv.hostPlatform.isx86) ''
+    sed -i '/-msse/d' src/CMakeLists.txt
+  '';
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+    which
+    zip
+  ];
+
+  buildInputs = [
+    wxGTK
+    gtk3
+    sfml
+    fluidsynth
+    curl
+    freeimage
+    ftgl
+    glew
+    lua
+    mpg123
+  ];
+
+  cmakeFlags = [
+    "-DwxWidgets_LIBRARIES=${wxGTK}/lib"
+  ];
+
+  env.NIX_CFLAGS_COMPILE = "-Wno-narrowing";
+
+  passthru.updateScript = unstableGitUpdater {
+    url = "https://github.com/sirjuddington/SLADE.git";
+  };
+
+  meta = with lib; {
+    description = "Doom editor";
+    homepage = "http://slade.mancubus.net/";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ ertes ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/doom-ports/zandronum/add_gitinfo.patch b/nixpkgs/pkgs/games/doom-ports/zandronum/add_gitinfo.patch
new file mode 100644
index 000000000000..33f51ecb125d
--- /dev/null
+++ b/nixpkgs/pkgs/games/doom-ports/zandronum/add_gitinfo.patch
@@ -0,0 +1,15 @@
+diff -r 4178904d7698 src/gitinfo.h
+--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
++++ b/src/gitinfo.h	Fri Dec 01 13:02:42 2023 -0300
+@@ -0,0 +1,11 @@
++// 4178904d769879e6c2919fb647ee6dd2736399e9
++//
++// This file was automatically generated by the
++// updaterevision tool. Do not edit by hand.
++
++#define GIT_DESCRIPTION "ZA_3.0.1-572-4178904d7698"
++#define GIT_HASH "4178904d769879e6c2919fb647ee6dd2736399e9"
++#define GIT_TIME "2021-12-11 16:35:55 -0500"
++#define HG_REVISION_NUMBER 1639258555
++#define HG_REVISION_HASH_STRING "4178904d7698"
++#define HG_TIME "211211-2135"
diff --git a/nixpkgs/pkgs/games/doom-ports/zandronum/default.nix b/nixpkgs/pkgs/games/doom-ports/zandronum/default.nix
new file mode 100644
index 000000000000..0006ea3c7ce5
--- /dev/null
+++ b/nixpkgs/pkgs/games/doom-ports/zandronum/default.nix
@@ -0,0 +1,103 @@
+{ stdenv
+, lib
+, fetchhg
+, cmake
+, pkg-config
+, makeWrapper
+, callPackage
+, soundfont-fluid
+, SDL_compat
+, libGL
+, glew
+, bzip2
+, zlib
+, libjpeg
+, fluidsynth
+, fmodex
+, openssl
+, gtk2
+, python3
+, game-music-emu
+, serverOnly ? false
+}:
+
+let
+  suffix = lib.optionalString serverOnly "-server";
+  fmod = fmodex; # fmodex is on nixpkgs now
+  sqlite = callPackage ./sqlite.nix { };
+  clientLibPath = lib.makeLibraryPath [ fluidsynth ];
+
+in
+stdenv.mkDerivation rec {
+  pname = "zandronum${suffix}";
+  version = "3.1.0";
+
+  src = fetchhg {
+    # expired ssl certificate
+    url = "http://hg.osdn.net/view/zandronum/zandronum-stable";
+    rev = "4178904d7698";
+    hash = "sha256-5t36CoRPPjDKQE0DVSv2Qqpqko6JAXBI53tuAYiylHQ=";
+  };
+
+  # zandronum tries to download sqlite now when running cmake, don't let it
+  # it also needs the current mercurial revision info embedded in gitinfo.h
+  # otherwise, the client will fail to connect to servers because the
+  # protocol version doesn't match.
+  patches = [ ./zan_configure_impurity.patch ./dont_update_gitinfo.patch ./add_gitinfo.patch ];
+
+  # I have no idea why would SDL and libjpeg be needed for the server part!
+  # But they are.
+  buildInputs = [ openssl bzip2 zlib SDL_compat libjpeg sqlite game-music-emu ]
+    ++ lib.optionals (!serverOnly) [ libGL glew fmod fluidsynth gtk2 ];
+
+  nativeBuildInputs = [ cmake pkg-config makeWrapper python3 ];
+
+  preConfigure = ''
+    ln -s ${sqlite}/* sqlite/
+    sed -ie 's| restrict| _restrict|g' dumb/include/dumb.h \
+                                       dumb/src/it/*.c
+  '' + lib.optionalString (!serverOnly) ''
+    sed -i \
+      -e "s@/usr/share/sounds/sf2/@${soundfont-fluid}/share/soundfonts/@g" \
+      -e "s@FluidR3_GM.sf2@FluidR3_GM2-2.sf2@g" \
+      src/sound/music_fluidsynth_mididevice.cpp
+  '';
+
+  cmakeFlags =
+    [ "-DFORCE_INTERNAL_GME=OFF" ]
+    ++ (if serverOnly
+    then [ "-DSERVERONLY=ON" ]
+    else [ "-DFMOD_LIBRARY=${fmod}/lib/libfmodex.so" ]);
+
+  hardeningDisable = [ "format" ];
+
+  # Won't work well without C or en_US. Setting LANG might not be enough if the user is making use of LC_* so wrap with LC_ALL instead
+  installPhase = ''
+    mkdir -p $out/bin
+    mkdir -p $out/lib/zandronum
+    cp zandronum${suffix} \
+       *.pk3 \
+       ${lib.optionalString (!serverOnly) "liboutput_sdl.so"} \
+       $out/lib/zandronum
+    makeWrapper $out/lib/zandronum/zandronum${suffix} $out/bin/zandronum${suffix}
+    wrapProgram $out/bin/zandronum${suffix} \
+      --set LC_ALL="C"
+  '';
+
+  postFixup = lib.optionalString (!serverOnly) ''
+    patchelf --set-rpath $(patchelf --print-rpath $out/lib/zandronum/zandronum):$out/lib/zandronum:${clientLibPath} \
+      $out/lib/zandronum/zandronum
+  '';
+
+  passthru = {
+    inherit fmod sqlite;
+  };
+
+  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 ];
+    license = licenses.sleepycat;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/doom-ports/zandronum/dont_update_gitinfo.patch b/nixpkgs/pkgs/games/doom-ports/zandronum/dont_update_gitinfo.patch
new file mode 100644
index 000000000000..d1cf831819c3
--- /dev/null
+++ b/nixpkgs/pkgs/games/doom-ports/zandronum/dont_update_gitinfo.patch
@@ -0,0 +1,19 @@
+diff -r 4178904d7698 src/CMakeLists.txt
+--- a/src/CMakeLists.txt	Sat Dec 11 16:35:55 2021 -0500
++++ b/src/CMakeLists.txt	Fri Dec 01 13:00:32 2023 -0300
+@@ -642,15 +642,6 @@
+ 	add_definitions( -DBACKPATCH )
+ endif( BACKPATCH )
+ 
+-# Update gitinfo.h
+-
+-get_target_property( UPDATEREVISION_EXE updaterevision LOCATION )
+-
+-add_custom_target( revision_check ALL
+-	COMMAND ${UPDATEREVISION_EXE} src/gitinfo.h
+-	WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+-	DEPENDS updaterevision )
+-
+ # Libraries ZDoom needs
+ 
+ message( STATUS "Fluid synth libs: ${FLUIDSYNTH_LIBRARIES}" )
diff --git a/nixpkgs/pkgs/games/doom-ports/zandronum/fmod.nix b/nixpkgs/pkgs/games/doom-ports/zandronum/fmod.nix
new file mode 100644
index 000000000000..59075d69c753
--- /dev/null
+++ b/nixpkgs/pkgs/games/doom-ports/zandronum/fmod.nix
@@ -0,0 +1,45 @@
+{ stdenv, lib, fetchurl, alsa-lib, libpulseaudio, undmg }:
+
+let
+  bits = lib.optionalString (stdenv.hostPlatform.system == "x86_64-linux") "64";
+  libPath = lib.makeLibraryPath [ stdenv.cc.cc alsa-lib libpulseaudio ];
+
+in
+stdenv.mkDerivation rec {
+  pname = "fmod";
+  version = "4.44.64";
+  shortVersion = builtins.replaceStrings [ "." ] [ "" ] version;
+
+  src = fetchurl (if stdenv.isLinux then {
+    url = "https://zdoom.org/files/fmod/fmodapi${shortVersion}linux.tar.gz";
+    sha256 = "047hk92xapwwqj281f4zwl0ih821rrliya70gfj82sdfjh9lz8i1";
+  } else {
+    url = "https://zdoom.org/files/fmod/fmodapi${shortVersion}mac-installer.dmg";
+    sha256 = "1m1y4cpcwpkl8x31d3s68xzp107f343ma09w2437i2adn5y7m8ii";
+  });
+
+  nativeBuildInputs = [ undmg ];
+
+  dontStrip = true;
+  dontPatchELF = true;
+  dontBuild = true;
+
+  installPhase = lib.optionalString stdenv.isLinux ''
+    install -Dm755 api/lib/libfmodex${bits}-${version}.so $out/lib/libfmodex-${version}.so
+    ln -s libfmodex-${version}.so $out/lib/libfmodex.so
+    patchelf --set-rpath ${libPath} $out/lib/libfmodex.so
+  '' + lib.optionalString stdenv.isDarwin ''
+    install -D api/lib/libfmodex.dylib $out/lib/libfmodex.dylib
+    install -D api/lib/libfmodexL.dylib $out/lib/libfmodexL.dylib
+  '' + ''
+    cp -r api/inc $out/include
+  '';
+
+  meta = with lib; {
+    description = "Programming library and toolkit for the creation and playback of interactive audio";
+    homepage    = "http://www.fmod.org/";
+    license     = licenses.unfreeRedistributable;
+    platforms   = [ "x86_64-linux" "i686-linux" "x86_64-darwin" ];
+    maintainers = [ maintainers.lassulus ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/doom-ports/zandronum/sqlite.nix b/nixpkgs/pkgs/games/doom-ports/zandronum/sqlite.nix
new file mode 100644
index 000000000000..67dbb84f515a
--- /dev/null
+++ b/nixpkgs/pkgs/games/doom-ports/zandronum/sqlite.nix
@@ -0,0 +1,28 @@
+{ lib
+, stdenv
+, fetchurl
+}:
+
+stdenv.mkDerivation {
+  pname = "sqlite-zandronum";
+  version = "3.0";
+
+  src = fetchurl {
+    url = "https://www.sqlite.org/2021/sqlite-autoconf-3360000.tar.gz";
+    sha256 = "1qxwkfvd185dfcqbakrzikrsw6ffr5jp1gl3dch9dsdyjvmw745x";
+  };
+
+  buildPhase = ''
+    mkdir -p $out
+    cp sqlite3.c $out/
+    cp sqlite3.h $out/
+    cp sqlite3ext.h $out/
+  '';
+
+  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 = lib.platforms.unix;
+    maintainers = [ lib.maintainers.lassulus ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/doom-ports/zandronum/zan_configure_impurity.patch b/nixpkgs/pkgs/games/doom-ports/zandronum/zan_configure_impurity.patch
new file mode 100644
index 000000000000..9dafc6219d29
--- /dev/null
+++ b/nixpkgs/pkgs/games/doom-ports/zandronum/zan_configure_impurity.patch
@@ -0,0 +1,69 @@
+diff -r 4178904d7698 sqlite/CMakeLists.txt
+--- a/sqlite/CMakeLists.txt	Sat Dec 11 16:35:55 2021 -0500
++++ b/sqlite/CMakeLists.txt	Fri Dec 01 12:57:55 2023 -0300
+@@ -1,65 +1,5 @@
+ cmake_minimum_required( VERSION 2.4 )
+ 
+-# [BB/EP] Download SQLite archive and extract the sources if necessary.
+-set( ZAN_SQLITE_VERSION 3360000 ) # SQL version 3.36.0
+-set( ZAN_SQLITE_YEAR 2021 )
+-set( ZAN_SQLITE_SHA1 "a4bcf9e951bfb9745214241ba08476299fc2dc1e" )
+-set( ZAN_SQLITE_DOWNLOAD_NAME "sqlite-autoconf-${ZAN_SQLITE_VERSION}" )
+-set( ZAN_SQLITE_TEMP_ARCHIVE "${CMAKE_CURRENT_SOURCE_DIR}/${ZAN_SQLITE_DOWNLOAD_NAME}.tar.gz" )
+-set( ZAN_SQLITE_HASHED_ARCHIVE "${CMAKE_CURRENT_SOURCE_DIR}/sqlite-${ZAN_SQLITE_SHA1}.tar.gz" )
+-
+-if( IS_DIRECTORY ${ZAN_SQLITE_HASHED_ARCHIVE} OR IS_SYMLINK ${ZAN_SQLITE_HASHED_ARCHIVE} )
+-	message( FATAL_ERROR "SQLite: ${ZAN_SQLITE_HASHED_ARCHIVE} must be a valid file.\n"
+-				"SQLite: Please remove it and try again." )
+-elseif( ( NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/sqlite3.c ) OR ( NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/sqlite3.h ) OR ( NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/sqlite3ext.h ) )
+-
+-	if( NOT EXISTS ${ZAN_SQLITE_HASHED_ARCHIVE} )
+-		if( IS_DIRECTORY ${ZAN_SQLITE_TEMP_ARCHIVE} OR IS_SYMLINK ${ZAN_SQLITE_TEMP_ARCHIVE} )
+-			message( FATAL_ERROR "SQLite: ${ZAN_SQLITE_TEMP_ARCHIVE} must be a valid file.\n"
+-					"SQLite: Please remove it and try again." )
+-		endif()
+-
+-		message( STATUS "SQLite: downloading the archive..." )
+-
+-		file( DOWNLOAD https://www.sqlite.org/${ZAN_SQLITE_YEAR}/${ZAN_SQLITE_DOWNLOAD_NAME}.tar.gz ${ZAN_SQLITE_TEMP_ARCHIVE}
+-				SHOW_PROGRESS
+-				STATUS ZAN_SQLITE_DOWNLOAD_STATUS )
+-
+-		# Report any problem if present and abort immediately.
+-		list( GET ZAN_SQLITE_DOWNLOAD_STATUS 0 ZAN_SQLITE_DOWNLOAD_ERROR_CODE )
+-		if( ZAN_SQLITE_DOWNLOAD_ERROR_CODE )
+-			list( GET ZAN_SQLITE_DOWNLOAD_STATUS 1 ZAN_SQLITE_DOWNLOAD_ERROR_MESSAGE )
+-			message( FATAL_ERROR "SQLite: download failed. Reason: ${ZAN_SQLITE_DOWNLOAD_ERROR_MESSAGE}" )
+-		endif()
+-
+-		# Check the hash. Abort immediately if it's not valid (something is wrong with the download)
+-		file( SHA1 ${ZAN_SQLITE_TEMP_ARCHIVE} ZAN_SQLITE_CURRENT_SHA1 )
+-		if( NOT ZAN_SQLITE_CURRENT_SHA1 STREQUAL ZAN_SQLITE_SHA1 )
+-			message( FATAL_ERROR "SQLite: download failed. The downloaded file has a different hash:\n"
+-						"SQLite:    valid:      ${ZAN_SQLITE_SHA1}\n"
+-						"SQLite:    downloaded: ${ZAN_SQLITE_CURRENT_SHA1}" )
+-		endif()
+-
+-		# Rename the archive.
+-		execute_process( COMMAND ${CMAKE_COMMAND} -E rename ${ZAN_SQLITE_TEMP_ARCHIVE} ${ZAN_SQLITE_HASHED_ARCHIVE} )
+-	endif()
+-
+-	message( STATUS "SQLite: saving the source files into the 'sqlite' directory." )
+-
+-	# Extract the archive.
+-	execute_process( COMMAND ${CMAKE_COMMAND} -E tar xzf ${ZAN_SQLITE_HASHED_ARCHIVE} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} )
+-
+-	# Copy the required files.
+-	execute_process( COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${ZAN_SQLITE_DOWNLOAD_NAME}/sqlite3.c ${CMAKE_CURRENT_SOURCE_DIR} )
+-	execute_process( COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${ZAN_SQLITE_DOWNLOAD_NAME}/sqlite3.h ${CMAKE_CURRENT_SOURCE_DIR} )
+-	execute_process( COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${ZAN_SQLITE_DOWNLOAD_NAME}/sqlite3ext.h ${CMAKE_CURRENT_SOURCE_DIR} )
+-
+-	# Remove the extracted folder.
+-	execute_process( COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_CURRENT_SOURCE_DIR}/${ZAN_SQLITE_DOWNLOAD_NAME} )
+-
+-	message( STATUS "SQLite: done." )
+-endif()
+-
+ # [BB] Silence all GCC warnings
+ IF ( CMAKE_COMPILER_IS_GNUCXX )
+ 	ADD_DEFINITIONS ( -w )
diff --git a/nixpkgs/pkgs/games/doom-ports/zdoom/bcc-git.nix b/nixpkgs/pkgs/games/doom-ports/zdoom/bcc-git.nix
new file mode 100644
index 000000000000..aa3fdeca183a
--- /dev/null
+++ b/nixpkgs/pkgs/games/doom-ports/zdoom/bcc-git.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation {
+  pname = "doom-bcc";
+  version = "unstable-2018-01-04";
+
+  src = fetchFromGitHub {
+    owner = "wormt";
+    repo = "bcc";
+    rev = "d58b44d9f18b28fd732c27113e5607a454506d19";
+    sha256 = "1m83ip40ln61qrvb1fbgaqbld2xip9n3k817lwkk1936pml9zcrq";
+  };
+
+  enableParallelBuilding = true;
+  makeFlags = ["CC=${stdenv.cc.targetPrefix}cc"];
+
+  patches = [ ./bcc-warning-fix.patch ];
+
+  installPhase = ''
+    mkdir -p $out/{bin,lib,share/doc}
+    install -m755 bcc $out/bin/bcc
+    cp -av doc $out/share/doc/bcc
+    cp -av lib $out/lib/bcc
+  '';
+
+  meta = with lib; {
+    description = "Compiler for Doom/Hexen scripts (ACS, BCS)";
+    homepage = "https://github.com/wormt/bcc";
+    license = licenses.mit;
+    maintainers = with maintainers; [ertes];
+  };
+}
diff --git a/nixpkgs/pkgs/games/doom-ports/zdoom/bcc-warning-fix.patch b/nixpkgs/pkgs/games/doom-ports/zdoom/bcc-warning-fix.patch
new file mode 100644
index 000000000000..4a352cb1e471
--- /dev/null
+++ b/nixpkgs/pkgs/games/doom-ports/zdoom/bcc-warning-fix.patch
@@ -0,0 +1,25 @@
+From c6ac05c96b7908ccd35f3908fc0f13650b0583c0 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ertugrul=20S=C3=B6ylemez?= <esz@posteo.de>
+Date: Sat, 3 Feb 2018 17:08:54 +0100
+Subject: [PATCH] Remove -Werror
+
+---
+ Makefile | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/Makefile b/Makefile
+index bbe2c75..3357d2d 100644
+--- a/Makefile
++++ b/Makefile
+@@ -4,7 +4,7 @@ EXE=bcc
+ BUILD_DIR=build
+ CC=gcc
+ INCLUDE=-Isrc -I src/parse
+-OPTIONS=-Wall -Werror -Wno-unused -std=c99 -pedantic -Wstrict-aliasing \
++OPTIONS=-Wall -Wno-unused -std=c99 -pedantic -Wstrict-aliasing \
+ 	-Wstrict-aliasing=2 -Wmissing-field-initializers -D_BSD_SOURCE \
+ 	-D_DEFAULT_SOURCE $(INCLUDE)
+ VERSION_FILE=$(BUILD_DIR)/version.c
+-- 
+2.15.1
+
diff --git a/nixpkgs/pkgs/games/doom-ports/zdoom/default.nix b/nixpkgs/pkgs/games/doom-ports/zdoom/default.nix
new file mode 100644
index 000000000000..3a31f8fdfb5f
--- /dev/null
+++ b/nixpkgs/pkgs/games/doom-ports/zdoom/default.nix
@@ -0,0 +1,55 @@
+{ lib, stdenv, fetchurl, p7zip, cmake
+, SDL2, openal, fluidsynth, soundfont-fluid, bzip2, zlib, libjpeg, game-music-emu
+, libsndfile, mpg123 }:
+
+stdenv.mkDerivation rec {
+  pname = "zdoom";
+  majorVersion = "2.8";
+  version = "${majorVersion}.1";
+
+  src = fetchurl {
+    url = "https://zdoom.org/files/zdoom/${majorVersion}/zdoom-${version}-src.7z";
+    sha256 = "0453fqrh9l00xwphfxni5qkf9y134n3s1mr1dvi5cbkxcva7j8bq";
+  };
+
+  nativeBuildInputs = [ p7zip cmake ];
+  buildInputs = [
+    SDL2 openal fluidsynth bzip2 zlib libjpeg game-music-emu libsndfile mpg123
+  ];
+
+  cmakeFlags = [
+    "-DFORCE_INTERNAL_GME=OFF"
+    "-DGME_INCLUDE_DIR=${game-music-emu}/include"
+    "-DGME_LIBRARIES=${game-music-emu}/lib/libgme.so"
+  ];
+
+  sourceRoot = ".";
+
+  NIX_CFLAGS_LINK = [ "-lopenal" "-lfluidsynth" ];
+
+  preConfigure = ''
+    sed -i \
+      -e "s@/usr/share/sounds/sf2/@${soundfont-fluid}/share/soundfonts/@g" \
+      -e "s@FluidR3_GM.sf2@FluidR3_GM2-2.sf2@g" \
+      src/sound/music_fluidsynth_mididevice.cpp
+  '';
+
+  installPhase = ''
+    install -Dm755 zdoom "$out/lib/zdoom/zdoom"
+    for i in *.pk3; do
+      install -Dm644 "$i" "$out/lib/zdoom/$i"
+    done
+    mkdir -p $out/bin
+    ln -s $out/lib/zdoom/zdoom $out/bin/zdoom
+  '';
+
+  meta = with lib; {
+    homepage = "http://zdoom.org/";
+    description = "Enhanced port of the official DOOM source code";
+    # Doom source license, MAME license
+    license = licenses.unfreeRedistributable;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ lassulus ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/games/doom-ports/zdoom/zdbsp.nix b/nixpkgs/pkgs/games/doom-ports/zdoom/zdbsp.nix
new file mode 100644
index 000000000000..d18eb144292f
--- /dev/null
+++ b/nixpkgs/pkgs/games/doom-ports/zdoom/zdbsp.nix
@@ -0,0 +1,37 @@
+{ lib
+, stdenv
+, fetchzip
+, cmake
+, zlib
+}:
+
+stdenv.mkDerivation rec {
+  pname = "zdbsp";
+  version = "1.19";
+
+  src = fetchzip {
+    url = "https://zdoom.org/files/utils/zdbsp/zdbsp-${version}-src.zip";
+    sha256 = "sha256-DTj0jMNurvwRwMbo0L4+IeNlbfIwUbqcG1LKd68C08g=";
+    stripRoot = false;
+  };
+
+  nativeBuildInputs = [
+    cmake
+  ];
+
+  buildInputs = [
+    zlib
+  ];
+
+  installPhase = ''
+    install -Dm755 zdbsp $out/bin/zdbsp
+  '';
+
+  meta = with lib; {
+    homepage = "https://zdoom.org/wiki/ZDBSP";
+    description = "ZDoom's internal node builder for DOOM maps";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ lassulus siraben ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/games/duckmarines/default.nix b/nixpkgs/pkgs/games/duckmarines/default.nix
new file mode 100644
index 000000000000..a4e37081ab0e
--- /dev/null
+++ b/nixpkgs/pkgs/games/duckmarines/default.nix
@@ -0,0 +1,55 @@
+{ lib, stdenv, fetchurl, love, lua, makeWrapper, makeDesktopItem }:
+
+stdenv.mkDerivation rec {
+  pname = "duckmarines";
+  version = "1.0c";
+
+  icon = fetchurl {
+    url = "http://tangramgames.dk/img/thumb/duckmarines.png";
+    sha256 = "07ypbwqcgqc5f117yxy9icix76wlybp1cmykc8f3ivdps66hl0k5";
+  };
+
+  desktopItem = makeDesktopItem {
+    name = "duckmarines";
+    exec = pname;
+    icon = icon;
+    comment = "Duck-themed action puzzle video game";
+    desktopName = "Duck Marines";
+    genericName = "duckmarines";
+    categories = [ "Game" ];
+  };
+
+  src = fetchurl {
+    url = "https://github.com/SimonLarsen/${pname}/releases/download/v${version}/${pname}-1.0c.love";
+    sha256 = "1rvgpkvi4h9zhc4fwb4knhsa789yjcx4a14fi4vqfdyybhvg5sh9";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ lua love ];
+
+  dontUnpack = true;
+
+  installPhase =
+  ''
+    mkdir -p $out/bin
+    mkdir -p $out/share/games/lovegames
+
+    cp -v ${src} $out/share/games/lovegames/${pname}.love
+
+    makeWrapper ${love}/bin/love $out/bin/${pname} --add-flags $out/share/games/lovegames/${pname}.love
+
+    chmod +x $out/bin/${pname}
+    mkdir -p $out/share/applications
+    ln -s ${desktopItem}/share/applications/* $out/share/applications/
+  '';
+
+  meta = with lib; {
+    description = "Duck-themed action puzzle video game";
+    maintainers = with maintainers; [ leenaars ];
+    platforms = platforms.linux;
+    hydraPlatforms = [];
+    license = licenses.free;
+    downloadPage = "http://tangramgames.dk/games/duckmarines";
+  };
+
+}
diff --git a/nixpkgs/pkgs/games/dwarf-fortress/default.nix b/nixpkgs/pkgs/games/dwarf-fortress/default.nix
new file mode 100644
index 000000000000..55157950c4f2
--- /dev/null
+++ b/nixpkgs/pkgs/games/dwarf-fortress/default.nix
@@ -0,0 +1,117 @@
+{ stdenv, stdenvNoCC, gccStdenv, lib, recurseIntoAttrs, libsForQt5, newScope, texliveBasic, perlPackages, jdk8, jre8 }:
+
+# To whomever it may concern:
+#
+# This directory menaces with spikes of Nix code. It is terrifying.
+#
+# If this is your first time here, you should probably install the dwarf-fortress-full package,
+# for instance with:
+#
+# environment.systemPackages = [ pkgs.dwarf-fortress-packages.dwarf-fortress-full ];
+#
+# You can adjust its settings by using override, or compile your own package by
+# using the other packages here.
+#
+# For example, you can enable the FPS indicator, disable the intro, pick a
+# theme other than phoebus (the default for dwarf-fortress-full), _and_ use
+# an older version with something like:
+#
+# environment.systemPackages = [
+#   (pkgs.dwarf-fortress-packages.dwarf-fortress-full.override {
+#      dfVersion = "0.44.11";
+#      theme = "cla";
+#      enableIntro = false;
+#      enableFPS = true;
+#   })
+# ]
+#
+# Take a look at lazy-pack.nix to see all the other options.
+#
+# You will find the configuration files in ~/.local/share/df_linux/data/init. If
+# you un-symlink them and edit, then the scripts will avoid overwriting your
+# changes on later launches, but consider extending the wrapper with your
+# desired options instead.
+
+with lib;
+
+let
+  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.05";
+
+  # Converts a version to a package name.
+  versionToName = version: "dwarf-fortress_${lib.replaceStrings ["."] ["_"] version}";
+
+  dwarf-therapist-original = libsForQt5.callPackage ./dwarf-therapist {
+    texlive = texliveBasic.withPackages (ps: with ps; [ 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;
+          };
+
+          dwarf-fortress-unfuck = callPackage ./unfuck.nix { inherit dfVersion; };
+
+          twbt = callPackage ./twbt { inherit dfVersion; };
+
+          dfhack = callPackage ./dfhack {
+            inherit (perlPackages) XMLLibXML XMLLibXSLT;
+            inherit dfVersion;
+            stdenv = gccStdenv;
+          };
+
+          dwarf-therapist = libsForQt5.callPackage ./dwarf-therapist/wrapper.nix {
+            inherit dwarf-fortress;
+            dwarf-therapist = dwarf-therapist-original;
+          };
+        in
+        callPackage ./wrapper {
+          inherit (self) themes;
+          inherit dwarf-fortress twbt dfhack dwarf-therapist;
+
+          jdk = jdk8; # TODO: remove override https://github.com/NixOS/nixpkgs/pull/89731
+        };
+    })
+    (lib.attrNames self.df-hashes));
+
+  self = rec {
+    df-hashes = lib.importJSON ./game.json;
+
+    # Aliases for the latest Dwarf Fortress and the selected Therapist install
+    dwarf-fortress = getAttr (versionToName latestVersion) df-games;
+    inherit dwarf-therapist-original;
+    dwarf-therapist = dwarf-fortress.dwarf-therapist;
+    dwarf-fortress-original = dwarf-fortress.dwarf-fortress;
+
+    dwarf-fortress-full = callPackage ./lazy-pack.nix {
+      inherit df-games versionToName latestVersion;
+    };
+
+    soundSense = callPackage ./soundsense.nix { };
+
+    legends-browser = callPackage ./legends-browser {
+      jre = jre8; # TODO: remove override https://github.com/NixOS/nixpkgs/pull/89731
+    };
+
+    themes = recurseIntoAttrs (callPackage ./themes {
+      stdenv = stdenvNoCC;
+    });
+
+    # Theme aliases
+    phoebus-theme = themes.phoebus;
+    cla-theme = themes.cla;
+  };
+
+in
+self // df-games
diff --git a/nixpkgs/pkgs/games/dwarf-fortress/df_permission b/nixpkgs/pkgs/games/dwarf-fortress/df_permission
new file mode 100644
index 000000000000..dc1c0c151e0b
--- /dev/null
+++ b/nixpkgs/pkgs/games/dwarf-fortress/df_permission
@@ -0,0 +1,40 @@
+From tarn.adams@gmail.com Sat Oct 30 00:56:16 2010
+Date: Fri, 29 Oct 2010 16:56:15 -0800
+From: Tarn Adams <tarn.adams@gmail.com>
+To: roconnor@theorem.ca
+Subject: Re: Dwarf Fortress Redistribution for NixOS
+
+Sure, that redistribution is fine.  I think I've handled the movie
+issue for next time now.  Thanks for the heads up on that.
+
+Tarn
+
+On Fri, Oct 29, 2010 at 6:56 AM,  <roconnor@theorem.ca> wrote:
+> I'd like to distribute a *slightly* modified version of Dwarf Fortress which
+> is needed to run it under the NixOS distribution of Linux (see
+> <https://nixos.org/>
+>
+> Modification: The interpreter location /lib/ld-linux.so.2 in
+> lib/Dwarf_Fortress is replaced with the location of ld-linux.so.2 under the
+> NixOS distribution (which is currently
+> /nix/store/l8x3fdy1r6zf441vnqa87lzsvxrjbdz9-glibc-2.11.1/lib/ld-linux.so.2
+> but might change at a later date to something similar).
+>
+> I don't need you to recompile Dwarf Fortress.  I can patch the binary itself
+> using patchelf.  I just would like your permission to redistrubute this
+> modified binary.
+>
+> Thanks, I'm looking forward to trying out your game and letting other Nix
+> users try it out too.
+>
+> P.S. the inital_movies are open in read/write mode instead of read-only mode
+> which causes some issues under NixOS because the inital_movies are stored
+> read-only.  I have a workaround, but you may want to consider opening these
+> files in read-only mode.
+>
+> --
+> Russell O'Connor                                      <http://r6.ca/>
+> ``All talk about `theft,''' the general counsel of the American Graphophone
+> Company wrote, ``is the merest claptrap, for there exists no property in
+> ideas musical, literary or artistic, except as defined by statute.''
+>
diff --git a/nixpkgs/pkgs/games/dwarf-fortress/dfhack/default.nix b/nixpkgs/pkgs/games/dwarf-fortress/dfhack/default.nix
new file mode 100644
index 000000000000..914ccbb6ab33
--- /dev/null
+++ b/nixpkgs/pkgs/games/dwarf-fortress/dfhack/default.nix
@@ -0,0 +1,171 @@
+{ stdenv
+, buildEnv
+, lib
+, fetchFromGitHub
+, fetchpatch
+, cmake
+, writeScriptBin
+, perl
+, XMLLibXML
+, XMLLibXSLT
+, zlib
+, ruby
+, enableStoneSense ? false
+, allegro5
+, libGLU
+, libGL
+, SDL
+, dfVersion
+}:
+
+with lib;
+
+let
+  dfhack-releases = {
+    "0.44.10" = {
+      dfHackRelease = "0.44.10-r2";
+      sha256 = "19bxsghxzw3bilhr8sm4axz7p7z8lrvbdsd1vdjf5zbg04rs866i";
+      xmlRev = "321bd48b10c4c3f694cc801a7dee6be392c09b7b";
+      prerelease = false;
+    };
+    "0.44.11" = {
+      dfHackRelease = "0.44.11-beta2.1";
+      sha256 = "1jgwcqg9m1ybv3szgnklp6zfpiw5mswla464dlj2gfi5v82zqbv2";
+      xmlRev = "f27ebae6aa8fb12c46217adec5a812cd49a905c8";
+      prerelease = true;
+    };
+    "0.44.12" = {
+      dfHackRelease = "0.44.12-r1";
+      sha256 = "0j03lq6j6w378z6cvm7jspxc7hhrqm8jaszlq0mzfvap0k13fgyy";
+      xmlRev = "23500e4e9bd1885365d0a2ef1746c321c1dd5094";
+      prerelease = false;
+    };
+    "0.47.02" = {
+      dfHackRelease = "0.47.02-alpha0";
+      sha256 = "19lgykgqm0si9vd9hx4zw8b5m9188gg8r1a6h25np2m2ziqwbjj9";
+      xmlRev = "23500e4e9bd1885365d0a2ef1746c321c1dd509a";
+      prerelease = true;
+    };
+    "0.47.04" = {
+      dfHackRelease = "0.47.04-r5";
+      sha256 = "sha256-0s+/LKbqsS/mrxKPDeniqykE5+Gy3ZzCa8yEDzMyssY=";
+      xmlRev = "be0444cc165a1abff053d5893dc1f780f06526b7";
+      prerelease = false;
+    };
+    "0.47.05" = {
+      dfHackRelease = "0.47.05-r7";
+      sha256 = "sha256-vBKUTSjfCnalkBzfjaIKcxUuqsGGOTtoJC1RHJIDlNc=";
+      xmlRev = "f5019a5c6f19ef05a28bd974c3e8668b78e6e2a4";
+      prerelease = false;
+    };
+
+  };
+
+  release =
+    if lib.isAttrs dfVersion
+    then dfVersion
+    else if hasAttr dfVersion dfhack-releases
+    then getAttr dfVersion dfhack-releases
+    else throw "[DFHack] Unsupported Dwarf Fortress version: ${dfVersion}";
+
+  version = release.dfHackRelease;
+
+  # revision of library/xml submodule
+  xmlRev = release.xmlRev;
+
+  arch =
+    if stdenv.hostPlatform.system == "x86_64-linux" then "64"
+    else if stdenv.hostPlatform.system == "i686-linux" then "32"
+    else throw "Unsupported architecture";
+
+  fakegit = writeScriptBin "git" ''
+    #! ${stdenv.shell}
+    if [ "$*" = "describe --tags --long" ]; then
+      echo "${version}-unknown"
+    elif [ "$*" = "describe --tags --abbrev=8 --long" ]; then
+      echo "${version}-unknown"
+    elif [ "$*" = "describe --tags --abbrev=8 --exact-match" ]; then
+      echo "${version}"
+    elif [ "$*" = "rev-parse HEAD" ]; then
+      if [ "$(dirname "$(pwd)")" = "xml" ]; then
+        echo "${xmlRev}"
+      else
+        echo "refs/tags/${version}"
+      fi
+    elif [ "$*" = "rev-parse HEAD:library/xml" ]; then
+      echo "${xmlRev}"
+    else
+      exit 1
+    fi
+  '';
+in
+  stdenv.mkDerivation {
+    pname = "dfhack";
+    inherit version;
+
+    # Beware of submodules
+    src = fetchFromGitHub {
+      owner = "DFHack";
+      repo = "dfhack";
+      rev = release.dfHackRelease;
+      sha256 = release.sha256;
+      fetchSubmodules = true;
+    };
+
+    patches = lib.optional (lib.versionOlder version "0.44.12-r3") (fetchpatch {
+      name = "fix-stonesense.patch";
+      url = "https://github.com/DFHack/stonesense/commit/f5be6fe5fb192f01ae4551ed9217e97fd7f6a0ae.patch";
+      extraPrefix = "plugins/stonesense/";
+      stripLen = 1;
+      hash = "sha256-wje6Mkct29eyMOcJnbdefwBOLJko/s4JcJe52ojuW+8=";
+    }) ++ lib.optional (lib.versionOlder version "0.47.04-r1") (fetchpatch {
+      name = "fix-protobuf.patch";
+      url = "https://github.com/DFHack/dfhack/commit/7bdf958518d2892ee89a7173224a069c4a2190d8.patch";
+      hash = "sha256-p+mKhmYbnhWKNiGPMjbYO505Gcg634n0nudqH0NX3KY=";
+    });
+
+    # gcc 11 fix
+    CXXFLAGS = lib.optionalString (lib.versionOlder version "0.47.05-r3") "-fpermissive";
+
+    # As of
+    # https://github.com/DFHack/dfhack/commit/56e43a0dde023c5a4595a22b29d800153b31e3c4,
+    # dfhack gets its goodies from the directory above the Dwarf_Fortress
+    # executable, which leads to stock Dwarf Fortress and not the built
+    # environment where all the dfhack resources are symlinked to (typically
+    # ~/.local/share/df_linux). This causes errors like `tweak is not a
+    # recognized command` to be reported and dfhack to lose some of its
+    # functionality.
+    postPatch = ''
+      sed -i 's@cached_path = path_string.*@cached_path = getenv("DF_DIR");@' library/Process-linux.cpp
+    '';
+
+    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 ];
+
+    preConfigure = ''
+      # Trick build system into believing we have .git
+      mkdir -p .git/modules/library/xml
+      touch .git/index .git/modules/library/xml/index
+    '';
+
+    cmakeFlags = [ "-DDFHACK_BUILD_ARCH=${arch}" "-DDOWNLOAD_RUBY=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.
+    postInstall = ''
+      ln -s ${ruby}/lib/libruby-*.so $out/hack/libruby.so
+    '';
+
+    passthru = { inherit dfVersion; };
+
+    meta = with lib; {
+      description = "Memory hacking library for Dwarf Fortress and a set of tools that use it";
+      homepage = "https://github.com/DFHack/dfhack/";
+      license = licenses.zlib;
+      platforms = [ "x86_64-linux" "i686-linux" ];
+      maintainers = with maintainers; [ robbinch a1russell abbradar numinit ncfavier ];
+    };
+  }
diff --git a/nixpkgs/pkgs/games/dwarf-fortress/dwarf-therapist/default.nix b/nixpkgs/pkgs/games/dwarf-fortress/dwarf-therapist/default.nix
new file mode 100644
index 000000000000..42dd74a766b2
--- /dev/null
+++ b/nixpkgs/pkgs/games/dwarf-fortress/dwarf-therapist/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, qtbase
+, qtdeclarative
+, cmake
+, texlive
+, ninja
+}:
+
+stdenv.mkDerivation rec {
+  pname = "dwarf-therapist";
+  version = "41.2.2";
+
+  src = fetchFromGitHub {
+    owner = "Dwarf-Therapist";
+    repo = "Dwarf-Therapist";
+    rev = "v${version}";
+    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;
+
+  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;
+    platforms = platforms.x86;
+    homepage = "https://github.com/Dwarf-Therapist/Dwarf-Therapist";
+  };
+}
diff --git a/nixpkgs/pkgs/games/dwarf-fortress/dwarf-therapist/dwarf-therapist.in b/nixpkgs/pkgs/games/dwarf-fortress/dwarf-therapist/dwarf-therapist.in
new file mode 100644
index 000000000000..5ae0a35b5e20
--- /dev/null
+++ b/nixpkgs/pkgs/games/dwarf-fortress/dwarf-therapist/dwarf-therapist.in
@@ -0,0 +1,25 @@
+#!@stdenv_shell@ -e
+
+[ -z "$DT_DIR" ] && DT_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/dwarftherapist"
+
+install_dir="@install@"
+therapist_dir="@therapist@"
+
+@cat@ <<EOF >&2
+Using $DT_DIR as Dwarf Therapist overlay directory.
+EOF
+
+update_path() {
+  local path="$1"
+
+  @mkdir@ -p "$DT_DIR/$(@dirname@ "$path")"
+  if [ ! -e "$DT_DIR/$path" ] || [ -L "$DT_DIR/$path" ]; then
+    @rm@ -f "$DT_DIR/$path"
+    @ln@ -s "$install_dir/share/dwarftherapist/$path" "$DT_DIR/$path"
+  fi
+}
+
+cd "$install_dir/share/dwarftherapist"
+update_path memory_layouts
+
+exec "$therapist_dir/bin/dwarftherapist" "$@"
diff --git a/nixpkgs/pkgs/games/dwarf-fortress/dwarf-therapist/wrapper.nix b/nixpkgs/pkgs/games/dwarf-fortress/dwarf-therapist/wrapper.nix
new file mode 100644
index 000000000000..eaf391bbe6b1
--- /dev/null
+++ b/nixpkgs/pkgs/games/dwarf-fortress/dwarf-therapist/wrapper.nix
@@ -0,0 +1,60 @@
+{ stdenv, dwarf-therapist, dwarf-fortress, substituteAll, coreutils, wrapQtAppsHook }:
+
+let
+  platformSlug =
+    if stdenv.hostPlatform.is32bit then
+      "linux32" else "linux64";
+  inifile = "linux/v0.${dwarf-fortress.baseVersion}.${dwarf-fortress.patchVersion}_${platformSlug}.ini";
+
+in
+
+stdenv.mkDerivation {
+  pname = "dwarf-therapist";
+  inherit (dwarf-therapist) version meta;
+
+  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 ];
+
+  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
+
+    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
+    mkdir -p $out/share/dwarftherapist/memory_layouts/linux
+    orig_md5=$(cat "${dwarf-fortress}/hash.md5.orig" | cut -c1-8)
+    patched_md5=$(cat "${dwarf-fortress}/hash.md5" | cut -c1-8)
+    input_file="${dwarf-therapist}/share/dwarftherapist/memory_layouts/${inifile}"
+    output_file="$out/share/dwarftherapist/memory_layouts/${inifile}"
+
+    echo "[Dwarf Therapist Wrapper] Fixing Dwarf Fortress MD5 prefix:"
+    echo "  Input:   $input_file"
+    echo "  Search:  $orig_md5"
+    echo "  Output:  $output_file"
+    echo "  Replace: $patched_md5"
+
+    substitute "$input_file" "$output_file" --replace "$orig_md5" "$patched_md5"
+  '';
+
+  preferLocalBuild = true;
+}
diff --git a/nixpkgs/pkgs/games/dwarf-fortress/game.json b/nixpkgs/pkgs/games/dwarf-fortress/game.json
new file mode 100644
index 000000000000..522cccdcda45
--- /dev/null
+++ b/nixpkgs/pkgs/games/dwarf-fortress/game.json
@@ -0,0 +1,139 @@
+{
+  "0.43.05": {
+    "linux": "1r0b96yrdf24m9476k5x7rmp3faxr0kfwwdf35agpvlb1qbi6v45",
+    "linux32": "16l1lydpkbnl3zhz4i2snmjk7pps8vmw3zv0bjgr8dncbsrycd03",
+    "osx": "1j2zdkjnmxy8yn599pm0qmbi4zjp1m8h4ggqjxhyzp135h0lqqf9",
+    "osx32": "09ym4mflp5z78pk5mvj7b44xihnsvrxmh0b5kix6h1m6z3cc90l4",
+    "win": "0m337wh4c47ij1f3zrimvy7baff7nzrmgjbmrwdy89d0z90xpnx8",
+    "win_s": "0bjk5m1qkn3ldhqiwbq24y2m9fz9r574d54ngdb8b4ri2xfl1fbp",
+    "win32": "162rl9ygpj66pis87bqc5bwc0mk75hxv6ianhn87pbl4rh7g8ax8",
+    "win32_s": "0gv1jyw5fdskjjs27pr41grbmkk7ipqn0ry615f5g79k3mhl200i",
+    "legacy": "09lvbmg1gq257qchlbmq7hxc5nl9r39jpf73zhmwb5xfbpprn0zs",
+    "legacy_s": "023a5b27fm65w7gmzjssyyci70fdjk2zbv965y4n0f23kc4rj9gl",
+    "legacy32": "1m75arxj1q82l2dkk8qcargm3xczxlqi8krwvg3iimddky34gipq",
+    "legacy32_s": "1hgzsk66isfr5vcraxwgl7cvycl14kwf8w9kzxr8jyp5z7k24q29"
+  },
+  "0.44.05": {
+    "linux": "18bjyhjp5458bfbizm8vq4s00pqpfs097qp6pv76m84kgbc4ghg3",
+    "linux32": "1b9i4kf4c8s6bhqwn8jx100mg7fqp8nmswrai5w8dsma01py4amr",
+    "osx": "1ssc8vq3ad38x9c04j8gg96kxv0g2npi3jwcg40676byx5nrx7b6",
+    "osx32": "12i7x8idcbvp5h62jyc7b7j98jf4lrisnwglvnrms6jclj0b3g0q",
+    "win": "1kaifarjx0akg7s5a2ngfw0vm0vyr4jnax5rrbv96dliqn5knddz",
+    "win_s": "1a1xikrjdv4b0yfgnp5s8d6xn0njylynsqd8zixdc01vccl5kqm6",
+    "win32": "1j3cq0h7jdvxbsbpfxa7bli45smvy9m4fji0j6849kj7x0vcpwq4",
+    "win32_s": "10cw1n48ffkrv9ms07ka5b5370d9k2fm051cnnq03lkcvlwrq145",
+    "legacy": "0y7xpgmwn4nshhc7apyf8mj5ycl0q5vckdaviwzz6w1x31s3dp6n",
+    "legacy_s": "0j8rbw9ww1avmh8zhyzljjj6in87q4qffpffdl394fsi74n8px0d",
+    "legacy32": "0d3l4jvx53a01fjf1lf20ar9lfyykfhk05dlrfwz3w4k7vj4vvlf",
+    "legacy32_s": "1c5x9x44bblz7anhmk4y9a7p1b39b9k7gzvj4pi55jzfq0k60kl7"
+  },
+  "0.44.09": {
+    "linux": "1haikynkg1pqyrzzqk1qxm19p36ww58qp8brh3fjxssp4x71rcdy",
+    "linux32": "0lmbrdf7wjdwj5yx0khnq871yxvhfwqxjjyfkqcdy5ik18lvlkj8",
+    "osx": "01dss8g9lmi8majp6lxcfw166ydz4himkz6am5pi29gixaf4vfqs",
+    "osx32": "1iwlvmz1ir9k0kzn6726frmkznvsg9a99bbqnxvwcnq3nnnjxw3s",
+    "win": "08g5irgp59dfjgj3jxc8ixwzgnz2wghcl8cg1b1g4088dsf2x3x8",
+    "win_s": "1xyb4msn9wfrh7x136r8xn3sjz6z8c4zksbzifa0z0bpa3pdviap",
+    "win32": "0m8bs2mnyi1r4x84fwnfgd1ijdcf08xsq5zy84476svci932g5kz",
+    "win32_s": "0pl319qmyy96ibzlgj4wfj19dv1wzyg8ig6q11l4c7rivzc9286i",
+    "legacy": "0l8nrvppfzazhjsfkd5nd0bxnc6ljk8fs6yg8qh69g7q7zvzgnd3",
+    "legacy_s": "1c49z539a31czzq0rnhg6yrv1zbaja35sd0ssr4k7lsghjv84k1z",
+    "legacy32": "155xg6dpb8frlw7d9h7m1y0spw55wl4nkn7zrm70bpyp39pydlqp",
+    "legacy32_s": "05qkzjfx1ybrv96wya1dirdfxdkhj6a440sjpzwbqpkqgr8z57a3"
+  },
+  "0.44.10": {
+    "linux": "1cqm43hn3ar9d8a7y7dwq48ajp72cirn1gclh8r2fykkypprxmp2",
+    "linux32": "0gdb6sq8725nwdisxwha8f5b6arq570s73aj4gdrh611gxh13r6n",
+    "osx": "1wpa45d81q8f5mhqmaxvdkz93k6cm3pg7vpsqjjjsp5s961gd74g",
+    "osx32": "0rsy1n19n12gh8rddgi3db32in488f2nizq8kw25hga03hsh4r6x",
+    "win": "04i0ka12hmn3chsyfmk2pbknr1pdf3p8yaz7kv82ri4g6dvsjfv6",
+    "win_s": "01m6nqcrz4rhdc8wb31azj3vmjid8bdpqaf9wkz4g4vvjyy7xiyz",
+    "win32": "1nymin8wbzbh8gm2702dy7h5spdijdxnysdz71ldyl0xx4vw68d9",
+    "win32_s": "1skz0jpfm6j9bins04kn96f3v3k0kvjqlh25x3129r3hh8xacnd3",
+    "legacy": "0s84vpfr2b5y1kda9allqjrpkaxw15mkblk9dq08syhsj19vspa7",
+    "legacy_s": "18b7ikp7xy2y071h3ydfh5mq9hw9y303rdqyikvra5ji3n5p96cm",
+    "legacy32": "1yh2fl3qwpy6wrxavhn75grbjygymnfh746hxbmc60la7y5flrpy",
+    "legacy32_s": "0j65w2hxgpccg9qsaz14r82qvnvfd0pbl2gyx9fv8d77kxhkc4pw"
+  },
+  "0.44.11": {
+    "linux": "1qizfkxl2k6pn70is4vz94q4k55bc3pm13b2r6yqi6lw1cnna4sf",
+    "linux32": "11m39lfyrsxlw1g7f269q7fzwichg06l21fxhqzgvlvmzmxsf8q5",
+    "osx": "073hmcj7bm323m3xqi42605rkvmgmv83bnxz1byymgs8aqyfykkx",
+    "osx32": "0w5avnj86wprk8q0rb5qm9kxbigzk6dk0akqbw4m76jgg2jdmir7",
+    "win": "1yxyv1sycn5jc3g1y02d82154xydg3kbghis7l3xi28n3bh8387b",
+    "win_s": "1xzwl6c362wqgps911y9q8vndp8zyd20fc2p7pkzzmw2hrgfqi6q",
+    "win32": "16x2rg3gm3lh2akg7n057kkxxigb2ljz0nk685lmn4j0adq8l31p",
+    "win32_s": "1a2y220111d94mzj5y3jwpy062k8fw25akyp7yn3fwa17vwvn8zq",
+    "legacy": "0gfjmsfqj21hs4d1hm7fvppbdjspc4r2qnnp6mwcbgh67i5p5rdb",
+    "legacy_s": "1wr4hpzmhgl8haric3jpfd3kwqv1fi4vkb1gvaax5f7kplvfqfac",
+    "legacy32": "1cpzckwvqkxqn0c498mmh4papsjdi3mcvcp2vzlvj46kvdl3n0f0",
+    "legacy32_s": "024vzwfcrx7ms4dip0ccwd0vizzck2pwz2ryyvlz4rpjzhswj5gi"
+  },
+  "0.44.12": {
+    "win32": "0bxrc7zj4vgcgdwc130g6f5jnp13vgx9a2kn2l1jcc958x8a367g",
+    "linux32": "0fmr8diskmbh12s0bpfn5gky9lmrc7xxj6va5adjm6ahxv9jwr06",
+    "osx": "1md6r1pimmlhcn5gjqzg0ygbdwc2v125sfjy0f6gbfbykwcm7391",
+    "osx32": "1dbg7pavxw20r8iqc566fn558avgj5glsycvi6ggbvsh0rpw6n5v",
+    "win": "0zb5ximqi5j7vyvgjzfz7ycadh5sgb7jlyaa68x0sjlbybdr1min",
+    "win_s": "1ncf5zr1fggr5knf30l0wh7spp376v1jcc6m9c86zim8azcfx0y7",
+    "linux": "0ydr5lnysy45nsznqp5r2pysdqn3f0xkrkh9v9l1md111mriabas",
+    "win32_s": "1mxbjkikf010skrpng51r86jmv4nal51j5n1y9kyhv344bq6chr9",
+    "legacy": "11a212ynhx18p3k8hvdjx199din14wggxiwz191b4309fznzpprz",
+    "legacy_s": "05madj529y18ndxrih96mivbzng1vz2zbzicrcnj58i2084zm23f",
+    "legacy32": "0rapcydiic2nq6idjf7fg53xsxk8dxzyi1vflpz554ghdrnsmwjv",
+    "legacy32_s": "16fgbd3lx4r270dxqj6gr1g1iqjj8cv389h2hw1l646xx28g8d2m"
+  },
+  "0.47.01": {
+    "linux": "1wbybkfpgvpd2yliy8mfgddnz806ac4rv4j0lhlsqwpk8jj0mx81",
+    "linux32": "1fnz1mydqgybcm8kzranvjzc2x9g6bcalxv3fsjngvpv13x6izzv",
+    "osx": "18wdffidasbrsbhqjwds08ckbrjhcw0759aynz7zggyy5is9q8iw",
+    "osx32": "1b4kf3vg0zd5w5s0rdhzfz0rswkl6sq0j1f8qmimnw7qd09h43wx",
+    "win": "1v3v2z7g67d6926h9lxakznvbddyxyr85i1ym34y2wywnc886z7r",
+    "win_s": "0yahynimhz4nvdi5qp5a612vf7ikg87w2aj2r8s1lhdw6xwdkpyc",
+    "win32": "07mqhm64c1ddjc3vpyhf9qf14lp19xwz3pgg4c2pvcwy4yyrys22",
+    "win32_s": "07acbxai8g04yxg7n68nyx4jwcqqkgjn7n96q2lzxdvc988kiivz",
+    "legacy32_s": "1gxmc3rsl9glai3wb4wzsda3qyhdimd8s5kbr5m753n8lmzasafx"
+  },
+  "0.47.02": {
+    "linux": "1zbsygbfiqxxs767qxkxjp3ayywi5q0d8xlrqlbd0l8a3ccg5avw",
+    "linux32": "1ddc9s4n408j8gidgign51bgv2wgy5z4cy74jzx00pvnhsfp2mpy",
+    "osx": "1mwy88yxip1wys1kxpfsbg7wlvfrkc4lg04gqw0d266a88dj7a30",
+    "osx32": "08ssnzl52gqqgcqhl0ynyikbxz76825kpcg1d6yx8g7ifjndf19n",
+    "win": "08g7fy18y8q32l0158314bny0qg57xz37qj9fri9r4xbhci67ldk",
+    "win_s": "0x56s1md62yk661aqcdgnz8k0zir0zr8qwan5vrqc0q9yh069yl1",
+    "win32": "0ww64mymbilb235n93d7w4c9axq3ww2mxa0f7bl4x8yrxwc8k942",
+    "win32_s": "0r801vip807v88icf47i3s82v7lshx67q4ilzfjirqfslh1x00bs",
+    "legacy": "14f4d6r7swfjnlaalg4l5916ihj6wvhlsgjp7cygamzp4c2wgng8",
+    "legacy_s": "1jxf52kaijf4crwxj30a4f6z7rzs6xa91y6vn5s8jr0cvbr5pz64",
+    "legacy32": "0j7shqdv3gimacj03cil2y0fmr0j0fp57cwmdjwnxwx3m96k3xwm",
+    "legacy32_s": "1wc7pcp9dwz0q1na3i5pbqknya595qdkmr7hsmgh2kk8rsp3g9g2"
+  },
+  "0.47.04": {
+    "linux": "1ri82c5hja6n0wv538srf2nbcyb8ip49w4l201m90cmcycmqgr8x",
+    "linux32": "00yz8gl75sbx15d7vl22ij0a5qd325kpc9mgm1lh5g7i065vgzn8",
+    "osx": "0c1g655bn5n4pbzxw3v83gmy54va5y87m7ksi6iryfal0m9lshhv",
+    "osx32": "1knfgqbwa7v9va1w6i8yzz6xp3dj633dbs50izx6ldszm0ra42pg",
+    "win": "0j7ixr3rf9900zzfw3nd3vg97kdkspm530cmf9dkwhf6klmpks7s",
+    "win_s": "11amw5gjhi753mvf17wifcjiyikjx0qwa16787gfhj9jfp0yw764",
+    "win32": "1xw9f49n85c31kbzkm5zh81kccjx9msjyy3xwr0klak5w398a59l",
+    "win32_s": "0s26hrgfk2b5wg4dvg90wgw1mvrrvbyjhmsys9f5fl7zn1pjbxxr",
+    "legacy": "103bcnn8gxi2rkpjmjfgv5a5kxmh1zd7vagrsscv55sppd7fcl7n",
+    "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/nixpkgs/pkgs/games/dwarf-fortress/game.nix b/nixpkgs/pkgs/games/dwarf-fortress/game.nix
new file mode 100644
index 000000000000..7ce837b7b0b5
--- /dev/null
+++ b/nixpkgs/pkgs/games/dwarf-fortress/game.nix
@@ -0,0 +1,109 @@
+{ stdenv
+, lib
+, fetchurl
+, SDL
+, dwarf-fortress-unfuck
+
+  # Our own "unfuck" libs for macOS
+, ncurses
+, fmodex
+, gcc
+
+, dfVersion
+, df-hashes
+}:
+
+with lib;
+
+let
+  libpath = makeLibraryPath [ stdenv.cc.cc stdenv.cc.libc dwarf-fortress-unfuck SDL ];
+
+  # Map Dwarf Fortress platform names to Nixpkgs platform names.
+  # Other srcs are avilable like 32-bit mac & win, but I have only
+  # included the ones most likely to be needed by Nixpkgs users.
+  platforms = {
+    x86_64-linux = "linux";
+    i686-linux = "linux32";
+    x86_64-darwin = "osx";
+    i686-darwin = "osx32";
+    x86_64-cygwin = "win";
+    i686-cygwin = "win32";
+  };
+
+  dfVersionTriple = splitVersion dfVersion;
+  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}";
+
+in
+
+stdenv.mkDerivation {
+  pname = "dwarf-fortress";
+  version = dfVersion;
+
+  src = fetchurl {
+    url = "https://www.bay12games.com/dwarves/df_${baseVersion}_${patchVersion}_${dfPlatform}.tar.bz2";
+    inherit sha256;
+  };
+
+  installPhase = ''
+    mkdir -p $out
+    cp -r * $out
+    rm $out/libs/lib*
+
+    exe=$out/${if stdenv.isLinux then "libs/Dwarf_Fortress"
+                                 else "dwarfort.exe"}
+
+    # Store the original hash
+    md5sum $exe | awk '{ print $1 }' > $out/hash.md5.orig
+  '' + optionalString stdenv.isLinux ''
+    patchelf \
+      --set-interpreter $(cat ${stdenv.cc}/nix-support/dynamic-linker) \
+      --set-rpath "${libpath}" \
+      $exe
+  '' + optionalString stdenv.isDarwin ''
+    # My custom unfucked dwarfort.exe for macOS. Can't use
+    # absolute paths because original doesn't have enough
+    # header space. Someone plz break into Tarn's house & put
+    # -headerpad_max_install_names into his LDFLAGS.
+
+    ln -s ${getLib ncurses}/lib/libncurses.dylib $out/libs
+    ln -s ${getLib gcc.cc}/lib/libstdc++.6.dylib $out/libs
+    ln -s ${getLib fmodex}/lib/libfmodex.dylib $out/libs
+
+    install_name_tool \
+      -change /usr/lib/libncurses.5.4.dylib \
+              @executable_path/libs/libncurses.dylib \
+      -change /usr/local/lib/x86_64/libstdc++.6.dylib \
+              @executable_path/libs/libstdc++.6.dylib \
+      $exe
+  '' + ''
+    # Store the new hash
+    md5sum $exe | awk '{ print $1 }' > $out/hash.md5
+  '';
+
+  passthru = {
+    inherit baseVersion patchVersion dfVersion;
+    updateScript = ./update.sh;
+  };
+
+  meta = {
+    description = "A single-player fantasy game with a randomly generated adventure world";
+    homepage = "https://www.bay12games.com/dwarves/";
+    license = licenses.unfreeRedistributable;
+    platforms = attrNames platforms;
+    maintainers = with maintainers; [ a1russell robbinch roconnor abbradar numinit shazow ncfavier ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/dwarf-fortress/lazy-pack.nix b/nixpkgs/pkgs/games/dwarf-fortress/lazy-pack.nix
new file mode 100644
index 000000000000..17037dbdb278
--- /dev/null
+++ b/nixpkgs/pkgs/games/dwarf-fortress/lazy-pack.nix
@@ -0,0 +1,56 @@
+{ 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
+  # should contain every utility available unless you disable them.
+, enableDFHack ? stdenvNoCC.isLinux
+, enableTWBT ? enableDFHack
+, enableSoundSense ? true
+, enableStoneSense ? true
+, enableDwarfTherapist ? true
+, enableLegendsBrowser ? true
+, legends-browser
+, theme ? themes.phoebus
+  # General config options:
+, enableIntro ? true
+, enableTruetype ? null # defaults to 24, see init.txt
+, enableFPS ? false
+, enableTextMode ? false
+, enableSound ? true
+}:
+
+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-therapist = dwarf-fortress.dwarf-therapist;
+in
+buildEnv {
+  name = "dwarf-fortress-full";
+  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;
+
+  meta = with lib; {
+    description = "An opinionated wrapper for Dwarf Fortress";
+    maintainers = with maintainers; [ Baughn numinit ];
+    license = licenses.mit;
+    platforms = platforms.all;
+    homepage = "https://github.com/NixOS/nixpkgs/";
+  };
+}
diff --git a/nixpkgs/pkgs/games/dwarf-fortress/legends-browser/default.nix b/nixpkgs/pkgs/games/dwarf-fortress/legends-browser/default.nix
new file mode 100644
index 000000000000..3484db0cc8ff
--- /dev/null
+++ b/nixpkgs/pkgs/games/dwarf-fortress/legends-browser/default.nix
@@ -0,0 +1,37 @@
+{ lib, buildEnv, writeShellScriptBin, fetchurl, jre }:
+
+let
+  name = "legends-browser-${version}";
+  version = "1.17.1";
+
+  jar = fetchurl {
+    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/"
+    mkdir -p "$BASE"
+    cd "$BASE"
+    if [[ ! -e legendsbrowser.properties ]]; then
+      echo 'Creating initial configuration for legends-browser'
+      echo "last=$(cd ..; pwd)" > legendsbrowser.properties
+    fi
+    ${jre}/bin/java -jar ${jar}
+  '';
+in
+
+buildEnv {
+  inherit name;
+  paths = [ script ];
+
+  meta = with lib; {
+    description = "A multi-platform, open source, java-based legends viewer for dwarf fortress";
+    maintainers = with maintainers; [ Baughn ];
+    sourceProvenance = with sourceTypes; [ binaryBytecode ];
+    license = licenses.mit;
+    platforms = platforms.all;
+    homepage = "https://github.com/robertjanetzko/LegendsBrowser";
+  };
+}
diff --git a/nixpkgs/pkgs/games/dwarf-fortress/soundsense.nix b/nixpkgs/pkgs/games/dwarf-fortress/soundsense.nix
new file mode 100644
index 000000000000..8ed1e7be1b20
--- /dev/null
+++ b/nixpkgs/pkgs/games/dwarf-fortress/soundsense.nix
@@ -0,0 +1,37 @@
+{ stdenv
+, fetchzip
+, dos2unix
+, soundPack ? stdenv.mkDerivation {
+    name = "soundsense-soundpack";
+    src = fetchzip {
+      url = "http://df.zweistein.cz/soundsense/soundpack.zip";
+      sha256 = "0qz0mjkp7wp0gxk3ws2x760awv8c9lkacj2fn9bz3gqqnq262ffa";
+    };
+    installPhase = ''
+      cp -r . $out
+    '';
+  }
+}:
+
+stdenv.mkDerivation rec {
+  version = "2016-1_196";
+  dfVersion = "0.44.12";
+  inherit soundPack;
+  pname = "soundsense";
+  src = fetchzip {
+    url = "http://df.zweistein.cz/soundsense/soundSense_${version}.zip";
+    sha256 = "1gkrs69l3xsh858yjp204ddp29m668j630akm7arssc9359wxqkk";
+  };
+  nativeBuildInputs = [ dos2unix ];
+  buildPhase = ''
+    dos2unix soundSense.sh
+    chmod +x soundSense.sh
+  '';
+  installPhase = ''
+    mkdir $out
+    cp -R . $out/soundsense
+    ln -s $out/soundsense/dfhack $out/hack
+    ln -s $soundPack $out/soundsense/packs
+  '';
+  passthru = { inherit version dfVersion; };
+}
diff --git a/nixpkgs/pkgs/games/dwarf-fortress/themes/default.nix b/nixpkgs/pkgs/games/dwarf-fortress/themes/default.nix
new file mode 100644
index 000000000000..d2e2ec5fd19b
--- /dev/null
+++ b/nixpkgs/pkgs/games/dwarf-fortress/themes/default.nix
@@ -0,0 +1,21 @@
+{ lib, fetchFromGitHub, ... }:
+
+with builtins;
+
+listToAttrs (map
+  (v: {
+    inherit (v) name;
+    value = fetchFromGitHub {
+      name = "${v.name}-theme-${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)))
diff --git a/nixpkgs/pkgs/games/dwarf-fortress/themes/themes.json b/nixpkgs/pkgs/games/dwarf-fortress/themes/themes.json
new file mode 100644
index 000000000000..1b2449addf40
--- /dev/null
+++ b/nixpkgs/pkgs/games/dwarf-fortress/themes/themes.json
@@ -0,0 +1,87 @@
+[
+  {
+    "name": "afro-graphics",
+    "version": "47.05",
+    "sha256": "0gqrxb4bbx1h93xjz4ygd7yp8g5barj2zc6y7xvr94ww8b9a2r28"
+  },
+  {
+    "name": "autoreiv",
+    "version": "47.01",
+    "sha256": "1c2xchlfq7ajpcq8qgrzkw5yfgm0k3fiwq6n7l4724dlbim3rjp2"
+  },
+  {
+    "name": "cla",
+    "version": "0.47.xx-v26.3",
+    "sha256": "0ca81r3821jja4pqib75qxcsgg3s0wxzyq1jb4jc0495cvzxw7qa"
+  },
+  {
+    "name": "dfgraphics",
+    "version": "42.05",
+    "sha256": "18xyqn458hh8l2qgbvrvz17nbp6yk91d7rqlxlp1g5wr9qfq28rp"
+  },
+  {
+    "name": "gemset",
+    "version": "47.05",
+    "sha256": "1ivsbj71w3zwxnaz0405xhqhn4yzdfziijc0s0vmbmcphhhqnjaj"
+  },
+  {
+    "name": "ironhand",
+    "version": "47.05",
+    "sha256": "003yrwishkzf6nvr6xlldbnd3x7rf5ds7l91mc0npdq1lcl0br9w"
+  },
+  {
+    "name": "jolly-bastion",
+    "version": "47.04",
+    "sha256": "0799ad90g62nvpdcl6zq3vr2nvfc62lprm4br9n2hbs8wgrra6rq"
+  },
+  {
+    "name": "mayday",
+    "version": "47.05",
+    "sha256": "17sdvr9a98xx5r2nrr3m4jlddvlb4h6qlch8r23g9g4mj0hsifnj"
+  },
+  {
+    "name": "meph",
+    "version": "47.05_v5.5.1-V",
+    "sha256": "1kiqxiqw686dii5x7zav2nsw15csg0grv4h8hrb764rl4fw6x9nl"
+  },
+  {
+    "name": "obsidian",
+    "version": "47.05",
+    "sha256": "1dkwdwm52fsj4gqqqr5vppbsk8a4kd3i7d3qawawgl0qn6q139xs"
+  },
+  {
+    "name": "phoebus",
+    "version": "47.05",
+    "sha256": "18pn3dqyk9hp82gva92c6y3vk52s366rrx74rdnvahswdr5dmq4d"
+  },
+  {
+    "name": "rally-ho",
+    "version": "47.05",
+    "sha256": "1h3jqq0yq2rbzbl70sq85lgdpwswczpay16kqfwq1n8zdisl4gqn"
+  },
+  {
+    "name": "spacefox",
+    "version": "47.05a",
+    "sha256": "1y1rbsxr1m0mb2k02q6gh24c4nyqc9lw98dvfckp2bzc5f9cx3ks"
+  },
+  {
+    "name": "taffer",
+    "version": "47.04",
+    "sha256": "1ly2sc0pb2kybb8grj19zx372whblmd0bj8p64akpi2rrywi13sy"
+  },
+  {
+    "name": "tergel",
+    "version": "47.01",
+    "sha256": "142sd1i11vvirn68rp4gqzl67ww597df1lc57ycnpnz0n3q39kxy"
+  },
+  {
+    "name": "vettlingr",
+    "version": "47.05",
+    "sha256": "0s1vy3ssp1hk8f6wlkz09xy5v747dpbsgw5vi6i1mq3lnlcy68vq"
+  },
+  {
+    "name": "wanderlust",
+    "version": "47.04",
+    "sha256": "1z56m8zplq5d18sbkwg5lwcy8iwfa5hbxixsm3hdxm04qyld1z89"
+  }
+]
diff --git a/nixpkgs/pkgs/games/dwarf-fortress/themes/update.sh b/nixpkgs/pkgs/games/dwarf-fortress/themes/update.sh
new file mode 100755
index 000000000000..1b652bf49943
--- /dev/null
+++ b/nixpkgs/pkgs/games/dwarf-fortress/themes/update.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env nix-shell
+#! nix-shell -i bash -p jq nix coreutils curl nix-prefetch-git
+
+curl "https://api.github.com/users/dfgraphics/repos" | jq -r '.[].name | ascii_downcase' | while read repo; do
+    version="$(curl "https://api.github.com/repos/DFgraphics/${repo}/releases/latest" | jq -r .tag_name)"
+    sha256="$(nix-prefetch-git "https://github.com/DFgraphics/${repo}" "${version}" | jq -r ".sha256")"
+    echo "{}" | jq ".name=\"${repo}\" | .version=\"${version}\" | .sha256=\"${sha256}\""
+done | jq -s . > themes.json
diff --git a/nixpkgs/pkgs/games/dwarf-fortress/twbt/default.nix b/nixpkgs/pkgs/games/dwarf-fortress/twbt/default.nix
new file mode 100644
index 000000000000..311a36da2bf1
--- /dev/null
+++ b/nixpkgs/pkgs/games/dwarf-fortress/twbt/default.nix
@@ -0,0 +1,85 @@
+{ stdenvNoCC
+, lib
+, fetchurl
+, unzip
+, dfVersion
+}:
+
+with lib;
+
+let
+  twbt-releases = {
+    "0.44.10" = {
+      twbtRelease = "6.49";
+      sha256 = "1qjkc7k33qhxj2g18njzasccjqsis5y8zrw5vl90h4rs3i8ld9xz";
+      prerelease = false;
+    };
+    "0.44.11" = {
+      twbtRelease = "6.51";
+      sha256 = "1yclqmarjd97ch054h425a12r8a5ailmflsd7b39cg4qhdr1nii5";
+      prerelease = true;
+    };
+    "0.44.12" = {
+      twbtRelease = "6.54";
+      sha256 = "10gfd6vv0vk4v1r5hjbz7vf1zqys06dsad695gysc7fbcik2dakh";
+      prerelease = false;
+    };
+    "0.47.02" = {
+      twbtRelease = "6.61";
+      sha256 = "07bqy9rkd64h033sxdpigp5zq4xrr0xd36wdr1b21g649mv8j6yw";
+      prerelease = false;
+    };
+    "0.47.04" = {
+      twbtRelease = "6.xx";
+      dfhackRelease = "0.47.04-r5";
+      sha256 = "sha256-+C3g4KJShCb2VXGQ4mtkDOufXZQ1P+ebDTmUzL3tNyU=";
+      prerelease = true;
+    };
+    "0.47.05" = {
+      twbtRelease = "6.xx";
+      dfhackRelease = "0.47.05-r7";
+      sha256 = "sha256-4xMKuSP5J6pMK+hwjTAcTI0gsLJfw+Xt+vh9CopR4tk=";
+      prerelease = true;
+    };
+  };
+
+  release =
+    if hasAttr dfVersion twbt-releases
+    then getAttr dfVersion twbt-releases
+    else throw "[TWBT] Unsupported Dwarf Fortress version: ${dfVersion}";
+in
+
+stdenvNoCC.mkDerivation rec {
+  pname = "twbt";
+  version = release.twbtRelease;
+
+  src = fetchurl {
+    url =
+      if version == "6.xx" then
+        "https://github.com/thurin/df-twbt/releases/download/${release.dfhackRelease}/twbt-${version}-linux64-${release.dfhackRelease}.zip"
+      else
+        "https://github.com/mifki/df-twbt/releases/download/v${version}/twbt-${version}-linux.zip";
+    sha256 = release.sha256;
+  };
+
+  sourceRoot = ".";
+
+  outputs = [ "lib" "art" "out" ];
+
+  nativeBuildInputs = [ unzip ];
+
+  installPhase = ''
+    mkdir -p $lib/hack/{plugins,lua} $art/data/art
+    cp -a */twbt.plug.so $lib/hack/plugins/
+    cp -a *.lua $lib/hack/lua/
+    cp -a *.png $art/data/art/
+  '';
+
+  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;
+    platforms = platforms.linux;
+    homepage = "https://github.com/mifki/df-twbt";
+  };
+}
diff --git a/nixpkgs/pkgs/games/dwarf-fortress/unfuck.nix b/nixpkgs/pkgs/games/dwarf-fortress/unfuck.nix
new file mode 100644
index 000000000000..9b7de93ecd7d
--- /dev/null
+++ b/nixpkgs/pkgs/games/dwarf-fortress/unfuck.nix
@@ -0,0 +1,134 @@
+{ stdenv
+, lib
+, fetchFromGitHub
+, cmake
+, libGL
+, libSM
+, SDL
+, SDL_image
+, SDL_ttf
+, glew
+, openalSoft
+, ncurses
+, glib
+, gtk2
+, gtk3
+, libsndfile
+, zlib
+, dfVersion
+, pkg-config
+}:
+
+with lib;
+
+let
+  unfuck-releases = {
+    "0.43.05" = {
+      unfuckRelease = "0.43.05";
+      sha256 = "173dyrbxlzqvjf1j3n7vpns4gfjkpyvk9z16430xnmd5m6nda8p2";
+    };
+    "0.44.05" = {
+      unfuckRelease = "0.44.05";
+      sha256 = "00yj4l4gazxg4i6fj9rwri6vm17i6bviy2mpkx0z5c0mvsr7s14b";
+    };
+    "0.44.09" = {
+      unfuckRelease = "0.44.09";
+      sha256 = "138p0v8z2x47f0fk9k6g75ikw5wb3vxldwv5ggbkf4hhvlw6lvzm";
+    };
+    "0.44.10" = {
+      unfuckRelease = "0.44.10";
+      sha256 = "0vb19qx2ibc79j4bgbk9lskb883qfb0815zw1dfz9k7rqwal8mzj";
+    };
+    "0.44.11" = {
+      unfuckRelease = "0.44.11.1";
+      sha256 = "1kszkb1d1vll8p04ja41nangsaxb5lv4p3xh2jhmsmipfixw7nvz";
+    };
+    "0.44.12" = {
+      unfuckRelease = "0.44.12";
+      sha256 = "1kszkb1d1vll8p04ja41nangsaxb5lv4p3xh2jhmsmipfixw7nvz";
+    };
+    "0.47.01" = {
+      unfuckRelease = "0.47.01";
+      sha256 = "11xvb3qh4crdf59pwfwpi73rzm3ysd1r1xp2k1jp7527jmqapk4k";
+    };
+    "0.47.02" = {
+      unfuckRelease = "0.47.01";
+      sha256 = "11xvb3qh4crdf59pwfwpi73rzm3ysd1r1xp2k1jp7527jmqapk4k";
+    };
+    "0.47.04" = {
+      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}";
+in
+
+stdenv.mkDerivation {
+  pname = "dwarf_fortress_unfuck";
+  version = release.unfuckRelease;
+
+  src = fetchFromGitHub {
+    owner = "svenstaro";
+    repo = "dwarf_fortress_unfuck";
+    rev = release.unfuckRelease;
+    sha256 = release.sha256;
+  };
+
+  postPatch = ''
+    # https://github.com/svenstaro/dwarf_fortress_unfuck/pull/27
+    substituteInPlace CMakeLists.txt --replace \''${GLEW_LIBRARIES} GLEW::glew
+  '';
+
+  cmakeFlags = [
+    "-DGTK2_GLIBCONFIG_INCLUDE_DIR=${glib.out}/lib/glib-2.0/include"
+    "-DGTK2_GDKCONFIG_INCLUDE_DIR=${gtk2.out}/lib/gtk-2.0/include"
+  ];
+
+  nativeBuildInputs = [ cmake pkg-config ];
+  buildInputs = [
+    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;
+
+  installPhase = ''
+    install -D -m755 ../build/libgraphics.so $out/lib/libgraphics.so
+  '';
+
+  # Breaks dfhack because of inlining.
+  hardeningDisable = [ "fortify" ];
+
+  passthru = { inherit dfVersion; };
+
+  meta = with lib; {
+    description = "Unfucked multimedia layer for Dwarf Fortress";
+    homepage = "https://github.com/svenstaro/dwarf_fortress_unfuck";
+    license = licenses.free;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ abbradar numinit ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/dwarf-fortress/update.sh b/nixpkgs/pkgs/games/dwarf-fortress/update.sh
new file mode 100755
index 000000000000..5b99dff8aa77
--- /dev/null
+++ b/nixpkgs/pkgs/games/dwarf-fortress/update.sh
@@ -0,0 +1,42 @@
+#!/usr/bin/env nix-shell
+#! nix-shell -i bash -p jq nix coreutils curl
+
+# systems to generate hashes for
+systems='linux linux32 osx osx32
+     win win_s win32 win32_s
+         legacy legacy_s legacy32 legacy32_s'
+
+if [ $# -eq 0 ]; then
+    versions="$(curl http://www.bay12games.com/dwarves/ \
+           | grep 'DWARF FORTRESS CLASSIC ' \
+           | sed 's/.*DWARF FORTRESS CLASSIC \([0-9.]*\) .*/\1/')"
+else
+    versions="$@"
+fi
+
+tmp1="$(mktemp)"
+tmp2="$(mktemp)"
+for version in $versions; do
+    for system in $systems; do
+    echo -n $version,$system,
+    ver=$(echo $version | sed -e s,^0\.,, | tr . _)
+    if [[ "$system" = *win* ]] || [[ "$system" = *legacy* ]]; then
+        ext=zip
+    else
+        ext=tar.bz2
+    fi
+    nix-prefetch-url \
+        http://www.bay12games.com/dwarves/df_${ver}_${system}.${ext}
+    done
+done | jq --slurp --raw-input \
+      'split("\n")  | .[:-1] | map(split(",")) |
+           map({ "version": .[0], "platform": .[1], "sha256": .[2] }) |
+       group_by(.version) |
+       map(map({"version": .version, (.platform): .sha256}) | add |
+           {(.version): .} | map_values(del(.version))) | add' \
+      > "$tmp1"
+
+# Append $tmp1 to game.json. There should be a better way to handle
+# this but all other attempts failed for me.
+jq -M --slurpfile a "$tmp1" '. + $a[]' < "$(dirname "$0")/game.json" > "$tmp2"
+cat "$tmp2" > "$(dirname "$0")/game.json"
diff --git a/nixpkgs/pkgs/games/dwarf-fortress/wrapper/default.nix b/nixpkgs/pkgs/games/dwarf-fortress/wrapper/default.nix
new file mode 100644
index 000000000000..a4433821d20d
--- /dev/null
+++ b/nixpkgs/pkgs/games/dwarf-fortress/wrapper/default.nix
@@ -0,0 +1,182 @@
+{ stdenv
+, lib
+, buildEnv
+, substituteAll
+, runCommand
+, coreutils
+, gawk
+, dwarf-fortress
+, dwarf-therapist
+, enableDFHack ? false
+, dfhack
+, enableSoundSense ? false
+, soundSense
+, jdk
+, enableStoneSense ? false
+, enableTWBT ? false
+, twbt
+, themes ? { }
+, theme ? null
+, extraPackages ? [ ]
+  # General config options:
+, enableIntro ? true
+, enableTruetype ? null # defaults to 24, see init.txt
+, enableFPS ? false
+, enableTextMode ? false
+, enableSound ? true
+# An attribute set of settings to override in data/init/*.txt.
+# For example, `init.FOO = true;` is translated to `[FOO:YES]` in init.txt
+, settings ? { }
+# TODO world-gen.txt, interface.txt require special logic
+}:
+
+let
+  dfhack_ = dfhack.override {
+    inherit enableStoneSense;
+  };
+
+  ptheme =
+    if builtins.isString theme
+    then builtins.getAttr theme themes
+    else theme;
+
+  baseEnv = buildEnv {
+    name = "dwarf-fortress-base-env-${dwarf-fortress.dfVersion}";
+
+    # These are in inverse order for first packages to override the next ones.
+    paths = extraPackages
+         ++ lib.optional (theme != null) ptheme
+         ++ lib.optional enableDFHack dfhack_
+         ++ lib.optional enableSoundSense soundSense
+         ++ lib.optionals enableTWBT [ twbt.lib twbt.art ]
+         ++ [ dwarf-fortress ];
+
+    ignoreCollisions = true;
+  };
+
+  settings_ = lib.recursiveUpdate {
+    init = {
+      PRINT_MODE =
+        if enableTextMode then "TEXT"
+        else if enableTWBT then "TWBT"
+        else if stdenv.hostPlatform.isDarwin then "STANDARD" # https://www.bay12games.com/dwarves/mantisbt/view.php?id=11680
+        else null;
+      INTRO = enableIntro;
+      TRUETYPE = enableTruetype;
+      FPS = enableFPS;
+      SOUND = enableSound;
+    };
+  } settings;
+
+  forEach = attrs: f: lib.concatStrings (lib.mapAttrsToList f attrs);
+
+  toTxt = v:
+    if lib.isBool v then if v then "YES" else "NO"
+    else if lib.isInt v then toString v
+    else if lib.isString v then v
+    else throw "dwarf-fortress: unsupported configuration value ${toString v}";
+
+  config = runCommand "dwarf-fortress-config" {
+    nativeBuildInputs = [ gawk ];
+  } (''
+    mkdir -p $out/data/init
+
+    edit_setting() {
+      v=''${v//'&'/'\&'}
+      if ! gawk -i inplace -v RS='\r?\n' '
+        { n += sub("\\[" ENVIRON["k"] ":[^]]*\\]", "[" ENVIRON["k"] ":" ENVIRON["v"] "]"); print }
+        END { exit(!n) }
+      ' "$out/$file"; then
+        echo "error: no setting named '$k' in $file" >&2
+        exit 1
+      fi
+    }
+  '' + forEach settings_ (file: kv: ''
+    file=data/init/${lib.escapeShellArg file}.txt
+    cp ${baseEnv}/"$file" "$out/$file"
+  '' + forEach kv (k: v: lib.optionalString (v != null) ''
+    export k=${lib.escapeShellArg k} v=${lib.escapeShellArg (toTxt v)}
+    edit_setting
+  '')) + lib.optionalString enableDFHack ''
+    mkdir -p $out/hack
+
+    # Patch the MD5
+    orig_md5=$(< "${dwarf-fortress}/hash.md5.orig")
+    patched_md5=$(< "${dwarf-fortress}/hash.md5")
+    input_file="${dfhack_}/hack/symbols.xml"
+    output_file="$out/hack/symbols.xml"
+
+    echo "[DFHack Wrapper] Fixing Dwarf Fortress MD5:"
+    echo "  Input:   $input_file"
+    echo "  Search:  $orig_md5"
+    echo "  Output:  $output_file"
+    echo "  Replace: $patched_md5"
+
+    substitute "$input_file" "$output_file" --replace "$orig_md5" "$patched_md5"
+  '');
+
+  # This is a separate environment because the config files to modify may come
+  # from any of the paths in baseEnv.
+  env = buildEnv {
+    name = "dwarf-fortress-env-${dwarf-fortress.dfVersion}";
+    paths = [ config baseEnv ];
+    ignoreCollisions = true;
+  };
+in
+
+lib.throwIf (enableTWBT && !enableDFHack) "dwarf-fortress: TWBT requires DFHack to be enabled"
+lib.throwIf (enableStoneSense && !enableDFHack) "dwarf-fortress: StoneSense requires DFHack to be enabled"
+lib.throwIf (enableTextMode && enableTWBT) "dwarf-fortress: text mode and TWBT are mutually exclusive"
+
+stdenv.mkDerivation {
+  pname = "dwarf-fortress";
+  version = dwarf-fortress.dfVersion;
+
+  dfInit = substituteAll {
+    name = "dwarf-fortress-init";
+    src = ./dwarf-fortress-init.in;
+    inherit env;
+    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;
+  runDFHack = ./dfhack.in;
+  runSoundSense = ./soundSense.in;
+
+  passthru = {
+    inherit dwarf-fortress dwarf-therapist twbt env;
+    dfhack = dfhack_;
+  };
+
+  buildCommand = ''
+    mkdir -p $out/bin
+
+    substitute $runDF $out/bin/dwarf-fortress \
+      --subst-var-by stdenv_shell ${stdenv.shell} \
+      --subst-var dfInit
+    chmod 755 $out/bin/dwarf-fortress
+  '' + lib.optionalString enableDFHack ''
+    substitute $runDFHack $out/bin/dfhack \
+      --subst-var-by stdenv_shell ${stdenv.shell} \
+      --subst-var dfInit
+    chmod 755 $out/bin/dfhack
+  '' + lib.optionalString enableSoundSense ''
+    substitute $runSoundSense $out/bin/soundsense \
+      --subst-var-by stdenv_shell ${stdenv.shell} \
+      --subst-var-by jre ${jdk.jre} \
+      --subst-var dfInit
+    chmod 755 $out/bin/soundsense
+  '';
+
+  preferLocalBuild = true;
+
+  inherit (dwarf-fortress) meta;
+}
diff --git a/nixpkgs/pkgs/games/dwarf-fortress/wrapper/dfhack.in b/nixpkgs/pkgs/games/dwarf-fortress/wrapper/dfhack.in
new file mode 100755
index 000000000000..0f74674baf29
--- /dev/null
+++ b/nixpkgs/pkgs/games/dwarf-fortress/wrapper/dfhack.in
@@ -0,0 +1,11 @@
+#!@stdenv_shell@ -e
+
+source @dfInit@
+
+for i in *.init *.init-example dfhack-config/default dfhack-config/init hack/* stonesense/*; do
+  if [ -e "$i" ]; then update_path "$i"; fi
+done
+
+cd "$DF_DIR"
+LD_LIBRARY_PATH="$env_dir/hack/libs:$env_dir/hack${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH" \
+  LD_PRELOAD="$env_dir/hack/libdfhack.so:$LD_PRELOAD" exec $env_dir/libs/Dwarf_Fortress "$@"
diff --git a/nixpkgs/pkgs/games/dwarf-fortress/wrapper/dwarf-fortress-init.in b/nixpkgs/pkgs/games/dwarf-fortress/wrapper/dwarf-fortress-init.in
new file mode 100644
index 000000000000..27639e57f212
--- /dev/null
+++ b/nixpkgs/pkgs/games/dwarf-fortress/wrapper/dwarf-fortress-init.in
@@ -0,0 +1,45 @@
+#!@stdenv_shell@ -e
+shopt -s extglob
+
+[ -z "$DF_DIR" ] && export DF_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/df_linux"
+env_dir="@env@"
+exe="$env_dir/@exe@"
+
+update_path() {
+  local path="$1"
+
+  @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"
+  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"
+
+@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.
+
+EOF
+
+cd "$env_dir"
+for i in data/init/* data/!(init|index|announcement) raw; do
+  update_path "$i"
+done
+
+forcecopy_path data/index
+# For some reason, it's needed to be writable...
+forcecopy_path data/announcement
+forcecopy_path data/help
+forcecopy_path data/dipscript
diff --git a/nixpkgs/pkgs/games/dwarf-fortress/wrapper/dwarf-fortress.in b/nixpkgs/pkgs/games/dwarf-fortress/wrapper/dwarf-fortress.in
new file mode 100644
index 000000000000..4448bd05fda5
--- /dev/null
+++ b/nixpkgs/pkgs/games/dwarf-fortress/wrapper/dwarf-fortress.in
@@ -0,0 +1,9 @@
+#!@stdenv_shell@ -e
+
+source @dfInit@
+
+export DYLD_LIBRARY_PATH="$env_dir/libs"
+export DYLD_FRAMEWORK_PATH="$env_dir/libs"
+
+cd "$DF_DIR"
+exec "$exe" "$@"
diff --git a/nixpkgs/pkgs/games/dwarf-fortress/wrapper/soundSense.in b/nixpkgs/pkgs/games/dwarf-fortress/wrapper/soundSense.in
new file mode 100644
index 000000000000..28357ed7579f
--- /dev/null
+++ b/nixpkgs/pkgs/games/dwarf-fortress/wrapper/soundSense.in
@@ -0,0 +1,10 @@
+#!@stdenv_shell@ -e
+
+source @dfInit@
+
+for p in soundsense/*; do
+  update_path "$p"
+done
+
+cd "$DF_DIR"
+PATH=@jre@/bin exec $DF_DIR/soundsense/soundSense.sh
diff --git a/nixpkgs/pkgs/games/dxx-rebirth/assets.nix b/nixpkgs/pkgs/games/dxx-rebirth/assets.nix
new file mode 100644
index 000000000000..b214d49659b6
--- /dev/null
+++ b/nixpkgs/pkgs/games/dxx-rebirth/assets.nix
@@ -0,0 +1,55 @@
+{ lib, stdenv, requireFile, gogUnpackHook }:
+
+let
+  generic = ver: source: let
+    pname = "descent${toString ver}";
+  in stdenv.mkDerivation rec {
+    name = "${pname}-assets-${version}";
+    version = "2.0.0.7";
+
+    src = requireFile rec {
+      name = "setup_descent12_${version}.exe";
+      sha256 = "1r1drbfda6czg21f9qqiiwgnkpszxgmcn5bafp5ljddh34swkn3f";
+      message = ''
+        While the Descent ${toString ver} game engine is free, the game assets are not.
+
+        Please purchase the game on gog.com and download the Windows installer.
+
+        Once you have downloaded the file, please use the following command and re-run the
+        installation:
+
+        nix-prefetch-url file://\$PWD/${name}
+      '';
+    };
+
+    nativeBuildInputs = [ gogUnpackHook ];
+
+    dontBuild = true;
+    dontFixup = true;
+
+    installPhase = ''
+      runHook preInstall
+
+      mkdir -p $out/share/{games/${pname},doc/${pname}/examples}
+      pushd "app/${source}"
+      mv dosbox*.conf $out/share/doc/${pname}/examples
+      mv *.txt *.pdf  $out/share/doc/${pname}
+      cp -r * $out/share/games/descent${toString ver}
+      popd
+
+      runHook postInstall
+    '';
+
+    meta = with lib; {
+      description = "Descent ${toString ver} assets from GOG";
+      homepage    = "https://www.dxx-rebirth.com/";
+      license     = licenses.unfree;
+      maintainers = with maintainers; [ peterhoeg ];
+      hydraPlatforms = [];
+    };
+  };
+
+in {
+  descent1-assets = generic 1 "descent";
+  descent2-assets = generic 2 "descent 2";
+}
diff --git a/nixpkgs/pkgs/games/dxx-rebirth/default.nix b/nixpkgs/pkgs/games/dxx-rebirth/default.nix
new file mode 100644
index 000000000000..95cf0918b52c
--- /dev/null
+++ b/nixpkgs/pkgs/games/dxx-rebirth/default.nix
@@ -0,0 +1,59 @@
+{ lib, stdenv
+, fetchFromGitHub
+, fetchurl
+, fetchpatch
+, scons
+, pkg-config
+, SDL2
+, SDL2_image
+, SDL2_mixer
+, libGLU
+, libGL
+, libpng
+, physfs
+}:
+
+let
+  music = fetchurl {
+    url = "https://www.dxx-rebirth.com/download/dxx/res/d2xr-sc55-music.dxa";
+    sha256 = "05mz77vml396mff43dbs50524rlm4fyds6widypagfbh5hc55qdc";
+  };
+
+in
+stdenv.mkDerivation rec {
+  pname = "dxx-rebirth";
+  version = "unstable-2023-03-23";
+
+  src = fetchFromGitHub {
+    owner = "dxx-rebirth";
+    repo = "dxx-rebirth";
+    rev = "841ebcc11d249febe48911bc239606ade3bd78b3";
+    hash = "sha256-cr5QdkKO/HNvtc2w4ynJixuLauhPCwtsSC3UEV7+C1A=";
+  };
+
+  nativeBuildInputs = [ pkg-config scons ];
+
+  buildInputs = [ libGLU libGL libpng physfs SDL2 SDL2_image SDL2_mixer ];
+
+  enableParallelBuilding = true;
+
+  sconsFlags = [ "sdl2=1" ];
+
+  env.NIX_CFLAGS_COMPILE = toString [
+    "-Wno-format-nonliteral"
+    "-Wno-format-truncation"
+  ];
+
+  postInstall = ''
+    install -Dm644 ${music} $out/share/games/dxx-rebirth/${music.name}
+    install -Dm644 -t $out/share/doc/dxx-rebirth *.txt
+  '';
+
+  meta = with lib; {
+    description = "Source Port of the Descent 1 and 2 engines";
+    homepage = "https://www.dxx-rebirth.com/";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ peterhoeg ];
+    platforms = with platforms; linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/dxx-rebirth/full.nix b/nixpkgs/pkgs/games/dxx-rebirth/full.nix
new file mode 100644
index 000000000000..f3349c114eed
--- /dev/null
+++ b/nixpkgs/pkgs/games/dxx-rebirth/full.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, makeWrapper
+, dxx-rebirth, descent1-assets, descent2-assets }:
+
+let
+  generic = ver: assets: stdenv.mkDerivation {
+    name = "d${toString ver}x-rebirth-full-${assets.version}";
+
+    nativeBuildInputs = [ makeWrapper ];
+
+    buildCommand = ''
+      mkdir -p $out/bin
+
+      makeWrapper ${dxx-rebirth}/bin/d${toString ver}x-rebirth $out/bin/descent${toString ver} \
+        --add-flags "-hogdir ${assets}/share/games/descent${toString ver}"
+    '';
+
+    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 ];
+      maintainers = with maintainers; [ peterhoeg ];
+      platforms   = with platforms; linux;
+      hydraPlatforms = [];
+    };
+  };
+
+in {
+  d1x-rebirth-full = generic 1 descent1-assets;
+  d2x-rebirth-full = generic 2 descent2-assets;
+}
diff --git a/nixpkgs/pkgs/games/easyrpg-player/default.nix b/nixpkgs/pkgs/games/easyrpg-player/default.nix
new file mode 100644
index 000000000000..ea68c3a110e2
--- /dev/null
+++ b/nixpkgs/pkgs/games/easyrpg-player/default.nix
@@ -0,0 +1,135 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, fetchpatch
+, cmake
+, doxygen
+, pkg-config
+, freetype
+, fmt
+, glib
+, harfbuzz
+, liblcf
+, libpng
+, libsndfile
+, libvorbis
+, libxmp
+, libXcursor
+, libXext
+, libXi
+, libXinerama
+, libXrandr
+, libXScrnSaver
+, libXxf86vm
+, mpg123
+, opusfile
+, pcre
+, pixman
+, SDL2
+, speexdsp
+, wildmidi
+, zlib
+, libdecor
+, alsa-lib
+, asciidoctor
+, Foundation
+, AudioUnit
+, AudioToolbox
+}:
+
+stdenv.mkDerivation rec {
+  pname = "easyrpg-player";
+  version = "0.8";
+
+  src = fetchFromGitHub {
+    owner = "EasyRPG";
+    repo = "Player";
+    rev = version;
+    hash = "sha256-t0sa9ONVVfsiTy+us06vU2bMa4QmmQeYxU395g0WS6w=";
+  };
+
+  patches = [
+    # Fixed compatibility with fmt > 9
+    # Remove when version > 0.8
+    (fetchpatch {
+      name = "0001-Fix-building-with-fmtlib-10.patch";
+      url = "https://github.com/EasyRPG/Player/commit/ab6286f6d01bada649ea52d1f0881dde7db7e0cf.patch";
+      hash = "sha256-GdSdVFEG1OJCdf2ZIzTP+hSrz+ddhTMBvOPjvYQHy54=";
+    })
+  ];
+
+  strictDeps = true;
+
+  nativeBuildInputs = [
+    asciidoctor
+    cmake
+    doxygen
+    pkg-config
+  ];
+
+  buildInputs = [
+    fmt
+    freetype
+    glib
+    harfbuzz
+    liblcf
+    libpng
+    libsndfile
+    libvorbis
+    libxmp
+    mpg123
+    opusfile
+    pcre
+    pixman
+    SDL2
+    speexdsp
+    zlib
+  ] ++ lib.optionals stdenv.hostPlatform.isLinux [
+    alsa-lib
+    libXcursor
+    libXext
+    libXi
+    libXinerama
+    libXrandr
+    libXScrnSaver
+    libXxf86vm
+    libdecor
+    wildmidi # until packaged on Darwin
+  ] ++ lib.optionals stdenv.hostPlatform.isDarwin [
+    Foundation
+    AudioUnit
+    AudioToolbox
+  ];
+
+  cmakeFlags = [
+    "-DPLAYER_ENABLE_TESTS=${lib.boolToString doCheck}"
+  ];
+
+  makeFlags = [
+    "all"
+    "man"
+  ];
+
+  buildFlags = lib.optionals doCheck [
+    "test_runner_player"
+  ];
+
+  postInstall = lib.optionalString stdenv.hostPlatform.isDarwin ''
+    mkdir $out/bin
+    mv Package $out/Applications
+    ln -s $out/{Applications/EasyRPG\ Player.app/Contents/MacOS,bin}/EasyRPG\ Player
+  '';
+
+  doCheck = stdenv.buildPlatform.canExecute stdenv.hostPlatform;
+
+  enableParallelChecking = true;
+
+  meta = with lib; {
+    description = "RPG Maker 2000/2003 and EasyRPG games interpreter";
+    homepage = "https://easyrpg.org/";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ yana ];
+    platforms = platforms.all;
+    mainProgram = lib.optionalString stdenv.hostPlatform.isDarwin "EasyRPG Player";
+  };
+}
diff --git a/nixpkgs/pkgs/games/eboard/default.nix b/nixpkgs/pkgs/games/eboard/default.nix
new file mode 100644
index 000000000000..0250208fd48a
--- /dev/null
+++ b/nixpkgs/pkgs/games/eboard/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, fetchurl, perl, pkg-config, gtk2 }:
+
+stdenv.mkDerivation rec {
+  pname = "eboard";
+  version = "1.1.1";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/eboard/eboard-${version}.tar.bz2";
+    sha256 = "0vm25j1s2zg1lipwjv9qrcm877ikfmk1yh34i8f5l3bwd63115xd";
+  };
+
+  patches = [ ./eboard.patch ];
+
+  buildInputs = [ gtk2 ];
+  nativeBuildInputs = [ perl pkg-config ];
+
+  hardeningDisable = [ "format" ];
+
+  env.NIX_CFLAGS_COMPILE = "-fpermissive";
+
+  meta = {
+    homepage = "http://www.bergo.eng.br/eboard/";
+    description = "Chess interface for Unix-like systems";
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/eboard/eboard.patch b/nixpkgs/pkgs/games/eboard/eboard.patch
new file mode 100644
index 000000000000..f80c1b2f78d7
--- /dev/null
+++ b/nixpkgs/pkgs/games/eboard/eboard.patch
@@ -0,0 +1,16 @@
+--- a/cimg.cc	2014-05-25 02:41:58.000000000 -0500
++++ b/cimg.cc	2014-05-25 02:42:31.000000000 -0500
+@@ -94,11 +94,11 @@
+       ct == PNG_COLOR_TYPE_GRAY_ALPHA)
+     png_set_gray_to_rgb(pngp);
+
+-  alloc(pngp->width,pngp->height);
++  alloc(png_get_image_width(pngp, infp),png_get_image_height(pngp, infp));
+   if (!ok) { fclose(f); return; }
+   ok = 0;
+
+-  for(i=0;i<pngp->height;i++) {
++  for(i=0;i<png_get_image_height(pngp, infp);i++) {
+     png_read_row(pngp, (png_bytep) (&data[i*rowlen]), NULL);
+   }
+
diff --git a/nixpkgs/pkgs/games/ecwolf/default.nix b/nixpkgs/pkgs/games/ecwolf/default.nix
new file mode 100644
index 000000000000..542b414d8a45
--- /dev/null
+++ b/nixpkgs/pkgs/games/ecwolf/default.nix
@@ -0,0 +1,51 @@
+{ stdenv
+, lib
+, fetchFromBitbucket
+, cmake
+, copyDesktopItems
+, pkg-config
+, makeWrapper
+, zlib
+, bzip2
+, libjpeg
+, SDL2
+, SDL2_net
+, SDL2_mixer
+, gtk3
+}:
+
+stdenv.mkDerivation rec {
+  pname = "ecwolf";
+  version = "1.4.1";
+
+  src = fetchFromBitbucket {
+    owner = pname;
+    repo = pname;
+    rev = version;
+    sha256 = "V2pSP8i20zB50WtUMujzij+ISSupdQQ/oCYYrOaTU1g=";
+  };
+
+  nativeBuildInputs = [ cmake copyDesktopItems pkg-config ]
+    ++ lib.optionals stdenv.isDarwin [ makeWrapper ];
+  buildInputs = [ zlib bzip2 libjpeg SDL2 SDL2_net SDL2_mixer gtk3 ];
+
+  NIX_LDFLAGS = lib.optionalString stdenv.isDarwin "-framework AppKit";
+
+  # ECWolf installs its binary to the games/ directory, but Nix only adds bin/
+  # directories to the PATH.
+  postInstall = lib.optionalString stdenv.isLinux ''
+    mv "$out/games" "$out/bin"
+  '' + lib.optionalString stdenv.isDarwin ''
+    mkdir -p $out/{Applications,bin}
+    cp -R ecwolf.app $out/Applications
+    makeWrapper $out/{Applications/ecwolf.app/Contents/MacOS,bin}/ecwolf
+  '';
+
+  meta = with lib; {
+    description = "Enhanched SDL-based port of Wolfenstein 3D for various platforms";
+    homepage = "https://maniacsvault.net/ecwolf/";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ jayman2000 sander ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/games/eduke32/default.nix b/nixpkgs/pkgs/games/eduke32/default.nix
new file mode 100644
index 000000000000..051e097eb3a3
--- /dev/null
+++ b/nixpkgs/pkgs/games/eduke32/default.nix
@@ -0,0 +1,123 @@
+{ lib
+, stdenv
+, fetchurl
+, makeWrapper
+, pkg-config
+, nasm
+, makeDesktopItem
+, alsa-lib
+, flac
+, gtk2
+, libvorbis
+, libvpx
+, libGLU
+, libGL
+, SDL2
+, SDL2_mixer
+, AGL
+, Cocoa
+, GLUT
+, OpenGL
+}:
+
+let
+  desktopItem = makeDesktopItem {
+    name = "eduke32";
+    exec = "@out@/bin/${wrapper}";
+    comment = "Duke Nukem 3D port";
+    desktopName = "Enhanced Duke Nukem 3D";
+    genericName = "Duke Nukem 3D port";
+    categories = [ "Game" ];
+  };
+
+  wrapper = "eduke32-wrapper";
+
+in stdenv.mkDerivation rec {
+  pname = "eduke32";
+  version = "20230926";
+  rev = "10459";
+  revExtra = "8feaf6c25";
+
+  src = fetchurl {
+    url = "https://dukeworld.com/eduke32/synthesis/${version}-${rev}-${revExtra}/eduke32_src_${version}-${rev}-${revExtra}.tar.xz";
+    hash = "sha256-GQOpDQm2FeaOMyYu9L5zhrM6XFvZAHMAwn1tSK7RCB8=";
+  };
+
+  buildInputs = [
+    flac
+    libvorbis
+    libvpx
+    SDL2
+    SDL2_mixer
+  ] ++ lib.optionals stdenv.isLinux [
+    alsa-lib
+    gtk2
+    libGL
+    libGLU
+  ] ++ lib.optionals stdenv.isDarwin [
+    AGL
+    Cocoa
+    GLUT
+    OpenGL
+  ];
+
+  nativeBuildInputs = [ makeWrapper pkg-config ]
+    ++ lib.optional (stdenv.hostPlatform.system == "i686-linux") nasm;
+
+  postPatch = ''
+    substituteInPlace source/imgui/src/imgui_impl_sdl2.cpp \
+      --replace '#include <SDL.h>' '#include <SDL2/SDL.h>' \
+      --replace '#include <SDL_syswm.h>' '#include <SDL2/SDL_syswm.h>' \
+      --replace '#include <SDL_vulkan.h>' '#include <SDL2/SDL_vulkan.h>'
+  '' + lib.optionalString stdenv.isLinux ''
+    substituteInPlace source/build/src/glbuild.cpp \
+      --replace libGLU.so ${libGLU}/lib/libGLU.so
+
+    for f in glad.c glad_wgl.c ; do
+      substituteInPlace source/glad/src/$f \
+        --replace libGL.so ${libGL}/lib/libGL.so
+    done
+  '';
+
+  makeFlags = [
+    "SDLCONFIG=${SDL2}/bin/sdl2-config"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # broken, see: https://github.com/NixOS/nixpkgs/issues/19098
+    "LTO=0"
+  ];
+
+  enableParallelBuilding = true;
+
+  installPhase = ''
+    runHook preInstall
+
+    install -Dm755 -t $out/bin eduke32 mapster32
+  '' + lib.optionalString stdenv.isLinux ''
+    makeWrapper $out/bin/eduke32 $out/bin/${wrapper} \
+      --set-default EDUKE32_DATA_DIR /var/lib/games/eduke32 \
+      --add-flags '-g "$EDUKE32_DATA_DIR/DUKE3D.GRP"'
+
+    cp -rv ${desktopItem}/share $out
+    substituteInPlace $out/share/applications/eduke32.desktop \
+      --subst-var out
+  '' + lib.optionalString stdenv.isDarwin ''
+    mkdir -p $out/Applications/EDuke32.app/Contents/MacOS
+    mkdir -p $out/Applications/Mapster32.app/Contents/MacOS
+
+    cp -r platform/Apple/bundles/EDuke32.app/* $out/Applications/EDuke32.app/
+    cp -r platform/Apple/bundles/Mapster32.app/* $out/Applications/Mapster32.app/
+
+    ln -sf $out/bin/eduke32 $out/Applications/EDuke32.app/Contents/MacOS/eduke32
+    ln -sf $out/bin/mapster32 $out/Applications/Mapster32.app/Contents/MacOS/mapster32
+  '' + ''
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Enhanched port of Duke Nukem 3D for various platforms";
+    homepage = "http://eduke32.com";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ mikroskeem sander ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/games/egoboo/default.nix b/nixpkgs/pkgs/games/egoboo/default.nix
new file mode 100644
index 000000000000..ba89e4ca7afd
--- /dev/null
+++ b/nixpkgs/pkgs/games/egoboo/default.nix
@@ -0,0 +1,65 @@
+{ 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
+  # they fix more, because it even has at least one bugs less than 2.7.4.
+  # 2.8.0 does not start properly on linux
+  # They just starting making that 2.8.0 work on linux.
+  pname = "egoboo";
+  version = "2.7.3";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/egoboo/egoboo-${version}.tar.gz";
+    sha256 = "18cjgp9kakrsa90jcb4cl8hhh9k57mi5d1sy5ijjpd3p7zl647hd";
+  };
+
+  buildPhase = ''
+    cd source
+    make -C enet all
+    # The target 'all' has trouble
+    make -C game -f Makefile.unix egoboo
+  '';
+
+  # The user will need to have all the files in '.' to run egoboo, with
+  # writeable controls.txt and setup.txt
+  installPhase = ''
+    mkdir -p $out/share/egoboo-${version}
+    cp -v game/egoboo $out/share/egoboo-${version}
+    cd ..
+    cp -v -Rd controls.txt setup.txt players modules basicdat $out/share/egoboo-${version}
+  '';
+
+  buildInputs = [ libGLU libGL SDL SDL_mixer SDL_image SDL_ttf ];
+
+  /*
+    This big commented thing may be needed for versions 2.8.0 or beyond
+    I keep it here for future updates.
+
+    # Some files have to go to $HOME, but we put them in the 'shared'.
+    patchPhase = ''
+      sed -i -e 's,''${HOME}/.''${PROJ_NAME},''${PREFIX}/share/games/''${PROJ_NAME},g' Makefile
+    '';
+
+    preBuild = ''
+      makeFlags=PREFIX=$out
+    '';
+  */
+
+  # Workaround build failure on -fno-common toolchains like upstream
+  # gcc-10. Otherwise build fails as:
+  #   ld: mad.o:(.bss+0x233800): multiple definition of `tile_dict'; camera.o:(.bss+0x140): first defined here
+  env.NIX_CFLAGS_COMPILE = "-fcommon";
+
+  NIX_LDFLAGS = "-lm";
+
+  meta = {
+    description = "3D dungeon crawling adventure";
+
+    homepage = "https://egoboo.sourceforge.net/";
+    license = lib.licenses.gpl2Plus;
+
+    # I take it out of hydra as it does not work as well as I'd like
+    # maintainers = [ ];
+    # platforms = lib.platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/games/eidolon/Cargo.lock b/nixpkgs/pkgs/games/eidolon/Cargo.lock
new file mode 100644
index 000000000000..3a800a1263cb
--- /dev/null
+++ b/nixpkgs/pkgs/games/eidolon/Cargo.lock
@@ -0,0 +1,2087 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "addr2line"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97"
+dependencies = [
+ "gimli",
+]
+
+[[package]]
+name = "adler"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+
+[[package]]
+name = "aho-corasick"
+version = "0.6.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81ce3d38065e618af2d7b77e10c5ad9a069859b4be3c2250f674af3840d9c8a5"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "0.7.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "ansi_term"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
+dependencies = [
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "arrayref"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544"
+
+[[package]]
+name = "arrayvec"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
+
+[[package]]
+name = "atty"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
+dependencies = [
+ "hermit-abi 0.1.19",
+ "libc",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "autocfg"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78"
+dependencies = [
+ "autocfg 1.1.0",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "backtrace"
+version = "0.3.67"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca"
+dependencies = [
+ "addr2line",
+ "cc",
+ "cfg-if 1.0.0",
+ "libc",
+ "miniz_oxide",
+ "object",
+ "rustc-demangle",
+]
+
+[[package]]
+name = "base64"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e"
+dependencies = [
+ "byteorder",
+]
+
+[[package]]
+name = "base64"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "blake2b_simd"
+version = "0.5.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587"
+dependencies = [
+ "arrayref",
+ "arrayvec",
+ "constant_time_eq",
+]
+
+[[package]]
+name = "butlerd"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "095899eb6b69e0a1c98215e51a44c67b8e3c902ebb9440afaafe2eb45e650a09"
+dependencies = [
+ "hyper",
+ "rand 0.5.6",
+ "regex 1.7.1",
+ "reqwest",
+ "serde",
+ "serde_derive",
+ "serde_json",
+]
+
+[[package]]
+name = "byteorder"
+version = "1.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+
+[[package]]
+name = "bytes"
+version = "0.4.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c"
+dependencies = [
+ "byteorder",
+ "either",
+ "iovec",
+]
+
+[[package]]
+name = "cc"
+version = "1.0.79"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
+
+[[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.34.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
+dependencies = [
+ "ansi_term",
+ "atty",
+ "bitflags",
+ "strsim",
+ "textwrap",
+ "unicode-width",
+ "vec_map",
+]
+
+[[package]]
+name = "cloudabi"
+version = "0.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "concolor"
+version = "0.0.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "318d6c16e73b3a900eb212ad6a82fc7d298c5ab8184c7a9998646455bc474a16"
+dependencies = [
+ "bitflags",
+ "concolor-query",
+ "is-terminal",
+]
+
+[[package]]
+name = "concolor-query"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82a90734b3d5dcf656e7624cca6bce9c3a90ee11f900e80141a7427ccfb3d317"
+
+[[package]]
+name = "constant_time_eq"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
+
+[[package]]
+name = "cookie"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "888604f00b3db336d2af898ec3c1d5d0ddf5e6d462220f2ededc33a87ac4bbd5"
+dependencies = [
+ "time",
+ "url 1.7.2",
+]
+
+[[package]]
+name = "cookie_store"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "46750b3f362965f197996c4448e4a0935e791bf7d6631bfce9ee0af3d24c919c"
+dependencies = [
+ "cookie",
+ "failure",
+ "idna 0.1.5",
+ "log",
+ "publicsuffix",
+ "serde",
+ "serde_json",
+ "time",
+ "try_from",
+ "url 1.7.2",
+]
+
+[[package]]
+name = "core-foundation"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc"
+
+[[package]]
+name = "crc32fast"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c20ff29ded3204c5106278a81a38f4b482636ed4fa1e6cfbeef193291beb29ed"
+dependencies = [
+ "crossbeam-epoch",
+ "crossbeam-utils 0.7.2",
+ "maybe-uninit",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace"
+dependencies = [
+ "autocfg 1.1.0",
+ "cfg-if 0.1.10",
+ "crossbeam-utils 0.7.2",
+ "lazy_static",
+ "maybe-uninit",
+ "memoffset",
+ "scopeguard",
+]
+
+[[package]]
+name = "crossbeam-queue"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570"
+dependencies = [
+ "cfg-if 0.1.10",
+ "crossbeam-utils 0.7.2",
+ "maybe-uninit",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
+dependencies = [
+ "autocfg 1.1.0",
+ "cfg-if 0.1.10",
+ "lazy_static",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "dirs"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901"
+dependencies = [
+ "libc",
+ "redox_users",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "dtoa"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0"
+
+[[package]]
+name = "eidolon"
+version = "1.4.6"
+dependencies = [
+ "butlerd",
+ "dirs",
+ "human-panic",
+ "regex 0.2.11",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "structopt",
+]
+
+[[package]]
+name = "either"
+version = "1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
+
+[[package]]
+name = "encoding_rs"
+version = "0.8.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "errno"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1"
+dependencies = [
+ "errno-dragonfly",
+ "libc",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "errno-dragonfly"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
+dependencies = [
+ "cc",
+ "libc",
+]
+
+[[package]]
+name = "failure"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86"
+dependencies = [
+ "backtrace",
+ "failure_derive",
+]
+
+[[package]]
+name = "failure_derive"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4"
+dependencies = [
+ "proc-macro2 1.0.51",
+ "quote 1.0.23",
+ "syn 1.0.109",
+ "synstructure",
+]
+
+[[package]]
+name = "fastrand"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
+dependencies = [
+ "instant",
+]
+
+[[package]]
+name = "flate2"
+version = "1.0.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841"
+dependencies = [
+ "crc32fast",
+ "miniz_oxide",
+]
+
+[[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.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8"
+dependencies = [
+ "percent-encoding 2.2.0",
+]
+
+[[package]]
+name = "fuchsia-cprng"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
+
+[[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"
+version = "0.1.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678"
+
+[[package]]
+name = "futures-cpupool"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4"
+dependencies = [
+ "futures",
+ "num_cpus",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.1.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
+dependencies = [
+ "cfg-if 1.0.0",
+ "libc",
+ "wasi 0.9.0+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31"
+dependencies = [
+ "cfg-if 1.0.0",
+ "libc",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "gimli"
+version = "0.27.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4"
+
+[[package]]
+name = "h2"
+version = "0.1.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462"
+dependencies = [
+ "byteorder",
+ "bytes",
+ "fnv",
+ "futures",
+ "http",
+ "indexmap",
+ "log",
+ "slab",
+ "string",
+ "tokio-io",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+
+[[package]]
+name = "heck"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c"
+dependencies = [
+ "unicode-segmentation",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.1.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286"
+
+[[package]]
+name = "http"
+version = "0.1.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa 0.4.8",
+]
+
+[[package]]
+name = "http-body"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d"
+dependencies = [
+ "bytes",
+ "futures",
+ "http",
+ "tokio-buf",
+]
+
+[[package]]
+name = "httparse"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
+
+[[package]]
+name = "human-panic"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87eb03e654582b31967d414b86711a7bbd7c6b28a6b7d32857b7d1d45c0926f9"
+dependencies = [
+ "backtrace",
+ "concolor",
+ "os_info",
+ "serde",
+ "serde_derive",
+ "termcolor",
+ "toml",
+ "uuid 0.8.2",
+]
+
+[[package]]
+name = "hyper"
+version = "0.12.36"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c843caf6296fc1f93444735205af9ed4e109a539005abb2564ae1d6fad34c52"
+dependencies = [
+ "bytes",
+ "futures",
+ "futures-cpupool",
+ "h2",
+ "http",
+ "http-body",
+ "httparse",
+ "iovec",
+ "itoa 0.4.8",
+ "log",
+ "net2",
+ "rustc_version",
+ "time",
+ "tokio",
+ "tokio-buf",
+ "tokio-executor",
+ "tokio-io",
+ "tokio-reactor",
+ "tokio-tcp",
+ "tokio-threadpool",
+ "tokio-timer",
+ "want",
+]
+
+[[package]]
+name = "hyper-tls"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a800d6aa50af4b5850b2b0f659625ce9504df908e9733b635720483be26174f"
+dependencies = [
+ "bytes",
+ "futures",
+ "hyper",
+ "native-tls",
+ "tokio-io",
+]
+
+[[package]]
+name = "idna"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e"
+dependencies = [
+ "matches",
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "idna"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8"
+dependencies = [
+ "matches",
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "idna"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6"
+dependencies = [
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "indexmap"
+version = "1.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399"
+dependencies = [
+ "autocfg 1.1.0",
+ "hashbrown",
+]
+
+[[package]]
+name = "instant"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "io-lifetimes"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1abeb7a0dd0f8181267ff8adc397075586500b81b28a73e8a0208b00fc170fb3"
+dependencies = [
+ "libc",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "iovec"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "is-terminal"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "21b6b32576413a8e69b90e952e4a026476040d81017b80445deda5f2d3921857"
+dependencies = [
+ "hermit-abi 0.3.1",
+ "io-lifetimes",
+ "rustix",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "itoa"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4"
+
+[[package]]
+name = "itoa"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440"
+
+[[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.139"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79"
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4"
+
+[[package]]
+name = "lock_api"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75"
+dependencies = [
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "matches"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5"
+
+[[package]]
+name = "maybe-uninit"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
+
+[[package]]
+name = "memchr"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+
+[[package]]
+name = "memoffset"
+version = "0.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa"
+dependencies = [
+ "autocfg 1.1.0",
+]
+
+[[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.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef"
+dependencies = [
+ "mime",
+ "unicase",
+]
+
+[[package]]
+name = "miniz_oxide"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa"
+dependencies = [
+ "adler",
+]
+
+[[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.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e"
+dependencies = [
+ "lazy_static",
+ "libc",
+ "log",
+ "openssl",
+ "openssl-probe",
+ "openssl-sys",
+ "schannel",
+ "security-framework",
+ "security-framework-sys",
+ "tempfile",
+]
+
+[[package]]
+name = "net2"
+version = "0.2.38"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "74d0df99cfcd2530b2e694f6e17e7f37b8e26bb23983ac530c0c97408837c631"
+dependencies = [
+ "cfg-if 0.1.10",
+ "libc",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b"
+dependencies = [
+ "hermit-abi 0.2.6",
+ "libc",
+]
+
+[[package]]
+name = "object"
+version = "0.30.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.17.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3"
+
+[[package]]
+name = "openssl"
+version = "0.10.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b102428fd03bc5edf97f62620f7298614c45cedf287c271e7ed450bbaf83f2e1"
+dependencies = [
+ "bitflags",
+ "cfg-if 1.0.0",
+ "foreign-types",
+ "libc",
+ "once_cell",
+ "openssl-macros",
+ "openssl-sys",
+]
+
+[[package]]
+name = "openssl-macros"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c"
+dependencies = [
+ "proc-macro2 1.0.51",
+ "quote 1.0.23",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "openssl-probe"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
+
+[[package]]
+name = "openssl-sys"
+version = "0.9.80"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23bbbf7854cd45b83958ebe919f0e8e516793727652e27fda10a8384cfc790b7"
+dependencies = [
+ "autocfg 1.1.0",
+ "cc",
+ "libc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "os_info"
+version = "2.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2cc1b4330bb29087e791ae2a5cf56be64fb8946a4ff5aec2ba11c6ca51f5d60"
+dependencies = [
+ "log",
+ "serde",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "parking_lot"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252"
+dependencies = [
+ "lock_api",
+ "parking_lot_core",
+ "rustc_version",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bda66b810a62be75176a80873726630147a5ca780cd33921e0b5709033e66b0a"
+dependencies = [
+ "cfg-if 0.1.10",
+ "cloudabi",
+ "libc",
+ "redox_syscall 0.1.57",
+ "rustc_version",
+ "smallvec",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "percent-encoding"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831"
+
+[[package]]
+name = "percent-encoding"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160"
+
+[[package]]
+name = "proc-macro2"
+version = "0.4.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759"
+dependencies = [
+ "unicode-xid 0.1.0",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.51"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "publicsuffix"
+version = "1.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95b4ce31ff0a27d93c8de1849cf58162283752f065a90d508f1105fa6c9a213f"
+dependencies = [
+ "idna 0.2.3",
+ "url 2.3.1",
+]
+
+[[package]]
+name = "quote"
+version = "0.6.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1"
+dependencies = [
+ "proc-macro2 0.4.30",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b"
+dependencies = [
+ "proc-macro2 1.0.51",
+]
+
+[[package]]
+name = "rand"
+version = "0.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9"
+dependencies = [
+ "cloudabi",
+ "fuchsia-cprng",
+ "libc",
+ "rand_core 0.3.1",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "rand"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca"
+dependencies = [
+ "autocfg 0.1.8",
+ "libc",
+ "rand_chacha",
+ "rand_core 0.4.2",
+ "rand_hc",
+ "rand_isaac",
+ "rand_jitter",
+ "rand_os",
+ "rand_pcg",
+ "rand_xorshift",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef"
+dependencies = [
+ "autocfg 0.1.8",
+ "rand_core 0.3.1",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
+dependencies = [
+ "rand_core 0.4.2",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
+
+[[package]]
+name = "rand_hc"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4"
+dependencies = [
+ "rand_core 0.3.1",
+]
+
+[[package]]
+name = "rand_isaac"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08"
+dependencies = [
+ "rand_core 0.3.1",
+]
+
+[[package]]
+name = "rand_jitter"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b"
+dependencies = [
+ "libc",
+ "rand_core 0.4.2",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "rand_os"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071"
+dependencies = [
+ "cloudabi",
+ "fuchsia-cprng",
+ "libc",
+ "rand_core 0.4.2",
+ "rdrand",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "rand_pcg"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44"
+dependencies = [
+ "autocfg 0.1.8",
+ "rand_core 0.4.2",
+]
+
+[[package]]
+name = "rand_xorshift"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c"
+dependencies = [
+ "rand_core 0.3.1",
+]
+
+[[package]]
+name = "rdrand"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
+dependencies = [
+ "rand_core 0.3.1",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.1.57"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"
+
+[[package]]
+name = "redox_syscall"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "redox_users"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d"
+dependencies = [
+ "getrandom 0.1.16",
+ "redox_syscall 0.1.57",
+ "rust-argon2",
+]
+
+[[package]]
+name = "regex"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9329abc99e39129fcceabd24cf5d85b4671ef7c29c50e972bc5afe32438ec384"
+dependencies = [
+ "aho-corasick 0.6.10",
+ "memchr",
+ "regex-syntax 0.5.6",
+ "thread_local",
+ "utf8-ranges",
+]
+
+[[package]]
+name = "regex"
+version = "1.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733"
+dependencies = [
+ "aho-corasick 0.7.20",
+ "memchr",
+ "regex-syntax 0.6.28",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d707a4fa2637f2dca2ef9fd02225ec7661fe01a53623c1e6515b6916511f7a7"
+dependencies = [
+ "ucd-util",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
+
+[[package]]
+name = "reqwest"
+version = "0.9.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f88643aea3c1343c804950d7bf983bd2067f5ab59db6d613a08e05572f2714ab"
+dependencies = [
+ "base64 0.10.1",
+ "bytes",
+ "cookie",
+ "cookie_store",
+ "encoding_rs",
+ "flate2",
+ "futures",
+ "http",
+ "hyper",
+ "hyper-tls",
+ "log",
+ "mime",
+ "mime_guess",
+ "native-tls",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "time",
+ "tokio",
+ "tokio-executor",
+ "tokio-io",
+ "tokio-threadpool",
+ "tokio-timer",
+ "url 1.7.2",
+ "uuid 0.7.4",
+ "winreg",
+]
+
+[[package]]
+name = "rust-argon2"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb"
+dependencies = [
+ "base64 0.13.1",
+ "blake2b_simd",
+ "constant_time_eq",
+ "crossbeam-utils 0.8.14",
+]
+
+[[package]]
+name = "rustc-demangle"
+version = "0.1.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342"
+
+[[package]]
+name = "rustc_version"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
+dependencies = [
+ "semver",
+]
+
+[[package]]
+name = "rustix"
+version = "0.36.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f43abb88211988493c1abb44a70efa56ff0ce98f233b7b276146f1f3f7ba9644"
+dependencies = [
+ "bitflags",
+ "errno",
+ "io-lifetimes",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "ryu"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde"
+
+[[package]]
+name = "schannel"
+version = "0.1.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3"
+dependencies = [
+ "windows-sys 0.42.0",
+]
+
+[[package]]
+name = "scopeguard"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+
+[[package]]
+name = "security-framework"
+version = "2.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254"
+dependencies = [
+ "bitflags",
+ "core-foundation",
+ "core-foundation-sys",
+ "libc",
+ "security-framework-sys",
+]
+
+[[package]]
+name = "security-framework-sys"
+version = "2.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "semver"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
+dependencies = [
+ "semver-parser",
+]
+
+[[package]]
+name = "semver-parser"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
+
+[[package]]
+name = "serde"
+version = "1.0.152"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.152"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e"
+dependencies = [
+ "proc-macro2 1.0.51",
+ "quote 1.0.23",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.93"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cad406b69c91885b5107daf2c29572f6c8cdb3c66826821e286c533490c0bc76"
+dependencies = [
+ "itoa 1.0.5",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_urlencoded"
+version = "0.5.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "642dd69105886af2efd227f75a520ec9b44a820d65bc133a9131f7d229fd165a"
+dependencies = [
+ "dtoa",
+ "itoa 0.4.8",
+ "serde",
+ "url 1.7.2",
+]
+
+[[package]]
+name = "slab"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d"
+dependencies = [
+ "autocfg 1.1.0",
+]
+
+[[package]]
+name = "smallvec"
+version = "0.6.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b97fcaeba89edba30f044a10c6a3cc39df9c3f17d7cd829dd1446cab35f890e0"
+dependencies = [
+ "maybe-uninit",
+]
+
+[[package]]
+name = "string"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d"
+dependencies = [
+ "bytes",
+]
+
+[[package]]
+name = "strsim"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
+
+[[package]]
+name = "structopt"
+version = "0.2.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16c2cdbf9cc375f15d1b4141bc48aeef444806655cd0e904207edc8d68d86ed7"
+dependencies = [
+ "clap",
+ "structopt-derive",
+]
+
+[[package]]
+name = "structopt-derive"
+version = "0.2.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53010261a84b37689f9ed7d395165029f9cc7abb9f56bbfe86bee2597ed25107"
+dependencies = [
+ "heck",
+ "proc-macro2 0.4.30",
+ "quote 0.6.13",
+ "syn 0.15.44",
+]
+
+[[package]]
+name = "syn"
+version = "0.15.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5"
+dependencies = [
+ "proc-macro2 0.4.30",
+ "quote 0.6.13",
+ "unicode-xid 0.1.0",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2 1.0.51",
+ "quote 1.0.23",
+ "unicode-ident",
+]
+
+[[package]]
+name = "synstructure"
+version = "0.12.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f"
+dependencies = [
+ "proc-macro2 1.0.51",
+ "quote 1.0.23",
+ "syn 1.0.109",
+ "unicode-xid 0.2.4",
+]
+
+[[package]]
+name = "tempfile"
+version = "3.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af18f7ae1acd354b992402e9ec5864359d693cd8a79dcbef59f76891701c1e95"
+dependencies = [
+ "cfg-if 1.0.0",
+ "fastrand",
+ "redox_syscall 0.2.16",
+ "rustix",
+ "windows-sys 0.42.0",
+]
+
+[[package]]
+name = "termcolor"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "textwrap"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
+dependencies = [
+ "unicode-width",
+]
+
+[[package]]
+name = "thread_local"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "time"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a"
+dependencies = [
+ "libc",
+ "wasi 0.10.0+wasi-snapshot-preview1",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "tinyvec"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+dependencies = [
+ "tinyvec_macros",
+]
+
+[[package]]
+name = "tinyvec_macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
+
+[[package]]
+name = "tokio"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6"
+dependencies = [
+ "bytes",
+ "futures",
+ "mio",
+ "num_cpus",
+ "tokio-current-thread",
+ "tokio-executor",
+ "tokio-io",
+ "tokio-reactor",
+ "tokio-tcp",
+ "tokio-threadpool",
+ "tokio-timer",
+]
+
+[[package]]
+name = "tokio-buf"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fb220f46c53859a4b7ec083e41dec9778ff0b1851c0942b211edb89e0ccdc46"
+dependencies = [
+ "bytes",
+ "either",
+ "futures",
+]
+
+[[package]]
+name = "tokio-current-thread"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1de0e32a83f131e002238d7ccde18211c0a5397f60cbfffcb112868c2e0e20e"
+dependencies = [
+ "futures",
+ "tokio-executor",
+]
+
+[[package]]
+name = "tokio-executor"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb2d1b8f4548dbf5e1f7818512e9c406860678f29c300cdf0ebac72d1a3a1671"
+dependencies = [
+ "crossbeam-utils 0.7.2",
+ "futures",
+]
+
+[[package]]
+name = "tokio-io"
+version = "0.1.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674"
+dependencies = [
+ "bytes",
+ "futures",
+ "log",
+]
+
+[[package]]
+name = "tokio-reactor"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09bc590ec4ba8ba87652da2068d150dcada2cfa2e07faae270a5e0409aa51351"
+dependencies = [
+ "crossbeam-utils 0.7.2",
+ "futures",
+ "lazy_static",
+ "log",
+ "mio",
+ "num_cpus",
+ "parking_lot",
+ "slab",
+ "tokio-executor",
+ "tokio-io",
+ "tokio-sync",
+]
+
+[[package]]
+name = "tokio-sync"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "edfe50152bc8164fcc456dab7891fa9bf8beaf01c5ee7e1dd43a397c3cf87dee"
+dependencies = [
+ "fnv",
+ "futures",
+]
+
+[[package]]
+name = "tokio-tcp"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "98df18ed66e3b72e742f185882a9e201892407957e45fbff8da17ae7a7c51f72"
+dependencies = [
+ "bytes",
+ "futures",
+ "iovec",
+ "mio",
+ "tokio-io",
+ "tokio-reactor",
+]
+
+[[package]]
+name = "tokio-threadpool"
+version = "0.1.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df720b6581784c118f0eb4310796b12b1d242a7eb95f716a8367855325c25f89"
+dependencies = [
+ "crossbeam-deque",
+ "crossbeam-queue",
+ "crossbeam-utils 0.7.2",
+ "futures",
+ "lazy_static",
+ "log",
+ "num_cpus",
+ "slab",
+ "tokio-executor",
+]
+
+[[package]]
+name = "tokio-timer"
+version = "0.2.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93044f2d313c95ff1cb7809ce9a7a05735b012288a888b62d4434fd58c94f296"
+dependencies = [
+ "crossbeam-utils 0.7.2",
+ "futures",
+ "slab",
+ "tokio-executor",
+]
+
+[[package]]
+name = "toml"
+version = "0.5.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "try-lock"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed"
+
+[[package]]
+name = "try_from"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "283d3b89e1368717881a9d51dad843cc435380d8109c9e47d38780a324698d8b"
+dependencies = [
+ "cfg-if 0.1.10",
+]
+
+[[package]]
+name = "ucd-util"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "abd2fc5d32b590614af8b0a20d837f32eca055edd0bbead59a9cfe80858be003"
+
+[[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.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d54675592c1dbefd78cbd98db9bacd89886e1ca50692a0692baefffdeb92dd58"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc"
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "unicode-segmentation"
+version = "1.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
+
+[[package]]
+name = "unicode-width"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
+
+[[package]]
+name = "unicode-xid"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
+
+[[package]]
+name = "url"
+version = "1.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a"
+dependencies = [
+ "idna 0.1.5",
+ "matches",
+ "percent-encoding 1.0.1",
+]
+
+[[package]]
+name = "url"
+version = "2.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643"
+dependencies = [
+ "form_urlencoded",
+ "idna 0.3.0",
+ "percent-encoding 2.2.0",
+]
+
+[[package]]
+name = "utf8-ranges"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fcfc827f90e53a02eaef5e535ee14266c1d569214c6aa70133a624d8a3164ba"
+
+[[package]]
+name = "uuid"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90dbc611eb48397705a6b0f6e917da23ae517e4d127123d2cf7674206627d32a"
+dependencies = [
+ "rand 0.6.5",
+]
+
+[[package]]
+name = "uuid"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
+dependencies = [
+ "getrandom 0.2.8",
+]
+
+[[package]]
+name = "vcpkg"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+
+[[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.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+[[package]]
+name = "want"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230"
+dependencies = [
+ "futures",
+ "log",
+ "try-lock",
+]
+
+[[package]]
+name = "wasi"
+version = "0.9.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
+
+[[package]]
+name = "wasi"
+version = "0.10.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
+
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
+[[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-util"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+dependencies = [
+ "winapi 0.3.9",
+]
+
+[[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 = "windows-sys"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.45.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd"
+
+[[package]]
+name = "winreg"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9"
+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/nixpkgs/pkgs/games/eidolon/default.nix b/nixpkgs/pkgs/games/eidolon/default.nix
new file mode 100644
index 000000000000..34bfd4151894
--- /dev/null
+++ b/nixpkgs/pkgs/games/eidolon/default.nix
@@ -0,0 +1,38 @@
+{
+  lib,
+  fetchFromSourcehut,
+  rustPlatform,
+  pkg-config,
+  openssl,
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "eidolon";
+  version = "1.4.6";
+
+  src = fetchFromSourcehut {
+    owner = "~nicohman";
+    repo = pname;
+    rev = version;
+    hash = "sha256-Ofc3i+iMmbUgY3bomUk4rM3bEQInTV3rIPz3m0yZw/o=";
+  };
+
+  cargoLock = {
+    lockFile = ./Cargo.lock;
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ openssl ];
+
+  postPatch = ''
+    ln -sf ${./Cargo.lock} Cargo.lock
+  '';
+
+  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.gpl3Only;
+    maintainers = with maintainers; [ _0x4A6F ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/empty-epsilon/default.nix b/nixpkgs/pkgs/games/empty-epsilon/default.nix
new file mode 100644
index 000000000000..ba41431eb5ca
--- /dev/null
+++ b/nixpkgs/pkgs/games/empty-epsilon/default.nix
@@ -0,0 +1,85 @@
+{ lib, stdenv, fetchFromGitHub, cmake, sfml, libX11, glew, python3, fetchpatch, applyPatches, glm, meshoptimizer, SDL2, ninja}:
+
+let
+
+  major = "2023";
+  minor = "06";
+  patch.seriousproton = "17";
+  patch.emptyepsilon = "17";
+
+  version.seriousproton = "${major}.${minor}.${patch.seriousproton}";
+  version.emptyepsilon = "${major}.${minor}.${patch.emptyepsilon}";
+  version.basis-universal = "v1_15_update2";
+
+  basis-universal = fetchFromGitHub {
+    owner = "BinomialLLC";
+    repo = "basis_universal";
+    rev = version.basis-universal;
+    sha256 = "sha256-2snzq/SnhWHIgSbUUgh24B6tka7EfkGO+nwKEObRkU4=";
+  };
+
+  serious-proton = stdenv.mkDerivation {
+    pname = "serious-proton";
+    version = version.seriousproton;
+
+    src = fetchFromGitHub {
+      owner = "daid";
+      repo = "SeriousProton";
+      rev = "EE-${version.seriousproton}";
+      sha256 = "sha256-5ifYb5dX8ihQmJB1RHyzMsZJeXZ+m27JmA+W+XA/XwI=";
+    };
+
+    nativeBuildInputs = [ cmake ];
+    buildInputs = [ sfml libX11 glm SDL2 ];
+
+    cmakeFlags = [
+      "-DFETCHCONTENT_SOURCE_DIR_BASIS=${basis-universal}"
+    ];
+
+    meta = with lib; {
+      description = "C++ game engine coded on top of SFML used for EmptyEpsilon";
+      homepage = "https://github.com/daid/SeriousProton";
+      license = licenses.mit;
+      maintainers = with maintainers; [ fpletz ];
+      platforms = platforms.linux;
+    };
+  };
+
+in
+
+
+stdenv.mkDerivation {
+  pname = "empty-epsilon";
+  version = version.emptyepsilon;
+
+  src = fetchFromGitHub {
+    owner = "daid";
+    repo = "EmptyEpsilon";
+    rev = "EE-${version.emptyepsilon}";
+    sha256 = "sha256-zuXbCBlv6URndbB0aA+3bli0cSeUBf3LT/7/jcPITnc=";
+  };
+
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ serious-proton sfml glew libX11 python3 glm SDL2 ninja ];
+
+  cmakeFlags = [
+    "-DSERIOUS_PROTON_DIR=${serious-proton.src}"
+    "-DCPACK_PACKAGE_VERSION=${version.emptyepsilon}"
+    "-DCPACK_PACKAGE_VERSION_MAJOR=${major}"
+    "-DCPACK_PACKAGE_VERSION_MINOR=${minor}"
+    "-DCPACK_PACKAGE_VERSION_PATCH=${patch.emptyepsilon}"
+    "-DFETCHCONTENT_SOURCE_DIR_BASIS=${basis-universal}"
+    "-DFETCHCONTENT_SOURCE_DIR_MESHOPTIMIZER=${meshoptimizer.src}"
+    "-DCMAKE_AR=${stdenv.cc.cc}/bin/gcc-ar"
+    "-DCMAKE_RANLIB=${stdenv.cc.cc}/bin/gcc-ranlib"
+    "-G Ninja"
+  ];
+
+  meta = with lib; {
+    description = "Open source bridge simulator based on Artemis";
+    homepage = "https://daid.github.io/EmptyEpsilon/";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ fpletz lheckemann ma27 ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/endgame-singularity/default.nix b/nixpkgs/pkgs/games/endgame-singularity/default.nix
new file mode 100644
index 000000000000..57766c2e8446
--- /dev/null
+++ b/nixpkgs/pkgs/games/endgame-singularity/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, fetchurl
+, fetchFromGitHub
+, unzip
+, python3
+, enableDefaultMusicPack ? true
+}:
+
+let
+  pname = "endgame-singularity";
+  version = "1.00";
+
+  main_src = fetchFromGitHub {
+    owner = "singularity";
+    repo = "singularity";
+    rev = "v${version}";
+    sha256 = "0ndrnxwii8lag6vrjpwpf5n36hhv223bb46d431l9gsigbizv0hl";
+  };
+
+  music_src = fetchurl {
+    url = "http://www.emhsoft.com/singularity/endgame-singularity-music-007.zip";
+    sha256 = "0vf2qaf66jh56728pq1zbnw50yckjz6pf6c6qw6dl7vk60kkqnpb";
+  };
+in
+
+python3.pkgs.buildPythonApplication rec {
+  inherit pname version;
+
+  srcs = [ main_src ] ++ lib.optional enableDefaultMusicPack music_src;
+  sourceRoot = main_src.name;
+
+  nativeBuildInputs = [ unzip ]; # The music is zipped
+  propagatedBuildInputs = with python3.pkgs; [ pygame numpy polib ];
+
+  # Add the music
+  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
+  '';
+
+  meta = {
+    homepage = "http://www.emhsoft.com/singularity/";
+    description = "A simulation game about strong AI";
+    longDescription = ''
+      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 details are in LICENSE.txt
+    license = with lib.licenses; [
+      gpl2Plus # most of the code, some translations
+      mit # recursive_fix_pickle, polib
+      cc-by-sa-30 # data and artwork, some translations
+      free # earth images from NASA, some fonts
+      cc0 # cick0.wav
+    ];
+    mainProgram = "singularity";
+    maintainers = with lib.maintainers; [ fgaz ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/endless-sky/default.nix b/nixpkgs/pkgs/games/endless-sky/default.nix
new file mode 100644
index 000000000000..9a3e86117cef
--- /dev/null
+++ b/nixpkgs/pkgs/games/endless-sky/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, SDL2
+, libpng
+, libjpeg
+, glew
+, openal
+, scons
+, libmad
+, libuuid
+}:
+
+stdenv.mkDerivation rec {
+  pname = "endless-sky";
+  version = "0.10.4";
+
+  src = fetchFromGitHub {
+    owner = "endless-sky";
+    repo = "endless-sky";
+    rev = "v${version}";
+    sha256 = "sha256-VTg8H6umq9yMMP274StIJfEZZvUFDILiMKhioam58QE=";
+  };
+
+  patches = [
+    ./fixes.patch
+  ];
+
+  postPatch = ''
+    # the trailing slash is important!!
+    # endless sky naively joins the paths with string concatenation
+    # so it's essential that there be a trailing slash on the resources path
+    substituteInPlace source/Files.cpp \
+      --replace '%NIXPKGS_RESOURCES_PATH%' "$out/share/games/endless-sky/"
+  '';
+
+  preBuild = ''
+    export AR="${stdenv.cc.targetPrefix}gcc-ar"
+  '';
+
+  enableParallelBuilding = true;
+
+  buildInputs = [
+    SDL2
+    libpng
+    libjpeg
+    glew
+    openal
+    scons
+    libmad
+    libuuid
+  ];
+
+  prefixKey = "PREFIX=";
+
+  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; [
+      gpl3Plus
+      cc-by-sa-30
+      cc-by-sa-40
+      publicDomain
+    ];
+    maintainers = with maintainers; [ lheckemann _360ied ];
+    platforms = platforms.linux; # Maybe other non-darwin Unix
+  };
+}
diff --git a/nixpkgs/pkgs/games/endless-sky/fixes.patch b/nixpkgs/pkgs/games/endless-sky/fixes.patch
new file mode 100644
index 000000000000..b6f330eca442
--- /dev/null
+++ b/nixpkgs/pkgs/games/endless-sky/fixes.patch
@@ -0,0 +1,53 @@
+diff --git a/SConstruct b/SConstruct
+index 48fd080..419b40d 100644
+--- a/SConstruct
++++ b/SConstruct
+@@ -55,7 +55,7 @@ sky = env.Program("endless-sky", Glob("build/" + env["mode"] + "/*.cpp"))
+ 
+ 
+ # Install the binary:
+-env.Install("$DESTDIR$PREFIX/games", sky)
++env.Install("$DESTDIR$PREFIX/bin", sky)
+ 
+ # Install the desktop file:
+ env.Install("$DESTDIR$PREFIX/share/applications", "endless-sky.desktop")
+diff --git a/source/Files.cpp b/source/Files.cpp
+index de27023e..4225051f 100644
+--- a/source/Files.cpp
++++ b/source/Files.cpp
+@@ -108,32 +108,9 @@ void Files::Init(const char * const *argv)
+ 		resources = str;
+ 		SDL_free(str);
+ 	}
+-#if defined _WIN32
+-	FixWindowsSlashes(resources);
+-#endif
+-	if(resources.back() != '/')
+-		resources += '/';
+-#if defined __linux__ || defined __FreeBSD__ || defined __DragonFly__
+-	// Special case, for Linux: the resource files are not in the same place as
+-	// the executable, but are under the same prefix (/usr or /usr/local).
+-	static const string LOCAL_PATH = "/usr/local/";
+-	static const string STANDARD_PATH = "/usr/";
+-	static const string RESOURCE_PATH = "share/games/endless-sky/";
+-	if(!resources.compare(0, LOCAL_PATH.length(), LOCAL_PATH))
+-		resources = LOCAL_PATH + RESOURCE_PATH;
+-	else if(!resources.compare(0, STANDARD_PATH.length(), STANDARD_PATH))
+-		resources = STANDARD_PATH + RESOURCE_PATH;
+-#endif
+-	// If the resources are not here, search in the directories containing this
+-	// one. This allows, for example, a Mac app that does not actually have the
+-	// resources embedded within it.
+-	while(!Exists(resources + "credits.txt"))
+-	{
+-		size_t pos = resources.rfind('/', resources.length() - 2);
+-		if(pos == string::npos || pos == 0)
+-			throw runtime_error("Unable to find the resource directories!");
+-		resources.erase(pos + 1);
+-	}
++
++	resources = "%NIXPKGS_RESOURCES_PATH%";
++
+ 	dataPath = resources + "data/";
+ 	imagePath = resources + "images/";
+ 	soundPath = resources + "sounds/";
diff --git a/nixpkgs/pkgs/games/enigma/default.nix b/nixpkgs/pkgs/games/enigma/default.nix
new file mode 100644
index 000000000000..e2e9ca1338c2
--- /dev/null
+++ b/nixpkgs/pkgs/games/enigma/default.nix
@@ -0,0 +1,46 @@
+{ lib, stdenv, fetchurl, fetchpatch, 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";
+
+  src = fetchurl {
+    url = "https://github.com/Enigma-Game/Enigma/releases/download/${version}/Enigma-${version}-src.tar.gz";
+    sha256 = "rmS5H7wrEJcAcdDXjtW07enuOGjeLm6VaVRvxYQ3+K8=";
+  };
+
+  patches = [
+    # fix format string security warning (turned into error)
+    (fetchpatch {
+      url = "https://github.com/Enigma-Game/Enigma/pull/70/commits/d25051eb6228c885e779a9674f8ee3979da30663.patch";
+      sha256 = "L5C4NCZDDUKji9Tg4geKaiw3CkSY6rCoawqGKqR4dFM=";
+    })
+  ];
+
+  nativeBuildInputs = [ pkg-config gettext makeWrapper imagemagick ];
+  buildInputs = [ SDL2 SDL2_image SDL2_mixer SDL2_ttf libpng xercesc curl xdg-utils ];
+
+  # The configure script of enigma uses pkg-config to determine the header
+  # directories of SDL2. However, pkg-config only returns the path to the core
+  # SDL2 library, not to the additional libraries SDL2_ttf, SDL2_image and
+  # SDL2_mixer. In contrast, sdl2-config does return the correct list of paths.
+  # We don't use configureFlags here so that the shell can correctly carry
+  # out the interpolation.
+  preConfigure = ''
+    export SDL_CFLAGS=$(sdl2-config --cflags)
+  '';
+
+  postInstall = ''
+    rm -r $out/include
+    # make xdg-open overrideable at runtime
+    wrapProgram $out/bin/enigma --suffix 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.hostPlatform.isDarwin;
+    maintainers = with maintainers; [ iblech ];
+    homepage = "https://www.nongnu.org/enigma/";
+  };
+}
diff --git a/nixpkgs/pkgs/games/etlegacy/default.nix b/nixpkgs/pkgs/games/etlegacy/default.nix
new file mode 100644
index 000000000000..befbbc5ed291
--- /dev/null
+++ b/nixpkgs/pkgs/games/etlegacy/default.nix
@@ -0,0 +1,141 @@
+{ lib
+, stdenv
+, fetchurl
+, writeShellApplication
+, fetchFromGitHub
+, cjson
+, cmake
+, git
+, makeWrapper
+, unzip
+, curl
+, freetype
+, glew
+, libjpeg
+, libogg
+, libpng
+, libtheora
+, lua
+, minizip
+, openal
+, SDL2
+, sqlite
+, zlib
+}:
+let
+  version = "2.81.1";
+
+  fetchAsset = { asset, hash }: fetchurl {
+    url = "https://mirror.etlegacy.com/etmain/${asset}";
+    inherit hash;
+  };
+
+  pak0 = fetchAsset {
+    asset = "pak0.pk3";
+    hash = "sha256-cSlmsg4GUj/oFBlRZQDkmchrK0/sgjhW3b0zP8s9JuU=";
+  };
+
+  pak1 = fetchAsset {
+    asset = "pak1.pk3";
+    hash = "sha256-VhD9dJAkQFtEJafOY5flgYe5QdIgku8R1IRLQn31Pl0=";
+  };
+
+  pak2 = fetchAsset {
+    asset = "pak2.pk3";
+    hash = "sha256-pIq3SaGhKrTZE3KGsfI9ZCwp2lmEWyuvyPZOBSzwbz4=";
+  };
+
+  fakeGit = writeShellApplication {
+    name = "git";
+
+    text = ''
+      if [ "$1" = "describe" ]; then
+        echo "${version}"
+      fi
+    '';
+  };
+in
+stdenv.mkDerivation {
+  pname = "etlegacy";
+  inherit version;
+
+  src = fetchFromGitHub {
+    owner = "etlegacy";
+    repo = "etlegacy";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-CGXtc51vaId/SHbD34ZeT0gPsrl7p2DEw/Kp+GBZIaA="; # 2.81.1
+  };
+
+  nativeBuildInputs = [
+    cjson
+    cmake
+    fakeGit
+    git
+    makeWrapper
+    unzip
+  ];
+
+  buildInputs = [
+    curl
+    freetype
+    glew
+    libjpeg
+    libogg
+    libpng
+    libtheora
+    lua
+    minizip
+    openal
+    SDL2
+    sqlite
+    zlib
+  ];
+
+  preBuild = ''
+    # Required for build time to not be in 1980
+    export SOURCE_DATE_EPOCH=$(date +%s)
+    # This indicates the build was by a CI pipeline and prevents the resource
+    # files from being flagged as 'dirty' due to potentially being custom built.
+    export CI="true"
+  '';
+
+  cmakeFlags = [
+    "-DCROSS_COMPILE32=0"
+    "-DBUILD_SERVER=1"
+    "-DBUILD_CLIENT=1"
+    "-DBUNDLED_JPEG=0"
+    "-DBUNDLED_LIBS=0"
+    "-DINSTALL_EXTRA=0"
+    "-DINSTALL_OMNIBOT=0"
+    "-DINSTALL_GEOIP=0"
+    "-DINSTALL_WOLFADMIN=0"
+    "-DFEATURE_AUTOUPDATE=0"
+    "-DINSTALL_DEFAULT_BASEDIR=${placeholder "out"}/lib/etlegacy"
+    "-DINSTALL_DEFAULT_BINDIR=${placeholder "out"}/bin"
+  ];
+
+  postInstall = ''
+    ln -s ${pak0} $out/lib/etlegacy/etmain/pak0.pk3
+    ln -s ${pak1} $out/lib/etlegacy/etmain/pak1.pk3
+    ln -s ${pak2} $out/lib/etlegacy/etmain/pak2.pk3
+
+    makeWrapper $out/bin/etl.* $out/bin/etl
+    makeWrapper $out/bin/etlded.* $out/bin/etlded
+  '';
+
+  hardeningDisable = [ "fortify" ];
+
+  meta = {
+    description = "ET: Legacy is an open source project based on the code of Wolfenstein: Enemy Territory which was released in 2010 under the terms of the GPLv3 license";
+    homepage = "https://etlegacy.com";
+    license = with lib.licenses; [ gpl3 cc-by-nc-sa-30 ];
+    longDescription = ''
+      ET: Legacy, an open source project fully compatible client and server
+      for the popular online FPS game Wolfenstein: Enemy Territory - whose
+      gameplay is still considered unmatched by many, despite its great age.
+    '';
+    mainProgram = "etl";
+    maintainers = with lib.maintainers; [ ashleyghooper drupol ];
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/everspace/default.nix b/nixpkgs/pkgs/games/everspace/default.nix
new file mode 100644
index 000000000000..abf568d6acab
--- /dev/null
+++ b/nixpkgs/pkgs/games/everspace/default.nix
@@ -0,0 +1,118 @@
+{
+  # Packaging Dependencies
+  lib, stdenv, requireFile, autoPatchelfHook, unzip, copyDesktopItems, makeDesktopItem,
+
+  # Everspace Dependencies
+  cairo, gdk-pixbuf, pango, gtk2-x11, libGL, openal,
+
+  # Unreal Engine 4 Dependencies
+  xorg
+}:
+
+# Known issues:
+# - Video playback (upon starting a new game) does not work (screen is black)
+stdenv.mkDerivation rec {
+  pname = "everspace";
+  version = "1.3.5.3655";
+
+  src = requireFile {
+    name = "everspace_1_3_5_3655_32896.sh";
+    url = "https://www.gog.com/";
+    sha256 = "0jlvxq14k1pxmbr08y8kar0ijlqxcnkfqlvw883j96v9zr34ynj3";
+  };
+
+  nativeBuildInputs = [
+    autoPatchelfHook
+    copyDesktopItems
+    unzip
+  ];
+
+  buildInputs = [
+    cairo
+    gdk-pixbuf
+    pango
+    gtk2-x11
+    openal
+    stdenv.cc.cc.lib
+  ];
+
+  runtimeDependencies = [
+    libGL
+
+    # ue4
+    xorg.libX11
+    xorg.libXScrnSaver
+    xorg.libXau
+    xorg.libXcursor
+    xorg.libXext
+    xorg.libXfixes
+    xorg.libXi
+    xorg.libXrandr
+    xorg.libXrender
+    xorg.libXxf86vm
+    xorg.libxcb
+  ];
+
+  unpackPhase = ''
+    runHook preUnpack
+
+    # The shell script contains a zip file. Unzipping it works but will result
+    # in some error output and an error exit code.
+    unzip "$src" || true
+
+    runHook postUnpack
+  '';
+
+  postPatch = ''
+    ## Remove Bundled Libs ##
+
+    # vlc libs
+    #
+    # TODO: This is probably what breaks video playback. It would be cleaner
+    #   to remove the bundled libs and replace them with system libs but there
+    #   are so many. Copy-pasting the list from the vlc package is a good start
+    #   but still leaves us with many unresolved dependencies.
+    rm -rf ./data/noarch/game/RSG/Plugins/VlcMedia
+
+    # openal
+    rm -rf ./data/noarch/game/Engine/Binaries/ThirdParty/OpenAL
+  '';
+
+  dontConfigure = true;
+  dontBuild = true;
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p "$out/opt"
+    cp -r "./data/noarch" "$out/opt/everspace"
+
+    mkdir -p "$out/bin"
+    ln -s "$out/opt/everspace/game/RSG/Binaries/Linux/RSG-Linux-Shipping" "$out/bin/everspace"
+
+    mkdir -p "$out/share/pixmaps"
+    ln -s "$out/opt/everspace/support/icon.png" "$out/share/pixmaps/everspace-gog.png"
+
+    runHook postInstall
+  '';
+
+  desktopItems = [
+    (makeDesktopItem {
+      type = "Application";
+      name = "everspace-gog";
+      desktopName = "EVERSPACEâ„¢";
+      comment = meta.description;
+      exec = "everspace";
+      icon = "everspace-gog";
+      categories = [ "Game" ];
+    })
+  ];
+
+  meta = with lib; {
+    description = "Action-focused single-player space shooter with roguelike elements";
+    homepage = "https://classic.everspace-game.com/";
+    license = licenses.unfree;
+    maintainers = with maintainers; [ jtrees ];
+    platforms = [ "x86_64-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/extremetuxracer/default.nix b/nixpkgs/pkgs/games/extremetuxracer/default.nix
new file mode 100644
index 000000000000..446c692ad81f
--- /dev/null
+++ b/nixpkgs/pkgs/games/extremetuxracer/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv, fetchurl, libGLU, libGL, libX11, xorgproto, tcl, freeglut, freetype
+, sfml, libXi
+, libXmu, libXext, libXt, libSM, libICE
+, libpng, pkg-config, gettext, intltool
+}:
+
+stdenv.mkDerivation rec {
+  version = "0.8.3";
+  pname = "extremetuxracer";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/extremetuxracer/etr-${version}.tar.xz";
+    sha256 = "sha256-LuQvP1/C+NSap1BW6xFvbKuE1lZBIOaWGuWSc2ckURM=";
+  };
+
+  nativeBuildInputs = [ pkg-config intltool ];
+  buildInputs = [
+    libGLU libGL libX11 xorgproto tcl freeglut freetype
+    sfml libXi
+    libXmu libXext libXt libSM libICE
+    libpng gettext
+  ];
+
+  configureFlags = [ "--with-tcl=${tcl}/lib" ];
+
+  preConfigure = ''
+    export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE"
+  '';
+
+  meta = {
+    description = "High speed arctic racing game based on Tux Racer";
+    longDescription = ''
+      ExtremeTuxRacer - Tux lies on his belly and accelerates down ice slopes.
+    '';
+    license = lib.licenses.gpl2Plus;
+    homepage = "https://sourceforge.net/projects/extremetuxracer/";
+    maintainers = with lib.maintainers; [ ];
+    mainProgram = "etr";
+    platforms = with lib.platforms; linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/exult/default.nix b/nixpkgs/pkgs/games/exult/default.nix
new file mode 100644
index 000000000000..eddb96f301da
--- /dev/null
+++ b/nixpkgs/pkgs/games/exult/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, SDL2
+, autoconf
+, automake
+, libogg
+, libtool
+, libvorbis
+, pkg-config
+, zlib
+, enableTools ? false
+}:
+
+stdenv.mkDerivation rec {
+  pname = "exult";
+  version = "1.8";
+
+  src = fetchFromGitHub {
+    owner = "exult";
+    repo = "exult";
+    rev = "v${version}";
+    hash = "sha256-Y7FpgiGuqR4ZG/PNSfLcNcRWeeC7GebUTighXsCfy+E=";
+  };
+
+  nativeBuildInputs = [
+    autoconf
+    automake
+    libtool
+    pkg-config
+  ];
+
+  buildInputs = [
+    SDL2
+    libogg
+    libvorbis
+    zlib
+  ];
+
+  preConfigure = ''
+    ./autogen.sh
+  '';
+
+  configureFlags = lib.optional (!enableTools) "--disable-tools";
+
+  meta = with lib; {
+    description = "Exult is a project to recreate Ultima VII for modern operating systems";
+    longDescription = ''
+      Ultima VII, an RPG from the early 1990's, still has a huge following. But,
+      being a DOS game with a very nonstandard memory manager, it is difficult
+      to run it on the latest computers. Exult is a project that created an
+      Ultima VII game engine that runs on modern operating systems, capable of
+      using the data and graphics files that come with the game. Exult aims to
+      let those people who own Ultima VII play the game on modern hardware, in
+      as close to (or perhaps even surpassing) its original splendor as is
+      possible.
+    '';
+    homepage = "http://exult.info";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ azahi eelco ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/ezquake/default.nix b/nixpkgs/pkgs/games/ezquake/default.nix
new file mode 100644
index 000000000000..a562b9353ebe
--- /dev/null
+++ b/nixpkgs/pkgs/games/ezquake/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv, fetchFromGitHub, curl, expat
+, jansson, libpng, libjpeg, libGLU, libGL
+, libsndfile, libXxf86vm, pcre, pkg-config, SDL2
+, vim, speex }:
+
+stdenv.mkDerivation rec {
+  pname = "ezquake";
+  version = "3.6.3";
+
+  src = fetchFromGitHub {
+    owner = "QW-Group";
+    repo = pname + "-source";
+    rev = version;
+    fetchSubmodules = true;
+    hash = "sha256-ThrsJfj+eP7Lv2ZSNLO6/b98VHrL6/rhwf2p0qMvTF8=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [
+    expat curl jansson libpng libjpeg libGLU libGL libsndfile libXxf86vm pcre SDL2 vim speex
+  ];
+
+  installPhase = with lib; let
+    sys = last (splitString "-" stdenv.hostPlatform.system);
+    arch = head (splitString "-" stdenv.hostPlatform.system);
+  in ''
+    mkdir -p $out/bin
+    find .
+    mv ezquake-${sys}-${arch} $out/bin/ezquake
+  '';
+
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    homepage = "https://ezquake.com/";
+    description = "A modern QuakeWorld client focused on competitive online play";
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ edwtjo ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/factorio/default.nix b/nixpkgs/pkgs/games/factorio/default.nix
new file mode 100644
index 000000000000..7851cd6e8d1e
--- /dev/null
+++ b/nixpkgs/pkgs/games/factorio/default.nix
@@ -0,0 +1,277 @@
+{ lib
+, alsa-lib
+, factorio-utils
+, fetchurl
+, libGL
+, libICE
+, libSM
+, libX11
+, libXcursor
+, libXext
+, libXi
+, libXinerama
+, libXrandr
+, libpulseaudio
+, libxkbcommon
+, makeDesktopItem
+, makeWrapper
+, releaseType
+, stdenv
+, wayland
+
+, mods-dat ? null
+, versionsJson ? ./versions.json
+, username ? ""
+, token ? "" # get/reset token at https://factorio.com/profile
+, experimental ? false # true means to always use the latest branch
+, ...
+} @ args:
+
+assert releaseType == "alpha"
+  || releaseType == "headless"
+  || releaseType == "demo";
+
+let
+
+  inherit (lib) importJSON;
+
+  mods = args.mods or [ ];
+
+  helpMsg = ''
+
+    ===FETCH FAILED===
+    Please ensure you have set the username and token with config.nix, or
+    /etc/nix/nixpkgs-config.nix if on NixOS.
+
+    Your token can be seen at https://factorio.com/profile (after logging in). It is
+    not as sensitive as your password, but should still be safeguarded. There is a
+    link on that page to revoke/invalidate the token, if you believe it has been
+    leaked or wish to take precautions.
+
+    Example:
+    {
+      packageOverrides = pkgs: {
+        factorio = pkgs.factorio.override {
+          username = "FactorioPlayer1654";
+          token = "d5ad5a8971267c895c0da598688761";
+        };
+      };
+    }
+
+    Alternatively, instead of providing the username+token, you may manually
+    download the release through https://factorio.com/download , then add it to
+    the store using e.g.:
+
+      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
+
+    Note the ultimate "_" is replaced with "-" in the --name arg!
+  '';
+
+  desktopItem = makeDesktopItem {
+    name = "factorio";
+    desktopName = "Factorio";
+    comment = "A game in which you build and maintain factories.";
+    exec = "factorio";
+    icon = "factorio";
+    categories = [ "Game" ];
+  };
+
+  branch = if experimental then "experimental" else "stable";
+
+  # 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.
+  versions = importJSON versionsJson;
+  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.");
+
+  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;
+            curlOptsList = [
+              "--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
+            '';
+          }));
+  };
+
+  configBaseCfg = ''
+    use-system-read-write-data-directories=false
+    [path]
+    read-data=$out/share/factorio/data/
+    [other]
+    check_updates=false
+  '';
+
+  updateConfigSh = ''
+    #! $SHELL
+    if [[ -e ~/.factorio/config.cfg ]]; then
+      # Config file exists, but may have wrong path.
+      # Try to edit it. I'm sure this is perfectly safe and will never go wrong.
+      sed -i 's|^read-data=.*|read-data=$out/share/factorio/data/|' ~/.factorio/config.cfg
+    else
+      # Config file does not exist. Phew.
+      install -D $out/share/factorio/config-base.cfg ~/.factorio/config.cfg
+    fi
+  '';
+
+  modDir = factorio-utils.mkModDirDrv mods mods-dat;
+
+  base = with actual; {
+    pname = "factorio-${releaseType}";
+    inherit version src;
+
+    preferLocalBuild = true;
+    dontBuild = true;
+
+    installPhase = ''
+      mkdir -p $out/{bin,share/factorio}
+      cp -a data $out/share/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 = ''
+        Factorio is a game in which you build and maintain factories.
+
+        You will be mining resources, researching technologies, building
+        infrastructure, automating production and fighting enemies. Use your
+        imagination to design your factory, combine simple elements into
+        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 reached
+        version 1.0 in mid 2020.
+      '';
+      homepage = "https://www.factorio.com/";
+      sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
+      license = lib.licenses.unfree;
+      maintainers = with lib.maintainers; [ Baughn elitak erictapen priegger lukegb ];
+      platforms = [ "x86_64-linux" ];
+    };
+  };
+
+  releases = rec {
+    headless = base;
+    demo = base // {
+
+      nativeBuildInputs = [ makeWrapper ];
+      buildInputs = [ libpulseaudio ];
+
+      libPath = lib.makeLibraryPath [
+        alsa-lib
+        libGL
+        libICE
+        libSM
+        libX11
+        libXcursor
+        libXext
+        libXi
+        libXinerama
+        libXrandr
+        libpulseaudio
+        libxkbcommon
+        wayland
+      ];
+
+      installPhase = base.installPhase + ''
+        wrapProgram $out/bin/factorio                                \
+          --prefix LD_LIBRARY_PATH : /run/opengl-driver/lib:$libPath \
+          --run "$out/share/factorio/update-config.sh"               \
+          --argv0 ""                                                 \
+          --add-flags "-c \$HOME/.factorio/config.cfg"               \
+          ${lib.optionalString (mods!=[]) "--add-flags --mod-directory=${modDir}"}
+
+          # TODO Currently, every time a mod is changed/added/removed using the
+          # modlist, a new derivation will take up the entire footprint of the
+          # client. The only way to avoid this is to remove the mods arg from the
+          # package function. The modsDir derivation will have to be built
+          # separately and have the user specify it in the .factorio config or
+          # right along side it using a symlink into the store I think i will
+          # just remove mods for the client derivation entirely. this is much
+          # cleaner and more useful for headless mode.
+
+          # TODO: trying to toggle off a mod will result in read-only-fs-error.
+          # not much we can do about that except warn the user somewhere. In
+          # fact, no exit will be clean, since this error will happen on close
+          # regardless. just prints an ugly stacktrace but seems to be otherwise
+          # harmless, unless maybe the user forgets and tries to use the mod
+          # manager.
+
+        install -m0644 <(cat << EOF
+        ${configBaseCfg}
+        EOF
+        ) $out/share/factorio/config-base.cfg
+
+        install -m0755 <(cat << EOF
+        ${updateConfigSh}
+        EOF
+        ) $out/share/factorio/update-config.sh
+
+        mkdir -p $out/share/icons/hicolor/{64x64,128x128}/apps
+        cp -a data/core/graphics/factorio-icon.png $out/share/icons/hicolor/64x64/apps/factorio.png
+        cp -a data/core/graphics/factorio-icon@2x.png $out/share/icons/hicolor/128x128/apps/factorio.png
+        ln -s ${desktopItem}/share/applications $out/share/
+      '';
+    };
+    alpha = demo // {
+
+      installPhase = demo.installPhase + ''
+        cp -a doc-html $out/share/factorio
+      '';
+    };
+  };
+
+in
+stdenv.mkDerivation (releases.${releaseType})
diff --git a/nixpkgs/pkgs/games/factorio/mods.nix b/nixpkgs/pkgs/games/factorio/mods.nix
new file mode 100644
index 000000000000..7327b9e22870
--- /dev/null
+++ b/nixpkgs/pkgs/games/factorio/mods.nix
@@ -0,0 +1,213 @@
+# This file is here for demo purposes only, populated with a small sampling of
+# 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.
+{ lib, fetchurl
+, factorio-utils
+, allRecommendedMods ? true
+, allOptionalMods ? false
+}:
+with lib;
+let
+  modDrv = factorio-utils.modDrv { inherit allRecommendedMods allOptionalMods; };
+in
+rec {
+
+  bobassembly = modDrv {
+    src = fetchurl {
+      urls = [
+        "https://f.xor.us/factorio-mods/bobassembly_0.13.0.zip"
+      ];
+      sha256 = "0c0m7sb45r37g882x0aq8mc82yhfh9j9h8g018d4s5pf93vzr6d1";
+    };
+    deps = [ boblibrary ];
+    optionalDeps = [ bobconfig ];
+    recommendedDeps = [ bobplates ];
+  };
+
+  bobconfig = modDrv {
+    src = fetchurl {
+      urls = [
+        "https://f.xor.us/factorio-mods/bobconfig_0.13.1.zip"
+      ];
+      sha256 = "0z4kmggm1slbr3qiy5xahc9nhdffllp21n9nv5gh1zbzv72sb1rp";
+    };
+  };
+
+  bobelectronics = modDrv {
+    src = fetchurl {
+      urls = [
+        "https://f.xor.us/factorio-mods/bobelectronics_0.13.1.zip"
+      ];
+      sha256 = "16sn5w33s0ckiwqxx7b2pcsqmhxbxjm2w4h4vd99hwpvdpjyav52";
+    };
+    deps = [ boblibrary ];
+    optionalDeps = [ bobconfig ];
+    recommendedDeps = [ bobplates ];
+  };
+
+  bobenemies = modDrv {
+    src = fetchurl {
+      urls = [
+        "https://f.xor.us/factorio-mods/bobenemies_0.13.1.zip"
+      ];
+      sha256 = "1wnb5wsvh9aa3i9mj17f36ybbd13qima3iwshw60i6xkzzqfk44d";
+    };
+    optionalDeps = [ bobconfig ];
+  };
+
+  bobgreenhouse = modDrv {
+    src = fetchurl {
+      urls = [
+        "https://f.xor.us/factorio-mods/bobgreenhouse_0.13.2.zip"
+      ];
+      sha256 = "1ql26875dvz2lqln289jg1w6yjzsd0x0pqmd570jffwi5m320rrw";
+    };
+    deps = [ boblibrary ];
+    optionalDeps = [ bobconfig ];
+    recommendedDeps = [ bobplates ];
+  };
+
+  bobinserters = modDrv {
+    src = fetchurl {
+      urls = [
+        "https://f.xor.us/factorio-mods/bobinserters_0.13.3.zip"
+      ];
+      sha256 = "0nys9zhaw0v3w2xzrhawr8g2hcxkzdmyqd4s8xm5bnbrgrq86g9z";
+    };
+    deps = [ boblibrary ];
+    optionalDeps = [ bobconfig ];
+    recommendedDeps = [ ];
+  };
+
+  boblibrary = modDrv {
+    src = fetchurl {
+      urls = [
+        "https://f.xor.us/factorio-mods/boblibrary_0.13.1.zip"
+      ];
+      sha256 = "04fybs626lzxf0p21jl8kakh2mddah7l9m57srk7a87jw5bj1zx8";
+    };
+  };
+
+  boblogistics = modDrv {
+    src = fetchurl {
+      urls = [
+        "https://f.xor.us/factorio-mods/boblogistics_0.13.7.zip"
+      ];
+      sha256 = "0c91zmyxwsmyv6vm6gp498vb7flqlcyzkbp9s5q1651hpyd378hx";
+    };
+    deps = [ boblibrary ];
+    optionalDeps = [ bobconfig ];
+    recommendedDeps = [ bobplates ];
+  };
+
+  bobmining = modDrv {
+    src = fetchurl {
+      urls = [
+        "https://f.xor.us/factorio-mods/bobmining_0.13.1.zip"
+      ];
+      sha256 = "1l7k3v4aizihppgi802fr5b8zbnq2h05c2bbsk5hds239qgxy80m";
+    };
+    deps = [ boblibrary ];
+    optionalDeps = [ bobconfig bobores bobplates ];
+  };
+
+  bobmodules = modDrv {
+    src = fetchurl {
+      urls = [
+        "https://f.xor.us/factorio-mods/bobmodules_0.13.0.zip"
+      ];
+      sha256 = "0ggd2gc4s5sbld7gyncbzdgq8gc00mvxjcfv7i2dchcrdzrlr556";
+    };
+    deps = [ boblibrary ];
+    optionalDeps = [ bobconfig ];
+    recommendedDeps = [ bobplates bobassembly bobelectronics ];
+  };
+
+  bobores = modDrv {
+    src = fetchurl {
+      urls = [
+        "https://f.xor.us/factorio-mods/bobores_0.13.1.zip"
+      ];
+      sha256 = "1rri70655kj77sdr3zgp56whmcl0gfjmw90jm7lj1jp8l1pdfzb9";
+    };
+    deps = [ boblibrary ];
+    optionalDeps = [ bobconfig ];
+  };
+
+  bobplates = modDrv {
+    src = fetchurl {
+      urls = [
+        "https://f.xor.us/factorio-mods/bobplates_0.13.2.zip"
+      ];
+      sha256 = "0iczpa26hflj17k84p4n6wz0pwhbbrfk86dgac4bfz28kqg58nj1";
+    };
+    deps = [ boblibrary ];
+    optionalDeps = [ bobconfig bobenemies ];
+    recommendedDeps = [ bobores bobtech ];
+  };
+
+  bobpower = modDrv {
+    src = fetchurl {
+      urls = [
+        "https://f.xor.us/factorio-mods/bobpower_0.13.1.zip"
+      ];
+      sha256 = "18sblnlvprrm2vzlczlki09yj9lr4y64808zrwmcasf7470skar3";
+    };
+    deps = [ boblibrary ];
+    optionalDeps = [ bobconfig ];
+    recommendedDeps = [ bobplates ];
+  };
+
+  bobrevamp = modDrv {
+    src = fetchurl {
+      urls = [
+        "https://f.xor.us/factorio-mods/bobrevamp_0.13.0.zip"
+      ];
+      sha256 = "0rkyf61clh8fjg72z9i7r4skvdzgd49ky6s0486xxljhbil4nxb7";
+    };
+    deps = [ boblibrary ];
+  };
+
+  bobtech = modDrv {
+    src = fetchurl {
+      urls = [
+        "https://f.xor.us/factorio-mods/bobtech_0.13.0.zip"
+      ];
+      sha256 = "0arc9kilxzdpapn3gh5h8269ssgsjxib4ny0qissq2sg95gxlsn0";
+    };
+    deps = [ boblibrary ];
+    optionalDeps = [ bobenemies ];
+  };
+
+  bobtechsave = modDrv {
+    src = fetchurl {
+      urls = [
+        "https://f.xor.us/factorio-mods/bobtechsave_0.13.0.zip"
+      ];
+      sha256 = "1vlv4sgdfd9ldjm8y79n95ms5k6x2i7khjc422lp9080m03v1hcl";
+    };
+  };
+
+  bobwarfare = modDrv {
+    src = fetchurl {
+      urls = [
+        "https://f.xor.us/factorio-mods/bobwarfare_0.13.4.zip"
+      ];
+      sha256 = "07wzn16i4r0qjm41wfyl17rrhry2vrph08a0kq8w5iy6qcbqqfd3";
+    };
+    deps = [ boblibrary ];
+    optionalDeps = [ boblibrary bobplates ];
+    recommendedDeps = [ bobtech ];
+  };
+
+  clock = modDrv {
+    src = fetchurl {
+      urls = [
+        "https://f.xor.us/factorio-mods/clock_0.13.0.zip"
+      ];
+      sha256 = "0nflywbj6p2kz2w9wff78vskzljrzaf32ib56k3z456d9y8mlxfd";
+    };
+  };
+
+}
diff --git a/nixpkgs/pkgs/games/factorio/update.py b/nixpkgs/pkgs/games/factorio/update.py
new file mode 100755
index 000000000000..c234b36264e8
--- /dev/null
+++ b/nixpkgs/pkgs/games/factorio/update.py
@@ -0,0 +1,190 @@
+#!/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.')
+flags.DEFINE_list('release_type', '', 'If non-empty, a comma-separated list of release types to update (e.g. alpha).')
+flags.DEFINE_list('release_channel', '', 'If non-empty, a comma-separated list of release channels to update (e.g. experimental).')
+
+
+@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 FLAGS.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].get(release_type.name)
+                if version == None:
+                    continue
+                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 FLAGS.release_type and release_type_name not in FLAGS.release_type:
+            logging.info("%s/%s/%s: not in --release_type, not updating", system_name, release_type_name, release_channel_name)
+            return old_release
+        if FLAGS.release_channel and release_channel_name not in FLAGS.release_channel:
+            logging.info("%s/%s/%s: not in --release_channel, not updating", system_name, release_type_name, release_channel_name)
+            return old_release
+        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/nixpkgs/pkgs/games/factorio/utils.nix b/nixpkgs/pkgs/games/factorio/utils.nix
new file mode 100644
index 000000000000..d2b52ae48366
--- /dev/null
+++ b/nixpkgs/pkgs/games/factorio/utils.nix
@@ -0,0 +1,51 @@
+# 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.
+{ lib, stdenv }:
+with lib;
+{
+  mkModDirDrv = mods: modsDatFile: # a list of mod derivations
+    let
+      recursiveDeps = modDrv: [modDrv] ++ map recursiveDeps modDrv.deps;
+      modDrvs = unique (flatten (map recursiveDeps mods));
+    in
+    stdenv.mkDerivation {
+      name = "factorio-mod-directory";
+
+      preferLocalBuild = true;
+      buildCommand = ''
+        mkdir -p $out
+        for modDrv in ${toString modDrvs}; do
+          # NB: there will only ever be a single zip file in each mod derivation's output dir
+          ln -s $modDrv/*.zip $out
+        done
+      '' + (lib.optionalString (modsDatFile != null) ''
+       cp ${modsDatFile} $out/mod-settings.dat
+      '');
+    };
+
+    modDrv = { allRecommendedMods, allOptionalMods }:
+      { src
+      , name ? null
+      , deps ? []
+      , optionalDeps ? []
+      , recommendedDeps ? []
+      }: stdenv.mkDerivation {
+
+        inherit src;
+
+        # Use the name of the zip, but endstrip ".zip" and possibly the querystring that gets left in by fetchurl
+        name = replaceStrings ["_"] ["-"] (if name != null then name else removeSuffix ".zip" (head (splitString "?" src.name)));
+
+        deps = deps ++ optionals allOptionalMods optionalDeps
+                    ++ optionals allRecommendedMods recommendedDeps;
+
+        preferLocalBuild = true;
+        buildCommand = ''
+          mkdir -p $out
+          srcBase=$(basename $src)
+          srcBase=''${srcBase#*-}  # strip nix hash
+          srcBase=''${srcBase%\?*} # strip querystring leftover from fetchurl
+          cp $src $out/$srcBase
+        '';
+      };
+}
diff --git a/nixpkgs/pkgs/games/factorio/versions.json b/nixpkgs/pkgs/games/factorio/versions.json
new file mode 100644
index 000000000000..d034e6eab15d
--- /dev/null
+++ b/nixpkgs/pkgs/games/factorio/versions.json
@@ -0,0 +1,58 @@
+{
+  "x86_64-linux": {
+    "alpha": {
+      "experimental": {
+        "name": "factorio_alpha_x64-1.1.94.tar.xz",
+        "needsAuth": true,
+        "sha256": "06z3l828drnqv075qa3sg8l1877dlakqnppr79y031jlp8vg19pm",
+        "tarDirectory": "x64",
+        "url": "https://factorio.com/get-download/1.1.94/alpha/linux64",
+        "version": "1.1.94"
+      },
+      "stable": {
+        "name": "factorio_alpha_x64-1.1.94.tar.xz",
+        "needsAuth": true,
+        "sha256": "06z3l828drnqv075qa3sg8l1877dlakqnppr79y031jlp8vg19pm",
+        "tarDirectory": "x64",
+        "url": "https://factorio.com/get-download/1.1.94/alpha/linux64",
+        "version": "1.1.94"
+      }
+    },
+    "demo": {
+      "experimental": {
+        "name": "factorio_demo_x64-1.1.94.tar.xz",
+        "needsAuth": false,
+        "sha256": "1z2l8xj3vvrd1m3q1rypczzqdzrmldmyipfg54qly8cfj3pxvk4w",
+        "tarDirectory": "x64",
+        "url": "https://factorio.com/get-download/1.1.94/demo/linux64",
+        "version": "1.1.94"
+      },
+      "stable": {
+        "name": "factorio_demo_x64-1.1.94.tar.xz",
+        "needsAuth": false,
+        "sha256": "1z2l8xj3vvrd1m3q1rypczzqdzrmldmyipfg54qly8cfj3pxvk4w",
+        "tarDirectory": "x64",
+        "url": "https://factorio.com/get-download/1.1.94/demo/linux64",
+        "version": "1.1.94"
+      }
+    },
+    "headless": {
+      "experimental": {
+        "name": "factorio_headless_x64-1.1.94.tar.xz",
+        "needsAuth": false,
+        "sha256": "0ajs883dnz2ak1mxqvsw6hmpahcxqq243ravp5gb3iyiaaprqa4n",
+        "tarDirectory": "x64",
+        "url": "https://factorio.com/get-download/1.1.94/headless/linux64",
+        "version": "1.1.94"
+      },
+      "stable": {
+        "name": "factorio_headless_x64-1.1.94.tar.xz",
+        "needsAuth": false,
+        "sha256": "0ajs883dnz2ak1mxqvsw6hmpahcxqq243ravp5gb3iyiaaprqa4n",
+        "tarDirectory": "x64",
+        "url": "https://factorio.com/get-download/1.1.94/headless/linux64",
+        "version": "1.1.94"
+      }
+    }
+  }
+}
diff --git a/nixpkgs/pkgs/games/fairymax/default.nix b/nixpkgs/pkgs/games/fairymax/default.nix
new file mode 100644
index 000000000000..b493f4dcfa27
--- /dev/null
+++ b/nixpkgs/pkgs/games/fairymax/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, stdenv
+, fetchurl
+}:
+
+stdenv.mkDerivation rec {
+  pname = "fairymax";
+  version = "4.8";
+
+  src = fetchurl {
+    url = "http://home.hccnet.nl/h.g.muller/fmax4_8w.c";
+    hash = "sha256-ikn+CA5lxtDYSDT+Nsv1tfORhKW6/vlmHcGAT9SFfQc=";
+  };
+
+  ini = fetchurl {
+    url = "http://home.hccnet.nl/h.g.muller/fmax.ini";
+    hash = "sha256-lh2ivXx4jNdWn3pT1WKKNEvkVQ31JfdDx+vqNx44nf8=";
+  };
+
+  unpackPhase = ''
+    cp ${src} fairymax.c
+    cp ${ini} fmax.ini
+  '';
+
+  buildPhase = ''
+    cc *.c -Wno-return-type \
+      -o fairymax \
+      -DINI_FILE='"'"$out/share/fairymax/fmax.ini"'"'
+  '';
+
+  installPhase = ''
+    mkdir -p "$out"/{bin,share/fairymax}
+    cp fairymax "$out/bin"
+    cp fmax.ini "$out/share/fairymax"
+  '';
+
+  meta = with lib; {
+    homepage = "http://home.hccnet.nl/h.g.muller/dwnldpage.html";
+    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 implemented. This version
+       (4.8J) supports up to 15 piece types, and board sizes up to 12x8.
+    '';
+    license = licenses.free;
+    maintainers = [ maintainers.raskin ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/games/fallout-ce/build.nix b/nixpkgs/pkgs/games/fallout-ce/build.nix
new file mode 100644
index 000000000000..c220895db08c
--- /dev/null
+++ b/nixpkgs/pkgs/games/fallout-ce/build.nix
@@ -0,0 +1,77 @@
+{ cmake
+, fpattern
+, lib
+, SDL2
+, stdenv
+, writeShellScript
+
+, extraBuildInputs ? [ ]
+, extraMeta
+, pname
+, version
+, src
+}:
+
+let
+  launcher = writeShellScript "${pname}" ''
+    set -eu
+    assetDir="''${XDG_DATA_HOME:-$HOME/.local/share}/${pname}"
+    [ -d "$assetDir" ] || mkdir -p "$assetDir"
+    cd "$assetDir"
+
+    notice=0 fault=0
+    requiredFiles=(master.dat critter.dat)
+    for f in "''${requiredFiles[@]}"; do
+      if [ ! -f "$f" ]; then
+        echo "Required file $f not found in $PWD, note the files are case-sensitive"
+        notice=1 fault=1
+      fi
+    done
+
+    if [ ! -d "data/sound/music" ]; then
+      echo "data/sound/music directory not found in $PWD. This may prevent in-game music from functioning."
+      notice=1
+    fi
+
+    if [ $notice -ne 0 ]; then
+      echo "Please reference the installation instructions at https://github.com/alexbatalov/fallout2-ce"
+    fi
+
+    if [ $fault -ne 0 ]; then
+      exit $fault;
+    fi
+
+    exec @out@/libexec/${pname} "$@"
+  '';
+in
+stdenv.mkDerivation {
+  inherit pname version src;
+
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ SDL2 ] ++ extraBuildInputs;
+  hardeningDisable = [ "format" ];
+  cmakeBuildType = "RelWithDebInfo";
+
+  postPatch = ''
+    substituteInPlace third_party/fpattern/CMakeLists.txt \
+      --replace "FetchContent_Populate" "#FetchContent_Populate" \
+      --replace "{fpattern_SOURCE_DIR}" "${fpattern}/include" \
+      --replace "$/nix/" "/nix/"
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    install -D ${pname} $out/libexec/${pname}
+    install -D ${launcher} $out/bin/${pname}
+    substituteInPlace $out/bin/${pname} --subst-var out
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    license = licenses.sustainableUse;
+    maintainers = with maintainers; [ hughobrien TheBrainScrambler ];
+    platforms = platforms.linux;
+  } // extraMeta;
+}
diff --git a/nixpkgs/pkgs/games/fallout-ce/fallout-ce.nix b/nixpkgs/pkgs/games/fallout-ce/fallout-ce.nix
new file mode 100644
index 000000000000..5f55743a674b
--- /dev/null
+++ b/nixpkgs/pkgs/games/fallout-ce/fallout-ce.nix
@@ -0,0 +1,20 @@
+{ callPackage
+, fetchFromGitHub
+}:
+
+callPackage ./build.nix rec {
+  pname = "fallout-ce";
+  version = "1.0.0";
+
+  src = fetchFromGitHub {
+    owner = "alexbatalov";
+    repo = "fallout1-ce";
+    rev = "v${version}";
+    hash = "sha256-EvRkOlvtiVao63S0WRKKuHlhfkdTgc0m6GTyv4EfJFU=";
+  };
+
+  extraMeta = {
+    description = "A fully working re-implementation of Fallout, with the same original gameplay, engine bugfixes, and some quality of life improvements";
+    homepage = "https://github.com/alexbatalov/fallout1-ce";
+  };
+}
diff --git a/nixpkgs/pkgs/games/fallout-ce/fallout2-ce.nix b/nixpkgs/pkgs/games/fallout-ce/fallout2-ce.nix
new file mode 100644
index 000000000000..b28a9701c202
--- /dev/null
+++ b/nixpkgs/pkgs/games/fallout-ce/fallout2-ce.nix
@@ -0,0 +1,23 @@
+{ callPackage
+, fetchFromGitHub
+, zlib
+}:
+
+callPackage ./build.nix rec {
+  pname = "fallout2-ce";
+  version = "1.2.0";
+
+  src = fetchFromGitHub {
+    owner = "alexbatalov";
+    repo = "fallout2-ce";
+    rev = "v${version}";
+    hash = "sha256-+N4jhmxBX6z48kaU0jm90OKhguHlggT3OF9uuyY0EV0=";
+  };
+
+  extraBuildInputs = [ zlib ];
+
+  extraMeta = {
+    description = "A fully working re-implementation of Fallout 2, with the same original gameplay, engine bugfixes, and some quality of life improvements";
+    homepage = "https://github.com/alexbatalov/fallout2-ce";
+  };
+}
diff --git a/nixpkgs/pkgs/games/ferium/default.nix b/nixpkgs/pkgs/games/ferium/default.nix
new file mode 100644
index 000000000000..2cc48b6d8fbe
--- /dev/null
+++ b/nixpkgs/pkgs/games/ferium/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv, fetchFromGitHub, rustPlatform, Security, installShellFiles }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "ferium";
+  version = "4.4.1";
+
+  src = fetchFromGitHub {
+    owner = "gorilla-devs";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-3ILDR6CmR/CTzZfUEPD10TQZRSDKSqHmwxU3GPHIyK8=";
+  };
+
+  buildInputs = lib.optionals stdenv.isDarwin [ Security ];
+
+  cargoHash = "sha256-00rzn8eWcxRfPvIT2+EVQLd6e8gnMWx78QrwURpxstg=";
+
+  # Disable the GUI file picker so that GTK/XDG dependencies aren't used
+  buildNoDefaultFeatures = true;
+
+  # Requires an internet connection
+  doCheck = false;
+
+  nativeBuildInputs = [ installShellFiles ];
+
+  postInstall = ''
+    for shell in bash fish zsh; do
+      $out/bin/ferium complete $shell > ferium.$shell
+      installShellCompletion ferium.$shell
+    done
+  '';
+
+  meta = with lib; {
+    description = "Fast and multi-source CLI program for managing Minecraft mods and modpacks from Modrinth, CurseForge, and GitHub Releases";
+    homepage = "https://github.com/gorilla-devs/ferium";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ leo60228 soupglasses ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/fheroes2/default.nix b/nixpkgs/pkgs/games/fheroes2/default.nix
new file mode 100644
index 000000000000..700dd0f6b315
--- /dev/null
+++ b/nixpkgs/pkgs/games/fheroes2/default.nix
@@ -0,0 +1,71 @@
+{ stdenv, lib, fetchFromGitHub, imagemagick
+, gettext, glibcLocalesUtf8, libpng, SDL2, SDL2_image, SDL2_mixer, SDL2_ttf, zlib
+
+, gitUpdater
+}:
+
+stdenv.mkDerivation rec {
+  pname = "fheroes2";
+  version = "1.0.11";
+
+  src = fetchFromGitHub {
+    owner = "ihhub";
+    repo = "fheroes2";
+    rev = version;
+    hash = "sha256-R7hl5VzzdRcU9TF6WfiLYgUFpVixuppLobMsan0jKsQ=";
+  };
+
+  nativeBuildInputs = [ imagemagick ];
+
+  buildInputs = [ gettext glibcLocalesUtf8 libpng SDL2 SDL2_image SDL2_mixer SDL2_ttf zlib ];
+
+  makeFlags = [
+    "FHEROES2_STRICT_COMPILATION=1"
+    "FHEROES2_DATA=\"${placeholder "out"}/share/fheroes2\""
+  ];
+
+  enableParallelBuilding = true;
+
+  postBuild = ''
+    # Pick guaranteed to be present UTF-8 locale.
+    # Otherwise `iconv` calls fail to produce valid translations.
+    LANG=en_US.UTF_8 make -C files/lang
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    install -Dm755 $PWD/src/dist/fheroes2 $out/bin/fheroes2
+
+    install -Dm644 -t $out/share/fheroes2/files/lang $PWD/files/lang/*.mo
+    install -Dm644 -t $out/share/fheroes2/files/data $PWD/files/data/resurrection.h2d
+
+    install -Dm644 -t $out/share/applications $PWD/script/packaging/common/fheroes2.desktop
+
+    for size in 16 24 32 48 64 128; do
+      mkdir -p $out/share/icons/hicolor/"$size"x"$size"/apps
+      convert -resize "$size"x"$size" $PWD/src/resources/fheroes2.png $out/share/icons/hicolor/"$size"x"$size"/apps/fheroes2.png
+    done;
+
+    runHook postInstall
+  '';
+
+  passthru = {
+    updateScript = gitUpdater {
+      url = "https://github.com/ihhub/fheroes2.git";
+    };
+  };
+
+  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/nixpkgs/pkgs/games/fish-fillets-ng/default.nix b/nixpkgs/pkgs/games/fish-fillets-ng/default.nix
new file mode 100644
index 000000000000..787795828f4f
--- /dev/null
+++ b/nixpkgs/pkgs/games/fish-fillets-ng/default.nix
@@ -0,0 +1,41 @@
+{ 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";
+  };
+  data = fetchurl {
+    url = "mirror://sourceforge/fillets/fillets-ng-data-${version}.tar.gz";
+    sha256 = "169p0yqh2gxvhdilvjc2ld8aap7lv2nhkhkg4i1hlmgc6pxpkjgh";
+  };
+
+  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 = with lib; {
+    description = "A puzzle game";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ raskin ];
+    platforms = platforms.linux;
+    homepage = "https://fillets.sourceforge.net/";
+  };
+}
diff --git a/nixpkgs/pkgs/games/fish-fillets-ng/icon.xpm b/nixpkgs/pkgs/games/fish-fillets-ng/icon.xpm
new file mode 100644
index 000000000000..9947c54e7e55
--- /dev/null
+++ b/nixpkgs/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/nixpkgs/pkgs/games/flare/default.nix b/nixpkgs/pkgs/games/flare/default.nix
new file mode 100644
index 000000000000..45e1ee765426
--- /dev/null
+++ b/nixpkgs/pkgs/games/flare/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildEnv, callPackage, makeWrapper, Cocoa }:
+
+buildEnv {
+  name = "flare-1.14";
+
+  paths = [
+    (callPackage ./engine.nix { inherit Cocoa; })
+    (callPackage ./game.nix {})
+  ];
+
+  nativeBuildInputs = [ makeWrapper ];
+  postBuild = ''
+    mkdir -p $out/bin
+    makeWrapper $out/games/flare $out/bin/flare --chdir "$out/share/games/flare"
+  '';
+
+  meta = with lib; {
+    description = "Fantasy action RPG using the FLARE engine";
+    homepage = "https://flarerpg.org/";
+    maintainers = with maintainers; [ aanderse McSinyx ];
+    license = [ licenses.gpl3 licenses.cc-by-sa-30 ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/games/flare/desktop.patch b/nixpkgs/pkgs/games/flare/desktop.patch
new file mode 100644
index 000000000000..1ef3c21d010e
--- /dev/null
+++ b/nixpkgs/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/nixpkgs/pkgs/games/flare/engine.nix b/nixpkgs/pkgs/games/flare/engine.nix
new file mode 100644
index 000000000000..a1f8761815aa
--- /dev/null
+++ b/nixpkgs/pkgs/games/flare/engine.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, fetchFromGitHub, cmake, SDL2, SDL2_image, SDL2_mixer, SDL2_ttf, Cocoa }:
+
+stdenv.mkDerivation rec {
+  pname = "flare-engine";
+  version = "1.14";
+
+  src = fetchFromGitHub {
+    owner = "flareteam";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-DIzfTqwZJ8NAPB/TWzvPjepHb7hIbIr+Kk+doXJmpLc=";
+  };
+
+  patches = [ ./desktop.patch ];
+
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ SDL2 SDL2_image SDL2_mixer SDL2_ttf ]
+    ++ lib.optional stdenv.isDarwin Cocoa;
+
+  meta = with lib; {
+    description = "Free/Libre Action Roleplaying Engine";
+    homepage = "https://github.com/flareteam/flare-engine";
+    maintainers = with maintainers; [ aanderse McSinyx ];
+    license = [ licenses.gpl3 ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/games/flare/game.nix b/nixpkgs/pkgs/games/flare/game.nix
new file mode 100644
index 000000000000..8cfe40dc22b5
--- /dev/null
+++ b/nixpkgs/pkgs/games/flare/game.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, fetchFromGitHub, cmake }:
+
+stdenv.mkDerivation rec {
+  pname = "flare-game";
+  version = "1.14";
+
+  src = fetchFromGitHub {
+    owner = "flareteam";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-tINIwxyQn8eeJCHwRmAMo2TYRgrgJlGaUrnrgbmM3Jo=";
+  };
+
+  nativeBuildInputs = [ cmake ];
+
+  meta = with lib; {
+    description = "Fantasy action RPG using the FLARE engine";
+    homepage = "https://github.com/flareteam/flare-game";
+    maintainers = with maintainers; [ aanderse McSinyx ];
+    license = [ licenses.cc-by-sa-30 ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/games/flightgear/default.nix b/nixpkgs/pkgs/games/flightgear/default.nix
new file mode 100644
index 000000000000..3f6b02ddbb98
--- /dev/null
+++ b/nixpkgs/pkgs/games/flightgear/default.nix
@@ -0,0 +1,58 @@
+{ 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
+, makeDesktopItem, qtbase, qtdeclarative, glew, curl
+}:
+
+let
+  version = "2020.3.19";
+  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.txz";
+      sha256 = "sha256-863EnNBU+rYTdxHwMV6HbBu99lO6H3mKGuyumm6YR5U=";
+    };
+
+    dontUnpack = true;
+
+    installPhase = ''
+      mkdir -p "$out/share/FlightGear"
+      tar xf "${src}" -C "$out/share/FlightGear/" --strip-components=1
+    '';
+  };
+in
+stdenv.mkDerivation rec {
+  pname = "flightgear";
+  # inheriting data for `nix-prefetch-url -A pkgs.flightgear.data.src`
+  inherit version data;
+
+  src = fetchurl {
+    url = "mirror://sourceforge/flightgear/release-${shortVersion}/${pname}-${version}.tar.bz2";
+    sha256 = "sha256-Fn0I3pzA9yIYs3myPNflbH9u4Y19VZUS2lGjvWfzjm4=";
+  };
+
+  nativeBuildInputs = [ cmake wrapQtAppsHook ];
+  buildInputs = [
+    freeglut freealut libGLU libGL libICE libjpeg openal openscenegraph plib
+    libSM libunwind libX11 xorgproto libXext libXi
+    libXmu libXt simgear zlib boost libpng udev fltk13 apr qtbase
+    glew qtdeclarative curl
+  ];
+
+  qtWrapperArgs = [
+    "--set FG_ROOT ${data}/share/FlightGear"
+  ];
+
+  meta = with lib; {
+    description = "Flight simulator";
+    maintainers = with maintainers; [ raskin ];
+    platforms = platforms.linux;
+    hydraPlatforms = []; # disabled from hydra because it's so big
+    license = licenses.gpl2;
+    mainProgram = "fgfs";
+  };
+}
diff --git a/nixpkgs/pkgs/games/fltrator/default.nix b/nixpkgs/pkgs/games/fltrator/default.nix
new file mode 100644
index 000000000000..b1a2bb6b8c0d
--- /dev/null
+++ b/nixpkgs/pkgs/games/fltrator/default.nix
@@ -0,0 +1,45 @@
+{ lib, stdenv, fetchurl, unzip, fltk, which, libjpeg }:
+
+stdenv.mkDerivation rec {
+  pname = "fltrator";
+  version = "2.3";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/fltrator/fltrator-${version}-code.zip";
+    sha256 = "125aqq1sfrm0c9cm6gyylwdmc8xrb0rjf563xvw7q28sdbl6ayp7";
+  };
+
+  buildInputs = [ fltk libjpeg ];
+  nativeBuildInputs = [ unzip which ];
+
+  postPatch = ''
+    substituteInPlace src/fltrator.cxx\
+      --replace 'home += "fltrator/"' "home = \"$out/fltrator/\""
+    substituteInPlace src/fltrator-landscape.cxx\
+      --replace 'home += "fltrator/"' "home = \"$out/fltrator/\""
+    substituteInPlace rsc/fltrator.desktop \
+      --replace 'Exec=fltrator' "Exec=$out/bin/fltrator"
+  '';
+
+  dontAddPrefix = true;
+
+  makeFlags = [ "HOME=$(out)" "RSC_PATH=$(out)/fltrator"];
+
+  postInstall = ''
+    mkdir -p $out/share/applications
+    cp rsc/fltrator.desktop $out/share/applications
+    mkdir -p $out/share/icons/hicolor/128x128/apps/
+    cp rsc/fltrator-128.png $out/share/icons/hicolor/128x128/apps/fltrator2.png
+  '';
+
+  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 = "https://fltrator.sourceforge.net/";
+    platforms = platforms.linux;
+    maintainers = [ maintainers.marius851000 ];
+    license = licenses.gpl3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/games/forge-mtg/default.nix b/nixpkgs/pkgs/games/forge-mtg/default.nix
new file mode 100644
index 000000000000..cc5c56977bb9
--- /dev/null
+++ b/nixpkgs/pkgs/games/forge-mtg/default.nix
@@ -0,0 +1,65 @@
+{ coreutils
+, fetchFromGitHub
+, gnused
+, lib
+, maven
+, makeWrapper
+, openjdk
+}:
+
+let
+  version = "1.6.57";
+
+  src = fetchFromGitHub {
+    owner = "Card-Forge";
+    repo = "forge";
+    rev = "forge-${version}";
+    hash = "sha256-pxnnqLfyblbIgIRZZrx8Y8K43zUv9mu7PzZ7zltpEUQ=";
+  };
+
+  # launch4j downloads and runs a native binary during the package phase.
+  patches = [ ./no-launch4j.patch ];
+
+in
+maven.buildMavenPackage {
+  pname = "forge-mtg";
+  inherit version src patches;
+
+  # Tests need a running Xorg.
+  mvnParameters = "-DskipTests";
+  mvnHash = "sha256-QK9g0tG75lIhEtf4jW03N32YbD9Fe5iI0JTuqmCTtnE=";
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  installPhase = ''
+    runHook preInstall
+    mkdir -p $out/bin $out/share/forge
+    cp -a \
+      forge-gui-desktop/target/forge.sh \
+      forge-gui-desktop/target/forge-gui-desktop-${version}-jar-with-dependencies.jar \
+      forge-gui-mobile-dev/target/forge-adventure.sh \
+      forge-gui-mobile-dev/target/forge-gui-mobile-dev-${version}-jar-with-dependencies.jar \
+      forge-adventure/target/forge-adventure-editor.sh \
+      forge-adventure/target/forge-adventure-${version}-jar-with-dependencies.jar \
+      forge-gui/res \
+      $out/share/forge
+    runHook postInstall
+  '';
+
+  preFixup = ''
+    for commandToInstall in forge forge-adventure forge-adventure-editor; do
+      chmod 555 $out/share/forge/$commandToInstall.sh
+      makeWrapper $out/share/forge/$commandToInstall.sh $out/bin/$commandToInstall \
+        --prefix PATH : ${lib.makeBinPath [ coreutils openjdk gnused ]} \
+        --set JAVA_HOME ${openjdk}/lib/openjdk \
+        --set SENTRY_DSN ""
+    done
+  '';
+
+  meta = with lib; {
+    description = "Magic: the Gathering card game with rules enforcement";
+    homepage = "https://www.slightlymagic.net/forum/viewforum.php?f=26";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ eigengrau ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/forge-mtg/no-launch4j.patch b/nixpkgs/pkgs/games/forge-mtg/no-launch4j.patch
new file mode 100644
index 000000000000..7e9d9f4790a0
--- /dev/null
+++ b/nixpkgs/pkgs/games/forge-mtg/no-launch4j.patch
@@ -0,0 +1,466 @@
+diff --git a/forge-adventure/pom.xml b/forge-adventure/pom.xml
+index b35356ea76..b7ab1c775b 100644
+--- a/forge-adventure/pom.xml
++++ b/forge-adventure/pom.xml
+@@ -47,131 +47,6 @@
+                 </configuration>
+             </plugin>
+ 
+-            <plugin>
+-                    <groupId>com.akathist.maven.plugins.launch4j</groupId>
+-                    <artifactId>launch4j-maven-plugin</artifactId>
+-                    <version>1.7.25</version>
+-                    <executions>
+-                        <execution>
+-                            <id>l4j-adv</id>
+-                            <phase>package</phase>
+-                            <goals>
+-                                <goal>launch4j</goal>
+-                            </goals>
+-                            <configuration>
+-                                <headerType>gui</headerType>
+-                                <outfile>${project.build.directory}/forge-adventure-editor-java8.exe</outfile>
+-                                <jar>${project.build.finalName}-jar-with-dependencies.jar</jar>
+-                                <dontWrapJar>true</dontWrapJar>
+-                                <errTitle>forge</errTitle>
+-                                <icon>src/main/config/forge-adventure-editor.ico</icon>
+-                                <classPath>
+-                                    <mainClass>forge.adventure.Main</mainClass>
+-                                    <addDependencies>false</addDependencies>
+-                                    <preCp>anything</preCp>
+-                                </classPath>
+-                                <jre>
+-                                    <minVersion>1.8.0</minVersion>
+-                                    <maxHeapSize>4096</maxHeapSize>
+-                                    <opts>
+-                                        <opt>-Dfile.encoding=UTF-8</opt>
+-                                    </opts>
+-                                </jre>
+-                                <versionInfo>
+-                                    <fileVersion>
+-                                        1.0.0.0
+-                                    </fileVersion>
+-                                    <txtFileVersion>
+-                                        1.0.0.0
+-                                    </txtFileVersion>
+-                                    <fileDescription>Forge</fileDescription>
+-                                    <copyright>Forge</copyright>
+-                                    <productVersion>
+-                                        1.0.0.0
+-                                    </productVersion>
+-                                    <txtProductVersion>
+-                                        1.0.0.0
+-                                    </txtProductVersion>
+-                                    <productName>forge-adventure-editor</productName>
+-                                    <internalName>forge-adventure-editor</internalName>
+-                                    <originalFilename>forge-adventure-editor-java8.exe</originalFilename>
+-                                </versionInfo>
+-                            </configuration>
+-                        </execution>
+-                        <!--extra-->
+-                        <execution>
+-                            <id>l4j-adv2</id>
+-                            <phase>package</phase>
+-                            <goals>
+-                                <goal>launch4j</goal>
+-                            </goals>
+-                            <configuration>
+-                                <headerType>gui</headerType>
+-                                <outfile>${project.build.directory}/forge-adventure-editor.exe</outfile>
+-                                <jar>${project.build.finalName}-jar-with-dependencies.jar</jar>
+-                                <dontWrapJar>true</dontWrapJar>
+-                                <errTitle>forge</errTitle>
+-                                <downloadUrl>https://www.oracle.com/java/technologies/downloads/</downloadUrl>
+-                                <icon>src/main/config/forge-adventure-editor.ico</icon>
+-                                <classPath>
+-                                    <mainClass>forge.adventure.Main</mainClass>
+-                                    <addDependencies>false</addDependencies>
+-                                    <preCp>anything</preCp>
+-                                </classPath>
+-                                <jre>
+-                                    <minVersion>11.0.1</minVersion>
+-                                    <jdkPreference>jdkOnly</jdkPreference>
+-                                    <maxHeapSize>4096</maxHeapSize>
+-                                    <opts>
+-                                        <opt>-Dfile.encoding=UTF-8</opt>
+-                                        <opt>--add-opens java.base/java.lang=ALL-UNNAMED</opt>
+-                                        <opt>--add-opens java.base/java.math=ALL-UNNAMED</opt>
+-                                        <opt>--add-opens java.base/jdk.internal.misc=ALL-UNNAMED</opt>
+-                                        <opt>--add-opens java.base/java.nio=ALL-UNNAMED</opt>
+-                                        <opt>--add-opens=java.base/sun.nio.ch=ALL-UNNAMED</opt>
+-                                        <opt>--add-opens java.base/java.util=ALL-UNNAMED</opt>
+-                                        <opt>--add-opens java.base/java.lang.reflect=ALL-UNNAMED</opt>
+-                                        <opt>--add-opens java.base/java.text=ALL-UNNAMED</opt>
+-                                        <opt>--add-opens java.desktop/java.awt=ALL-UNNAMED</opt>
+-                                        <opt>--add-opens java.desktop/java.awt.font=ALL-UNNAMED</opt>
+-                                        <opt>--add-opens java.desktop/java.awt.image=ALL-UNNAMED</opt>
+-                                        <opt>--add-opens java.desktop/java.awt.color=ALL-UNNAMED</opt>
+-                                        <opt>--add-opens java.desktop/sun.awt.image=ALL-UNNAMED</opt>
+-                                        <opt>--add-opens java.desktop/javax.swing=ALL-UNNAMED</opt>
+-                                        <opt>--add-opens java.desktop/javax.swing.border=ALL-UNNAMED</opt>
+-                                        <opt>--add-opens java.desktop/javax.swing.event=ALL-UNNAMED</opt>
+-                                        <opt>--add-opens java.desktop/sun.swing=ALL-UNNAMED</opt>
+-                                        <opt>--add-opens java.desktop/java.beans=ALL-UNNAMED</opt>
+-                                        <opt>--add-opens java.base/java.util.concurrent=ALL-UNNAMED</opt>
+-                                        <opt>--add-opens java.base/java.net=ALL-UNNAMED</opt>
+-                                        <opt>-Dio.netty.tryReflectionSetAccessible=true</opt>
+-                                    </opts>
+-                                </jre>
+-                                <versionInfo>
+-                                    <fileVersion>
+-                                        1.0.0.0
+-                                    </fileVersion>
+-                                    <txtFileVersion>
+-                                        1.0.0.0
+-                                    </txtFileVersion>
+-                                    <fileDescription>Forge</fileDescription>
+-                                    <copyright>Forge</copyright>
+-                                    <productVersion>
+-                                        1.0.0.0
+-                                    </productVersion>
+-                                    <txtProductVersion>
+-                                        1.0.0.0
+-                                    </txtProductVersion>
+-                                    <productName>forge-adventure-editor</productName>
+-                                    <internalName>forge-adventure-editor</internalName>
+-                                    <originalFilename>forge-adventure-editor.exe</originalFilename>
+-                                </versionInfo>
+-                            </configuration>
+-                        </execution>
+-                        <!--extra-->
+-                    </executions>
+-            </plugin>
+-
+             <plugin>
+                 <groupId>com.google.code.maven-replacer-plugin</groupId>
+                 <artifactId>replacer</artifactId>
+diff --git a/forge-gui-desktop/pom.xml b/forge-gui-desktop/pom.xml
+index 3b74663b04..f0e324b69c 100644
+--- a/forge-gui-desktop/pom.xml
++++ b/forge-gui-desktop/pom.xml
+@@ -282,59 +282,6 @@
+             <id>windows-linux-release</id>
+             <build>
+                 <plugins>
+-                    <plugin>
+-                        <groupId>com.akathist.maven.plugins.launch4j</groupId>
+-                        <artifactId>launch4j-maven-plugin</artifactId>
+-                        <version>2.1.2</version>
+-                        <executions>
+-                            <execution>
+-                                <id>l4j-gui</id>
+-                                <phase>package</phase>
+-                                <goals>
+-                                    <goal>launch4j</goal>
+-                                </goals>
+-                                <configuration>
+-                                    <headerType>gui</headerType>
+-                                    <outfile>${project.build.directory}/forge-java8.exe</outfile>
+-                                    <jar>${project.build.finalName}-jar-with-dependencies.jar</jar>
+-                                    <dontWrapJar>true</dontWrapJar>
+-                                    <errTitle>forge</errTitle>
+-                                    <icon>src/main/config/forge.ico</icon>
+-                                    <classPath>
+-                                        <mainClass>forge.view.Main</mainClass>
+-                                        <addDependencies>false</addDependencies>
+-                                        <preCp>anything</preCp>
+-                                    </classPath>
+-                                    <jre>
+-                                        <minVersion>1.8.0</minVersion>
+-                                        <maxHeapSize>4096</maxHeapSize>
+-                                        <opts>
+-                                            <opt>-Dfile.encoding=UTF-8</opt>
+-                                        </opts>
+-                                    </jre>
+-                                    <versionInfo>
+-                                        <fileVersion>
+-                                            ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
+-                                        </fileVersion>
+-                                        <txtFileVersion>
+-                                            ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
+-                                        </txtFileVersion>
+-                                        <fileDescription>Forge</fileDescription>
+-                                        <copyright>Forge</copyright>
+-                                        <productVersion>
+-                                            ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
+-                                        </productVersion>
+-                                        <txtProductVersion>
+-                                            ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
+-                                        </txtProductVersion>
+-                                        <productName>Forge</productName>
+-                                        <internalName>forge</internalName>
+-                                        <originalFilename>forge-java8.exe</originalFilename>
+-                                    </versionInfo>
+-                                </configuration>
+-                            </execution>
+-                        </executions>
+-                    </plugin>
+ 
+                     <plugin>
+                         <groupId>org.apache.maven.plugins</groupId>
+@@ -447,130 +394,6 @@
+             <id>windows-linux</id>
+             <build>
+                 <plugins>
+-                    <plugin>
+-                        <groupId>com.akathist.maven.plugins.launch4j</groupId>
+-                        <artifactId>launch4j-maven-plugin</artifactId>
+-                        <version>2.1.2</version>
+-                        <executions>
+-                            <execution>
+-                                <id>l4j-gui</id>
+-                                <phase>package</phase>
+-                                <goals>
+-                                    <goal>launch4j</goal>
+-                                </goals>
+-                                <configuration>
+-                                    <headerType>gui</headerType>
+-                                    <outfile>${project.build.directory}/forge-java8.exe</outfile>
+-                                    <jar>${project.build.finalName}-jar-with-dependencies.jar</jar>
+-                                    <dontWrapJar>true</dontWrapJar>
+-                                    <errTitle>forge</errTitle>
+-                                    <icon>src/main/config/forge.ico</icon>
+-                                    <classPath>
+-                                        <mainClass>forge.view.Main</mainClass>
+-                                        <addDependencies>false</addDependencies>
+-                                        <preCp>anything</preCp>
+-                                    </classPath>
+-                                    <jre>
+-                                        <minVersion>1.8.0</minVersion>
+-                                        <maxHeapSize>4096</maxHeapSize>
+-                                        <opts>
+-                                            <opt>-Dfile.encoding=UTF-8</opt>
+-                                        </opts>
+-                                    </jre>
+-                                    <versionInfo>
+-                                        <fileVersion>
+-                                            ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
+-                                        </fileVersion>
+-                                        <txtFileVersion>
+-                                            ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
+-                                        </txtFileVersion>
+-                                        <fileDescription>Forge</fileDescription>
+-                                        <copyright>Forge</copyright>
+-                                        <productVersion>
+-                                            ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
+-                                        </productVersion>
+-                                        <txtProductVersion>
+-                                            ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
+-                                        </txtProductVersion>
+-                                        <productName>Forge</productName>
+-                                        <internalName>forge</internalName>
+-                                        <originalFilename>forge-java8.exe</originalFilename>
+-                                    </versionInfo>
+-                                </configuration>
+-                            </execution>
+-                            <!--extra-->
+-                            <execution>
+-                                <id>l4j-gui2</id>
+-                                <phase>package</phase>
+-                                <goals>
+-                                    <goal>launch4j</goal>
+-                                </goals>
+-                                <configuration>
+-                                    <headerType>gui</headerType>
+-                                    <outfile>${project.build.directory}/forge.exe</outfile>
+-                                    <jar>${project.build.finalName}-jar-with-dependencies.jar</jar>
+-                                    <dontWrapJar>true</dontWrapJar>
+-                                    <errTitle>forge</errTitle>
+-                                    <downloadUrl>https://www.oracle.com/java/technologies/downloads/</downloadUrl>
+-                                    <icon>src/main/config/forge.ico</icon>
+-                                    <classPath>
+-                                        <mainClass>forge.view.Main</mainClass>
+-                                        <addDependencies>false</addDependencies>
+-                                        <preCp>anything</preCp>
+-                                    </classPath>
+-                                    <jre>
+-                                        <minVersion>11.0.1</minVersion>
+-                                        <jdkPreference>jdkOnly</jdkPreference>
+-                                        <maxHeapSize>4096</maxHeapSize>
+-                                        <opts>
+-                                            <opt>-Dfile.encoding=UTF-8</opt>
+-                                            <opt>--add-opens java.base/java.lang=ALL-UNNAMED</opt>
+-                                            <opt>--add-opens java.base/java.math=ALL-UNNAMED</opt>
+-                                            <opt>--add-opens java.base/jdk.internal.misc=ALL-UNNAMED</opt>
+-                                            <opt>--add-opens java.base/java.nio=ALL-UNNAMED</opt>
+-                                            <opt>--add-opens=java.base/sun.nio.ch=ALL-UNNAMED</opt>
+-                                            <opt>--add-opens java.base/java.util=ALL-UNNAMED</opt>
+-                                            <opt>--add-opens java.base/java.lang.reflect=ALL-UNNAMED</opt>
+-                                            <opt>--add-opens java.base/java.text=ALL-UNNAMED</opt>
+-                                            <opt>--add-opens java.desktop/java.awt=ALL-UNNAMED</opt>
+-                                            <opt>--add-opens java.desktop/java.awt.font=ALL-UNNAMED</opt>
+-                                            <opt>--add-opens java.desktop/java.awt.image=ALL-UNNAMED</opt>
+-                                            <opt>--add-opens java.desktop/java.awt.color=ALL-UNNAMED</opt>
+-                                            <opt>--add-opens java.desktop/sun.awt.image=ALL-UNNAMED</opt>
+-                                            <opt>--add-opens java.desktop/javax.swing=ALL-UNNAMED</opt>
+-                                            <opt>--add-opens java.desktop/javax.swing.border=ALL-UNNAMED</opt>
+-                                            <opt>--add-opens java.desktop/javax.swing.event=ALL-UNNAMED</opt>
+-                                            <opt>--add-opens java.desktop/sun.swing=ALL-UNNAMED</opt>
+-                                            <opt>--add-opens java.desktop/java.beans=ALL-UNNAMED</opt>
+-                                            <opt>--add-opens java.base/java.util.concurrent=ALL-UNNAMED</opt>
+-                                            <opt>--add-opens java.base/java.net=ALL-UNNAMED</opt>
+-                                            <opt>-Dio.netty.tryReflectionSetAccessible=true</opt>
+-                                        </opts>
+-                                    </jre>
+-                                    <versionInfo>
+-                                        <fileVersion>
+-                                            ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
+-                                        </fileVersion>
+-                                        <txtFileVersion>
+-                                            ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
+-                                        </txtFileVersion>
+-                                        <fileDescription>Forge</fileDescription>
+-                                        <copyright>Forge</copyright>
+-                                        <productVersion>
+-                                            ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
+-                                        </productVersion>
+-                                        <txtProductVersion>
+-                                            ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.0
+-                                        </txtProductVersion>
+-                                        <productName>Forge</productName>
+-                                        <internalName>forge</internalName>
+-                                        <originalFilename>forge.exe</originalFilename>
+-                                    </versionInfo>
+-                                </configuration>
+-                            </execution>
+-                            <!--extra-->
+-                        </executions>
+-                    </plugin>
+ 
+                     <plugin>
+                         <groupId>org.apache.maven.plugins</groupId>
+diff --git a/forge-gui-mobile-dev/pom.xml b/forge-gui-mobile-dev/pom.xml
+index e7439c1e3a..de0cbc16a1 100644
+--- a/forge-gui-mobile-dev/pom.xml
++++ b/forge-gui-mobile-dev/pom.xml
+@@ -64,130 +64,6 @@
+                     </replacements>
+                 </configuration>
+             </plugin>
+-            <plugin>
+-                <groupId>com.akathist.maven.plugins.launch4j</groupId>
+-                <artifactId>launch4j-maven-plugin</artifactId>
+-                <version>1.7.25</version>
+-                <executions>
+-                    <execution>
+-                        <id>l4j-adv</id>
+-                        <phase>package</phase>
+-                        <goals>
+-                            <goal>launch4j</goal>
+-                        </goals>
+-                        <configuration>
+-                            <headerType>gui</headerType>
+-                            <outfile>${project.build.directory}/forge-adventure-java8.exe</outfile>
+-                            <jar>${project.build.finalName}-jar-with-dependencies.jar</jar>
+-                            <dontWrapJar>true</dontWrapJar>
+-                            <errTitle>forge</errTitle>
+-                            <icon>src/main/config/forge-adventure.ico</icon>
+-                            <classPath>
+-                                <mainClass>forge.app.Main</mainClass>
+-                                <addDependencies>false</addDependencies>
+-                                <preCp>anything</preCp>
+-                            </classPath>
+-                            <jre>
+-                                <minVersion>1.8.0</minVersion>
+-                                <maxHeapSize>4096</maxHeapSize>
+-                                <opts>
+-                                    <opt>-Dfile.encoding=UTF-8</opt>
+-                                </opts>
+-                            </jre>
+-                            <versionInfo>
+-                                <fileVersion>
+-                                    1.0.0.0
+-                                </fileVersion>
+-                                <txtFileVersion>
+-                                    1.0.0.0
+-                                </txtFileVersion>
+-                                <fileDescription>Forge</fileDescription>
+-                                <copyright>Forge</copyright>
+-                                <productVersion>
+-                                    1.0.0.0
+-                                </productVersion>
+-                                <txtProductVersion>
+-                                    1.0.0.0
+-                                </txtProductVersion>
+-                                <productName>forge-adventure</productName>
+-                                <internalName>forge-adventure</internalName>
+-                                <originalFilename>forge-adventure-java8.exe</originalFilename>
+-                            </versionInfo>
+-                        </configuration>
+-                    </execution>
+-                    <!--extra-->
+-                    <execution>
+-                        <id>l4j-adv2</id>
+-                        <phase>package</phase>
+-                        <goals>
+-                            <goal>launch4j</goal>
+-                        </goals>
+-                        <configuration>
+-                            <headerType>gui</headerType>
+-                            <outfile>${project.build.directory}/forge-adventure.exe</outfile>
+-                            <jar>${project.build.finalName}-jar-with-dependencies.jar</jar>
+-                            <dontWrapJar>true</dontWrapJar>
+-                            <errTitle>forge</errTitle>
+-                            <downloadUrl>https://www.oracle.com/java/technologies/downloads/</downloadUrl>
+-                            <icon>src/main/config/forge-adventure.ico</icon>
+-                            <classPath>
+-                                <mainClass>forge.app.Main</mainClass>
+-                                <addDependencies>false</addDependencies>
+-                                <preCp>anything</preCp>
+-                            </classPath>
+-                            <jre>
+-                                <minVersion>11.0.1</minVersion>
+-                                <jdkPreference>jdkOnly</jdkPreference>
+-                                <maxHeapSize>4096</maxHeapSize>
+-                                <opts>
+-                                    <opt>-Dfile.encoding=UTF-8</opt>
+-                                    <opt>--add-opens java.base/java.lang=ALL-UNNAMED</opt>
+-                                    <opt>--add-opens java.base/java.math=ALL-UNNAMED</opt>
+-                                    <opt>--add-opens java.base/jdk.internal.misc=ALL-UNNAMED</opt>
+-                                    <opt>--add-opens java.base/java.nio=ALL-UNNAMED</opt>
+-                                    <opt>--add-opens=java.base/sun.nio.ch=ALL-UNNAMED</opt>
+-                                    <opt>--add-opens java.base/java.util=ALL-UNNAMED</opt>
+-                                    <opt>--add-opens java.base/java.lang.reflect=ALL-UNNAMED</opt>
+-                                    <opt>--add-opens java.base/java.text=ALL-UNNAMED</opt>
+-                                    <opt>--add-opens java.desktop/java.awt=ALL-UNNAMED</opt>
+-                                    <opt>--add-opens java.desktop/java.awt.font=ALL-UNNAMED</opt>
+-                                    <opt>--add-opens java.desktop/java.awt.image=ALL-UNNAMED</opt>
+-                                    <opt>--add-opens java.desktop/java.awt.color=ALL-UNNAMED</opt>
+-                                    <opt>--add-opens java.desktop/sun.awt.image=ALL-UNNAMED</opt>
+-                                    <opt>--add-opens java.desktop/javax.swing=ALL-UNNAMED</opt>
+-                                    <opt>--add-opens java.desktop/javax.swing.border=ALL-UNNAMED</opt>
+-                                    <opt>--add-opens java.desktop/javax.swing.event=ALL-UNNAMED</opt>
+-                                    <opt>--add-opens java.desktop/sun.swing=ALL-UNNAMED</opt>
+-                                    <opt>--add-opens java.desktop/java.beans=ALL-UNNAMED</opt>
+-                                    <opt>--add-opens java.base/java.util.concurrent=ALL-UNNAMED</opt>
+-                                    <opt>--add-opens java.base/java.net=ALL-UNNAMED</opt>
+-                                    <opt>-Dio.netty.tryReflectionSetAccessible=true</opt>
+-                                </opts>
+-                            </jre>
+-                            <versionInfo>
+-                                <fileVersion>
+-                                    1.0.0.0
+-                                </fileVersion>
+-                                <txtFileVersion>
+-                                    1.0.0.0
+-                                </txtFileVersion>
+-                                <fileDescription>Forge</fileDescription>
+-                                <copyright>Forge</copyright>
+-                                <productVersion>
+-                                    1.0.0.0
+-                                </productVersion>
+-                                <txtProductVersion>
+-                                    1.0.0.0
+-                                </txtProductVersion>
+-                                <productName>forge-adventure</productName>
+-                                <internalName>forge-adventure</internalName>
+-                                <originalFilename>forge-adventure.exe</originalFilename>
+-                            </versionInfo>
+-                        </configuration>
+-                    </execution>
+-                    <!--extra-->
+-                </executions>
+-            </plugin>
+             <plugin>
+                 <artifactId>maven-assembly-plugin</artifactId>
+                 <configuration>
diff --git a/nixpkgs/pkgs/games/freeciv/default.nix b/nixpkgs/pkgs/games/freeciv/default.nix
new file mode 100644
index 000000000000..bccec663dbaa
--- /dev/null
+++ b/nixpkgs/pkgs/games/freeciv/default.nix
@@ -0,0 +1,86 @@
+{ lib, stdenv, fetchFromGitHub, autoreconfHook, lua5_3, pkg-config, python3
+, zlib, bzip2, curl, xz, gettext, libiconv, icu
+, SDL2, SDL2_mixer, SDL2_image, SDL2_ttf, SDL2_gfx, freetype, fluidsynth
+, sdl2Client ? false
+, gtkClient ? true, gtk3, wrapGAppsHook
+, qtClient ? false, qt5
+, server ? true, readline
+, enableSqlite ? true, sqlite
+}:
+
+stdenv.mkDerivation rec {
+  pname = "freeciv";
+  version = "3.0.9";
+
+  src = fetchFromGitHub {
+    owner = "freeciv";
+    repo = "freeciv";
+    rev = "R${lib.replaceStrings [ "." ] [ "_" ] version}";
+    hash = "sha256-vtkGV97FG43HIKPJ/of7jXWSrwHWgHUjwtq0XJPeKws=";
+  };
+
+  postPatch = ''
+    for f in {common,utility}/*.py; do
+      substituteInPlace $f \
+        --replace '/usr/bin/env python3' ${python3.interpreter}
+    done
+    for f in bootstrap/*.sh; do
+      patchShebangs $f
+    done
+  '';
+
+  nativeBuildInputs = [ autoreconfHook pkg-config ]
+    ++ lib.optionals qtClient [ qt5.wrapQtAppsHook ]
+    ++ lib.optionals gtkClient [ wrapGAppsHook ];
+
+  buildInputs = [ lua5_3 zlib bzip2 curl xz gettext libiconv icu ]
+    ++ [ SDL2 SDL2_mixer SDL2_image SDL2_ttf SDL2_gfx freetype fluidsynth ]
+    ++ lib.optionals gtkClient [ gtk3 ]
+    ++ lib.optionals qtClient  [ qt5.qtbase ]
+    ++ lib.optional server readline
+    ++ lib.optional enableSqlite sqlite;
+
+  dontWrapQtApps = true;
+  dontWrapGApps = true;
+
+  # configure is not smart enough to look for SDL2 headers under
+  # .../SDL2, but thankfully $SDL2_PATH is almost exactly what we want
+  preConfigure = ''
+    export CPPFLAGS="$(echo $SDL2_PATH | sed 's#/nix/store/#-I/nix/store/#g')"
+  '';
+  configureFlags = [ "--enable-shared" ]
+    ++ lib.optionals sdl2Client [
+      "--enable-client=sdl2"
+      "--enable-sdl-mixer=sdl2"
+    ]
+    ++ lib.optionals qtClient [
+      "--enable-client=qt"
+      "--with-qt5-includes=${qt5.qtbase.dev}/include"
+    ] ++ lib.optionals gtkClient [ "--enable-client=gtk3.22" ]
+    ++ lib.optional enableSqlite "--enable-fcdb=sqlite3"
+    ++ lib.optional (!gtkClient) "--enable-fcmp=cli"
+    ++ lib.optional (!server)    "--disable-server";
+
+  postFixup = lib.optionalString qtClient ''
+    wrapQtApp $out/bin/freeciv-qt
+  '' + lib.optionalString gtkClient ''
+    wrapGApp $out/bin/freeciv-gtk3.22
+  '';
+
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    description = "Multiplayer (or single player), turn-based strategy game";
+    longDescription = ''
+      Freeciv is a Free and Open Source empire-building strategy game
+      inspired by the history of human civilization. The game commences in
+      prehistory and your mission is to lead your tribe from the stone age
+      to the space age...
+    '';
+    homepage = "http://www.freeciv.org"; # http only
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ pierron ];
+    platforms = platforms.unix;
+    hydraPlatforms = platforms.linux; # sdl-config times out on darwin
+  };
+}
diff --git a/nixpkgs/pkgs/games/freedink/default.nix b/nixpkgs/pkgs/games/freedink/default.nix
new file mode 100644
index 000000000000..ecdcbb7dce69
--- /dev/null
+++ b/nixpkgs/pkgs/games/freedink/default.nix
@@ -0,0 +1,63 @@
+{ lib, stdenv, fetchurl, SDL, SDL_mixer, SDL_image, SDL_ttf, SDL_gfx
+, pkg-config, intltool, fontconfig, libzip, zip, zlib }:
+
+let
+  version = "1.08.20121209";
+
+  freedink_data = stdenv.mkDerivation rec {
+    pname = "freedink-data";
+    inherit version;
+
+    src = fetchurl {
+      url = "mirror://gnu/freedink/${pname}-${version}.tar.gz";
+      sha256 = "1mhns09l1s898x18ahbcy9gabrmgsr8dv7pm0a2ivid8mhxahn1j";
+    };
+
+    prePatch = "substituteInPlace Makefile --replace /usr/local $out";
+  };
+
+in stdenv.mkDerivation rec {
+  pname = "freedink";
+  inherit version;
+
+  src = fetchurl {
+    url = "mirror://gnu/freedink/${pname}-${version}.tar.gz";
+    sha256 = "19xximbcm6506kvpf3s0q96697kmzca3yrjdr6dgphklp33zqsqr";
+  };
+
+  nativeBuildInputs = [ pkg-config intltool ];
+
+  buildInputs = [
+    SDL SDL_mixer SDL_image SDL_ttf SDL_gfx
+    fontconfig libzip zip zlib
+  ];
+
+  preConfigure = ''
+    # Build fails on Linux with windres.
+    export ac_cv_prog_ac_ct_WINDRES=
+  '';
+
+  postInstall = ''
+    mkdir -p "$out/share/"
+    ln -s ${freedink_data}/share/dink "$out/share/"
+  '';
+
+  enableParallelBuilding = true;
+
+  meta = {
+    description = "A free, portable and enhanced version of the Dink Smallwood game engine";
+
+    longDescription = ''
+      GNU FreeDink is a new and portable version of the Dink Smallwood
+      game engine, which runs the original game as well as its D-Mods,
+      with close compatibility, under multiple platforms.
+    '';
+
+    homepage = "https://www.gnu.org/software/freedink/"; # Formerly http://www.freedink.org
+    license = lib.licenses.gpl3Plus;
+
+    maintainers = [ ];
+    platforms = lib.platforms.all;
+    hydraPlatforms = lib.platforms.linux; # sdl-config times out on darwin
+  };
+}
diff --git a/nixpkgs/pkgs/games/freedroid/default.nix b/nixpkgs/pkgs/games/freedroid/default.nix
new file mode 100644
index 000000000000..38eb60e7e045
--- /dev/null
+++ b/nixpkgs/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/nixpkgs/pkgs/games/freedroidrpg/default.nix b/nixpkgs/pkgs/games/freedroidrpg/default.nix
new file mode 100644
index 000000000000..254d9b2ce6a6
--- /dev/null
+++ b/nixpkgs/pkgs/games/freedroidrpg/default.nix
@@ -0,0 +1,76 @@
+{ fetchurl, fetchpatch, 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";
+in stdenv.mkDerivation {
+  pname = "freedroidrpg";
+  inherit version;
+
+  src = fetchurl {
+    url = "ftp://ftp.osuosl.org/pub/freedroid/freedroidRPG-${lib.versions.majorMinor version}/freedroidRPG-${version}.tar.gz";
+    sha256 = "0n4kn38ncmcy3lrxmq8fjry6c1z50z4q1zcqfig0j4jb0dsz2va2";
+  };
+
+  patches = [
+    # Pull upstream fix for -fno-common tolchains.
+    (fetchpatch {
+      name = "fno-common.patch";
+      url = "https://gitlab.com/freedroid/freedroid-src/-/commit/e610d427374226b79da5258d979936459f30c761.patch";
+      sha256 = "1s7sw4dkc7b6i72j6x47driq6v0k3wss48l9ivd4fw40n3iaxjb1";
+    })
+
+    # Do not embed build flags in the binary to reduce closure size.
+    ./drop-build-deps.patch
+  ];
+
+  nativeBuildInputs = [ pkg-config gettext python3 ];
+
+  buildInputs = [
+    SDL SDL_image SDL_gfx SDL_mixer libogg libvorbis lua5_3 libjpeg libpng zlib
+  ] ++ lib.optional stdenv.isDarwin libiconv;
+
+  meta = with lib; {
+    description = "Isometric 3D RPG similar to game Diablo";
+
+    longDescription = ''
+      <para>
+        FreedroidRPG is an original isometric 3D role playing game
+        taking place in the future, on Earth. It features action and
+        dialogs.
+      </para>
+      <para>
+        The game tells the story of a world destroyed by a conflict between
+        robots and their human masters. Play as Tux in a quest to save the
+        world from the murderous rebel bots who know no mercy. You get to
+        choose which path you wish to follow, and freedom of choice is
+        everywhere in the game.
+      </para>
+      <para>
+        FreedroidRPG features a real time combat system with melee and
+        ranged weapons, fairly similar to the proprietary game Diablo.
+        There is an innovative system of programs that can be run in order
+        to take control of enemy robots, alter their behavior, or improve one's
+        characteristics. You can use over 50 different kinds of items and
+        fight countless enemies on your way to your destiny. An advanced
+        dialog system provides story background and immersive role
+        playing situations.
+      </para>
+      <para>
+        The game is complete, fully playable, and can provide about
+        12 hours of fun. It is still being actively developed, and
+        help is welcome in many areas. People having - or trying to acquire -
+        programming, map editing, or writing skills will find FreedroidRPG
+        to be an exciting, fast-moving project in which they can fully
+        express their creativity.
+      </para>
+    '';
+
+    homepage = "https://www.freedroid.org/";
+
+    license = licenses.gpl2Plus;
+
+    maintainers = with maintainers; [ ];
+    platforms = platforms.unix;
+    hydraPlatforms = platforms.linux; # sdl-config times out on darwin
+  };
+}
diff --git a/nixpkgs/pkgs/games/freedroidrpg/drop-build-deps.patch b/nixpkgs/pkgs/games/freedroidrpg/drop-build-deps.patch
new file mode 100644
index 000000000000..d9f2d37b57c7
--- /dev/null
+++ b/nixpkgs/pkgs/games/freedroidrpg/drop-build-deps.patch
@@ -0,0 +1,15 @@
+Do not embed paths to build-only depends (-I...SDL2-dev and friends)
+into savefile lua comments.
+--- a/src/savestruct_internal.c
++++ b/src/savestruct_internal.c
+@@ -486,8 +486,8 @@ void save_game_data(struct auto_string *strout)
+ 	autostr_append(strout,
+ 		"SAVEGAME: %s %s %s;sizeof(tux_t)=%d;sizeof(enemy)=%d;sizeof(bullet)=%d;MAXBULLETS=%d\n",
+ 		SAVEGAME_VERSION, SAVEGAME_REVISION, VERSION, (int)sizeof(tux_t), (int)sizeof(enemy), (int)sizeof(bullet), (int)MAXBULLETS);
+-	autostr_append(strout, "BUILD_CFLAGS: %s\n", BUILD_CFLAGS);
+-	autostr_append(strout, "BUILD_LDFLAGS: %s\n", BUILD_LDFLAGS);
++	autostr_append(strout, "BUILD_CFLAGS: %s\n", "<hidden>");
++	autostr_append(strout, "BUILD_LDFLAGS: %s\n", "<hidden>");
+ 	autostr_append(strout, "VERSION: %s\n", freedroid_version);
+ 	autostr_append(strout, "--]]\n");
+ 
diff --git a/nixpkgs/pkgs/games/freenukum/default.nix b/nixpkgs/pkgs/games/freenukum/default.nix
new file mode 100644
index 000000000000..ed6c41edac44
--- /dev/null
+++ b/nixpkgs/pkgs/games/freenukum/default.nix
@@ -0,0 +1,74 @@
+{ lib, stdenv
+, rustPlatform
+, fetchFromGitLab
+, makeDesktopItem
+, installShellFiles
+, dejavu_fonts
+, SDL2
+, SDL2_ttf
+, SDL2_image
+}:
+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;
+    comment = description;
+    categories = [ "Game" "ArcadeGame" "ActionGame" ];
+    genericName = pname;
+  };
+
+in
+rustPlatform.buildRustPackage rec {
+  inherit pname;
+  version = "0.4.0";
+
+  src = fetchFromGitLab {
+    domain = "salsa.debian.org";
+    owner = "silwol";
+    repo = "freenukum";
+    rev = "v${version}";
+    hash = "sha256-Tk9n2gPwyPin6JZ4RSO8d/+xVpEz4rF8C2eGKwrAXU0=";
+  };
+
+  cargoSha256 = "sha256-8RfiObWDqZJg+sjjDBk+sRoS5CiECIdNPH79T+O8e8M=";
+
+  nativeBuildInputs = [
+    installShellFiles
+  ];
+
+  buildInputs = [
+    SDL2
+    SDL2_ttf
+    SDL2_image
+  ];
+
+  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 $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";
+    homepage = "https://salsa.debian.org/silwol/freenukum";
+    changelog = "https://salsa.debian.org/silwol/freenukum/-/blob/v${version}/CHANGELOG.md";
+    license = licenses.agpl3Plus;
+    maintainers = with maintainers; [ _0x4A6F ];
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/games/freeorion/default.nix b/nixpkgs/pkgs/games/freeorion/default.nix
new file mode 100644
index 000000000000..8c2c4ef86a08
--- /dev/null
+++ b/nixpkgs/pkgs/games/freeorion/default.nix
@@ -0,0 +1,87 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, doxygen
+, graphviz
+, makeWrapper
+, boost179
+, SDL2
+, python3
+, freetype
+, openal
+, libogg
+, libvorbis
+, zlib
+, libpng
+, libtiff
+, libjpeg
+, libGLU
+, libGL
+, glew
+, libxslt
+}:
+
+stdenv.mkDerivation rec {
+  pname = "freeorion";
+  version = "0.5";
+
+  src = fetchFromGitHub {
+    owner = "freeorion";
+    repo = "freeorion";
+    rev = "v${version}";
+    sha256 = "sha256-uJRDU0Xd+sHL2IDvMiElUSOhvchVMW9wYMSLSN7pYtQ=";
+  };
+
+  buildInputs = [
+    (boost179.override { enablePython = true; python = python3; })
+    (python3.withPackages (p: with p; [ pycodestyle ]))
+    SDL2
+    freetype
+    glew
+    libGL
+    libGLU
+    libjpeg
+    libogg
+    libpng
+    libtiff
+    libvorbis
+    openal
+    zlib
+  ];
+
+  nativeBuildInputs = [
+    cmake
+    doxygen
+    graphviz
+    makeWrapper
+  ];
+
+  # as of 0.5 FreeOrion doesn't work with "-DOpenGL_GL_PREFERENCE=GLVND"
+  cmakeFlags = [ "-DOpenGL_GL_PREFERENCE=LEGACY" ];
+
+  postInstall = ''
+    mkdir -p $out/libexec
+    # We need final slashes for XSLT replace to work properly
+    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/libexec/fix-paths \
+      --subst-var-by libxsltBin ${libxslt.bin} \
+      --subst-var-by shell ${stdenv.shell} \
+      --subst-var out
+    chmod +x $out/libexec/fix-paths
+
+    wrapProgram $out/bin/freeorion \
+      --run $out/libexec/fix-paths \
+      --prefix LD_LIBRARY_PATH : $out/lib/freeorion
+  '';
+
+  meta = with lib; {
+    description = "A free, open source, turn-based space empire and galactic conquest (4X) computer game";
+    homepage = "https://www.freeorion.org/";
+    license = with licenses; [ gpl2 cc-by-sa-30 ];
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ tex ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/freeorion/fix-paths.sh b/nixpkgs/pkgs/games/freeorion/fix-paths.sh
new file mode 100644
index 000000000000..def017ddc5b0
--- /dev/null
+++ b/nixpkgs/pkgs/games/freeorion/fix-paths.sh
@@ -0,0 +1,6 @@
+#!@shell@
+
+if [ -e ~/.config/freeorion/config.xml ]; then
+  @libxsltBin@/bin/xsltproc -o ~/.config/freeorion/config.xml @out@/share/freeorion/fix-paths.xslt ~/.config/freeorion/config.xml
+fi
+exit 0
diff --git a/nixpkgs/pkgs/games/freeorion/fix-paths.xslt b/nixpkgs/pkgs/games/freeorion/fix-paths.xslt
new file mode 100644
index 000000000000..f0db646b81ad
--- /dev/null
+++ b/nixpkgs/pkgs/games/freeorion/fix-paths.xslt
@@ -0,0 +1,13 @@
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+  <xsl:output method="xml" omit-xml-declaration="no" indent="yes" />
+
+  <xsl:template match='node() | @*'>
+    <xsl:copy>
+      <xsl:apply-templates select='node() | @*'/>
+    </xsl:copy>
+  </xsl:template>
+
+  <xsl:template match='//text()[starts-with(., "@nixStore@")]'>
+    <xsl:value-of select='concat("@out@", substring-after(substring-after(., "@nixStore@"), "/"))'/>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/nixpkgs/pkgs/games/freesweep/default.nix b/nixpkgs/pkgs/games/freesweep/default.nix
new file mode 100644
index 000000000000..feba049a5cf0
--- /dev/null
+++ b/nixpkgs/pkgs/games/freesweep/default.nix
@@ -0,0 +1,37 @@
+{ fetchFromGitHub, fetchpatch, ncurses, lib, stdenv
+, updateAutotoolsGnuConfigScriptsHook, installShellFiles }:
+
+stdenv.mkDerivation rec {
+  pname = "freesweep";
+  version = "1.0.2";
+
+  src = fetchFromGitHub {
+    owner = "rwestlund";
+    repo = "freesweep";
+    rev = "v${version}";
+    hash = "sha256-iuu81yHbNrjdPsimBrPK58PJ0d8i3ySM7rFUG/d8NJM";
+  };
+
+  nativeBuildInputs = [ updateAutotoolsGnuConfigScriptsHook installShellFiles ];
+  buildInputs = [ ncurses ];
+
+  configureFlags = [ "--with-prefsdir=$out/share" ];
+
+  enableParallelBuilding = true;
+
+  installPhase = ''
+    runHook preInstall
+    install -D -m 0555 freesweep $out/bin/freesweep
+    install -D -m 0444 sweeprc $out/share/sweeprc
+    installManPage freesweep.6
+    runHook postInstall
+  '';
+
+  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;
+    maintainers = with maintainers; [ kierdavis ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/games/frogatto/data.nix b/nixpkgs/pkgs/games/frogatto/data.nix
new file mode 100644
index 000000000000..a61bddf94bfb
--- /dev/null
+++ b/nixpkgs/pkgs/games/frogatto/data.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation {
+  pname = "frogatto-data";
+  version = "unstable-2023-02-27";
+
+  src = fetchFromGitHub {
+    owner = "frogatto";
+    repo = "frogatto";
+    rev = "5ca339f4b97e5004dc07394407bf1da43fbd6204";
+    sha256 = "sha256-6wqCFc7DlDt0u0JnPg4amVemc9HOjsB/U4s9n7N84QA=";
+  };
+
+  installPhase = ''
+    mkdir -p $out/share/frogatto/modules
+    cp -ar . $out/share/frogatto/modules/frogatto4
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/frogatto/frogatto";
+    description = "Data files to the frogatto game";
+    license = with licenses; [ cc-by-30 unfree ];
+    maintainers = with maintainers; [ astro ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/frogatto/default.nix b/nixpkgs/pkgs/games/frogatto/default.nix
new file mode 100644
index 000000000000..036b2abec19c
--- /dev/null
+++ b/nixpkgs/pkgs/games/frogatto/default.nix
@@ -0,0 +1,43 @@
+{ buildEnv, lib, callPackage, makeWrapper, makeDesktopItem }:
+
+let
+  description = "Action-adventure game, starring a certain quixotic frog";
+  engine = callPackage ./engine.nix { };
+  data = callPackage ./data.nix { };
+  desktopItem = makeDesktopItem {
+    name = "frogatto";
+    exec = "frogatto";
+    startupNotify = true;
+    icon = "${data}/share/frogatto/modules/frogatto/images/os/frogatto-icon.png";
+    comment = description;
+    desktopName = "Frogatto";
+    genericName = "frogatto";
+    categories = [ "Game" "ArcadeGame" ];
+  };
+  inherit (data) version;
+in buildEnv {
+  name = "frogatto-${version}";
+
+  nativeBuildInputs = [ makeWrapper ];
+  paths = [ engine data desktopItem ];
+  pathsToLink = [
+    "/bin"
+    "/share/frogatto/data"
+    "/share/frogatto/images"
+    "/share/frogatto/modules"
+    "/share/applications"
+  ];
+
+  postBuild = ''
+    wrapProgram $out/bin/frogatto \
+      --chdir "$out/share/frogatto"
+  '';
+
+  meta = with lib; {
+    homepage = "https://frogatto.com";
+    description = description;
+    license = with licenses; [ cc-by-30 unfree ];
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ astro ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/frogatto/engine.nix b/nixpkgs/pkgs/games/frogatto/engine.nix
new file mode 100644
index 000000000000..95e2135660fd
--- /dev/null
+++ b/nixpkgs/pkgs/games/frogatto/engine.nix
@@ -0,0 +1,51 @@
+{ lib, stdenv, fetchFromGitHub, fetchurl, which
+, boost, SDL2, SDL2_image, SDL2_mixer, SDL2_ttf
+, glew, zlib, icu, pkg-config, cairo, libvpx, glm
+}:
+
+stdenv.mkDerivation {
+  pname = "anura-engine";
+  version = "unstable-2023-02-27";
+
+  src = fetchFromGitHub {
+    owner = "anura-engine";
+    repo = "anura";
+    rev = "65d85b6646099db1d5cd25d31321bb434a3f94f1";
+    sha256 = "sha256-hb4Sn7uI+eXLaGb4zkEy4w+ByQJ6FqkoMUYFsyiFCeE=";
+    fetchSubmodules = true;
+  };
+
+  nativeBuildInputs = [
+    which pkg-config
+  ];
+
+  buildInputs = [
+    boost
+    SDL2
+    SDL2_image
+    SDL2_mixer
+    SDL2_ttf
+    glew
+    zlib
+    icu
+    cairo
+    libvpx
+    glm
+  ];
+
+  enableParallelBuilding = true;
+
+  installPhase = ''
+    mkdir -p $out/bin $out/share/frogatto
+    cp -ar data images modules $out/share/frogatto/
+    cp -a anura $out/bin/frogatto
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/anura-engine/anura";
+    description = "Game engine used by Frogatto";
+    license = licenses.zlib;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ astro ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/frotz/default.nix b/nixpkgs/pkgs/games/frotz/default.nix
new file mode 100644
index 000000000000..9b5256fc1c72
--- /dev/null
+++ b/nixpkgs/pkgs/games/frotz/default.nix
@@ -0,0 +1,43 @@
+{ fetchFromGitLab
+, libao
+, libmodplug
+, libsamplerate
+, libsndfile
+, libvorbis
+, ncurses
+, which
+, pkg-config
+, lib, stdenv }:
+
+stdenv.mkDerivation rec {
+  version = "2.53";
+  pname = "frotz";
+
+  src = fetchFromGitLab {
+    domain = "gitlab.com";
+    owner = "DavidGriffith";
+    repo = "frotz";
+    rev = version;
+    sha256 = "sha256-xVC/iE71W/Wdy5aPGH9DtcVAHWCcg3HkEA3iDV6OYUo=";
+  };
+
+  nativeBuildInputs = [ which pkg-config ];
+  buildInputs = [ libao libmodplug libsamplerate libsndfile libvorbis ncurses ];
+  preBuild = ''
+    makeFlagsArray+=(
+      CC="cc"
+      CFLAGS="-D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600"
+      LDFLAGS="-lncursesw -ltinfo"
+    )
+  '';
+  installFlags = [ "PREFIX=$(out)" ];
+
+  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";
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ nicknovitski  ddelabru ];
+    license = licenses.gpl2;
+  };
+}
diff --git a/nixpkgs/pkgs/games/frozen-bubble/default.nix b/nixpkgs/pkgs/games/frozen-bubble/default.nix
new file mode 100644
index 000000000000..6738f979d00b
--- /dev/null
+++ b/nixpkgs/pkgs/games/frozen-bubble/default.nix
@@ -0,0 +1,37 @@
+{ lib, fetchurl, perlPackages, pkg-config, SDL, SDL_mixer, SDL_Pango, glib
+, copyDesktopItems, makeDesktopItem
+}:
+perlPackages.buildPerlModule {
+  pname = "frozen-bubble";
+  version = "2.212";
+
+  src = fetchurl {
+    url = "mirror://cpan/authors/id/K/KT/KTHAKORE/Games-FrozenBubble-2.212.tar.gz";
+    sha256 = "721e04ff69c5233060656bfbf4002aa1aeadd96c95351f0c57bb85b6da35a305";
+  };
+  patches = [ ./fix-compilation.patch ];
+
+  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 = lib.licenses.gpl2;
+    maintainers = with lib.maintainers; [ puckipedia ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/frozen-bubble/fix-compilation.patch b/nixpkgs/pkgs/games/frozen-bubble/fix-compilation.patch
new file mode 100644
index 000000000000..e87dd0668dc2
--- /dev/null
+++ b/nixpkgs/pkgs/games/frozen-bubble/fix-compilation.patch
@@ -0,0 +1,33 @@
+diff --git a/Build.PL b/Build.PL
+index b029d1e..8737395 100644
+--- a/Build.PL
++++ b/Build.PL
+@@ -16,13 +16,14 @@ use Games::FrozenBubble;
+ my $prefix = Alien::SDL->config('prefix');
+ my $cflags = '-I'
+   . File::Spec->catfile( $prefix, 'include' )
++  . ' ' . `pkg-config --cflags SDL_mixer`
+   ;
+ $cflags .= ' -fnested-functions' if $^O =~ /darwin/;
+ ###!!! this looks strange, you perhaps meant "$cflags .= ..."
+ ###!!! I intended Alien::SDL to add -I$prefix/include automatically, please tell me when it does not work (kmx)
+ my $devnull = File::Spec->devnull();
+ my @cflags =  ExtUtils::CBuilder->new->split_like_shell( $cflags );
+-my @linkers = ( ExtUtils::CBuilder->new->split_like_shell( Alien::SDL->config('libs', '-lSDL_mixer', '-lSDL_Pango') ) );
++my @linkers = ( ExtUtils::CBuilder->new->split_like_shell( Alien::SDL->config('libs', '-lSDL_Pango',`pkg-config --libs SDL_mixer`) ) );
+ push @linkers, '-liconv'
+   if $^O =~ /win/i;    ###!!! really only Win needs this? ; BEWARE this matches also 'darwin', 'cygwin'!!!!
+ 
+diff --git a/inc/My/Builder.pm b/inc/My/Builder.pm
+index 2ebaf91..c420b9a 100644
+--- a/inc/My/Builder.pm
++++ b/inc/My/Builder.pm
+@@ -123,7 +123,7 @@ sub ACTION_server {
+             push @ofiles, $cbuilder->compile(
+                 source               => catfile($server_directory, $cfile),
+                 extra_compiler_flags => [
+-                    qw(-g -Wall -Werror -pipe), # verbatim from Makefile
++                    qw(-g -pipe), # verbatim from Makefile
+                     '-I' . $server_directory, # does not seem to be necessary
+                     $cbuilder->split_like_shell(`pkg-config glib-2.0 --cflags`),
+                     $cbuilder->split_like_shell(`pkg-config glib-2.0 --libs`),
diff --git a/nixpkgs/pkgs/games/fsg/default.nix b/nixpkgs/pkgs/games/fsg/default.nix
new file mode 100644
index 000000000000..282030023f74
--- /dev/null
+++ b/nixpkgs/pkgs/games/fsg/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv, fetchurl, gtk2, glib, pkg-config, libGLU, libGL, wxGTK32, libX11, xorgproto, runtimeShell }:
+
+stdenv.mkDerivation rec {
+  pname = "fsg";
+  version = "4.4";
+
+  src = fetchurl {
+    name = "fsg-src-${version}.tar.gz";
+    url = "https://github.com/ctrlcctrlv/wxsand/blob/master/fsg-src-${version}-ORIGINAL.tar.gz?raw=true";
+    sha256 = "1756y01rkvd3f1pkj88jqh83fqcfl2fy0c48mcq53pjzln9ycv8c";
+  };
+
+  patches = [ ./wxgtk-3.2.patch ];
+
+  hardeningDisable = [ "format" ];
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [ glib libGLU libGL wxGTK32 libX11 xorgproto ];
+
+  preBuild = ''
+    sed -e '
+      s@currentProbIndex != 100@0@;
+    ' -i MainFrame.cpp
+    sed -re '/ctrans_prob/s/energy\[center][+]energy\[other]/(int)(fmin(energy[center]+energy[other],99))/g' -i Canvas.cpp
+  '';
+
+  installPhase = ''
+    mkdir -p $out/bin $out/libexec
+    cp sand $out/libexec
+    echo -e '#!${runtimeShell}\nLC_ALL=C '$out'/libexec/sand "$@"' >$out/bin/fsg
+    chmod a+x $out/bin/fsg
+  '';
+
+  meta = {
+    description = "Cellular automata engine tuned towards the likes of Falling Sand";
+    maintainers = [ lib.maintainers.raskin ];
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/fsg/wxgtk-3.2.patch b/nixpkgs/pkgs/games/fsg/wxgtk-3.2.patch
new file mode 100644
index 000000000000..dff9f54aeeeb
--- /dev/null
+++ b/nixpkgs/pkgs/games/fsg/wxgtk-3.2.patch
@@ -0,0 +1,68 @@
+diff --git a/Canvas.cpp b/Canvas.cpp
+index 8c00727..5ee7756 100644
+--- a/Canvas.cpp
++++ b/Canvas.cpp
+@@ -889,7 +889,6 @@ void Canvas::Refresh(){
+   if (doDraw){
+     wxClientDC dc(this);
+ 
+-    dc.BeginDrawing();
+     
+     wxMemoryDC memdc;
+     wxImage image(g_width, g_height, bitmapdata, true);
+@@ -899,7 +898,6 @@ void Canvas::Refresh(){
+     dc.Blit(0,0,g_width, g_height, &memdc, 0, 0);
+     
+     if (!drawAll){
+-      dc.EndDrawing();
+       return;
+     }
+     else{
+@@ -912,7 +910,6 @@ void Canvas::Refresh(){
+     }
+     
+ 
+-    dc.EndDrawing();
+ 
+   }
+ }
+diff --git a/MainFrame.cpp b/MainFrame.cpp
+index c45107b..d93f9e1 100644
+--- a/MainFrame.cpp
++++ b/MainFrame.cpp
+@@ -178,7 +178,7 @@ MainFrame::MainFrame(const wxString& title, const wxPoint& pos, const wxSize& si
+       RHSizer->Add(RH4, 0, wxEXPAND | wxALL, 5);
+     }
+ 
+-    sizer->Add(g_canvas, 0, wxADJUST_MINSIZE | wxALL, 10);
++    sizer->Add(g_canvas, 0, wxALL, 10);
+     sizer->Add(RHSizer, 1, wxEXPAND);
+   }
+   this->SetSizer(sizer);
+@@ -1165,7 +1165,7 @@ void MainFrame::OnMenu(wxCommandEvent& event){
+   }
+   else if(event.GetId() == 1051){
+     //Load
+-    wxFileDialog dialog(this, _("Load from a file"), _(""), _(""), _("Any Image Files (*.*)|*.*"), wxOPEN);
++    wxFileDialog dialog(this, _("Load from a file"), _(""), _(""), _("Any Image Files (*.*)|*.*"), wxFD_OPEN);
+     
+     if (dialog.ShowModal() == wxID_OK){
+       sandboxFilename = dialog.GetPath();
+@@ -1174,7 +1174,7 @@ void MainFrame::OnMenu(wxCommandEvent& event){
+   }
+   else if(event.GetId() == 1052){
+     //Save
+-    wxFileDialog dialog(this, _("Save to a file"), _(""), _(""), _("PNG files (*.png)|*.png|BMP files (*.bmp)|*.bmp"), wxSAVE);
++    wxFileDialog dialog(this, _("Save to a file"), _(""), _(""), _("PNG files (*.png)|*.png|BMP files (*.bmp)|*.bmp"), wxFD_SAVE);
+     
+     if (dialog.ShowModal() == wxID_OK){
+       wxString filename = dialog.GetPath();
+@@ -1216,7 +1216,7 @@ void MainFrame::OnMenu(wxCommandEvent& event){
+   else if(event.GetId() == 1055){
+     //Load physics
+ 
+-    wxFileDialog dialog(this, _("Load from a file"), _(""), _(""), _("Physics Files (*.txt)|*.txt"), wxOPEN);
++    wxFileDialog dialog(this, _("Load from a file"), _(""), _(""), _("Physics Files (*.txt)|*.txt"), wxFD_OPEN);
+     if (dialog.ShowModal() == wxID_OK){
+       physicsFilename = dialog.GetPath();
+       loadPhysics(physicsFilename);
diff --git a/nixpkgs/pkgs/games/fteqw/default.nix b/nixpkgs/pkgs/games/fteqw/default.nix
new file mode 100644
index 000000000000..c4129d3974d6
--- /dev/null
+++ b/nixpkgs/pkgs/games/fteqw/default.nix
@@ -0,0 +1,90 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, gzip
+, libvorbis
+, libmad
+, SDL2
+, SDL2_mixer
+, libpng
+, alsa-lib
+, gnutls
+, zlib
+, libjpeg
+, vulkan-loader
+, vulkan-headers
+, speex
+, libopus
+, xorg
+, libGL
+}@attrs:
+{
+  fteqw = import ./generic.nix (rec {
+    pname = "fteqw";
+
+    buildFlags = [ "m-rel" ];
+
+    nativeBuildInputs = [
+      vulkan-headers
+    ];
+
+    buildInputs = [
+      gzip
+      libvorbis
+      libmad
+      SDL2
+      SDL2_mixer
+      libpng
+      alsa-lib
+      gnutls
+      libjpeg
+      vulkan-loader
+      speex
+      libopus
+      xorg.libXrandr
+      xorg.libXcursor
+    ];
+
+    postFixup = ''
+      patchelf $out/bin/${pname} \
+        --add-needed ${SDL2}/lib/libSDL2.so \
+        --add-needed ${libGL}/lib/libGLX.so \
+        --add-needed ${libGL}/lib/libGL.so \
+        --add-needed ${lib.getLib gnutls}/lib/libgnutls.so \
+        --add-needed ${vulkan-loader}/lib/libvulkan.so
+    '';
+
+    description = "A hybrid and versatile game engine";
+  } // attrs);
+
+  fteqw-dedicated = import ./generic.nix (rec {
+    pname = "fteqw-dedicated";
+    releaseFile = "fteqw-sv";
+
+    buildFlags = [ "sv-rel" ];
+
+    buildInputs = [
+      gnutls
+      zlib
+    ];
+
+    postFixup = ''
+      patchelf $out/bin/${pname} \
+        --add-needed ${gnutls}/lib/libgnutls.so \
+    '';
+
+    description = "Dedicated server for FTEQW";
+  } // attrs);
+
+  fteqcc = import ./generic.nix ({
+    pname = "fteqcc";
+
+    buildFlags = [ "qcc-rel" ];
+
+    buildInputs = [
+      zlib
+    ];
+
+    description = "User friendly QuakeC compiler";
+  } // attrs);
+}
diff --git a/nixpkgs/pkgs/games/fteqw/generic.nix b/nixpkgs/pkgs/games/fteqw/generic.nix
new file mode 100644
index 000000000000..a525cf5a6c44
--- /dev/null
+++ b/nixpkgs/pkgs/games/fteqw/generic.nix
@@ -0,0 +1,61 @@
+{ lib
+, fetchFromGitHub
+, stdenv
+, libopus
+, xorg
+, pname
+, releaseFile ? pname
+, buildFlags
+, buildInputs
+, nativeBuildInputs ? []
+, postFixup ? ""
+, description
+, ... }:
+
+stdenv.mkDerivation {
+  inherit pname buildFlags buildInputs nativeBuildInputs postFixup;
+  version = "unstable-2023-08-03";
+
+  src = fetchFromGitHub {
+    owner = "fte-team";
+    repo = "fteqw";
+    rev = "3adec5d0a53ba9ae32a92fc0a805cf6d5ec107fb";
+    hash = "sha256-p/U02hwKI+YqlVXIS/7+gujknNDLr5L53unjvG5qLJU=";
+  };
+
+  makeFlags = [
+    "PKGCONFIG=$(PKG_CONFIG)"
+    "-C" "engine"
+  ];
+
+  enableParallelBuilding = true;
+  postPatch = ''
+    substituteInPlace ./engine/Makefile \
+      --replace "I/usr/include/opus" "I${libopus.dev}/include/opus"
+    substituteInPlace ./engine/gl/gl_vidlinuxglx.c \
+      --replace 'Sys_LoadLibrary("libXrandr"' 'Sys_LoadLibrary("${xorg.libXrandr}/lib/libXrandr.so"'
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    install -Dm755 engine/release/${releaseFile} $out/bin/${pname}
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    inherit description;
+    homepage = "https://fteqw.org";
+    longDescription = ''
+      FTE is a game engine baed on QuakeWorld able to
+      play games such as Quake 1, 2, 3, and Hexen 2.
+      It includes various features such as extended map
+      limits, vulkan and OpenGL renderers, a dedicated
+      server, and fteqcc, for easier QuakeC development
+    '';
+    maintainers = with maintainers; [ necrophcodr ];
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/galaxis/default.nix b/nixpkgs/pkgs/games/galaxis/default.nix
new file mode 100644
index 000000000000..a3847e73c8da
--- /dev/null
+++ b/nixpkgs/pkgs/games/galaxis/default.nix
@@ -0,0 +1,47 @@
+{ lib, stdenv, fetchurl, ncurses, xmlto }:
+
+with lib;
+stdenv.mkDerivation rec {
+
+  pname = "galaxis";
+  version = "1.10";
+
+  src = fetchurl{
+    url = "http://www.catb.org/~esr/galaxis/${pname}-${version}.tar.gz";
+    sha256 = "1181x3z4r0794v2bkpigb5fablw1nayj42wvhy2am79p7j1iqq5r";
+  };
+
+  buildInputs = [ ncurses xmlto ];
+
+  patchPhase = ''
+    sed -i\
+     -e 's|^install: galaxis\.6 uninstall|install: galaxis.6|'\
+     -e 's|usr/||g' -e 's|ROOT|DESTDIR|g'\
+     -e 's|install -m 755 -o 0 -g 0|install -m 755|' Makefile
+  '';
+
+  dontConfigure = true;
+
+  makeFlags = [ "DESTDIR=$(out)" ];
+
+  meta = {
+    description = "Rescue lifeboats lost in interstellar space";
+    longDescription = ''
+      Lifeboats from a crippled interstellar liner are adrift in a starfield. To
+      find them, you can place probes that look in all eight compass directions
+      and tell you how many lifeboats they see. If you drop a probe directly on
+      a lifeboat it will be revealed immediately. Your objective: find the
+      lifeboats as quickly as possible, before the stranded passengers run out
+      of oxygen!
+
+      This is a UNIX-hosted, curses-based clone of the nifty little Macintosh
+      freeware game Galaxis. It doesn't have the super-simple, point-and-click
+      interface of the original, but compensates by automating away some of the
+      game's simpler deductions.
+    '';
+    homepage = "http://catb.org/~esr/galaxis/";
+    license = licenses.gpl2;
+    maintainers = [ maintainers.AndersonTorres ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/gambit/default.nix b/nixpkgs/pkgs/games/gambit/default.nix
new file mode 100644
index 000000000000..4bcd329171cc
--- /dev/null
+++ b/nixpkgs/pkgs/games/gambit/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+, installShellFiles
+, testers
+, gambit-chess
+}:
+
+buildGoModule rec {
+  pname = "gambit";
+  version = "0.1.0";
+
+  src = fetchFromGitHub {
+    owner = "maaslalani";
+    repo = "gambit";
+    rev = "v${version}";
+    hash = "sha256-RLbD9JK1yJn30WWg7KWDjJoj4WXIoy3Kb8t2F8rFPuk=";
+  };
+
+  vendorHash = "sha256-d9fPlv+ZAzQA42I61B5JEzfYpfJc9vWBcLYTX/s5dhs=";
+
+  nativeBuildInputs = [
+    installShellFiles
+  ];
+
+  ldflags = [
+    "-s"
+    "-w"
+    "-X=main.Version=v${version}"
+    "-X=main.CommitSHA=${src.rev}"
+  ];
+
+  postInstall = ''
+    installShellCompletion --cmd gambit \
+      --bash <($out/bin/gambit completion bash) \
+      --fish <($out/bin/gambit completion fish) \
+      --zsh <($out/bin/gambit completion zsh)
+  '';
+
+  passthru.tests = {
+    version = testers.testVersion {
+      package = gambit-chess;
+      version = "v${version}";
+    };
+  };
+
+  meta = with lib; {
+    description = "Play chess in your terminal";
+    homepage = "https://github.com/maaslalani/gambit";
+    changelog = "https://github.com/maaslalani/gambit/releases/tag/${src.rev}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/gamehub/default.nix b/nixpkgs/pkgs/games/gamehub/default.nix
new file mode 100644
index 000000000000..87796d58c732
--- /dev/null
+++ b/nixpkgs/pkgs/games/gamehub/default.nix
@@ -0,0 +1,67 @@
+{ stdenv
+, lib
+, fetchFromGitHub
+, meson
+, ninja
+, vala
+, pkg-config
+, desktop-file-utils
+, glib
+, gtk3
+, glib-networking
+, libgee
+, libsoup
+, json-glib
+, sqlite
+, webkitgtk
+, libmanette
+, libXtst
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "GameHub";
+  version = "0.16.3-2";
+
+  src = fetchFromGitHub {
+    owner = "tkashkin";
+    repo = pname;
+    rev = "${version}-master";
+    hash = "sha256-dBGzXwDO9BvnEIcdfqlGnMzUdBqaVA96Ds0fY6eukes=";
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    meson
+    ninja
+    pkg-config
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    glib
+    glib-networking
+    gtk3
+    json-glib
+    libgee
+    libmanette
+    libsoup
+    libXtst
+    sqlite
+    webkitgtk
+  ];
+
+  meta = with lib; {
+    homepage = "https://tkashkin.github.io/projects/gamehub";
+    description = "Unified library for all your games";
+    longDescription = ''
+      GameHub is a unified library for all your games. It allows you to store
+      your games from different platforms into one program to make it easier
+      for you to manage your games.
+    '';
+    maintainers = with maintainers; [ pasqui23 ];
+    license = with licenses; [ gpl3Only ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/gamepad-tool/default.nix b/nixpkgs/pkgs/games/gamepad-tool/default.nix
new file mode 100644
index 000000000000..11da7ab16d52
--- /dev/null
+++ b/nixpkgs/pkgs/games/gamepad-tool/default.nix
@@ -0,0 +1,47 @@
+{ stdenvNoCC, fetchurl, dpkg, lib, qt5, autoPatchelfHook, SDL2 }:
+
+stdenvNoCC.mkDerivation (finalAttrs: {
+  pname = "gamepad-tool";
+  version = "1.2";
+
+  src = fetchurl {
+    url = "https://generalarcade.com/gamepadtool/linux/gamepadtool_${finalAttrs.version}_amd64.deb";
+    hash = "sha256-ZuB0TOyT2B5QkU1o5h3/8PL85tBq06hlz5YclRanD88=";
+  };
+
+  nativeBuildInputs = [ dpkg qt5.wrapQtAppsHook autoPatchelfHook ];
+
+  unpackCmd = ''
+    mkdir -p root
+    dpkg-deb -x $curSrc root
+  '';
+
+  dontBuild = true;
+
+  buildInputs = [
+    SDL2
+    qt5.qtbase
+  ];
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/bin $out/share/applications
+    cp usr/bin/gamepad-tool $out/bin
+    cp -r usr/share/icons $out/share/icons
+    substitute usr/share/applications/gamepad-tool-debian.desktop \
+      $out/share/applications/gamepad-tool.desktop \
+      --replace "Exec=gamepad-tool" "Exec=$out/bin/gamepad-tool" \
+      --replace "/usr/share/icons/hicolor/256x256/apps/gamepad-tool.png" "$out/share/icons/hicolor/256x256/apps/gamepad-tool.png"
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "A simple GUI tool to create/modify gamepad mappings for games that use SDL2 Game Controller API";
+    homepage = "https://generalarcade.com/gamepadtool/";
+    license = licenses.unfree;
+    platforms = [ "x86_64-linux" ];
+    maintainers = with maintainers; [ gador ];
+    mainProgram = "gamepad-tool";
+  };
+})
diff --git a/nixpkgs/pkgs/games/garden-of-coloured-lights/default.nix b/nixpkgs/pkgs/games/garden-of-coloured-lights/default.nix
new file mode 100644
index 000000000000..7012449f6afc
--- /dev/null
+++ b/nixpkgs/pkgs/games/garden-of-coloured-lights/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, fetchurl, autoconf, automake, allegro }:
+
+stdenv.mkDerivation rec {
+  pname = "garden-of-coloured-lights";
+  version = "1.0.9";
+
+  nativeBuildInputs = [ autoconf automake ];
+  buildInputs = [ allegro ];
+
+  prePatch = ''
+    noInline='s/inline //'
+    sed -e "$noInline" -i src/stuff.c
+    sed -e "$noInline" -i src/stuff.h
+  '';
+
+  src = fetchurl {
+    url = "mirror://sourceforge/garden/${version}/garden-${version}.tar.gz";
+    sha256 = "1qsj4d7r22m5f9f5f6cyvam1y5q5pbqvy5058r7w0k4s48n77y6s";
+  };
+
+  # Workaround build failure on -fno-common toolchains:
+  #   ld: main.o:src/main.c:58: multiple definition of
+  #     `eclass'; eclass.o:src/eclass.c:21: first defined here
+  env.NIX_CFLAGS_COMPILE = "-fcommon";
+
+  meta = with lib; {
+    description = "Old-school vertical shoot-em-up / bullet hell";
+    homepage = "https://garden.sourceforge.net/drupal/";
+    maintainers = with maintainers; [ ];
+    license = licenses.gpl3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/games/gargoyle/darwin.sh b/nixpkgs/pkgs/games/gargoyle/darwin.sh
new file mode 100644
index 000000000000..ed0daec4ef1f
--- /dev/null
+++ b/nixpkgs/pkgs/games/gargoyle/darwin.sh
@@ -0,0 +1,54 @@
+#!@shell@
+
+set -e
+
+GARGDIST=build/macosx.release
+BUNDLE=${out}/Applications/Gargoyle.app/Contents
+TERPS="
+advsys/advsys
+agility/agility
+alan2/alan2
+alan3/alan3
+bocfel/bocfel
+frotz/frotz
+garglk/gargoyle
+geas/geas
+git/git
+glulxe/glulxe
+hugo/hugo
+jacl/jacl
+level9/level9
+magnetic/magnetic
+nitfol/nitfol
+scare/scare
+scott/scott
+tads/tadsr
+"
+
+mkdir -p $BUNDLE/MacOS
+mkdir -p $BUNDLE/Frameworks
+mkdir -p $BUNDLE/Resources
+mkdir -p $BUNDLE/PlugIns
+
+install_name_tool -id @executable_path/../Frameworks/libgarglk.dylib $GARGDIST/garglk/libgarglk.dylib
+for file in $TERPS
+do
+install_name_tool -change @executable_path/libgarglk.dylib @executable_path/../Frameworks/libgarglk.dylib $GARGDIST/$file || true
+cp -f $GARGDIST/$file $BUNDLE/PlugIns
+done
+
+cp -f garglk/launcher.plist $BUNDLE/Info.plist
+cp -f $GARGDIST/garglk/gargoyle $BUNDLE/MacOS/Gargoyle
+cp -f $GARGDIST/garglk/libgarglk.dylib $BUNDLE/Frameworks
+cp -f $GARGDIST/garglk/libgarglk.dylib $BUNDLE/PlugIns
+cp -f garglk/launchmac.nib $BUNDLE/Resources/MainMenu.nib
+cp -f garglk/garglk.ini $BUNDLE/Resources
+cp -f garglk/*.icns $BUNDLE/Resources
+cp -f licenses/* $BUNDLE/Resources
+
+mkdir $BUNDLE/Resources/Fonts
+cp fonts/LiberationMono*.ttf $BUNDLE/Resources/Fonts
+cp fonts/LinLibertine*.otf $BUNDLE/Resources/Fonts
+
+mkdir -p ${out}/bin
+ln -s $BUNDLE/MacOS/Gargoyle ${out}/bin/gargoyle
diff --git a/nixpkgs/pkgs/games/gargoyle/default.nix b/nixpkgs/pkgs/games/gargoyle/default.nix
new file mode 100644
index 000000000000..9be95457b41c
--- /dev/null
+++ b/nixpkgs/pkgs/games/gargoyle/default.nix
@@ -0,0 +1,75 @@
+{ lib, stdenv, fetchFromGitHub, substituteAll, jam, cctools, pkg-config
+, SDL, SDL_mixer, SDL_sound, gtk2, libvorbis, smpeg }:
+
+let
+
+  jamenv = ''
+    unset AR
+  '' + (if stdenv.isDarwin then ''
+    export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -I${lib.getDev SDL}/include/SDL"
+    export GARGLKINI="$out/Applications/Gargoyle.app/Contents/Resources/garglk.ini"
+  '' else ''
+    export NIX_LDFLAGS="$NIX_LDFLAGS -rpath $out/libexec/gargoyle"
+    export DESTDIR="$out"
+    export _BINDIR=libexec/gargoyle
+    export _APPDIR=libexec/gargoyle
+    export _LIBDIR=libexec/gargoyle
+    export GARGLKINI="$out/etc/garglk.ini"
+  '');
+
+in
+
+stdenv.mkDerivation rec {
+  pname = "gargoyle";
+  version = "2019.1.1";
+
+  src = fetchFromGitHub {
+    owner = "garglk";
+    repo = "garglk";
+    rev = version;
+    sha256 = "0w54avmbp4i4zps2rb4acmpa641s6wvwbrln4vbdhcz97fx48nzz";
+  };
+
+  nativeBuildInputs = [ jam pkg-config ] ++ lib.optional stdenv.isDarwin cctools;
+
+  buildInputs = [ SDL SDL_mixer SDL_sound gtk2 ]
+    ++ lib.optionals stdenv.isDarwin [ smpeg libvorbis ];
+
+  # Workaround build failure on -fno-common toolchains:
+  #   ld: build/linux.release/alan3/Location.o:(.bss+0x0): multiple definition of
+  #     `logFile'; build/linux.release/alan3/act.o:(.bss+0x0): first defined here
+  # TODO: drop once updated to 2022.1 or later.
+  env.NIX_CFLAGS_COMPILE = "-fcommon";
+
+  buildPhase = jamenv + "jam -j$NIX_BUILD_CORES";
+
+  installPhase =
+  if stdenv.isDarwin then
+  (substituteAll {
+    inherit (stdenv) shell;
+    isExecutable = true;
+    src = ./darwin.sh;
+  })
+  else jamenv + ''
+    jam -j$NIX_BUILD_CORES install
+    mkdir -p "$out/bin"
+    ln -s ../libexec/gargoyle/gargoyle "$out/bin"
+    mkdir -p "$out/etc"
+    cp garglk/garglk.ini "$out/etc"
+    mkdir -p "$out/share/applications"
+    cp garglk/gargoyle.desktop "$out/share/applications"
+    mkdir -p "$out/share/icons/hicolor/32x32/apps"
+    cp garglk/gargoyle-house.png "$out/share/icons/hicolor/32x32/apps"
+  '';
+
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    homepage = "http://ccxvii.net/gargoyle/";
+    license = licenses.gpl2Plus;
+    description = "Interactive fiction interpreter GUI";
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ orivej ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/gav/default.nix b/nixpkgs/pkgs/games/gav/default.nix
new file mode 100644
index 000000000000..dc2868ba21b5
--- /dev/null
+++ b/nixpkgs/pkgs/games/gav/default.nix
@@ -0,0 +1,27 @@
+{lib, stdenv, fetchurl, SDL, SDL_image, SDL_mixer, SDL_net} :
+
+stdenv.mkDerivation rec {
+  pname = "gav";
+  version = "0.9.0";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/gav/gav-${version}.tar.gz";
+    sha256 = "8f0deb8b2cd775b339229054f4f282583a4cfbcba9d27a6213cf910bab944f3e";
+  };
+
+  prePatch = ''
+    mkdir -p $out/bin
+    sed -e "s@/usr@$out@" -i Makefile
+    sed -e "s@/usr@$out@" -i Theme.h
+  '';
+
+  patches = [ ./gcc.patch ];
+  buildInputs = [SDL SDL_image SDL_mixer SDL_net];
+
+  meta = {
+    description = "Remake of AV Arcade Volleyball";
+    homepage = "https://gav.sourceforge.net/";
+    license = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/gav/gcc.patch b/nixpkgs/pkgs/games/gav/gcc.patch
new file mode 100644
index 000000000000..eb4c64727bce
--- /dev/null
+++ b/nixpkgs/pkgs/games/gav/gcc.patch
@@ -0,0 +1,12 @@
+diff --git a/aarg.h b/aarg.h
+index a212870..907671c 100644
+--- a/aarg.h
++++ b/aarg.h
+@@ -5,6 +5,7 @@
+ #include <stdlib.h>
+ #include <stdio.h>
+ #include <unistd.h>
++#include <string.h>
+ #include <map>
+ #include <string>
+ #include <sstream>
diff --git a/nixpkgs/pkgs/games/gcompris/default.nix b/nixpkgs/pkgs/games/gcompris/default.nix
new file mode 100644
index 000000000000..a9e9f860d852
--- /dev/null
+++ b/nixpkgs/pkgs/games/gcompris/default.nix
@@ -0,0 +1,69 @@
+{ stdenv
+, cmake
+, fetchurl
+, gettext
+, gst_all_1
+, lib
+, ninja
+, wrapQtAppsHook
+, qmlbox2d
+, qtbase
+, qtcharts
+, qtdeclarative
+, qtgraphicaleffects
+, qtmultimedia
+, qtquickcontrols2
+, qtsensors
+, qttools
+, qtxmlpatterns
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gcompris";
+  version = "3.3";
+
+  src = fetchurl {
+    url = "mirror://kde/stable/gcompris/qt/src/gcompris-qt-${version}.tar.xz";
+    hash = "sha256-8hqiq1wYw4irbOXCrwcJqTMuLISzSmSqPuw2Rn8XzQA=";
+  };
+
+  cmakeFlags = [
+    "-DQML_BOX2D_LIBRARY=${qmlbox2d}/${qtbase.qtQmlPrefix}/Box2D.2.1"
+  ];
+
+  nativeBuildInputs = [ cmake gettext ninja qttools wrapQtAppsHook ];
+
+  buildInputs = [
+    qmlbox2d
+    qtbase
+    qtcharts
+    qtdeclarative
+    qtgraphicaleffects
+    qtmultimedia
+    qtquickcontrols2
+    qtsensors
+    qtxmlpatterns
+  ] ++ (with gst_all_1; [
+    gstreamer
+    gst-plugins-base
+    gst-plugins-good
+    gst-plugins-bad
+  ]);
+
+  postInstall = ''
+    install -Dm444 ../org.kde.gcompris.desktop     -t $out/share/applications
+    install -Dm444 ../org.kde.gcompris.appdata.xml -t $out/share/metainfo
+    install -Dm444 ../images/256-apps-gcompris-qt.png $out/share/icons/hicolor/256x256/apps/gcompris-qt.png
+
+    qtWrapperArgs+=(--prefix GST_PLUGIN_SYSTEM_PATH_1_0 : "$GST_PLUGIN_SYSTEM_PATH_1_0")
+  '';
+
+  meta = with lib; {
+    description = "A high quality educational software suite, including a large number of activities for children aged 2 to 10";
+    homepage = "https://gcompris.net/";
+    license = licenses.gpl3Plus;
+    mainProgram = "gcompris-qt";
+    maintainers = with maintainers; [ guibou ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/gcs/default.nix b/nixpkgs/pkgs/games/gcs/default.nix
new file mode 100644
index 000000000000..be8bb7017863
--- /dev/null
+++ b/nixpkgs/pkgs/games/gcs/default.nix
@@ -0,0 +1,81 @@
+{ lib, stdenv, fetchFromGitHub, runCommand
+, jdk8, ant
+, jre8, makeWrapper
+}:
+
+let
+  gcs = fetchFromGitHub {
+    owner = "richardwilkes";
+    repo = "gcs";
+    rev = "gcs-4.8.0";
+    sha256 = "0k8am8vfwls5s2z4zj1p1aqy8gapn5vbr9zy66s5g048ch8ah1hm";
+  };
+  appleStubs = fetchFromGitHub {
+    owner = "richardwilkes";
+    repo = "apple_stubs";
+    rev = "gcs-4.3.0";
+    sha256 = "0m1qw30b19s04hj7nch1mbvv5s698g5dr1d1r7r07ykvk1yh7zsa";
+  };
+  toolkit = fetchFromGitHub {
+    owner = "richardwilkes";
+    repo = "toolkit";
+    rev = "gcs-4.8.0";
+    sha256 = "1ciwwh0wxk3pzsj6rbggsbg3l2f741qy7yx1ca4v7vflsma84f1n";
+  };
+  library = fetchFromGitHub {
+    owner = "richardwilkes";
+    repo = "gcs_library";
+    rev = "gcs-4.8.0";
+    sha256 = "085jpp9mpv5kw00zds9sywmfq31mrlbrgahnwcjkx0z9i22amz4g";
+  };
+in stdenv.mkDerivation rec {
+  pname = "gcs";
+  version = "4.8.0";
+
+  src = runCommand "${pname}-${version}-src" { preferLocalBuild = true; } ''
+    mkdir -p $out
+    cd $out
+
+    cp -r ${gcs} gcs
+    cp -r ${appleStubs} apple_stubs
+    cp -r ${toolkit} toolkit
+    cp -r ${library} gcs_library
+  '';
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ jdk8 jre8 ant ];
+  buildPhase = ''
+    cd apple_stubs
+    ant
+
+    cd ../toolkit
+    ant
+
+    cd ../gcs
+    ant
+
+    cd ..
+  '';
+
+  installPhase = ''
+    mkdir -p $out/bin $out/share/java
+
+    find gcs/libraries toolkit/libraries apple_stubs/ \( -name '*.jar' -and -not -name '*-src.jar' \) -exec cp '{}' $out/share/java ';'
+
+    makeWrapper ${jre8}/bin/java $out/bin/gcs \
+      --set GCS_LIBRARY ${library} \
+      --add-flags "-cp $out/share/java/gcs-${version}.jar com.trollworks.gcs.app.GCS"
+  '';
+
+  meta = with lib; {
+    description = "A stand-alone, interactive, character sheet editor for the GURPS 4th Edition roleplaying game system";
+    homepage = "https://gurpscharactersheet.com/";
+    sourceProvenance = with sourceTypes; [
+      fromSource
+      binaryBytecode  # source bundles dependencies as jars
+    ];
+    license = licenses.mpl20;
+    platforms = platforms.all;
+    maintainers = with maintainers; [];
+  };
+}
diff --git a/nixpkgs/pkgs/games/gemrb/default.nix b/nixpkgs/pkgs/games/gemrb/default.nix
new file mode 100644
index 000000000000..7768ccf76253
--- /dev/null
+++ b/nixpkgs/pkgs/games/gemrb/default.nix
@@ -0,0 +1,89 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, SDL2
+, SDL2_mixer
+, freetype
+, libGL
+, libiconv
+, libpng
+, libvlc
+, libvorbis
+, openal
+, python3
+, zlib
+}:
+
+let
+  # the GLES backend on rpi is untested as I don't have the hardware
+  backend =
+    if stdenv.hostPlatform.isx86 then "OpenGL" else "GLES";
+
+  withVLC = stdenv.isDarwin;
+
+  inherit (lib) optional optionalString;
+
+in
+stdenv.mkDerivation rec {
+  pname = "gemrb";
+  version = "0.9.2";
+
+  src = fetchFromGitHub {
+    owner = "gemrb";
+    repo = "gemrb";
+    rev = "v${version}";
+    hash = "sha256-riea48Jc9zYb19mf5sBunTp5l27PGRFd/B5KdCUWr6Y=";
+  };
+
+  buildInputs = [
+    SDL2
+    SDL2_mixer
+    freetype
+    libGL
+    libiconv
+    libpng
+    libvorbis
+    openal
+    python3
+    zlib
+  ]
+  ++ optional withVLC libvlc;
+
+  nativeBuildInputs = [ cmake ];
+
+  # 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"
+  ];
+
+  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
+      open-source implementation of Bioware's Infinity Engine. It was written to
+      support pseudo-3D role playing games based on the Dungeons & Dragons
+      ruleset (Baldur's Gate and Icewind Dale series, Planescape: Torment).
+    '';
+    homepage = "https://gemrb.org/";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/gimx/conf.patch b/nixpkgs/pkgs/games/gimx/conf.patch
new file mode 100644
index 000000000000..875cc68824ac
--- /dev/null
+++ b/nixpkgs/pkgs/games/gimx/conf.patch
@@ -0,0 +1,26 @@
+diff --git a/core/config_reader.c b/core/config_reader.c
+index 451fc48..ed45f4d 100644
+--- a/core/config_reader.c
++++ b/core/config_reader.c
+@@ -1355,7 +1355,7 @@ 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);
+-
++  if(getenv("GIMXCONF")) { snprintf(file_path, sizeof(file_path), "%s", file); }
+   if(read_file(file_path) == -1)
+   {
+     gerror("read_file failed\n");
+diff --git a/core/gimx.c b/core/gimx.c
+index 700cae9..9143d8b 100755
+--- a/core/gimx.c
++++ b/core/gimx.c
+@@ -192,7 +192,7 @@ 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);
+-
++  if(getenv("GIMXCONF")) { snprintf(file_path, sizeof(file_path), "%s", gimx_params.config_file); }
+   FILE * fp = gfile_fopen(file_path, "r");
+   if (fp == NULL)
+   {
diff --git a/nixpkgs/pkgs/games/gimx/custom/Dualshock4.xml b/nixpkgs/pkgs/games/gimx/custom/Dualshock4.xml
new file mode 100644
index 000000000000..45ee5ed7c1c1
--- /dev/null
+++ b/nixpkgs/pkgs/games/gimx/custom/Dualshock4.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<root>
+  <controller id="1" dpi="0" type="DS4">
+    <configuration id="1">
+      <trigger type="" id="" name="" button_id="" switch_back="no" delay="0"/>
+      <mouse_options_list/>
+      <intensity_list/>
+      <button_map>
+        <button id="abs_axis_10" label="">
+          <device type="joystick" id="0" name="Sony Computer Entertainment Wireless Controller"/>
+          <event type="button" id="3"/>
+        </button>
+        <button id="abs_axis_9" label="">
+          <device type="joystick" id="0" name="Sony Computer Entertainment Wireless Controller"/>
+          <event type="button" id="0"/>
+        </button>
+        <button id="abs_axis_8" label="">
+          <device type="joystick" id="0" name="Sony Computer Entertainment Wireless Controller"/>
+          <event type="button" id="1"/>
+        </button>
+        <button id="abs_axis_7" label="">
+          <device type="joystick" id="0" name="Sony Computer Entertainment Wireless Controller"/>
+          <event type="button" id="2"/>
+        </button>
+        <button id="abs_axis_11" label="">
+          <device type="joystick" id="0" name="Sony Computer Entertainment Wireless Controller"/>
+          <event type="button" id="4"/>
+        </button>
+        <button id="abs_axis_12" label="">
+          <device type="joystick" id="0" name="Sony Computer Entertainment Wireless Controller"/>
+          <event type="button" id="5"/>
+        </button>
+        <button id="abs_axis_0" label="">
+          <device type="joystick" id="0" name="Sony Computer Entertainment Wireless Controller"/>
+          <event type="button" id="8"/>
+        </button>
+        <button id="abs_axis_1" label="">
+          <device type="joystick" id="0" name="Sony Computer Entertainment Wireless Controller"/>
+          <event type="button" id="9"/>
+        </button>
+        <button id="abs_axis_15" label="">
+          <device type="joystick" id="0" name="Sony Computer Entertainment Wireless Controller"/>
+          <event type="button" id="11"/>
+        </button>
+        <button id="abs_axis_16" label="">
+          <device type="joystick" id="0" name="Sony Computer Entertainment Wireless Controller"/>
+          <event type="button" id="12"/>
+        </button>
+        <button id="abs_axis_2" label="">
+          <device type="joystick" id="0" name="Sony Computer Entertainment Wireless Controller"/>
+          <event type="button" id="10"/>
+        </button>
+        <button id="abs_axis_3" label="">
+          <device type="joystick" id="0" name="Sony Computer Entertainment Wireless Controller"/>
+          <event type="button" id="13"/>
+        </button>
+        <button id="abs_axis_4" label="">
+          <device type="joystick" id="0" name="Sony Computer Entertainment Wireless Controller"/>
+          <event type="button" id="14"/>
+        </button>
+        <button id="abs_axis_5" label="">
+          <device type="joystick" id="0" name="Sony Computer Entertainment Wireless Controller"/>
+          <event type="button" id="15"/>
+        </button>
+        <button id="abs_axis_6" label="">
+          <device type="joystick" id="0" name="Sony Computer Entertainment Wireless Controller"/>
+          <event type="button" id="16"/>
+        </button>
+      </button_map>
+      <axis_map>
+        <axis id="rel_axis_0" label="">
+          <device type="joystick" id="0" name="Sony Computer Entertainment Wireless Controller"/>
+          <event type="axis" id="0" dead_zone="0" multiplier="0.004" exponent="1.00" shape=""/>
+        </axis>
+        <axis id="rel_axis_1" label="">
+          <device type="joystick" id="0" name="Sony Computer Entertainment Wireless Controller"/>
+          <event type="axis" id="1" dead_zone="0" multiplier="0.004" exponent="1.00" shape=""/>
+        </axis>
+        <axis id="rel_axis_2" label="">
+          <device type="joystick" id="0" name="Sony Computer Entertainment Wireless Controller"/>
+          <event type="axis" id="3" dead_zone="0" multiplier="0.004" exponent="1.00" shape=""/>
+        </axis>
+        <axis id="rel_axis_3" label="">
+          <device type="joystick" id="0" name="Sony Computer Entertainment Wireless Controller"/>
+          <event type="axis" id="4" dead_zone="0" multiplier="0.004" exponent="1.00" shape=""/>
+        </axis>
+        <axis id="abs_axis_13" label="">
+          <device type="joystick" id="0" name="Sony Computer Entertainment Wireless Controller"/>
+          <event type="axis" id="2" dead_zone="0" multiplier="0.008" exponent="1.00" shape=""/>
+        </axis>
+        <axis id="abs_axis_14" label="">
+          <device type="joystick" id="0" name="Sony Computer Entertainment Wireless Controller"/>
+          <event type="axis" id="5" dead_zone="0" multiplier="0.008" exponent="1.00" shape=""/>
+        </axis>
+      </axis_map>
+      <joystick_corrections_list/>
+      <force_feedback>
+        <device type="joystick" id="0" name="Sony Computer Entertainment Wireless Controller"/>
+        <inversion enable="no"/>
+        <gain rumble="0" constant="0" spring="0" damper="0"/>
+      </force_feedback>
+    </configuration>
+  </controller>
+</root>
diff --git a/nixpkgs/pkgs/games/gimx/default.nix b/nixpkgs/pkgs/games/gimx/default.nix
new file mode 100644
index 000000000000..9c2b260f1dbf
--- /dev/null
+++ b/nixpkgs/pkgs/games/gimx/default.nix
@@ -0,0 +1,86 @@
+{ stdenv, lib, fetchFromGitHub, makeWrapper, curl, libusb1, xorg, libxml2
+, ncurses5, bluez, libmhash, gimxPdpGamepad ? false }:
+
+let
+  gimx-config = fetchFromGitHub {
+    owner = "matlo";
+    repo = "GIMX-configurations";
+    rev = "c20300f24d32651d369e2b27614b62f4b856e4a0";
+    sha256 = "02wcjk8da188x7y0jf3p0arjdh9zbb0lla3fxdb28b1xyybfvx5p";
+  };
+
+in stdenv.mkDerivation rec {
+  pname = "gimx";
+  version = "unstable-2021-08-31";
+
+  src = fetchFromGitHub {
+    owner = "matlo";
+    repo = "GIMX";
+    rev = "58d2098dce75ed4c90ae649460d3a7a150f4ef0a";
+    fetchSubmodules = true;
+    sha256 = "05kdv2qqr311c2p76hdlgvrq7b04vcpps5c80zn8b8l7p831ilgz";
+  };
+
+  patches = [ ./conf.patch ];
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [
+    curl libusb1 bluez libxml2 ncurses5 libmhash
+    xorg.libX11 xorg.libXi xorg.libXext
+  ];
+
+  postPatch = lib.optionals gimxPdpGamepad ''
+    substituteInPlace ./shared/gimxcontroller/include/x360.h \
+      --replace "0x045e" "0x0e6f" --replace "0x028e" "0x0213"
+    substituteInPlace ./loader/firmware/EMU360.hex \
+      --replace "1B210001" "1B211001" \
+      --replace "09210001" "09211001" \
+      --replace "5E048E021001" "6F0E13020001"
+  '';
+
+  makeFlags = [ "build-core" ];
+
+  env.NIX_CFLAGS_COMPILE = toString [
+    # Needed with GCC 12
+    "-Wno-error=address"
+    "-Wno-error=deprecated-declarations"
+    "-Wno-error=use-after-free"
+  ];
+
+  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
+    cp -r ${./custom} $out/share/custom
+
+    makeWrapper $out/bin/gimx $out/bin/gimx-dualshock4 \
+      --set GIMXCONF 1 --add-flags "--nograb" --add-flags "-p /dev/ttyUSB0" \
+      --add-flags "-c $out/share/custom/Dualshock4.xml"
+
+    makeWrapper $out/bin/gimx $out/bin/gimx-xboxonepad \
+      --set GIMXCONF 1 --add-flags "--nograb" --add-flags "-p /dev/ttyUSB0" \
+      --add-flags "-c $out/share/config/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/nixpkgs/pkgs/games/gl-117/default.nix b/nixpkgs/pkgs/games/gl-117/default.nix
new file mode 100644
index 000000000000..f135c93ff04f
--- /dev/null
+++ b/nixpkgs/pkgs/games/gl-117/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, fetchurl
+, libGLU, libGL, SDL, freeglut, SDL_mixer, autoconf, automake, libtool
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gl-117";
+  version = "1.3.2";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/project/gl-117/gl-117/GL-117%20Source/${pname}-${version}.tar.bz2";
+    sha256 = "1yvg1rp1yijv0b45cz085b29x5x0g5fkm654xdv5qwh2l6803gb4";
+  };
+
+  nativeBuildInputs = [ automake autoconf ];
+  buildInputs = [ libGLU libGL SDL freeglut SDL_mixer libtool ];
+
+  meta = with lib; {
+    description = "An air combat simulator";
+    homepage = "https://sourceforge.net/projects/gl-117";
+    maintainers = with maintainers; [ raskin ];
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/gl-gsync-demo/default.nix b/nixpkgs/pkgs/games/gl-gsync-demo/default.nix
new file mode 100644
index 000000000000..968d4d5e4a3d
--- /dev/null
+++ b/nixpkgs/pkgs/games/gl-gsync-demo/default.nix
@@ -0,0 +1,38 @@
+{ stdenv, fetchFromGitHub, libX11, freeglut, glew, libXNVCtrl, libXext, lib }:
+
+stdenv.mkDerivation rec {
+  pname = "gl-gsync-demo";
+  version = "unstable-2020-12-27";
+
+  src = fetchFromGitHub {
+    owner = "dahenry";
+    repo = "gl-gsync-demo";
+    rev = "4fd963a8ad880dc2d846394c8c80b2091a119591";
+    sha256 = "1innsmpsd9n9ih80v16rhj2ijrl28jd7x6a4jmxdirba7mjibm8d";
+  };
+
+  buildInputs = [ libX11 freeglut glew libXNVCtrl libXext ];
+
+  installPhase = ''
+    runHook preInstall
+
+    install -D gl-gsync-demo -t $out/bin/
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    license = with licenses; mit;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ atemu ];
+    description = "A very basic OpenGL demo for testing NVIDIA's G-SYNC technology on Linux";
+    longDescription = ''
+      The demo simply draws a vertical bar moving across the screen at constant speed, but deliberately rendered at a variable frame rate.
+
+      The min and max frame rates can be manually changed at runtime, by step of 10 fps and with a min of 10 fps.
+
+      The demo also allows to toggle V-Sync on/off.
+    '';
+    homepage = "https://github.com/dahenry/gl-gsync-demo";
+  };
+}
diff --git a/nixpkgs/pkgs/games/globulation/default.nix b/nixpkgs/pkgs/games/globulation/default.nix
new file mode 100644
index 000000000000..039098f87da5
--- /dev/null
+++ b/nixpkgs/pkgs/games/globulation/default.nix
@@ -0,0 +1,69 @@
+{ lib, stdenv, fetchurl, libGLU, libGL, SDL, scons, SDL_ttf, SDL_image, zlib, SDL_net
+, speex, libvorbis, libogg, boost, fribidi, bsdiff
+, fetchpatch
+}:
+let
+  version = "0.9.4";
+  patchlevel = "4";
+  tutorial4patch = fetchurl {
+    url = "http://bugs.debian.org/cgi-bin/bugreport.cgi?msg=34;filename=tutorial-part4.map.bspatch;att=1;bug=595448";
+    name = "globulation2-tutorial4-map-patch-debian.bspatch";
+    sha256 = "d3511ac0f822d512c42abd34b3122f2990862d3d0af6ce464ff372f5bd7f35e9";
+  };
+in
+stdenv.mkDerivation rec {
+  name = "glob2-${version}.${patchlevel}";
+
+  src = fetchurl {
+    url = "mirror://savannah/glob2/${version}/${name}.tar.gz";
+    sha256 = "1f0l2cqp2g3llhr9jl6jj15k0wb5q8n29vqj99xy4p5hqs78jk8g";
+  };
+
+  patches = [ ./header-order.patch ./public-buildproject.patch
+    (fetchpatch {
+      url = "https://bitbucket.org/giszmo/glob2/commits/c9dc715624318e4fea4abb24e04f0ebdd9cd8d2a/raw";
+      sha256 = "0017xg5agj3dy0hx71ijdcrxb72bjqv7x6aq7c9zxzyyw0mkxj0k";
+    })
+    (fetchpatch {
+      url = "https://sources.debian.org/data/main/g/glob2/0.9.4.4-6/debian/patches/10_pthread_underlinkage.patch";
+      sha256 = "sha256-L9POADlkgQbUQEUmx4s3dxXG9tS0w2IefpRGuQNRMI0=";
+    })
+    (fetchpatch {
+      url = "https://sources.debian.org/data/main/g/glob2/0.9.4.4-6/debian/patches/link-boost-system.patch";
+      sha256 = "sha256-ne6F2ZowB+TUmg3ePuUoPNxXI0ZJC6HEol3oQQHJTy4=";
+    })
+    (fetchpatch {
+      url = "https://sources.debian.org/data/main/g/glob2/0.9.4.4-6/debian/patches/scons.patch";
+      sha256 = "sha256-Gah7SoVcd/Aljs0Nqo3YF0lZImUWtrGM4HbbQ4yrhHU=";
+    })
+    (fetchpatch {
+      url = "https://sources.debian.org/data/main/g/glob2/0.9.4.4-6/debian/patches/boost-1.69.patch";
+      sha256 = "sha256-D7agFR4uyIHxQz690Q8EHPF+rTEoiGUpgkm7r5cL5SI=";
+    })
+  ];
+
+  postPatch = ''
+    cp campaigns/tutorial-part4.map{,.orig}
+    bspatch  campaigns/tutorial-part4.map{.orig,} ${tutorial4patch}
+    sed -i -e "s@env = Environment()@env = Environment( ENV = os.environ )@" SConstruct
+  '';
+
+  nativeBuildInputs = [ scons ];
+  buildInputs = [ libGLU libGL SDL SDL_ttf SDL_image zlib SDL_net speex libvorbis libogg boost fribidi bsdiff ];
+
+  postConfigure = ''
+    sconsFlags+=" BINDIR=$out/bin"
+    sconsFlags+=" INSTALLDIR=$out/share/globulation2"
+    sconsFlags+=" DATADIR=$out/share/globulation2/glob2"
+  '';
+
+  NIX_LDFLAGS = "-lboost_system";
+
+  meta = with lib; {
+    description = "RTS without micromanagement";
+    maintainers = with maintainers; [ raskin ];
+    platforms = platforms.linux;
+    license = licenses.gpl3;
+  };
+  passthru.updateInfo.downloadPage = "http://globulation2.org/wiki/Download_and_Install";
+}
diff --git a/nixpkgs/pkgs/games/globulation/header-order.patch b/nixpkgs/pkgs/games/globulation/header-order.patch
new file mode 100644
index 000000000000..6c8dd922c255
--- /dev/null
+++ b/nixpkgs/pkgs/games/globulation/header-order.patch
@@ -0,0 +1,23 @@
+With gcc 4.4, compilation of libgag/src/TextStream.cpp fails with the error: 
+'class GAGCore::StreamBackend' has no member named 'getc'. Reordering 
+#include's solves the problem.
+
+Patch from Debian.
+
+Index: glob2-0.9.4.1/libgag/src/TextStream.cpp
+===================================================================
+--- glob2-0.9.4.1.orig/libgag/src/TextStream.cpp        2009-06-27 20:19:38.000000000 +0400
++++ glob2-0.9.4.1/libgag/src/TextStream.cpp     2009-06-27 20:20:22.000000000 +0400
+@@ -17,11 +17,11 @@
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+ 
+-#include <TextStream.h>
+ #include <assert.h>
+ #include <fstream>
+ #include <iostream>
+ #include <stack>
++#include <TextStream.h>
+ #ifdef WIN32
+ #define snprintf _snprintf
+ #define vsnprintf _vsnprintf
diff --git a/nixpkgs/pkgs/games/globulation/public-buildproject.patch b/nixpkgs/pkgs/games/globulation/public-buildproject.patch
new file mode 100644
index 000000000000..1eaedf08820d
--- /dev/null
+++ b/nixpkgs/pkgs/games/globulation/public-buildproject.patch
@@ -0,0 +1,21 @@
+diff -Nru glob2-0.9.4.4/src/Game.h glob2-0.9.4.4.new/src/Game.h
+--- glob2-0.9.4.4/src/Game.h	2009-08-29 16:39:06.000000000 -0400
++++ glob2-0.9.4.4.new/src/Game.h	2015-08-29 00:59:07.843398596 -0400
+@@ -148,7 +148,7 @@
+ 		TOP_TO_BOTTOM,
+ 		BOTTOM_TO_TOP
+ 	};
+-	
++public:	
+ 	struct BuildProject
+ 	{
+ 		int posX;
+@@ -158,7 +158,7 @@
+ 		int unitWorking;
+ 		int unitWorkingFuture;
+ 	};
+-	
++private:	
+ 	///Initiates Game
+ 	void init(GameGUI *gui, MapEdit* edit);
+ 
diff --git a/nixpkgs/pkgs/games/gltron/default.nix b/nixpkgs/pkgs/games/gltron/default.nix
new file mode 100644
index 000000000000..540170c49b21
--- /dev/null
+++ b/nixpkgs/pkgs/games/gltron/default.nix
@@ -0,0 +1,30 @@
+{lib, stdenv, fetchurl, SDL, libGLU, libGL, zlib, libpng, libvorbis, libmikmod, SDL_sound } :
+
+stdenv.mkDerivation rec {
+  pname = "gltron";
+  version = "0.70";
+  src = fetchurl {
+    url = "mirror://sourceforge/gltron/gltron-${version}-source.tar.gz";
+    sha256 = "e0c8ebb41a18a1f8d7302a9c2cb466f5b1dd63e9a9966c769075e6b6bdad8bb0";
+  };
+
+  patches = [ ./gentoo-prototypes.patch ];
+
+  postPatch = ''
+     # Fix https://sourceforge.net/p/gltron/bugs/15
+     sed -i /__USE_MISC/d lua/src/lib/liolib.c
+  '';
+
+  # The build fails, unless we disable the default -Wall -Werror
+  configureFlags = [ "--disable-warn" ];
+
+  buildInputs = [ SDL libGLU libGL zlib libpng libvorbis libmikmod SDL_sound ];
+
+  meta = {
+    homepage = "http://www.gltron.org/";
+    description = "Game based on the movie Tron";
+    license = lib.licenses.gpl2Plus;
+    maintainers = with lib.maintainers; [viric];
+    platforms = with lib.platforms; linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/gltron/gentoo-prototypes.patch b/nixpkgs/pkgs/games/gltron/gentoo-prototypes.patch
new file mode 100644
index 000000000000..71078ae553f7
--- /dev/null
+++ b/nixpkgs/pkgs/games/gltron/gentoo-prototypes.patch
@@ -0,0 +1,27 @@
+Taken from:
+http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/games-action/gltron/files/gltron-0.70-prototypes.patch?revision=1.1&view=markup
+
+scripting.h declares these params as const so make sure they're the same.
+
+--- a/nebu/scripting/scripting.c
++++ b/nebu/scripting/scripting.c
+@@ -169,16 +169,16 @@
+   return status;
+ }    
+ 
+-void scripting_RunFile(char *name) {
++void scripting_RunFile(const char *name) {
+   lua_dofile(L, name);
+ }
+ 
+-void scripting_Run(char *command) {
++void scripting_Run(const char *command) {
+   /* fprintf(stderr, "[command] %s\n", command); */
+   lua_dostring(L, command);
+ }
+ 
+-void scripting_RunFormat(char *format, ... ) {
++void scripting_RunFormat(const char *format, ... ) {
+   char buf[4096];
+   va_list ap;
+   va_start(ap, format);
diff --git a/nixpkgs/pkgs/games/gmad/default.nix b/nixpkgs/pkgs/games/gmad/default.nix
new file mode 100644
index 000000000000..97538679ee59
--- /dev/null
+++ b/nixpkgs/pkgs/games/gmad/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, fetchFromGitHub, premake4, bootil }:
+
+stdenv.mkDerivation rec {
+  pname = "gmad";
+  version = "unstable-2020-02-24";
+
+  meta = {
+    description = "Garry's Mod Addon Creator and Extractor";
+    homepage = "https://github.com/Facepunch/gmad";
+    license = lib.licenses.unfree;
+    maintainers = [ lib.maintainers.abigailbuccaneer ];
+    platforms = lib.platforms.all;
+  };
+
+  src = fetchFromGitHub {
+    owner = "Facepunch";
+    repo = "gmad";
+    rev = "5236973a2fcbb3043bdd3d4529ce68b6d938ad93";
+    sha256="04an17nvnj38mpi0w005v41ib8ynb5qhgrdkmsda4hq7l1gn276s";
+  };
+
+  buildInputs = [ premake4 bootil ];
+
+  targetName =
+    if stdenv.isLinux then "gmad_linux"
+    else if stdenv.isDarwin then "gmad_osx"
+    else "gmad";
+
+  premakeFlags = [ "--bootil_lib=${bootil}/lib" "--bootil_inc=${bootil}/include" ];
+
+  installPhase = ''
+    mkdir -p $out/bin
+    cp ${targetName} $out/bin/gmad
+  '';
+}
diff --git a/nixpkgs/pkgs/games/gnome-hexgl/default.nix b/nixpkgs/pkgs/games/gnome-hexgl/default.nix
new file mode 100644
index 000000000000..54d74ffa5fa0
--- /dev/null
+++ b/nixpkgs/pkgs/games/gnome-hexgl/default.nix
@@ -0,0 +1,43 @@
+{ lib, stdenv
+, fetchFromGitHub
+, ninja
+, meson
+, pkg-config
+, gthree
+, gsound
+, libepoxy
+, gtk3
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-hexgl";
+  version = "unstable-2020-07-24";
+
+  src = fetchFromGitHub {
+    owner = "alexlarsson";
+    repo = "gnome-hexgl";
+    rev = "f47a351055a235730795341dcd6b2397cc4bfa0c";
+    sha256 = "yZWGymaSUfnCP8VAEdDH64w0muSnRK/XPi1/IqTrE4k=";
+  };
+
+  nativeBuildInputs = [
+    ninja
+    meson
+    pkg-config
+  ];
+
+  buildInputs = [
+    gthree
+    gsound
+    libepoxy
+    gtk3
+  ];
+
+  meta = with lib; {
+    description = "Gthree port of HexGL";
+    homepage = "https://github.com/alexlarsson/gnome-hexgl";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/games/gnonograms/default.nix b/nixpkgs/pkgs/games/gnonograms/default.nix
new file mode 100644
index 000000000000..2446384ff719
--- /dev/null
+++ b/nixpkgs/pkgs/games/gnonograms/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, vala
+, meson
+, ninja
+, pkg-config
+, desktop-file-utils
+, appstream
+, python3
+, shared-mime-info
+, wrapGAppsHook
+, gtk3
+, pantheon
+, libgee
+, libhandy
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gnonograms";
+  version = "2.1.2";
+
+  src = fetchFromGitHub {
+    owner = "jeremypw";
+    repo = "gnonograms";
+    rev = "v${version}";
+    sha256 = "sha256-TkEVjrwlr4Q5FsfcdY+9fxwaMq+DFs0RwGI2E+GT5Mk=";
+  };
+
+  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
+    libhandy
+  ];
+
+  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/nixpkgs/pkgs/games/gnubg/default.nix b/nixpkgs/pkgs/games/gnubg/default.nix
new file mode 100644
index 000000000000..84bc7f5df8af
--- /dev/null
+++ b/nixpkgs/pkgs/games/gnubg/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv, fetchurl, pkg-config, glib, python3, gtk2, readline,
+  copyDesktopItems, makeDesktopItem }:
+
+stdenv.mkDerivation rec {
+  pname = "gnubg";
+  version = "1.07.001";
+
+  src = fetchurl {
+    url = "mirror://gnu/gnubg/gnubg-release-${version}-sources.tar.gz";
+    hash = "sha256-cjmXKUGcrZ8RLDBmoS0AANpFCkVq3XsJTYkVUGnWgh4=";
+  };
+
+  nativeBuildInputs = [ copyDesktopItems pkg-config python3 glib ];
+
+  buildInputs = [ gtk2 readline ];
+
+  strictDeps = true;
+
+  configureFlags = [ "--with-gtk" "--with--board3d" ];
+
+  desktopItems = makeDesktopItem {
+    desktopName = "GNU Backgammon";
+    name = pname;
+    genericName = "Backgammon";
+    comment = meta.description;
+    exec = pname;
+    icon = pname;
+    categories = [ "Game" "GTK" "StrategyGame" ];
+  };
+
+  meta = with lib;
+    { description = "World class backgammon application";
+      homepage = "https://www.gnu.org/software/gnubg/";
+      license = licenses.gpl3;
+      maintainers = [ maintainers.ehmry ];
+      platforms = platforms.linux;
+    };
+}
diff --git a/nixpkgs/pkgs/games/gnuchess/default.nix b/nixpkgs/pkgs/games/gnuchess/default.nix
new file mode 100644
index 000000000000..3acf6a8aa62d
--- /dev/null
+++ b/nixpkgs/pkgs/games/gnuchess/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, fetchurl, flex, makeWrapper }:
+
+stdenv.mkDerivation rec {
+  pname = "gnuchess";
+  version = "6.2.9";
+
+  src = fetchurl {
+    url = "mirror://gnu/chess/gnuchess-${version}.tar.gz";
+    sha256 = "sha256-3fzCC911aQCpq2xCx9r5CiiTv38ZzjR0IM42uuvEGJA=";
+  };
+
+  buildInputs = [
+    flex
+  ];
+  nativeBuildInputs = [ makeWrapper ];
+
+  postInstall = ''
+    wrapProgram $out/bin/gnuchessx --set PATH "$out/bin"
+    wrapProgram $out/bin/gnuchessu --set PATH "$out/bin"
+  '';
+
+  meta = with lib; {
+    description = "GNU Chess engine";
+    maintainers = with maintainers; [ raskin ];
+    platforms = platforms.unix;
+    license = licenses.gpl3Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/games/gnugo/default.nix b/nixpkgs/pkgs/games/gnugo/default.nix
new file mode 100644
index 000000000000..3b8449ab4c7f
--- /dev/null
+++ b/nixpkgs/pkgs/games/gnugo/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, fetchurl, fetchpatch }:
+
+stdenv.mkDerivation rec {
+  pname = "gnugo";
+  version = "3.8";
+
+  src = fetchurl {
+    url = "mirror://gnu/gnugo/gnugo-${version}.tar.gz";
+    sha256 = "0wkahvqpzq6lzl5r49a4sd4p52frdmphnqsfdv7gdp24bykdfs6s";
+  };
+
+  patches = [
+    # Pull patch pending upstream inclusion for -fno-common toolchain support:
+    #   https://savannah.gnu.org/patch/index.php?10208
+    (fetchpatch {
+      name = "fno-common.patch";
+      url = "https://savannah.gnu.org/patch/download.php?file_id=53240";
+      sha256 = "0s96qvmx244vq5pv2nzf7x863kq2y5skzjhbpyzaajfkldbj0sw4";
+    })
+  ];
+
+  hardeningDisable = [ "format" ];
+
+  meta = {
+    description = "GNU Go - A computer go player";
+    homepage = "https://www.gnu.org/software/gnugo/";
+    license = lib.licenses.gpl3;
+    platforms = lib.platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/games/gnujump/default.nix b/nixpkgs/pkgs/games/gnujump/default.nix
new file mode 100644
index 000000000000..1c918395d40b
--- /dev/null
+++ b/nixpkgs/pkgs/games/gnujump/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv, makeDesktopItem, copyDesktopItems, fetchurl, SDL, SDL_image, SDL_mixer }:
+
+stdenv.mkDerivation rec {
+  pname = "gnujump";
+  version = "1.0.8";
+  src = fetchurl {
+    url = "mirror://gnu/gnujump/${pname}-${version}.tar.gz";
+    sha256 = "05syy9mzbyqcfnm0hrswlmhwlwx54f0l6zhcaq8c1c0f8dgzxhqk";
+  };
+
+  nativeBuildInputs = [ copyDesktopItems ];
+  buildInputs = [ SDL SDL_image SDL_mixer ];
+
+  NIX_LDFLAGS = "-lm";
+
+  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 = ''
+      The goal in this game is to jump to the next floor trying not to fall
+      down. As you go upper in the Falling Tower the floors will fall faster.
+      Try to survive longer get upper than anyone. It might seem too simple but
+      once you've tried you'll realize how addictive this is.
+    '';
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ fgaz ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/gnujump/gnujump.xpm b/nixpkgs/pkgs/games/gnujump/gnujump.xpm
new file mode 100644
index 000000000000..d8b6bcb4c8cb
--- /dev/null
+++ b/nixpkgs/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/nixpkgs/pkgs/games/gnushogi/default.nix b/nixpkgs/pkgs/games/gnushogi/default.nix
new file mode 100644
index 000000000000..2557b0571ea9
--- /dev/null
+++ b/nixpkgs/pkgs/games/gnushogi/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, stdenv
+, fetchurl
+, fetchpatch
+, zlib
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gnushogi";
+  version = "1.4.2";
+
+  src = fetchurl {
+    url = "mirror://gnu/gnushogi/${pname}-${version}.tar.gz";
+    hash = "sha256-HsxIqGYwPGNlJVKzJdaF5+9emJMkQIApGmHZZQXVKyk=";
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://sources.debian.org/data/main/g/gnushogi/1.4.2-7/debian/patches/01-make-dont-ignore";
+      hash = "sha256-Aw0zfH+wkj+rQQzKIn6bSilP76YIO27FwJ8n1UzG6ow=";
+    })
+    (fetchpatch {
+      url = "https://sources.debian.org/data/main/g/gnushogi/1.4.2-7/debian/patches/globals";
+      hash = "sha256-wZJBPMYSz4n1kOyLmR9QOp70650R9xXQUWD5hvaMRok=";
+    })
+  ];
+
+  buildInputs = [ zlib ];
+
+  meta = with lib; {
+    description = "GNU implementation of Shogi, also known as Japanese Chess";
+    homepage = "https://www.gnu.org/software/gnushogi/";
+    license = licenses.gpl3;
+    maintainers = [ maintainers.ciil ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/games/gogdl/default.nix b/nixpkgs/pkgs/games/gogdl/default.nix
new file mode 100644
index 000000000000..d5b3d0a5a544
--- /dev/null
+++ b/nixpkgs/pkgs/games/gogdl/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, fetchpatch
+, writeScript
+, buildPythonApplication
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+, requests
+, cacert
+}:
+
+buildPythonApplication rec {
+  pname = "gogdl";
+  version = "0.7.3";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "Heroic-Games-Launcher";
+    repo = "heroic-gogdl";
+    rev = "89d15f1593cc26f15a5f8f409bb623764c095d37";
+    hash = "sha256-EECpXGVhcwihKB8fLObVvYzFD8uh7CxYKtFiGc0Jqbk=";
+  };
+
+  disabled = pythonOlder "3.8";
+
+  propagatedBuildInputs = [
+    setuptools
+    requests
+  ];
+
+  pythonImportsCheck = [ "gogdl" ];
+
+  meta = with lib; {
+    description = "GOG Downloading module for Heroic Games Launcher";
+    homepage = "https://github.com/Heroic-Games-Launcher/heroic-gogdl";
+    license = with licenses; [ gpl3 ];
+    maintainers = with maintainers; [ aidalgol ];
+  };
+
+  # Upstream no longer create git tags when bumping the version, so we have to
+  # extract it from the source code on the main branch.
+  passthru.updateScript = writeScript "gogdl-update-script" ''
+    #!/usr/bin/env nix-shell
+    #!nix-shell -i bash -p curl gnused jq common-updater-scripts
+    set -eou pipefail;
+
+    owner=Heroic-Games-Launcher
+    repo=heroic-gogdl
+    path='gogdl/__init__.py'
+
+    version=$(
+      curl --cacert "${cacert}/etc/ssl/certs/ca-bundle.crt" \
+      https://raw.githubusercontent.com/$owner/$repo/main/$path |
+      sed -n 's/^\s*version\s*=\s*"\([0-9]\.[0-9]\.[0-9]\)"\s*$/\1/p')
+
+    commit=$(curl --cacert "${cacert}/etc/ssl/certs/ca-bundle.crt" \
+      https://api.github.com/repos/$owner/$repo/commits?path=$path |
+      jq -r '.[0].sha')
+
+    update-source-version \
+      ${pname} \
+      "$version" \
+      --file=./pkgs/games/gogdl/default.nix \
+      --rev=$commit
+  '';
+}
diff --git a/nixpkgs/pkgs/games/gogui/default.nix b/nixpkgs/pkgs/games/gogui/default.nix
new file mode 100644
index 000000000000..43e1f3397b8f
--- /dev/null
+++ b/nixpkgs/pkgs/games/gogui/default.nix
@@ -0,0 +1,95 @@
+{ ant
+, docbook-xsl-ns
+, docbook_xml_dtd_42
+, fetchFromGitHub
+, imagemagick
+, lib
+, libxslt
+, makeWrapper
+, openjdk
+, stdenv
+}:
+
+let
+  version = "1.5.4a";
+in stdenv.mkDerivation {
+  pname = "gogui";
+  inherit version;
+
+  src = fetchFromGitHub {
+    owner = "Remi-Coulom";
+    repo = "gogui";
+    rev = "v${version}";
+    hash = "sha256-UFhOk2mAnTtxfwEOHquN64YDCRq7nNUqZAPQf77MEEw=";
+  };
+
+  nativeBuildInputs = [
+    makeWrapper
+    ant
+  ];
+
+  buildInputs = [
+    docbook-xsl-ns
+    imagemagick
+    libxslt
+    openjdk
+  ];
+
+  buildPhase = ''
+    runHook preBuild
+
+    substituteInPlace doc/manual/xml/book.xml \
+      --replace http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd \
+      ${docbook_xml_dtd_42}/xml/dtd/docbook/docbookx.dtd
+    substituteInPlace doc/manual/xml/manpages.xml \
+      --replace http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd \
+      ${docbook_xml_dtd_42}/xml/dtd/docbook/docbookx.dtd
+
+    # generate required gui images from svg
+    # see https://github.com/Remi-Coulom/gogui/issues/36
+    sizes=( 16x16 24x24 32x32 48x48 64x64 )
+    for i in src/net/sf/gogui/images/*.svg; do
+      for j in ''${sizes[@]}; do
+        convert $i -resize $j src/net/sf/gogui/images/$(basename $i .svg)-''${j}.png
+      done
+    done
+
+    for i in src/net/sf/gogui/images/gogui-{black,white,setup}.svg; do
+      convert $i -resize 8x8 src/net/sf/gogui/images/$(basename $i .svg)-8x8.png
+    done
+
+    ant -Ddocbook-xsl.dir=${docbook-xsl-ns}/xml/xsl/docbook
+
+    runHook postBuild
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    # copy documentation
+    mkdir -p $out/share/doc
+    mv -vi doc $out/share/doc/gogui
+
+    # make man pages available
+    mkdir -p $out/share/man/
+    ln -s $out/share/doc/gogui/manual/man $out/share/man/man1
+
+    # copy programs
+    mv -vi {bin,lib} $out/
+
+    # wrap programs
+    for x in $out/bin/*; do
+      wrapProgram $x --prefix PATH ":" ${openjdk}/bin --set GOGUI_JAVA_HOME ${openjdk}
+    done
+
+    runHook postInstall
+  '';
+
+  meta = {
+    maintainers = [ lib.maintainers.cleverca22 lib.maintainers.omnipotententity];
+    description = "A graphical user interface to programs that play the board game Go and support the Go Text Protocol such as GNU Go";
+    homepage = "https://github.com/Remi-Coulom/gogui";
+    platforms = lib.platforms.unix;
+    license = lib.licenses.gpl3;
+  };
+}
diff --git a/nixpkgs/pkgs/games/gotypist/default.nix b/nixpkgs/pkgs/games/gotypist/default.nix
new file mode 100644
index 000000000000..24afb9317c5b
--- /dev/null
+++ b/nixpkgs/pkgs/games/gotypist/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildGoModule, fetchFromGitHub }:
+
+buildGoModule rec {
+  pname = "gotypist";
+  version = "0.8.2";
+
+  src = fetchFromGitHub {
+    owner = "pb-";
+    repo = "gotypist";
+    rev = version;
+    sha256 = "0khl2f6bl121slw9mlf4qzsdarpk1v3vry11f3dvz7pb1q6zjj11";
+  };
+
+  vendorHash = null;
+
+  meta = with lib; {
+    description = "A touch-typing tutor";
+    longDescription = ''
+      A simple touch-typing tutor that follows Steve Yegge's methodology of
+      going in fast, slow, and medium cycles.
+    '';
+    homepage = "https://github.com/pb-/gotypist";
+    license = licenses.mit;
+    maintainers = with maintainers; [ pb- ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/grapejuice/default.nix b/nixpkgs/pkgs/games/grapejuice/default.nix
new file mode 100644
index 000000000000..c8d1956eb9a5
--- /dev/null
+++ b/nixpkgs/pkgs/games/grapejuice/default.nix
@@ -0,0 +1,138 @@
+{ lib
+, fetchFromGitLab
+, gobject-introspection
+, pciutils
+, python3Packages
+, gtk3
+, wrapGAppsHook
+, glib
+, cairo
+, desktop-file-utils
+, xdg-utils
+, xdg-user-dirs
+, gettext
+, winetricks
+, wine
+, glxinfo
+, xrandr
+, bash
+}:
+
+python3Packages.buildPythonApplication rec  {
+  pname = "grapejuice";
+  version = "7.20.11";
+
+  src = fetchFromGitLab {
+    owner = "BrinkerVII";
+    repo = "grapejuice";
+    rev = "v${version}";
+    hash = "sha256-sDw67Xseeak1v5x0daznfdeNQahDTj21AVvXmuZlsgg=";
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    desktop-file-utils
+    glib
+    wrapGAppsHook
+    python3Packages.pip
+  ];
+
+  buildInputs = [
+    cairo
+    gettext
+    gtk3
+    bash
+  ];
+
+  propagatedBuildInputs = with python3Packages; [
+    psutil
+    dbus-python
+    pygobject3
+    packaging
+    wheel
+    setuptools
+    requests
+    unidecode
+    click
+    pydantic
+  ];
+
+  dontWrapGApps = true;
+
+  makeWrapperArgs = [
+    "--prefix PATH : ${lib.makeBinPath [ xdg-user-dirs wine winetricks pciutils glxinfo xrandr ]}"
+    # make xdg-open overrideable at runtime
+    "--suffix PATH : ${lib.makeBinPath [ xdg-utils ]}"
+  ];
+
+  postPatch = ''
+    substituteInPlace src/grapejuice_common/assets/desktop/grapejuice.desktop \
+      --replace \$GRAPEJUICE_EXECUTABLE "$out/bin/grapejuice" \
+      --replace \$GRAPEJUICE_GUI_EXECUTABLE "$out/bin/grapejuice-gui" \
+      --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 src/grapejuice_common/assets/desktop/roblox-studio-auth.desktop \
+      --replace \$GRAPEJUICE_EXECUTABLE "$out/bin/grapejuice" \
+      --replace \$STUDIO_ICON "grapejuice-roblox-studio"
+
+    substituteInPlace src/grapejuice_common/paths.py \
+      --replace 'return local_share() / "locale"' 'return Path("${placeholder "out"}/share/locale")'
+
+    substituteInPlace src/grapejuice_common/models/settings_model.py \
+      --replace 'default_wine_home: Optional[str] = ""' 'default_wine_home: Optional[str] = "${wine}"'
+
+    substituteInPlace src/grapejuice_packaging/builders/linux_package_builder.py \
+      --replace '"--no-dependencies",' '"--no-dependencies", "--no-build-isolation",'
+
+    substituteInPlace src/grapejuice_packaging/packaging_resources/bin/grapejuice src/grapejuice_packaging/packaging_resources/bin/grapejuice-gui \
+      --replace "/usr/bin/env python3" "${python3Packages.python.interpreter}"
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    PYTHONPATH=$(pwd)/src:$PYTHONPATH python3 -m grapejuice_packaging linux_package
+
+    mkdir -p "$out" "$out/${python3Packages.python.sitePackages}"
+    tar -xvf ./dist/linux_package/grapejuice-''${version}.tar.gz --strip-components=1 -C "$out"
+
+    mv "$out/lib/python3/dist-packages/"* "$out/${python3Packages.python.sitePackages}"
+    rmdir --ignore-fail-on-non-empty -p "$out/lib/python3/dist-packages"
+
+    runHook postInstall
+  '';
+
+  postFixup = ''
+    patchShebangs "$out/bin/grapejuice{,-gui}"
+
+    buildPythonPath "$out $pythonPath"
+
+    for bin in grapejuice grapejuice-gui; do
+    wrapProgram "$out/bin/$bin" \
+      --prefix PYTHONPATH : "$PYTHONPATH:$(toPythonPath $out)" \
+      ''${makeWrapperArgs[@]} \
+      ''${gappsWrapperArgs[@]}
+    done
+  '';
+
+  # 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 helium ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/graphwar/default.nix b/nixpkgs/pkgs/games/graphwar/default.nix
new file mode 100644
index 000000000000..3586979292e6
--- /dev/null
+++ b/nixpkgs/pkgs/games/graphwar/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, copyDesktopItems
+, jdk
+, makeDesktopItem
+, makeWrapper
+}:
+
+stdenv.mkDerivation rec {
+  pname = "graphwar";
+  version = "1.0.0";
+
+  src = fetchFromGitHub {
+    owner = "catabriga";
+    repo = "graphwar";
+    rev = version;
+    sha256 = "sha256-t3Y576dXWp2Mj6OSQN5cm9FuNBWNqKq6xxkVRbjIBgE=";
+  };
+
+  nativeBuildInputs = [ copyDesktopItems makeWrapper ];
+  buildInputs = [ jdk ];
+
+  buildPhase = ''
+    runHook preBuild
+
+    mkdir -p out/
+    javac -d out/ -sourcepath src/ -classpath out/ -encoding utf8 src/**/*.java
+
+    runHook postBuild
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/lib/
+    mv out $out/lib/graphwar
+    cp -r rsc $out/lib/graphwar/rsc
+
+    makeWrapper ${jdk}/bin/java $out/bin/graphwar \
+      --add-flags "-classpath $out/lib/graphwar Graphwar.Graphwar"
+    makeWrapper ${jdk}/bin/java $out/bin/graphwar-roomserver \
+      --add-flags "-classpath $out/lib/graphwar RoomServer.RoomServer"
+    makeWrapper ${jdk}/bin/java $out/bin/graphwar-globalserver \
+      --add-flags "-classpath $out/lib/graphwar GlobalServer.GlobalServer"
+
+    runHook postInstall
+  '';
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "graphwar";
+      exec = "graphwar";
+      desktopName = "Graphwar";
+      categories = [ "Game" ];
+    })
+  ];
+
+  meta = with lib; {
+    homepage = "http://www.graphwar.com/";
+    description = "An artillery game in which you must hit your enemies using mathematical functions";
+    license = licenses.gpl3Plus;
+    platforms = jdk.meta.platforms;
+    maintainers = with maintainers; [ yrd ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/gscrabble/default.nix b/nixpkgs/pkgs/games/gscrabble/default.nix
new file mode 100644
index 000000000000..28e2a58b0d00
--- /dev/null
+++ b/nixpkgs/pkgs/games/gscrabble/default.nix
@@ -0,0 +1,44 @@
+{ lib, buildPythonApplication, fetchFromGitHub
+, gtk3, wrapGAppsHook, gst_all_1, gobject-introspection
+, python3Packages, gnome }:
+
+buildPythonApplication {
+  pname = "gscrabble";
+  version = "unstable-2020-04-21";
+
+  src = fetchFromGitHub {
+    owner = "RaaH";
+    repo = "gscrabble";
+    rev = "aba37f062a6b183dcc084c453f395af1dc437ec8";
+    sha256 = "sha256-rYpPHgOlPRnlA+Nkvo/J+/8/vl24/Ssk55fTq9oNCz4=";
+  };
+
+  doCheck = false;
+
+  nativeBuildInputs = [ wrapGAppsHook gobject-introspection ];
+
+  buildInputs = with gst_all_1; [
+    gst-plugins-base gst-plugins-good gst-plugins-ugly gst-plugins-bad
+    gnome.adwaita-icon-theme gtk3
+  ];
+
+  propagatedBuildInputs = with python3Packages; [ gst-python pygobject3 ];
+
+  preFixup = ''
+    gappsWrapperArgs+=(
+      --prefix PYTHONPATH : "$out/share/GScrabble/modules"
+      )
+  '';
+
+  meta = with lib; {
+    # Fails to build, propably incompatible with latest Python
+    # error: Multiple top-level packages discovered in a flat-layout
+    # https://github.com/RaaH/gscrabble/issues/13
+    broken = true;
+    description = "Golden Scrabble crossword puzzle game";
+    homepage = "https://github.com/RaaH/gscrabble/";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/gshogi/default.nix b/nixpkgs/pkgs/games/gshogi/default.nix
new file mode 100644
index 000000000000..77eab7918b91
--- /dev/null
+++ b/nixpkgs/pkgs/games/gshogi/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, fetchFromGitHub
+, gobject-introspection
+, gtk3
+, python3
+, wrapGAppsHook
+}:
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "gshogi";
+  version = "0.5.1";
+
+  src = fetchFromGitHub {
+    owner = "johncheetham";
+    repo = "gshogi";
+    rev = "v${version}";
+    hash = "sha256-EPOIYPSFAhilxuZeYfuZ4Cd29ReJs/E4KNF5/lyzbxs=";
+  };
+
+  doCheck = false;  # no tests available
+
+  buildInputs = [
+    gtk3
+  ];
+
+  nativeBuildInputs = [ wrapGAppsHook gobject-introspection ];
+
+  propagatedBuildInputs = with python3.pkgs; [
+    pygobject3
+    pycairo
+  ];
+
+  meta = with lib; {
+    homepage = "http://johncheetham.com/projects/gshogi/";
+    description = "A graphical implementation of the Shogi board game, also known as Japanese Chess";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.ciil ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/gtetrinet/default.nix b/nixpkgs/pkgs/games/gtetrinet/default.nix
new file mode 100644
index 000000000000..af16d5e9f748
--- /dev/null
+++ b/nixpkgs/pkgs/games/gtetrinet/default.nix
@@ -0,0 +1,45 @@
+{ fetchFromGitHub, lib, stdenv, autoreconfHook, intltool, pkg-config, libgnome, libgnomeui, GConf }:
+
+stdenv.mkDerivation {
+  pname = "gtetrinet";
+  version = "0.7.11";
+
+  src = fetchFromGitHub {
+    owner = "GNOME";
+    repo = "gtetrinet";
+    rev = "6be3df83f3dc5c7cb966e6cd447182df01b93222";
+    sha256 = "1y05x8lfyxvkjg6c87cfd0xxmb22c88scx8fq3gah7hjy5i42v93";
+  };
+
+  nativeBuildInputs = [ autoreconfHook intltool pkg-config ];
+
+  buildInputs = [ libgnome libgnomeui ];
+
+  propagatedUserEnvPkgs = [ GConf ];
+
+  postAutoreconf = ''
+    intltoolize --force
+  '';
+
+  preInstall = ''
+    export GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL=1
+  '';
+
+  postInstall = ''
+    mv "$out/games" "$out/bin"
+  '';
+
+  enableParallelBuilding = true;
+
+  meta = {
+    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 = "https://gtetrinet.sourceforge.net/";
+    license = lib.licenses.gpl2;
+    platforms = lib.platforms.unix;
+    maintainers = [ lib.maintainers.chris-martin ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/gtypist/default.nix b/nixpkgs/pkgs/games/gtypist/default.nix
new file mode 100644
index 000000000000..43b95bacefc8
--- /dev/null
+++ b/nixpkgs/pkgs/games/gtypist/default.nix
@@ -0,0 +1,28 @@
+{lib, stdenv, fetchurl, makeWrapper, libiconv, ncurses, perl, fortune}:
+
+stdenv.mkDerivation rec {
+  pname = "gtypist";
+  version = "2.9.5";
+
+  src = fetchurl {
+    url = "mirror://gnu/gtypist/gtypist-${version}.tar.xz";
+    sha256 = "0xzrkkmj0b1dw3yr0m9hml2y634cc4h61im6zwcq57s7285z8fn1";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ ncurses perl fortune ]
+   ++ lib.optional stdenv.isDarwin libiconv;
+
+  preFixup = ''
+     wrapProgram "$out/bin/typefortune" \
+       --prefix PATH : "${fortune}/bin" \
+  '';
+
+  meta = with lib; {
+    homepage = "https://www.gnu.org/software/gtypist";
+    description = "Universal typing tutor";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux ++ platforms.darwin;
+    maintainers = with maintainers; [ pSub ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/gweled/default.nix b/nixpkgs/pkgs/games/gweled/default.nix
new file mode 100644
index 000000000000..fc187afbe806
--- /dev/null
+++ b/nixpkgs/pkgs/games/gweled/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, fetchbzr, gettext
+, gtk2, wrapGAppsHook, autoreconfHook, pkg-config
+, libmikmod, librsvg, libcanberra-gtk2, hicolor-icon-theme }:
+
+stdenv.mkDerivation rec {
+  pname = "gweled";
+  version = "unstable-2021-02-11";
+
+  src = fetchbzr {
+    url = "lp:gweled";
+    rev = "108";
+    sha256 = "sha256-rM4dgbYfSrVqZwi+xzKuEtmtjK3HVvqeutmni1vleLo=";
+  };
+
+  doCheck = false;
+
+  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 lib; {
+    description = "Bejeweled clone game";
+    homepage = "https://gweled.org";
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/harmonist/default.nix b/nixpkgs/pkgs/games/harmonist/default.nix
new file mode 100644
index 000000000000..cbb556cbc948
--- /dev/null
+++ b/nixpkgs/pkgs/games/harmonist/default.nix
@@ -0,0 +1,30 @@
+{lib, fetchurl, buildGoModule}:
+
+buildGoModule rec {
+  pname = "harmonist";
+  version = "0.5.1";
+
+  src = fetchurl {
+    url = "https://download.tuxfamily.org/harmonist/releases/${pname}-${version}.tar.gz";
+    hash = "sha256-NkUrBvOOs6yctW4CVRpJNcdfdPvUJZp9HaWLS7eO4yE=";
+  };
+
+  vendorHash = "sha256-0DV32a2LYnfYzg/tqwear9uaaahNUIi0M8uWlXOQ5Ic=";
+
+  ldflags = [ "-s" "-w" ];
+
+  meta = with lib; {
+    description = "A stealth coffee-break roguelike game";
+    longDescription = ''
+      Harmonist is a stealth coffee-break roguelike game. The game has a heavy
+      focus on tactical positioning, light and noise mechanisms, making use of
+      various terrain types and cones of view for monsters. Aiming for a
+      replayable streamlined experience, the game avoids complex inventory
+      management and character building, relying on items and player
+      adaptability for character progression.
+    '';
+    homepage = "https://harmonist.tuxfamily.org/";
+    license = licenses.isc;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/hase/default.nix b/nixpkgs/pkgs/games/hase/default.nix
new file mode 100644
index 000000000000..f807572455af
--- /dev/null
+++ b/nixpkgs/pkgs/games/hase/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, pkg-config
+, sparrow3d
+, zlib
+}:
+
+stdenv.mkDerivation {
+  pname = "hase";
+  version = "unstable-2020-10-06";
+
+  src = fetchFromGitHub {
+    owner = "theZiz";
+    repo = "hase";
+    rev = "31d6840cdf0c72fc459f10402dae7726096b2974";
+    hash = "sha256-d9So3E8nCQJ1/BdlwMkGbaFPT9mkX1VzlDGKp71ptEE=";
+  };
+
+  patches = [ ./prefer-dynamic.patch ];
+
+  nativeBuildInputs = [
+    pkg-config
+  ];
+
+  buildInputs = [
+    sparrow3d
+    zlib
+  ];
+
+  buildPhase = ''
+    NIX_CFLAGS_COMPILE=$(pkg-config --cflags sparrow3d zlib)
+
+    # build and install are one step, and inseparable without patching
+    mkdir -p $out/{bin,share/applications,share/pixmaps}
+    ./install.sh $out
+  '';
+
+  postFixup = ''
+    substituteInPlace "$out/share/applications/hase.desktop" \
+      --replace "Exec=hase" "Exec=$out/bin/hase"
+  '';
+
+  meta = {
+    description = "An open-source artillery shooter";
+    longDescription = ''
+      Hase is an open source gravity based artillery shooter. It is similar to
+      Worms, Hedgewars or artillery, but the gravity force and direction
+      depends on the mass nearby. It is optimized for mobile game consoles like
+      the GP2X, Open Pandora or GCW Zero.
+    '';
+    homepage = "http://ziz.gp2x.de/hase/";
+    license = lib.licenses.gpl3Plus;
+    maintainers = with lib.maintainers; [ colinsane ];
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/hase/prefer-dynamic.patch b/nixpkgs/pkgs/games/hase/prefer-dynamic.patch
new file mode 100644
index 000000000000..ab36e6b2b3d7
--- /dev/null
+++ b/nixpkgs/pkgs/games/hase/prefer-dynamic.patch
@@ -0,0 +1,13 @@
+diff --git a/Makefile b/Makefile
+index 95d894e..3c561c1 100644
+--- a/Makefile
++++ b/Makefile
+@@ -35,7 +35,7 @@ endif
+ LIB += -L$(SPARROW_LIB)
+ INCLUDE += -I$(SPARROW_FOLDER)
+ 
+-HASE_STATIC = $(SPARROW_LIB)/$(SPARROW3D_STATIC_LIB) $(SPARROW_LIB)/$(SPARROWSOUND_STATIC_LIB) $(SPARROW_LIB)/$(SPARROWNET_STATIC_LIB) $(STATIC)
++DYNAMIC += -lsparrow3d -lsparrowSound -lsparrowNet
+ 
+ ifneq ($(TARGET),win32)
+ DYNAMIC += -lz
diff --git a/nixpkgs/pkgs/games/hedgewars/default.nix b/nixpkgs/pkgs/games/hedgewars/default.nix
new file mode 100644
index 000000000000..94f8a28add9b
--- /dev/null
+++ b/nixpkgs/pkgs/games/hedgewars/default.nix
@@ -0,0 +1,88 @@
+{ stdenv, SDL2_image, SDL2_ttf, SDL2_net, fpc, ghcWithPackages, ffmpeg_4, freeglut
+, lib, fetchurl, cmake, pkg-config, lua5_1, SDL2, SDL2_mixer
+, zlib, libpng, libGL, libGLU, physfs
+, qtbase, qttools, wrapQtAppsHook
+, llvm
+, withServer ? true
+}:
+
+let
+  ghc = ghcWithPackages (pkgs: with pkgs; [
+          SHA bytestring entropy hslogger network pkgs.zlib random
+          regex-tdfa sandi utf8-string vector
+        ]);
+in
+stdenv.mkDerivation rec {
+  pname = "hedgewars";
+  version = "1.0.2";
+
+  src = fetchurl {
+    url = "https://www.hedgewars.org/download/releases/hedgewars-src-${version}.tar.bz2";
+    sha256 = "sha256-IB/l5FvYyls9gbGOwGvWu8n6fCxjvwGQBeL4C+W88hI=";
+  };
+
+  nativeBuildInputs = [ cmake pkg-config qttools wrapQtAppsHook ];
+
+  buildInputs = [
+    SDL2_ttf SDL2_net SDL2 SDL2_mixer SDL2_image
+    fpc lua5_1
+    llvm # hard-requirement on aarch64, for some reason not strictly necessary on x86-64
+    ffmpeg_4 freeglut physfs
+    qtbase
+  ] ++ lib.optional withServer ghc;
+
+  cmakeFlags = [
+    "-DNOVERSIONINFOUPDATE=ON"
+    "-DNOSERVER=${if withServer then "OFF" else "ON"}"
+  ];
+
+  NIX_LDFLAGS = lib.concatMapStringsSep " " (e: "-rpath ${e}/lib") [
+    SDL2.out
+    SDL2_image
+    SDL2_mixer
+    SDL2_net
+    SDL2_ttf
+    libGL
+    libGLU
+    libpng.out
+    lua5_1
+    physfs
+    zlib.out
+  ];
+
+  qtWrapperArgs = [
+    "--prefix LD_LIBRARY_PATH : ${lib.makeLibraryPath [ libGL libGLU freeglut physfs ]}"
+  ];
+
+  meta = with lib; {
+    description = "Turn-based strategy artillery game similar to Worms";
+    homepage = "https://hedgewars.org/";
+    license = licenses.gpl2;
+    longDescription = ''
+       Each player controls a team of several hedgehogs. During the course of
+       the game, players take turns with one of their hedgehogs. They then use
+       whatever tools and weapons are available to attack and kill the
+       opponents' hedgehogs, thereby winning the game. Hedgehogs may move
+       around the terrain in a variety of ways, normally by walking and jumping
+       but also by using particular tools such as the "Rope" or "Parachute", to
+       move to otherwise inaccessible areas. Each turn is time-limited to
+       ensure that players do not hold up the game with excessive thinking or
+       moving.
+
+       A large variety of tools and weapons are available for players during
+       the game: Grenade, Cluster Bomb, Bazooka, UFO, Homing Bee, Shotgun,
+       Desert Eagle, Fire Punch, Baseball Bat, Dynamite, Mine, Rope, Pneumatic
+       pick, Parachute. Most weapons, when used, cause explosions that deform
+       the terrain, removing circular chunks. The landscape is an island
+       floating on a body of water, or a restricted cave with water at the
+       bottom. A hedgehog dies when it enters the water (either by falling off
+       the island, or through a hole in the bottom of it), it is thrown off
+       either side of the arena or when its health is reduced, typically from
+       contact with explosions, to zero (the damage dealt to the attacked
+       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 ];
+    broken = stdenv.isDarwin;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/heroic/default.nix b/nixpkgs/pkgs/games/heroic/default.nix
new file mode 100644
index 000000000000..239d78f973c8
--- /dev/null
+++ b/nixpkgs/pkgs/games/heroic/default.nix
@@ -0,0 +1,125 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, fetchYarnDeps
+, yarn
+, prefetch-yarn-deps
+, nodejs
+, python3
+, makeWrapper
+, electron
+, vulkan-helper
+, gogdl
+, legendary-gl
+, nile
+}:
+
+let appName = "heroic";
+in stdenv.mkDerivation rec {
+  pname = "heroic-unwrapped";
+  version = "2.11.0";
+
+  src = fetchFromGitHub {
+    owner = "Heroic-Games-Launcher";
+    repo = "HeroicGamesLauncher";
+    rev = "v${version}";
+    hash = "sha256-N+9wNlDARE1zdXW/vka6whFNu5CF240zCJ00EDT1cM0=";
+  };
+
+  offlineCache = fetchYarnDeps {
+    yarnLock = "${src}/yarn.lock";
+    hash = "sha256-P7Mm9TMNjr2glLQppjJZRMeN9sYKyZWzRaerZIcY3Y8=";
+  };
+
+  nativeBuildInputs = [
+    yarn
+    prefetch-yarn-deps
+    nodejs
+    python3
+    makeWrapper
+  ];
+
+  patches = [
+    # Reverts part of upstream PR 2761 so that we don't have to use a non-free Electron fork.
+    # https://github.com/Heroic-Games-Launcher/HeroicGamesLauncher/pull/2761
+    ./remove-drm-support.patch
+    # Make Heroic create Steam shortcuts (to non-steam games) with the correct path to heroic.
+    ./fix-non-steam-shortcuts.patch
+  ];
+
+  postPatch = ''
+    # We are not packaging this as an Electron application bundle, so Electron
+    # reports to the application that is is not "packaged", which causes Heroic
+    # to take some incorrect codepaths meant for development environments.
+    substituteInPlace src/**/*.ts --replace 'app.isPackaged' 'true'
+  '';
+
+  configurePhase = ''
+    runHook preConfigure
+
+    export HOME=$(mktemp -d)
+    yarn config --offline set yarn-offline-mirror $offlineCache
+    fixup-yarn-lock yarn.lock
+    yarn install --offline --frozen-lockfile --ignore-platform --ignore-scripts --no-progress --non-interactive
+    patchShebangs node_modules/
+
+    runHook postConfigure
+  '';
+
+  buildPhase = ''
+    runHook preBuild
+
+    yarn --offline vite build
+
+    # Remove dev dependencies.
+    yarn install --production --offline --frozen-lockfile --ignore-platform --ignore-scripts --no-progress --non-interactive
+
+    runHook postBuild
+  '';
+
+  # --disable-gpu-compositing is to work around upstream bug
+  # https://github.com/electron/electron/issues/32317
+  installPhase = let
+    binPlatform = if stdenv.isDarwin then "darwin" else "linux";
+  in ''
+    runHook preInstall
+
+    mkdir -p $out/share/{applications,${appName}}
+    cp -r . $out/share/${appName}
+    rm -rf $out/share/${appName}/{.devcontainer,.vscode,.husky,.idea,.github}
+
+    chmod -R u+w "$out/share/${appName}/public/bin" "$out/share/${appName}/build/bin"
+    rm -rf "$out/share/${appName}/public/bin" "$out/share/${appName}/build/bin"
+    mkdir -p "$out/share/${appName}/build/bin/${binPlatform}"
+    ln -s \
+      "${gogdl}/bin/gogdl" \
+      "${legendary-gl}/bin/legendary" \
+      "${nile}/bin/nile" \
+      "${lib.optionalString stdenv.isLinux "${vulkan-helper}/bin/vulkan-helper"}" \
+      "$out/share/${appName}/build/bin/${binPlatform}"
+
+    makeWrapper "${electron}/bin/electron" "$out/bin/heroic" \
+      --inherit-argv0 \
+      --add-flags --disable-gpu-compositing \
+      --add-flags $out/share/${appName} \
+      --add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --enable-wayland-ime}}"
+
+    substituteInPlace "$out/share/${appName}/flatpak/com.heroicgameslauncher.hgl.desktop" \
+      --replace "Exec=heroic-run" "Exec=heroic"
+    mkdir -p "$out/share/applications" "$out/share/icons/hicolor/512x512/apps"
+    ln -s "$out/share/${appName}/flatpak/com.heroicgameslauncher.hgl.desktop" "$out/share/applications"
+    ln -s "$out/share/${appName}/flatpak/com.heroicgameslauncher.hgl.png" "$out/share/icons/hicolor/512x512/apps"
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "A Native GOG, Epic, and Amazon Games Launcher for Linux, Windows and Mac";
+    homepage = "https://github.com/Heroic-Games-Launcher/HeroicGamesLauncher";
+    changelog = "https://github.com/Heroic-Games-Launcher/HeroicGamesLauncher/releases";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ aidalgol ];
+    platforms = [ "x86_64-linux" "x86_64-darwin" "aarch64-linux" "aarch64-darwin" ];
+    mainProgram = appName;
+  };
+}
diff --git a/nixpkgs/pkgs/games/heroic/fhsenv.nix b/nixpkgs/pkgs/games/heroic/fhsenv.nix
new file mode 100644
index 000000000000..24f7c96bc9f9
--- /dev/null
+++ b/nixpkgs/pkgs/games/heroic/fhsenv.nix
@@ -0,0 +1,141 @@
+{ buildFHSEnv
+, heroic-unwrapped
+, extraPkgs ? pkgs: [ ]
+, extraLibraries ? pkgs: [ ]
+}:
+
+buildFHSEnv {
+  name = "heroic";
+
+  runScript = "heroic";
+
+  # Many Wine and native games need 32-bit libraries.
+  multiArch = true;
+
+  # required by Electron
+  unshareIpc = false;
+
+  targetPkgs = pkgs: with pkgs; [
+    heroic-unwrapped
+    gamemode
+    curl
+    gawk
+    gnome.zenity
+    plasma5Packages.kdialog
+    mangohud
+    nettools
+    opencl-headers
+    p7zip
+    perl
+    psmisc
+    python3
+    unzip
+    which
+    xorg.xrandr
+    zstd
+  ] ++ extraPkgs pkgs;
+
+  multiPkgs = let
+    xorgDeps = pkgs: with pkgs.xorg; [
+      libpthreadstubs
+      libSM
+      libX11
+      libXaw
+      libxcb
+      libXcomposite
+      libXcursor
+      libXdmcp
+      libXext
+      libXi
+      libXinerama
+      libXmu
+      libXrandr
+      libXrender
+      libXv
+      libXxf86vm
+    ];
+    gstreamerDeps = pkgs: with pkgs.gst_all_1; [
+      gstreamer
+      gst-plugins-base
+      gst-plugins-good
+      gst-plugins-ugly
+      gst-plugins-bad
+      gst-libav
+    ];
+  in pkgs: with pkgs; [
+    alsa-lib
+    alsa-plugins
+    bash
+    cabextract
+    cairo
+    coreutils
+    cups
+    dbus
+    freealut
+    freetype
+    fribidi
+    giflib
+    glib
+    gnutls
+    gtk3
+    lcms2
+    libevdev
+    libgcrypt
+    libGLU
+    libglvnd
+    libgpg-error
+    libgudev
+    libjpeg
+    libkrb5
+    libmpeg2
+    libogg
+    libopus
+    libpng
+    libpulseaudio
+    libselinux
+    libsndfile
+    libsoup
+    libtheora
+    libtiff
+    libunwind
+    libusb1
+    libv4l
+    libva
+    libvdpau
+    libvorbis
+    libvpx
+    libwebp
+    libxkbcommon
+    libxml2
+    mpg123
+    ncurses
+    ocl-icd
+    openal
+    openldap
+    openssl
+    pango
+    pipewire
+    samba4
+    sane-backends
+    SDL2
+    speex
+    sqlite
+    udev
+    unixODBC
+    util-linux
+    v4l-utils
+    vulkan-loader
+    wayland
+    zlib
+  ] ++ xorgDeps pkgs
+    ++ gstreamerDeps pkgs
+    ++ extraLibraries pkgs;
+
+  extraInstallCommands = ''
+    mkdir -p $out/share
+    ln -s ${heroic-unwrapped}/share/applications $out/share
+    ln -s ${heroic-unwrapped}/share/icons $out/share
+  '';
+
+  meta = heroic-unwrapped.meta;
+}
diff --git a/nixpkgs/pkgs/games/heroic/fix-non-steam-shortcuts.patch b/nixpkgs/pkgs/games/heroic/fix-non-steam-shortcuts.patch
new file mode 100644
index 000000000000..7b46473245f7
--- /dev/null
+++ b/nixpkgs/pkgs/games/heroic/fix-non-steam-shortcuts.patch
@@ -0,0 +1,13 @@
+diff --git a/src/backend/shortcuts/nonesteamgame/nonesteamgame.ts b/src/backend/shortcuts/nonesteamgame/nonesteamgame.ts
+index ebef6aa4..c8bd853d 100644
+--- a/src/backend/shortcuts/nonesteamgame/nonesteamgame.ts
++++ b/src/backend/shortcuts/nonesteamgame/nonesteamgame.ts
+@@ -252,7 +252,7 @@ async function addNonSteamGame(props: {
+     // add new Entry
+     const newEntry = {} as ShortcutEntry
+     newEntry.AppName = props.gameInfo.title
+-    newEntry.Exe = `"${app.getPath('exe')}"`
++    newEntry.Exe = `"heroic"`
+     newEntry.StartDir = `"${process.cwd()}"`
+ 
+     if (isFlatpak) {
diff --git a/nixpkgs/pkgs/games/heroic/remove-drm-support.patch b/nixpkgs/pkgs/games/heroic/remove-drm-support.patch
new file mode 100644
index 000000000000..44045bef2bf6
--- /dev/null
+++ b/nixpkgs/pkgs/games/heroic/remove-drm-support.patch
@@ -0,0 +1,28 @@
+diff --git a/src/backend/main.ts b/src/backend/main.ts
+index 83b58bb2..f61656fa 100644
+--- a/src/backend/main.ts
++++ b/src/backend/main.ts
+@@ -19,7 +19,6 @@ import {
+   protocol,
+   screen,
+   clipboard,
+-  components,
+   session
+ } from 'electron'
+ import 'backend/updater'
+@@ -310,14 +309,7 @@ if (!gotTheLock) {
+     }
+ 
+     if (!process.env.CI) {
+-      await components.whenReady().catch((e) => {
+-        logError([
+-          'Failed to download / update DRM components.',
+-          'Make sure you do not block update.googleapis.com domain if you want to use WideVine in Browser sideloaded apps',
+-          e
+-        ])
+-      })
+-      logInfo(['DRM module staus', components.status()])
++      logInfo('DRM modules disabled for nixpkgs')
+     }
+ 
+     // try to fix notification app name on windows
diff --git a/nixpkgs/pkgs/games/hex-a-hop/default.nix b/nixpkgs/pkgs/games/hex-a-hop/default.nix
new file mode 100644
index 000000000000..c6eaed57a9ca
--- /dev/null
+++ b/nixpkgs/pkgs/games/hex-a-hop/default.nix
@@ -0,0 +1,45 @@
+{ lib, stdenv, fetchurl, fetchzip, SDL, SDL_mixer, SDL_ttf }:
+
+stdenv.mkDerivation rec {
+  pname = "hex-a-hop";
+  version = "1.1.0";
+
+  src = fetchzip {
+    url = "https://downloads.sourceforge.net/project/hexahop/${version}/hex-a-hop-${version}.tar.gz";
+    sha256 = "sha256-fBSvNtgNR0aNofbvoYpM1e8ww4ARlXIvrQUvJqVGLlY=";
+  };
+
+  icon = fetchurl {
+    # Fetched from dfa365a90be5c52ef21235a9e90a865b04da3ad4, remove in the next version when the file is included
+    url = "https://sourceforge.net/p/hexahop/code/ci/dfa365a90be5c52ef21235a9e90a865b04da3ad4/tree/data/hex-a-hop.png?format=raw";
+    sha256 = "sha256-Vh/1wwRmC2eSD/+mk1Oqt7EX4a4k++nUAbWQD2P2hNA=";
+  };
+
+  desktop = fetchurl {
+    # Fetched from e67385078e4f248a3877ee1066613d231c0d0eee, remove in the next version when the file is included
+    url = "https://sourceforge.net/p/hexahop/code/ci/e67385078e4f248a3877ee1066613d231c0d0eee/tree/data/hex-a-hop.desktop?format=raw";
+    sha256 = "sha256-j6gKRq+8b1NDwP1WcCaScfmwNxAl78CfK6pemROrRak=";
+  };
+
+  buildInputs = [ SDL SDL_mixer SDL_ttf ];
+
+  makeFlags = [ "PREFIX=$(out)" ];
+
+  postFixup = ''
+    install -Dm644 ${icon} $out/share/icons/${pname}.png
+    install -Dm644 ${desktop} $out/share/applications/${pname}.desktop
+  '';
+
+  meta = {
+    description = "A puzzle game based on hexagonal tiles";
+    homepage = "http://hexahop.sourceforge.net";
+    license = with lib.licenses; [
+      gpl2Plus # Main code
+      cc-by-30 # Assets
+      lgpl2Plus # i18n
+      lgpl3Plus # source files from Lips of Suna
+    ];
+    platforms = lib.platforms.linux;
+    maintainers = with lib.maintainers; [ rampoina ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/hexgui/default.nix b/nixpkgs/pkgs/games/hexgui/default.nix
new file mode 100644
index 000000000000..49dae4217551
--- /dev/null
+++ b/nixpkgs/pkgs/games/hexgui/default.nix
@@ -0,0 +1,36 @@
+{ ant
+, fetchFromGitHub
+, jdk
+, lib
+, makeWrapper
+, stdenv
+}:
+stdenv.mkDerivation {
+  pname = "hexgui";
+  version = "unstable-2023-1-7";
+
+  src = fetchFromGitHub {
+    owner = "selinger";
+    repo = "hexgui";
+    rev = "62f07ff51db0d4a945ad42f86167cc2f2ce65d90";
+    hash = "sha256-yEdZs9HUt3lcrdNO1OH8M8g71+2Ltf+v1RR1fKRDV0o=";
+  };
+
+  nativeBuildInputs = [ ant jdk makeWrapper ];
+  buildPhase = ''
+    ant
+  '';
+
+  installPhase = ''
+    mkdir $out
+    mv bin lib $out
+    wrapProgram $out/bin/hexgui --prefix PATH : ${lib.makeBinPath [ jdk ]}
+  '';
+
+  meta = {
+    description = "GUI for the board game Hex";
+    homepage = "https://github.com/selinger/hexgui";
+    license = lib.licenses.gpl3;
+    maintainers = [ lib.maintainers.ursi ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/hheretic/default.nix b/nixpkgs/pkgs/games/hheretic/default.nix
new file mode 100644
index 000000000000..6e4be6bd54b7
--- /dev/null
+++ b/nixpkgs/pkgs/games/hheretic/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, SDL
+, SDL_mixer
+, autoreconfHook
+, gitUpdater
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "hheretic";
+  version = "0.2.3";
+
+  src = fetchFromGitHub {
+    owner = "sezero";
+    repo = "hheretic";
+    rev = "hheretic-${finalAttrs.version}";
+    hash = "sha256-e9N869W8STZdLUBSscxEnF2Z+SrdVv8ARDL8AMe1SJ8=";
+  };
+
+  nativeBuildInputs = [
+    autoreconfHook
+    SDL.dev
+  ];
+
+  buildInputs = [
+    SDL
+    SDL_mixer
+  ];
+
+  strictDeps = true;
+  enableParallelBuilding = true;
+
+  configureFlags = [ "--with-audio=sdlmixer" ];
+
+  installPhase = ''
+    runHook preInstall
+
+    install -Dm755 hheretic-gl -t $out/bin
+
+    runHook postInstall
+  '';
+
+  passthru.updateScript = gitUpdater {
+    rev-prefix = "hheretic-";
+  };
+
+  meta = {
+    description = "Linux port of Raven Game's Heretic";
+    homepage = "https://hhexen.sourceforge.net/hhexen.html";
+    license = lib.licenses.gpl2Plus;
+    mainProgram = "hheretic-gl";
+    maintainers = with lib.maintainers; [ moody ];
+    inherit (SDL.meta) platforms;
+    broken = stdenv.isDarwin;
+  };
+})
diff --git a/nixpkgs/pkgs/games/hhexen/default.nix b/nixpkgs/pkgs/games/hhexen/default.nix
new file mode 100644
index 000000000000..0e5345e85a7d
--- /dev/null
+++ b/nixpkgs/pkgs/games/hhexen/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, SDL
+, SDL_mixer
+, autoreconfHook
+, gitUpdater
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "hhexen";
+  version = "1.6.3";
+
+  src = fetchFromGitHub {
+    owner = "sezero";
+    repo = "hhexen";
+    rev = "hhexen-${finalAttrs.version}";
+    hash = "sha256-y3jKfU4e8R2pJQN/FN7W6KQ7D/P+7pmQkdmZug15ApI=";
+  };
+
+  nativeBuildInputs = [
+    autoreconfHook
+    SDL.dev
+  ];
+
+  buildInputs = [
+    SDL
+    SDL_mixer
+  ];
+
+  strictDeps = true;
+  enableParallelBuilding = true;
+
+  configureFlags = [ "--with-audio=sdlmixer" ];
+
+  installPhase = ''
+    runHook preInstall
+
+    install -Dm755 hhexen-gl -t $out/bin
+
+    runHook postInstall
+  '';
+
+  passthru.updateScript = gitUpdater {
+    rev-prefix = "hhexen-";
+  };
+
+  meta = {
+    description = "Linux port of Raven Game's Hexen";
+    homepage = "https://hhexen.sourceforge.net/hhexen.html";
+    license = lib.licenses.gpl2Plus;
+    maintainers = with lib.maintainers; [ moody djanatyn ];
+    mainProgram = "hhexen-gl";
+    inherit (SDL.meta) platforms;
+    broken = stdenv.isDarwin;
+  };
+})
diff --git a/nixpkgs/pkgs/games/hikounomizu/default.nix b/nixpkgs/pkgs/games/hikounomizu/default.nix
new file mode 100644
index 000000000000..bca6c8ecf8b9
--- /dev/null
+++ b/nixpkgs/pkgs/games/hikounomizu/default.nix
@@ -0,0 +1,81 @@
+{ lib
+, stdenv
+, fetchurl
+, cmake
+, pkg-config
+, util-linux
+, libGL
+, freetype
+, pugixml
+, SDL2
+, SDL2_image
+, openal
+, libogg
+, libvorbis
+, libGLU
+, enet
+, synfigstudio
+, inkscape
+, imagemagick
+, pngquant
+, xz
+, bc
+}:
+
+stdenv.mkDerivation rec {
+  pname = "hikounomizu";
+  version = "1.0.1";
+
+  src = fetchurl {
+    url = "http://download.tuxfamily.org/hnm/${version}/hikounomizu-${version}-src.tar.bz2";
+    hash = "sha256-3wRhe6CDq1dD0SObAygfqslYJx+EM3LM3rj6HI0whYU=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+    # for make data
+    util-linux
+    synfigstudio.synfig
+    inkscape
+    imagemagick
+    pngquant
+    xz
+    bc
+  ];
+
+  buildInputs = [
+    libGL
+    freetype
+    pugixml
+    SDL2
+    SDL2_image
+    openal
+    libogg
+    libvorbis
+    libGLU
+    enet
+  ];
+
+  postBuild = ''
+    make data HNM_PARALLEL=$NIX_BUILD_CORES
+  '';
+
+  meta = with lib; {
+    description = "A free platform-based fighting game";
+    longDescription = ''
+      Hikou no mizu (ãƒã‚¤ã‚¯ã®æ°´) is a free platform-based fighting game,
+      licensed under the GNU GPL v3 (program) and the LAL (graphics).
+      It works on many operating systems including GNU/Linux, *BSD, Haiku,
+      OS X and Windows.
+
+      The characters use natural powers such as water or lightning,
+      but they can also (mostly for now) fight the traditional way!
+    '';
+    homepage = "https://hikounomizu.org/";
+    downloadPage = "https://hikounomizu.org/download.html";
+    maintainers = with maintainers; [ fgaz ];
+    license = [ licenses.gpl3Plus licenses.lal13 ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/games/hmcl/default.nix b/nixpkgs/pkgs/games/hmcl/default.nix
new file mode 100644
index 000000000000..fcaa01ea2d95
--- /dev/null
+++ b/nixpkgs/pkgs/games/hmcl/default.nix
@@ -0,0 +1,97 @@
+{ lib
+, stdenv
+, fetchurl
+, makeBinaryWrapper
+, makeDesktopItem
+, wrapGAppsHook
+, copyDesktopItems
+, imagemagick
+, jre
+, xorg
+, libGL
+, glfw
+, openal
+, libglvnd
+, alsa-lib
+, wayland
+, libpulseaudio
+}:
+
+let
+  version = "3.5.5";
+  icon = fetchurl {
+    url = "https://github.com/huanghongxun/HMCL/raw/release-${version}/HMCLauncher/HMCL/HMCL.ico";
+    hash = "sha256-MWp78rP4b39Scz5/gpsjwaJhSu+K9q3S2B2cD/V31MA=";
+  };
+in
+stdenv.mkDerivation (finalAttrs: {
+  pname = "hmcl";
+  inherit version;
+
+  src = fetchurl {
+    url = "https://github.com/huanghongxun/HMCL/releases/download/release-${version}/HMCL-${version}.jar";
+    hash = "sha256-bXZF38pd8I8cReuDNrZzDj1hp1Crk+P26JNiikUCg4g=";
+  };
+
+  dontUnpack = true;
+
+  dontWrapGApps = true;
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "HMCL";
+      exec = "hmcl";
+      icon = "hmcl";
+      comment = finalAttrs.meta.description;
+      desktopName = "HMCL";
+      categories = [ "Game" ];
+    })
+  ];
+
+  nativeBuildInputs = [
+    makeBinaryWrapper
+    wrapGAppsHook
+    copyDesktopItems
+    imagemagick
+  ];
+
+  installPhase =
+    let
+      libpath = lib.makeLibraryPath ([
+        libGL
+        glfw
+        openal
+        libglvnd
+      ] ++ lib.optionals stdenv.isLinux [
+        xorg.libX11
+        xorg.libXxf86vm
+        xorg.libXext
+        xorg.libXcursor
+        xorg.libXrandr
+        xorg.libXtst
+        libpulseaudio
+        wayland
+        alsa-lib
+      ]);
+    in
+    ''
+      runHook preInstall
+      mkdir -p $out/{bin,lib/hmcl}
+      cp $src $out/lib/hmcl/hmcl.jar
+      magick ${icon} hmcl.png
+      install -Dm644 hmcl.png $out/share/icons/hicolor/32x32/apps/hmcl.png
+      makeBinaryWrapper ${jre}/bin/java $out/bin/hmcl \
+        --add-flags "-jar $out/lib/hmcl/hmcl.jar" \
+        --set LD_LIBRARY_PATH ${libpath}
+      runHook postInstall
+    '';
+
+  meta = with lib; {
+    homepage = "https://hmcl.huangyuhui.net";
+    description = "A Minecraft Launcher which is multi-functional, cross-platform and popular";
+    sourceProvenance = with sourceTypes; [ binaryBytecode ];
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ ];
+    inherit (jre.meta) platforms;
+  };
+})
diff --git a/nixpkgs/pkgs/games/hyperrogue/default.nix b/nixpkgs/pkgs/games/hyperrogue/default.nix
new file mode 100644
index 000000000000..762b89f07028
--- /dev/null
+++ b/nixpkgs/pkgs/games/hyperrogue/default.nix
@@ -0,0 +1,69 @@
+{ lib, stdenv, fetchFromGitHub, SDL, SDL_ttf, SDL_gfx, SDL_mixer, libpng
+, glew, dejavu_fonts, makeDesktopItem }:
+
+stdenv.mkDerivation rec {
+  pname = "hyperrogue";
+  version = "13.0";
+
+  src = fetchFromGitHub {
+    owner = "zenorogue";
+    repo = "hyperrogue";
+    rev = "v${version}";
+    sha256 = "sha256-RYa0YZCHsGiWyfql73+TlIq5WXM+9UULJ1lOS8m6oIw=";
+  };
+
+  CXXFLAGS = [
+    "-I${lib.getDev SDL}/include/SDL"
+    "-DHYPERPATH='\"${placeholder "out"}/share/hyperrogue/\"'"
+    "-DRESOURCEDESTDIR=HYPERPATH"
+    "-DHYPERFONTPATH='\"${dejavu_fonts}/share/fonts/truetype/\"'"
+  ];
+  HYPERROGUE_USE_GLEW = 1;
+  HYPERROGUE_USE_PNG = 1;
+
+  buildInputs = [ SDL SDL_ttf SDL_gfx SDL_mixer libpng glew ];
+
+  desktopItem = makeDesktopItem {
+    name = "hyperrogue";
+    desktopName = "HyperRogue";
+    genericName = "HyperRogue";
+    comment = meta.description;
+    icon = "hyperrogue";
+    exec = "hyperrogue";
+    categories = [ "Game" "AdventureGame" ];
+  };
+
+  installPhase = ''
+    install -d $out/share/hyperrogue/{sounds,music}
+
+    install -m 555 -D hyperrogue $out/bin/hyperrogue
+    install -m 444 -D hyperrogue-music.txt *.dat $out/share/hyperrogue
+    install -m 444 -D music/* $out/share/hyperrogue/music
+    install -m 444 -D sounds/* $out/share/hyperrogue/sounds
+
+    install -m 444 -D ${desktopItem}/share/applications/hyperrogue.desktop \
+      $out/share/applications/hyperrogue.desktop
+    install -m 444 -D hyperroid/app/src/main/res/drawable-ldpi/icon.png \
+      $out/share/icons/hicolor/36x36/apps/hyperrogue.png
+    install -m 444 -D hyperroid/app/src/main/res/drawable-mdpi/icon.png \
+      $out/share/icons/hicolor/48x48/apps/hyperrogue.png
+    install -m 444 -D hyperroid/app/src/main/res/drawable-hdpi/icon.png \
+      $out/share/icons/hicolor/72x72/apps/hyperrogue.png
+    install -m 444 -D hyperroid/app/src/main/res/drawable-xhdpi/icon.png \
+      $out/share/icons/hicolor/96x96/apps/hyperrogue.png
+    install -m 444 -D hyperroid/app/src/main/res/drawable-xxhdpi/icon.png \
+      $out/share/icons/hicolor/144x144/apps/hyperrogue.png
+    install -m 444 -D hyperroid/app/src/main/res/drawable-xxxhdpi/icon.png \
+      $out/share/icons/hicolor/192x192/apps/hyperrogue.png
+  '';
+
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    homepage = "https://www.roguetemple.com/z/hyper/";
+    description = "A roguelike game set in hyperbolic geometry";
+    maintainers = with maintainers; [ rardiol ];
+    license = licenses.gpl2;
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/games/icbm3d/default.nix b/nixpkgs/pkgs/games/icbm3d/default.nix
new file mode 100644
index 000000000000..a166b4f83f2b
--- /dev/null
+++ b/nixpkgs/pkgs/games/icbm3d/default.nix
@@ -0,0 +1,24 @@
+{lib, stdenv, fetchurl, libX11}:
+
+stdenv.mkDerivation rec {
+  pname = "icbm3d";
+  version = "0.4";
+  src = fetchurl {
+    url = "ftp://ftp.tuxpaint.org/unix/x/icbm3d/icbm3d.${version}.tar.gz";
+    sha256 = "1z9q01mj0v9qbwby5cajjc9wpvdw2ma5v1r639vraxpl9qairm4s";
+  };
+
+  buildInputs = [ libX11 ];
+
+  installPhase = ''
+    mkdir -p $out/bin
+    cp icbm3d $out/bin
+  '';
+
+  meta = {
+    homepage = "http://www.newbreedsoftware.com/icbm3d/";
+    description = "3D vector-based clone of the atari game Missile Command";
+    license = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/infra-arcana/default.nix b/nixpkgs/pkgs/games/infra-arcana/default.nix
new file mode 100644
index 000000000000..6eb1f44aa8cc
--- /dev/null
+++ b/nixpkgs/pkgs/games/infra-arcana/default.nix
@@ -0,0 +1,49 @@
+{ lib, stdenv, fetchFromGitLab, cmake, makeWrapper, SDL2, SDL2_image, SDL2_mixer
+}:
+
+stdenv.mkDerivation rec {
+  pname = "infra-arcana";
+  version = "22.1.0";
+
+  src = fetchFromGitLab {
+    owner = "martin-tornqvist";
+    repo = "ia";
+    rev = "v${version}";
+    sha256 = "sha256-MI+wH0+1f41JYXT2hzDs3RrrR3eTfOzgtCa5T6m8oQc=";
+  };
+
+  nativeBuildInputs = [ cmake makeWrapper ];
+  buildInputs = [ SDL2 SDL2_image SDL2_mixer ];
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/{opt/ia,bin}
+
+    # Remove build artifacts
+    rm -rf CMake* cmake* compile_commands.json CTest* Makefile
+    cp -ra * $out/opt/ia
+
+    # IA uses relative paths when looking for assets
+    wrapProgram $out/opt/ia/ia --run "cd $out/opt/ia"
+    ln -s $out/opt/ia/ia $out/bin/infra-arcana
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    homepage = "https://sites.google.com/site/infraarcana";
+    description = "A Lovecraftian single-player roguelike game";
+    longDescription = ''
+      Infra Arcana is a Roguelike set in the early 20th century. The goal is to
+      explore the lair of a dreaded cult called The Church of Starry Wisdom.
+
+      Buried deep beneath their hallowed grounds lies an artifact called The
+      Shining Trapezohedron - a window to all secrets of the universe. Your
+      ultimate goal is to unearth this artifact.
+    '';
+    platforms = platforms.linux;
+    maintainers = [ maintainers.kenran ];
+    license = licenses.agpl3Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/games/instawow/default.nix b/nixpkgs/pkgs/games/instawow/default.nix
new file mode 100644
index 000000000000..36e60d548842
--- /dev/null
+++ b/nixpkgs/pkgs/games/instawow/default.nix
@@ -0,0 +1,48 @@
+{ lib, python3, fetchFromGitHub, plugins ? [ ] }:
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "instawow";
+  version = "v3.1.0";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "layday";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-xJw/tgHBfOlv5JYsWWdEJ8vpel348YtXCQsaLqgp3Z0=";
+  };
+
+  extras = [ ];  # Disable GUI, most dependencies are not packaged.
+
+  nativeBuildInputs = with python3.pkgs; [
+    poetry-core
+    poetry-dynamic-versioning
+  ];
+  propagatedBuildInputs = with python3.pkgs; [
+    aiohttp
+    aiohttp-client-cache
+    alembic
+    attrs
+    cattrs
+    click
+    iso8601
+    loguru
+    mako
+    packaging
+    pluggy
+    prompt-toolkit
+    questionary
+    rapidfuzz
+    sqlalchemy
+    truststore
+    typing-extensions
+    yarl
+  ] ++ plugins;
+
+  meta = with lib; {
+    homepage = "https://github.com/layday/instawow";
+    description = "World of Warcraft add-on manager CLI and GUI";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ seirl ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/instead/default.nix b/nixpkgs/pkgs/games/instead/default.nix
new file mode 100644
index 000000000000..cafdd2b84f0d
--- /dev/null
+++ b/nixpkgs/pkgs/games/instead/default.nix
@@ -0,0 +1,71 @@
+{ lib, stdenv, fetchurl, SDL2, SDL2_ttf, SDL2_image, SDL2_mixer, pkg-config, lua, zlib, unzip }:
+
+let
+  # 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";
+      sha256 = "0d4m554hiqmgl4xl0jp0b3bqjl35879768hqznh9y57y04sygd2a";
+    })
+    (fetchurl {
+      url = "http://instead-games.googlecode.com/files/instead-cat_en-1.2.zip";
+      sha256 = "0jlm3ssqlka16dm0rg6qfjh6xdh3pv7lj2s4ib4mqwj2vfy0v6sg";
+    })
+    (fetchurl {
+      url = "http://instead-games.googlecode.com/files/instead-vinny-0.1.zip";
+      sha256 = "15qdbg82zp3a8vz4qxminr0xbzbdpnsciliy2wm3raz4hnadawg1";
+    })
+    (fetchurl {
+      url = "http://instead-games.googlecode.com/files/instead-toilet3in1-1.2.zip";
+      sha256 = "0wz4bljbg67m84qwpaqpzs934a5pcbhpgh39fvbbbfvnnlm4lirl";
+    })
+    (fetchurl {
+      url = "http://instead-games.googlecode.com/files/instead-kayleth-0.4.1.zip";
+      sha256 = "0xmn9inys0kbcdd02qaqp8gazqs67xq3fq7hvcy2qb9jbq85j8b2";
+    })
+  ];
+in
+
+stdenv.mkDerivation rec {
+  pname = "instead";
+  version = "3.3.2";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/project/instead/instead/${version}/instead_${version}.tar.gz";
+    sha256 = "u5j2kDKRvMQPsG8iA6uOBScuyE/e1BJIK2+qVL6jqQs=";
+  };
+
+  NIX_LDFLAGS = "-llua -lgcc_s";
+
+  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
+  '';
+
+  inherit games;
+
+  postInstall = ''
+    pushd $out/share/instead/games
+    for a in $games; do
+      unzip $a
+    done
+    popd
+  '';
+
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    description = "Simple text adventure interpreter for Unix and Windows";
+    homepage = "https://instead.syscall.ru/";
+    license = lib.licenses.gpl2;
+    platforms = with lib.platforms; linux;
+    maintainers = with maintainers; [ pSub ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/iortcw/default.nix b/nixpkgs/pkgs/games/iortcw/default.nix
new file mode 100644
index 000000000000..44a554b9e7d6
--- /dev/null
+++ b/nixpkgs/pkgs/games/iortcw/default.nix
@@ -0,0 +1,27 @@
+{ buildEnv, callPackage, makeWrapper }:
+
+let
+  sp = callPackage ./sp.nix {};
+  mp = sp.overrideAttrs (oldAttrs: {
+    sourceRoot = "${oldAttrs.src.name}/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` --chdir "$out/opt/iortcw"
+    done
+  '';
+
+  meta = sp.meta // {
+    description = "Game engine for Return to Castle Wolfenstein";
+  };
+}
diff --git a/nixpkgs/pkgs/games/iortcw/sp.nix b/nixpkgs/pkgs/games/iortcw/sp.nix
new file mode 100644
index 000000000000..66944c49ddd4
--- /dev/null
+++ b/nixpkgs/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 = "${src.name}/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 ];
+
+  env.NIX_CFLAGS_COMPILE = toString [
+    "-I${SDL2.dev}/include/SDL2"
+    "-I${opusfile.dev}/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` --chdir "$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/nixpkgs/pkgs/games/ironwail/default.nix b/nixpkgs/pkgs/games/ironwail/default.nix
new file mode 100644
index 000000000000..f55d72c4a40b
--- /dev/null
+++ b/nixpkgs/pkgs/games/ironwail/default.nix
@@ -0,0 +1,91 @@
+{ lib
+, stdenv
+, SDL2
+, fetchurl
+, gzip
+, libvorbis
+, libmad
+, flac
+, libopus
+, opusfile
+, libogg
+, curl
+, libxmp
+, vulkan-headers
+, vulkan-loader
+, copyDesktopItems
+, makeDesktopItem
+, pkg-config
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "ironwail";
+  version = "0.7.0";
+
+  src = fetchurl {
+    url = "https://github.com/andrei-drexler/ironwail/archive/refs/tags/v${finalAttrs.version}.tar.gz";
+    hash = "sha256-NBG0wwQWqyGWQYJmiLKfxGxpDJLw7Kwf4EnYd33dOpU=";
+  };
+
+  sourceRoot = "${finalAttrs.pname}-${finalAttrs.version}/Quake";
+
+  nativeBuildInputs = [
+    copyDesktopItems pkg-config vulkan-headers
+    gzip libvorbis libmad flac curl libopus
+    opusfile libogg libxmp vulkan-loader SDL2
+  ];
+
+  buildFlags = [
+    "DO_USERDIRS=1"
+    # Makefile defaults, set here to enforce consistency on Darwin build
+    "USE_CODEC_WAVE=1"
+    "USE_CODEC_MP3=1"
+    "USE_CODEC_VORBIS=1"
+    "USE_CODEC_FLAC=1"
+    "USE_CODEC_OPUS=1"
+    "USE_CODEC_MIKMOD=0"
+    "USE_CODEC_UMX=0"
+    "USE_CODEC_XMP=1"
+    "MP3LIB=mad"
+    "VORBISLIB=vorbis"
+    "SDL_CONFIG=sdl2-config"
+    "USE_SDL2=1"
+  ];
+
+  preInstall = ''
+    mkdir -p "$out/bin"
+    mkdir -p "$out/share/quake"
+    substituteInPlace Makefile --replace "cp ironwail.pak /usr/local/games/quake" "cp ironwail.pak $out/share/quake/ironwail.pak"
+    substituteInPlace Makefile --replace "/usr/local/games" "$out/bin"
+  '';
+
+  enableParallelBuilding = true;
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "ironwail";
+      exec = "quake";
+      desktopName = "Ironwail";
+      categories = [ "Game" ];
+    })
+  ];
+
+  meta = {
+    description = "A fork of the QuakeSpasm engine for iD software's Quake";
+    homepage = "https://github.com/andrei-drexler/ironwail";
+    longDescription = ''
+      Ironwail is a fork of QuakeSpasm with focus on high performance instead of
+      compatibility.
+      It features the ability to play the 2021 re-release content with no setup
+      required, a mods menu for quick access to installation of mods, and ease of
+      switching to installed mods.
+      It also include various visual features as well as improved limits for playing
+      larger levels with less performance impacts.
+    '';
+
+    license = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.linux;
+    maintainers = [ lib.maintainers.necrophcodr ];
+    mainProgram = "quake";
+  };
+})
diff --git a/nixpkgs/pkgs/games/itch/butler.nix b/nixpkgs/pkgs/games/itch/butler.nix
new file mode 100644
index 000000000000..cbd6b8aef936
--- /dev/null
+++ b/nixpkgs/pkgs/games/itch/butler.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+, stdenv
+, Cocoa
+, fetchpatch
+}:
+
+buildGoModule rec {
+  pname = "butler";
+  version = "15.21.0";
+
+  src = fetchFromGitHub {
+    owner = "itchio";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-vciSmXR3wI3KcnC+Uz36AgI/WUfztA05MJv1InuOjJM=";
+  };
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    Cocoa
+  ];
+
+  patches = [
+    # update x/sys dependency for darwin build https://github.com/itchio/butler/pull/245
+    (fetchpatch {
+      url = "https://github.com/itchio/butler/pull/245/commits/ef651d373e3061fda9692dd44ae0f7ce215e9655.patch";
+      hash = "sha256-rZZn/OGiv3mRyy89uORyJ99zWN21kZCCQAlFvSKxlPU=";
+    })
+  ];
+
+  proxyVendor = true;
+
+  vendorHash = "sha256-CtBwc5mcgLvl2Bvg5gI+ULJMQEEibx1aN3IpmRNUtwE=";
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Command-line itch.io helper";
+    homepage = "https://github.com/itchio/butler";
+    license = licenses.mit;
+    maintainers = with maintainers; [ martfont ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/itch/default.nix b/nixpkgs/pkgs/games/itch/default.nix
new file mode 100644
index 000000000000..897d8f3941c4
--- /dev/null
+++ b/nixpkgs/pkgs/games/itch/default.nix
@@ -0,0 +1,94 @@
+{ lib
+, stdenvNoCC
+, fetchzip
+, fetchFromGitHub
+, butler
+, electron
+, steam-run
+, makeWrapper
+, copyDesktopItems
+, makeDesktopItem
+}:
+stdenvNoCC.mkDerivation rec {
+  pname = "itch";
+  version = "26.1.2";
+
+  # TODO: Using kitch instead of itch, revert when possible
+  src = fetchzip {
+    url = "https://broth.itch.ovh/k${pname}/linux-amd64/${version}/archive/default#.zip";
+    stripRoot = false;
+    sha256 = "sha256-thXe+glpltSiKNGIRgvOZQZPJWfDHWo3dLdziyp2BM4=";
+  };
+
+  itch-setup = fetchzip {
+    url = "https://broth.itch.ovh/itch-setup/linux-amd64/1.26.0/itch-setup.zip";
+    stripRoot = false;
+    sha256 = "sha256-5MP6X33Jfu97o5R1n6Og64Bv4ZMxVM0A8lXeQug+bNA=";
+  };
+
+  icons = let sparseCheckout = "/release/images/itch-icons"; in
+    fetchFromGitHub {
+        owner = "itchio";
+        repo = pname;
+        rev = "v${version}-canary";
+        sha256 = "sha256-veZiKs9qHge+gCEpJ119bAT56ssXJAH3HBcYkEHqBFg=";
+        sparseCheckout = [ sparseCheckout ];
+      } + sparseCheckout;
+
+  nativeBuildInputs = [ copyDesktopItems makeWrapper ];
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = pname;
+      exec = "itch %U";
+      tryExec = pname;
+      icon = pname;
+      desktopName = pname;
+      mimeTypes = [ "x-scheme-handler/itchio" "x-scheme-handler/itch" ];
+      comment = "Install and play itch.io games easily";
+      categories = [ "Game" ];
+    })
+  ];
+
+  # As taken from https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=itch-bin
+  installPhase = ''
+    runHook preInstall
+
+    # TODO: Remove when the next stable Itch is stabilized
+    substituteInPlace ./resources/app/package.json \
+      --replace "kitch" "itch"
+
+    mkdir -p $out/bin $out/share/${pname}/resources/app
+    cp -r resources/app "$out/share/${pname}/resources/"
+
+    install -Dm644 LICENSE -t "$out/share/licenses/$pkgname/"
+    install -Dm644 LICENSES.chromium.html -t "$out/share/licenses/$pkgname/"
+
+    for icon in $icons/icon*.png
+    do
+      iconsize="''${icon#$icons/icon}"
+      iconsize="''${iconsize%.png}"
+      icondir="$out/share/icons/hicolor/''${iconsize}x''${iconsize}/apps/"
+      install -Dm644 "$icon" "$icondir/itch.png"
+    done
+
+    runHook postInstall
+  '';
+
+  postFixup = ''
+    makeWrapper ${steam-run}/bin/steam-run $out/bin/${pname} \
+      --add-flags ${electron}/bin/electron \
+      --add-flags $out/share/${pname}/resources/app \
+      --set BROTH_USE_LOCAL butler,itch-setup \
+      --prefix PATH : ${butler}/bin/:${itch-setup}
+  '';
+
+  meta = with lib; {
+    description = "The best way to play itch.io games";
+    homepage = "https://github.com/itchio/itch";
+    license = licenses.mit;
+    platforms = platforms.linux;
+    sourceProvenance = [ lib.sourceTypes.binaryBytecode ];
+    maintainers = with maintainers; [ pasqui23 ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/itchiodl/default.nix b/nixpkgs/pkgs/games/itchiodl/default.nix
new file mode 100644
index 000000000000..57a5d1473e17
--- /dev/null
+++ b/nixpkgs/pkgs/games/itchiodl/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, python3Packages
+, fetchFromGitHub
+}:
+
+python3Packages.buildPythonApplication rec {
+  pname = "itchiodl";
+  version = "2.3.0";
+
+  src = fetchFromGitHub {
+    owner = "Emersont1";
+    repo = "itchio";
+    rev = "v${version}";
+    hash = "sha256-XuNkqTAT9LlSwruchGQbombAKHZvKhpnqLfvJdDcrj0=";
+  };
+
+  format = "pyproject";
+
+  nativeBuildInputs = with python3Packages; [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = with python3Packages; [
+    beautifulsoup4
+    clint
+    requests
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Emersont1/itchio";
+    description = "itch.io download tool";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fgaz ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/ivan/default.nix b/nixpkgs/pkgs/games/ivan/default.nix
new file mode 100644
index 000000000000..30620bea710b
--- /dev/null
+++ b/nixpkgs/pkgs/games/ivan/default.nix
@@ -0,0 +1,70 @@
+{ lib, stdenv, fetchFromGitHub, cmake, pkg-config, SDL2, SDL2_mixer, alsa-lib, libpng
+, pcre, makeDesktopItem }:
+
+stdenv.mkDerivation rec {
+
+  pname = "ivan";
+  version = "059";
+
+  src = fetchFromGitHub {
+    owner = "Attnam";
+    repo = "ivan";
+    rev = "v${version}";
+    sha256 = "sha256-5Ijy28LLx1TGnZE6ZNQXPYfvW2KprF+91fKx2MzLEms=";
+  };
+
+  nativeBuildInputs = [ cmake pkg-config ];
+
+  buildInputs = [ SDL2 SDL2_mixer alsa-lib libpng pcre ];
+
+  hardeningDisable = ["all"];
+
+  # Enable wizard mode
+  cmakeFlags = ["-DCMAKE_CXX_FLAGS=-DWIZARD"];
+
+  # Help CMake find SDL_mixer.h
+  env.NIX_CFLAGS_COMPILE = "-I${lib.getDev SDL2_mixer}/include/SDL2";
+
+  # Create "ivan.desktop" file
+  ivanDesktop = makeDesktopItem {
+    name = pname;
+    exec = pname;
+    icon = "ivan.png";
+    desktopName = "IVAN";
+    genericName = pname;
+    categories = [ "Game" "AdventureGame" "RolePlaying" ];
+    comment = meta.description;
+  };
+
+  # Create appropriate directories. Copy icons and desktop item to these directories.
+  postInstall = ''
+    mkdir -p $out/share/applications
+    mkdir -p $out/share/icons/hicolor/16x16/apps
+    mkdir -p $out/share/icons/hicolor/32x32/apps
+    mkdir -p $out/share/icons/hicolor/128x128/apps
+    mkdir -p $out/share/icons/hicolor/256x256/apps
+    mkdir -p $out/share/icons/hicolor/512x512/apps
+    cp $src/Graphics/icons/shadowless.iconset/icon_16x16.png $out/share/icons/hicolor/16x16/apps/ivan.png
+    cp $src/Graphics/icons/shadowless.iconset/icon_32x32.png $out/share/icons/hicolor/32x32/apps/ivan.png
+    cp $src/Graphics/icons/shadowless.iconset/icon_128x128.png $out/share/icons/hicolor/128x128/apps/ivan.png
+    cp $src/Graphics/icons/shadowless.iconset/icon_256x256.png $out/share/icons/hicolor/256x256/apps/ivan.png
+    cp $src/Graphics/icons/shadowless.iconset/icon_512x512.png $out/share/icons/hicolor/512x512/apps/ivan.png
+    cp ${ivanDesktop}/share/applications/* $out/share/applications
+  '';
+
+  meta = with lib; {
+    description = "Graphical roguelike game";
+    longDescription = ''
+      Iter Vehemens ad Necem (IVAN) is a graphical roguelike game, which currently
+      runs in Windows, DOS, Linux, and OS X. It features advanced bodypart and
+      material handling, multi-colored lighting and, above all, deep gameplay.
+
+      This is a fan continuation of IVAN by members of Attnam.com
+    '';
+    homepage = "https://attnam.com/";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [];
+    mainProgram = "ivan";
+  };
+}
diff --git a/nixpkgs/pkgs/games/ja2-stracciatella/default.nix b/nixpkgs/pkgs/games/ja2-stracciatella/default.nix
new file mode 100644
index 000000000000..ea363c969429
--- /dev/null
+++ b/nixpkgs/pkgs/games/ja2-stracciatella/default.nix
@@ -0,0 +1,62 @@
+{ stdenv, lib, fetchurl, fetchFromGitHub, cmake, python3, rustPlatform, SDL2, fltk, rapidjson, gtest, Carbon, Cocoa }:
+let
+  version = "0.17.0";
+  src = fetchFromGitHub {
+    owner = "ja2-stracciatella";
+    repo = "ja2-stracciatella";
+    rev = "v${version}";
+    sha256 = "0m6rvgkba29jy3yq5hs1sn26mwrjl6mamqnv4plrid5fqaivhn6j";
+  };
+  libstracciatella = rustPlatform.buildRustPackage {
+    pname = "libstracciatella";
+    inherit version;
+    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 version;
+
+  nativeBuildInputs = [ cmake python3 ];
+  buildInputs = [ SDL2 fltk rapidjson gtest ] ++ lib.optionals stdenv.isDarwin [ Carbon Cocoa ];
+
+  patches = [
+    ./remove-rust-buildstep.patch
+  ];
+
+  preConfigure = ''
+    # 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")
+  '';
+
+  doInstallCheck = true;
+  installCheckPhase = ''
+    HOME=/tmp $out/bin/ja2 -unittests
+  '';
+
+  meta = {
+    description = "Jagged Alliance 2, with community fixes";
+    license = "SFI Source Code license agreement";
+    homepage = "https://ja2-stracciatella.github.io/";
+  };
+}
diff --git a/nixpkgs/pkgs/games/ja2-stracciatella/remove-rust-buildstep.patch b/nixpkgs/pkgs/games/ja2-stracciatella/remove-rust-buildstep.patch
new file mode 100644
index 000000000000..64e3c11b2502
--- /dev/null
+++ b/nixpkgs/pkgs/games/ja2-stracciatella/remove-rust-buildstep.patch
@@ -0,0 +1,73 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index e4e5547af..a3017d197 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -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}/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)
+@@ -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()
+-
+ ## Uninstall
+ 
+ add_custom_templated_target("uninstall")
diff --git a/nixpkgs/pkgs/games/jfsw/default.nix b/nixpkgs/pkgs/games/jfsw/default.nix
new file mode 100644
index 000000000000..e170f0024531
--- /dev/null
+++ b/nixpkgs/pkgs/games/jfsw/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, which
+, SDL2
+, perl
+, pkg-config
+, wrapGAppsHook
+, gtk3
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "jfsw";
+  version = "20211225";
+
+  src = fetchFromGitHub {
+    owner = "jonof";
+    repo = "jfsw";
+    rev = "refs/tags/${finalAttrs.version}";
+    fetchSubmodules = true;
+    hash = "sha256-oRJHVsVo+KQfJyd8TcPxTMPPi993qxQb0wnD9nR4vJY=";
+  };
+
+  nativeBuildInputs = [
+    which
+    SDL2
+    perl
+    pkg-config
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    SDL2
+    gtk3
+  ];
+
+  strictDeps = true;
+  enableParallelBuilding = true;
+
+  installPhase = ''
+    runHook preInstall
+
+    install -Dm755 sw -t $out/bin
+
+    runHook postInstall
+  '';
+
+  meta = {
+    description = "Modern port the original Shadow Warrior";
+    homepage = "http://www.jonof.id.au/jfsw/";
+    license = lib.licenses.gpl2Plus;
+    mainProgram = "sw";
+    maintainers = with lib.maintainers; [ moody ];
+    broken = stdenv.isDarwin;
+    inherit (SDL2.meta) platforms;
+  };
+})
diff --git a/nixpkgs/pkgs/games/julius/default.nix b/nixpkgs/pkgs/games/julius/default.nix
new file mode 100644
index 000000000000..df1ff2bd1a06
--- /dev/null
+++ b/nixpkgs/pkgs/games/julius/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, SDL2
+, SDL2_mixer
+, cmake
+, libpng
+}:
+
+stdenv.mkDerivation rec {
+  pname = "julius";
+  version = "1.7.0";
+
+  src = fetchFromGitHub {
+    owner = "bvschaik";
+    repo = "julius";
+    rev = "v${version}";
+    hash = "sha256-I5GTaVWzz0ryGLDSS3rzxp+XFVXZa9hZmgwon/6r83A=";
+  };
+
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ SDL2 SDL2_mixer libpng ];
+
+  meta = with lib; {
+    homepage = "https://github.com/bvschaik/julius";
+    description = "An open source re-implementation of Caesar III";
+    license = licenses.agpl3;
+    maintainers = with maintainers; [ Thra11 ];
+    platforms = platforms.all;
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/games/jumpnbump/default.nix b/nixpkgs/pkgs/games/jumpnbump/default.nix
new file mode 100644
index 000000000000..193d4dc0b585
--- /dev/null
+++ b/nixpkgs/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 gobject-introspection ];
+  buildInputs = [ SDL2 SDL2_mixer SDL2_net gtk3 ];
+
+  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/nixpkgs/pkgs/games/jumpy/Cargo.lock b/nixpkgs/pkgs/games/jumpy/Cargo.lock
new file mode 100644
index 000000000000..55e2b382e610
--- /dev/null
+++ b/nixpkgs/pkgs/games/jumpy/Cargo.lock
@@ -0,0 +1,5117 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "ab_glyph"
+version = "0.2.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1061f3ff92c2f65800df1f12fc7b4ff44ee14783104187dd04dfee6f11b0fd2"
+dependencies = [
+ "ab_glyph_rasterizer",
+ "owned_ttf_parser",
+]
+
+[[package]]
+name = "ab_glyph_rasterizer"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046"
+
+[[package]]
+name = "accesskit"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76eb1adf08c5bcaa8490b9851fd53cca27fa9880076f178ea9d29f05196728a8"
+dependencies = [
+ "enumn",
+ "serde",
+]
+
+[[package]]
+name = "accesskit_consumer"
+version = "0.15.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04bb4d9e4772fe0d47df57d0d5dbe5d85dd05e2f37ae1ddb6b105e76be58fb00"
+dependencies = [
+ "accesskit",
+]
+
+[[package]]
+name = "accesskit_macos"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "134d0acf6acb667c89d3332999b1a5df4edbc8d6113910f392ebb73f2b03bb56"
+dependencies = [
+ "accesskit",
+ "accesskit_consumer",
+ "objc2",
+ "once_cell",
+]
+
+[[package]]
+name = "accesskit_windows"
+version = "0.14.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9eac0a7f2d7cd7a93b938af401d3d8e8b7094217989a7c25c55a953023436e31"
+dependencies = [
+ "accesskit",
+ "accesskit_consumer",
+ "arrayvec",
+ "once_cell",
+ "paste",
+ "windows 0.48.0",
+]
+
+[[package]]
+name = "accesskit_winit"
+version = "0.14.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "825d23acee1bd6d25cbaa3ca6ed6e73faf24122a774ec33d52c5c86c6ab423c0"
+dependencies = [
+ "accesskit",
+ "accesskit_macos",
+ "accesskit_windows",
+ "winit",
+]
+
+[[package]]
+name = "addr2line"
+version = "0.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb"
+dependencies = [
+ "gimli",
+]
+
+[[package]]
+name = "adler"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+
+[[package]]
+name = "ahash"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f"
+dependencies = [
+ "cfg-if",
+ "getrandom 0.2.10",
+ "once_cell",
+ "serde",
+ "version_check",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "1.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "allocator-api2"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5"
+
+[[package]]
+name = "alsa"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2562ad8dcf0f789f65c6fdaad8a8a9708ed6b488e649da28c01656ad66b8b47"
+dependencies = [
+ "alsa-sys",
+ "bitflags 1.3.2",
+ "libc",
+ "nix 0.24.3",
+]
+
+[[package]]
+name = "alsa-sys"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527"
+dependencies = [
+ "libc",
+ "pkg-config",
+]
+
+[[package]]
+name = "android-activity"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64529721f27c2314ced0890ce45e469574a73e5e6fdd6e9da1860eb29285f5e0"
+dependencies = [
+ "android-properties",
+ "bitflags 1.3.2",
+ "cc",
+ "jni-sys",
+ "libc",
+ "log",
+ "ndk",
+ "ndk-context",
+ "ndk-sys",
+ "num_enum 0.6.1",
+]
+
+[[package]]
+name = "android-properties"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04"
+
+[[package]]
+name = "android_log-sys"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ecc8056bf6ab9892dcd53216c83d1597487d7dacac16c8df6b877d127df9937"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.75"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6"
+
+[[package]]
+name = "append-only-vec"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3cb8f874ecf419dd8165d0279746de966cb8966636d028845e3bd65d519812a"
+
+[[package]]
+name = "approx"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "arboard"
+version = "3.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac57f2b058a76363e357c056e4f74f1945bf734d37b8b3ef49066c4787dde0fc"
+dependencies = [
+ "clipboard-win",
+ "core-graphics",
+ "image",
+ "log",
+ "objc",
+ "objc-foundation",
+ "objc_id",
+ "parking_lot",
+ "thiserror",
+ "winapi",
+ "x11rb",
+]
+
+[[package]]
+name = "arrayvec"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
+
+[[package]]
+name = "ash"
+version = "0.37.3+1.3.251"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356a25ecd4a"
+dependencies = [
+ "libloading 0.7.4",
+]
+
+[[package]]
+name = "async-channel"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35"
+dependencies = [
+ "concurrent-queue",
+ "event-listener 2.5.3",
+ "futures-core",
+]
+
+[[package]]
+name = "async-executor"
+version = "1.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c1da3ae8dabd9c00f453a329dfe1fb28da3c0a72e2478cdcd93171740c20499"
+dependencies = [
+ "async-lock",
+ "async-task",
+ "concurrent-queue",
+ "fastrand 2.0.1",
+ "futures-lite",
+ "slab",
+]
+
+[[package]]
+name = "async-lock"
+version = "2.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b"
+dependencies = [
+ "event-listener 2.5.3",
+]
+
+[[package]]
+name = "async-task"
+version = "4.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9441c6b2fe128a7c2bf680a44c34d0df31ce09e5b7e401fcca3faa483dbc921"
+
+[[package]]
+name = "atomic-arena"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5450eca8ce5abcfd5520727e975ebab30ccca96030550406b0ca718b224ead10"
+
+[[package]]
+name = "atomicell"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "157342dd84c64f16899b4b16c1fb2cce54b887990362aac3c590b3d13810890f"
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "backtrace"
+version = "0.3.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837"
+dependencies = [
+ "addr2line",
+ "cc",
+ "cfg-if",
+ "libc",
+ "miniz_oxide",
+ "object",
+ "rustc-demangle",
+]
+
+[[package]]
+name = "base64"
+version = "0.21.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2"
+
+[[package]]
+name = "bevy"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91c6d3ec4f89e85294dc97334c5b271ddc301fdf67ac9bb994fe44d9273e6ed7"
+dependencies = [
+ "bevy_internal",
+]
+
+[[package]]
+name = "bevy_a11y"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "132c9e35a77c5395951f6d25fa2c52ee92296353426df4f961e60f3ff47e2e42"
+dependencies = [
+ "accesskit",
+ "bevy_app",
+ "bevy_derive",
+ "bevy_ecs",
+]
+
+[[package]]
+name = "bevy_app"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f557a7d59e1e16892d7544fc37316506ee598cb5310ef0365125a30783c11531"
+dependencies = [
+ "bevy_derive",
+ "bevy_ecs",
+ "bevy_reflect",
+ "bevy_tasks",
+ "bevy_utils",
+ "downcast-rs",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "bevy_asset"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9714af523da4cdf58c42a317e5ed40349708ad954a18533991fd64c8ae0a6f68"
+dependencies = [
+ "anyhow",
+ "async-channel",
+ "bevy_app",
+ "bevy_diagnostic",
+ "bevy_ecs",
+ "bevy_log",
+ "bevy_reflect",
+ "bevy_tasks",
+ "bevy_utils",
+ "bevy_winit",
+ "crossbeam-channel",
+ "downcast-rs",
+ "fastrand 1.9.0",
+ "js-sys",
+ "parking_lot",
+ "serde",
+ "thiserror",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+]
+
+[[package]]
+name = "bevy_core"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d5272321be5fcf5ce2fb16023bc825bb10dfcb71611117296537181ce950f48"
+dependencies = [
+ "bevy_app",
+ "bevy_ecs",
+ "bevy_math",
+ "bevy_reflect",
+ "bevy_tasks",
+ "bevy_utils",
+ "bytemuck",
+]
+
+[[package]]
+name = "bevy_core_pipeline"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67382fa9c96ce4f4e5833ed7cedd9886844a8f3284b4a717bd4ac738dcdea0c3"
+dependencies = [
+ "bevy_app",
+ "bevy_asset",
+ "bevy_core",
+ "bevy_derive",
+ "bevy_ecs",
+ "bevy_math",
+ "bevy_reflect",
+ "bevy_render",
+ "bevy_transform",
+ "bevy_utils",
+ "bitflags 2.4.0",
+ "radsort",
+ "serde",
+]
+
+[[package]]
+name = "bevy_derive"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a44e4e2784a81430199e4157e02903a987a32127c773985506f020e7d501b62e"
+dependencies = [
+ "bevy_macro_utils",
+ "quote",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "bevy_diagnostic"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6babb230dc383c98fdfc9603e3a7a2a49e1e2879dbe8291059ef37dca897932e"
+dependencies = [
+ "bevy_app",
+ "bevy_core",
+ "bevy_ecs",
+ "bevy_log",
+ "bevy_time",
+ "bevy_utils",
+ "sysinfo",
+]
+
+[[package]]
+name = "bevy_dylib"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22ea11f830028e1c9d37f8bc88c5873f1c4c0346661209c2ba015f899c51863c"
+dependencies = [
+ "bevy_internal",
+]
+
+[[package]]
+name = "bevy_ecs"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "266144b36df7e834d5198049e037ecdf2a2310a76ce39ed937d1b0a6a2c4e8c6"
+dependencies = [
+ "async-channel",
+ "bevy_ecs_macros",
+ "bevy_ptr",
+ "bevy_reflect",
+ "bevy_tasks",
+ "bevy_utils",
+ "downcast-rs",
+ "event-listener 2.5.3",
+ "fixedbitset",
+ "rustc-hash",
+ "serde",
+ "thiserror",
+ "thread_local",
+]
+
+[[package]]
+name = "bevy_ecs_macros"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7157a9c3be038d5008ee3f114feb6cf6b39c1d3d32ee21a7cacb8f81fccdfa80"
+dependencies = [
+ "bevy_macro_utils",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "bevy_egui"
+version = "0.21.0"
+source = "git+https://github.com/zicklag/bevy_egui?branch=feat/egui-0.23#aeb3d7f1eaaacc67cf3966974d1e31f31e8fad62"
+dependencies = [
+ "arboard",
+ "bevy",
+ "egui",
+ "thread_local",
+ "webbrowser",
+]
+
+[[package]]
+name = "bevy_encase_derive"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d0ac0f55ad6bca1be7b0f35bbd5fc95ed3d31e4e9db158fee8e5327f59006001"
+dependencies = [
+ "bevy_macro_utils",
+ "encase_derive_impl",
+]
+
+[[package]]
+name = "bevy_gilrs"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "65f4d79c55829f8016014593a42453f61a564ffb06ef79460d25696ccdfac67b"
+dependencies = [
+ "bevy_app",
+ "bevy_ecs",
+ "bevy_input",
+ "bevy_log",
+ "bevy_time",
+ "bevy_utils",
+ "gilrs",
+ "thiserror",
+]
+
+[[package]]
+name = "bevy_gizmos"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e286a3e7276431963f4aa29165ea5429fa7dbbc6d5c5ba0c531e7dd44ecc88a2"
+dependencies = [
+ "bevy_app",
+ "bevy_asset",
+ "bevy_core",
+ "bevy_core_pipeline",
+ "bevy_ecs",
+ "bevy_math",
+ "bevy_reflect",
+ "bevy_render",
+ "bevy_sprite",
+ "bevy_transform",
+ "bevy_utils",
+]
+
+[[package]]
+name = "bevy_hierarchy"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "103f8f58416ac6799b8c7f0b418f1fac9eba44fa924df3b0e16b09256b897e3d"
+dependencies = [
+ "bevy_app",
+ "bevy_core",
+ "bevy_ecs",
+ "bevy_log",
+ "bevy_reflect",
+ "bevy_utils",
+ "smallvec",
+]
+
+[[package]]
+name = "bevy_input"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffbd935401101ac8003f3c3aea70788c65ad03f7a32716a10608bedda7a648bc"
+dependencies = [
+ "bevy_app",
+ "bevy_ecs",
+ "bevy_math",
+ "bevy_reflect",
+ "bevy_utils",
+ "thiserror",
+]
+
+[[package]]
+name = "bevy_internal"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e0e35a9b2bd29aa784b3cc416bcbf2a298f69f00ca51fd042ea39d9af7fad37e"
+dependencies = [
+ "bevy_a11y",
+ "bevy_app",
+ "bevy_asset",
+ "bevy_core",
+ "bevy_core_pipeline",
+ "bevy_derive",
+ "bevy_diagnostic",
+ "bevy_ecs",
+ "bevy_gilrs",
+ "bevy_gizmos",
+ "bevy_hierarchy",
+ "bevy_input",
+ "bevy_log",
+ "bevy_math",
+ "bevy_pbr",
+ "bevy_ptr",
+ "bevy_reflect",
+ "bevy_render",
+ "bevy_scene",
+ "bevy_sprite",
+ "bevy_tasks",
+ "bevy_time",
+ "bevy_transform",
+ "bevy_utils",
+ "bevy_window",
+ "bevy_winit",
+]
+
+[[package]]
+name = "bevy_log"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07dcc615ff4f617b06c3f9522fca3c55d56f9644db293318f8ab68fcdea5d4fe"
+dependencies = [
+ "android_log-sys",
+ "bevy_app",
+ "bevy_ecs",
+ "bevy_utils",
+ "console_error_panic_hook",
+ "tracing-log",
+ "tracing-subscriber",
+ "tracing-wasm",
+]
+
+[[package]]
+name = "bevy_macro_utils"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23ddc18d489b4e57832d4958cde7cd2f349f0ad91e5892ac9e2f2ee16546b981"
+dependencies = [
+ "quote",
+ "rustc-hash",
+ "syn 2.0.38",
+ "toml_edit",
+]
+
+[[package]]
+name = "bevy_math"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78286a81fead796dc4b45ab14f4f02fe29a94423d3587bcfef872b2a8e0a474b"
+dependencies = [
+ "glam",
+ "serde",
+]
+
+[[package]]
+name = "bevy_mikktspace"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6cfc2a21ea47970a9b1f0f4735af3256a8f204815bd756110051d10f9d909497"
+dependencies = [
+ "glam",
+]
+
+[[package]]
+name = "bevy_pbr"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "63ca796a619e61cd43a0a3b11fde54644f7f0732a1fba1eef5d406248c6eba85"
+dependencies = [
+ "bevy_app",
+ "bevy_asset",
+ "bevy_core_pipeline",
+ "bevy_derive",
+ "bevy_ecs",
+ "bevy_math",
+ "bevy_reflect",
+ "bevy_render",
+ "bevy_transform",
+ "bevy_utils",
+ "bevy_window",
+ "bitflags 2.4.0",
+ "bytemuck",
+ "naga_oil",
+ "radsort",
+]
+
+[[package]]
+name = "bevy_prototype_lyon"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e347c16caede05dc5f774ba388cefeef0ab558a5601fc6b5ffd6606bef77308"
+dependencies = [
+ "bevy",
+ "lyon_algorithms",
+ "lyon_tessellation",
+ "svgtypes",
+]
+
+[[package]]
+name = "bevy_ptr"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72c7586401a46f7d8e436028225c1df5288f2e0082d066b247a82466fea155c6"
+
+[[package]]
+name = "bevy_reflect"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0778197a1eb3e095a71417c74b7152ede02975cdc95b5ea4ddc5251ed00a2eb5"
+dependencies = [
+ "bevy_math",
+ "bevy_ptr",
+ "bevy_reflect_derive",
+ "bevy_utils",
+ "downcast-rs",
+ "erased-serde",
+ "glam",
+ "once_cell",
+ "parking_lot",
+ "serde",
+ "smallvec",
+ "smol_str",
+ "thiserror",
+]
+
+[[package]]
+name = "bevy_reflect_derive"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "342a4b2d09db22c48607d23ad59a056aff1ee004549050a51d490d375ba29528"
+dependencies = [
+ "bevy_macro_utils",
+ "bit-set",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.38",
+ "uuid",
+]
+
+[[package]]
+name = "bevy_render"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39df4824b760928c27afc7b00fb649c7a63c9d76661ab014ff5c86537ee906cb"
+dependencies = [
+ "anyhow",
+ "async-channel",
+ "bevy_app",
+ "bevy_asset",
+ "bevy_core",
+ "bevy_derive",
+ "bevy_ecs",
+ "bevy_encase_derive",
+ "bevy_hierarchy",
+ "bevy_log",
+ "bevy_math",
+ "bevy_mikktspace",
+ "bevy_reflect",
+ "bevy_render_macros",
+ "bevy_tasks",
+ "bevy_time",
+ "bevy_transform",
+ "bevy_utils",
+ "bevy_window",
+ "bitflags 2.4.0",
+ "bytemuck",
+ "codespan-reporting",
+ "downcast-rs",
+ "encase",
+ "futures-lite",
+ "hexasphere",
+ "image",
+ "js-sys",
+ "naga",
+ "naga_oil",
+ "parking_lot",
+ "regex",
+ "serde",
+ "smallvec",
+ "thiserror",
+ "thread_local",
+ "wasm-bindgen",
+ "web-sys",
+ "wgpu",
+ "wgpu-hal",
+]
+
+[[package]]
+name = "bevy_render_macros"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0bd08c740aac73363e32fb45af869b10cec65bcb76fe3e6cd0f8f7eebf4c36c9"
+dependencies = [
+ "bevy_macro_utils",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "bevy_scene"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd47e1263506153bef3a8be97fe2d856f206d315668c4f97510ca6cc181d9681"
+dependencies = [
+ "anyhow",
+ "bevy_app",
+ "bevy_asset",
+ "bevy_derive",
+ "bevy_ecs",
+ "bevy_hierarchy",
+ "bevy_reflect",
+ "bevy_render",
+ "bevy_transform",
+ "bevy_utils",
+ "ron",
+ "serde",
+ "thiserror",
+ "uuid",
+]
+
+[[package]]
+name = "bevy_sprite"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68a8ca824fad75c6ef74cfbbba0a4ce3ccc435fa23d6bf3f003f260548813397"
+dependencies = [
+ "bevy_app",
+ "bevy_asset",
+ "bevy_core_pipeline",
+ "bevy_derive",
+ "bevy_ecs",
+ "bevy_log",
+ "bevy_math",
+ "bevy_reflect",
+ "bevy_render",
+ "bevy_transform",
+ "bevy_utils",
+ "bitflags 2.4.0",
+ "bytemuck",
+ "fixedbitset",
+ "guillotiere",
+ "rectangle-pack",
+ "thiserror",
+]
+
+[[package]]
+name = "bevy_tasks"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c73bbb847c83990d3927005090df52f8ac49332e1643d2ad9aac3cd2974e66bf"
+dependencies = [
+ "async-channel",
+ "async-executor",
+ "async-task",
+ "concurrent-queue",
+ "futures-lite",
+ "wasm-bindgen-futures",
+]
+
+[[package]]
+name = "bevy_time"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d58d6dbae9c8225d8c0e0f04d2c5dbb71d22adc01ecd5ab3cebc364139e4a6d"
+dependencies = [
+ "bevy_app",
+ "bevy_ecs",
+ "bevy_reflect",
+ "bevy_utils",
+ "crossbeam-channel",
+ "thiserror",
+]
+
+[[package]]
+name = "bevy_transform"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b9b0ac0149a57cd846cb357a35fc99286f9848e53d4481954608ac9552ed2d4"
+dependencies = [
+ "bevy_app",
+ "bevy_ecs",
+ "bevy_hierarchy",
+ "bevy_math",
+ "bevy_reflect",
+]
+
+[[package]]
+name = "bevy_utils"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08d9484e32434ea84dc548cff246ce0c6f756c1336f5ea03f24ac120a48595c7"
+dependencies = [
+ "ahash",
+ "bevy_utils_proc_macros",
+ "getrandom 0.2.10",
+ "hashbrown 0.14.1",
+ "instant",
+ "petgraph",
+ "thiserror",
+ "tracing",
+ "uuid",
+]
+
+[[package]]
+name = "bevy_utils_proc_macros"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5391b242c36f556db01d5891444730c83aa9dd648b6a8fd2b755d22cb3bddb57"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "bevy_window"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd584c0da7c4ada6557b09f57f30fb7cff21ccedc641473fc391574b4c9b7944"
+dependencies = [
+ "bevy_app",
+ "bevy_ecs",
+ "bevy_input",
+ "bevy_math",
+ "bevy_reflect",
+ "bevy_utils",
+ "raw-window-handle",
+]
+
+[[package]]
+name = "bevy_winit"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfdc044abdb95790c20053e6326760f0a2985f0dcd78613d397bf35f16039d53"
+dependencies = [
+ "accesskit_winit",
+ "approx",
+ "bevy_a11y",
+ "bevy_app",
+ "bevy_derive",
+ "bevy_ecs",
+ "bevy_hierarchy",
+ "bevy_input",
+ "bevy_math",
+ "bevy_tasks",
+ "bevy_utils",
+ "bevy_window",
+ "crossbeam-channel",
+ "raw-window-handle",
+ "wasm-bindgen",
+ "web-sys",
+ "winit",
+]
+
+[[package]]
+name = "bindgen"
+version = "0.68.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "726e4313eb6ec35d2730258ad4e15b547ee75d6afaa1361a922e78e59b7d8078"
+dependencies = [
+ "bitflags 2.4.0",
+ "cexpr",
+ "clang-sys",
+ "lazy_static",
+ "lazycell",
+ "peeking_take_while",
+ "proc-macro2",
+ "quote",
+ "regex",
+ "rustc-hash",
+ "shlex",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "bit-set"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1"
+dependencies = [
+ "bit-vec",
+]
+
+[[package]]
+name = "bit-vec"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "bitflags"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "bitset-core"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f421f1bcb30aa9d851a03c2920ab5d96ca920d5786645a597b5fc37922f8b89e"
+
+[[package]]
+name = "bitvec"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c"
+dependencies = [
+ "funty",
+ "radium",
+ "tap",
+ "wyz",
+]
+
+[[package]]
+name = "block"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
+
+[[package]]
+name = "block-buffer"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "block-sys"
+version = "0.1.0-beta.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fa55741ee90902547802152aaf3f8e5248aab7e21468089560d4c8840561146"
+dependencies = [
+ "objc-sys",
+]
+
+[[package]]
+name = "block2"
+version = "0.2.0-alpha.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8dd9e63c1744f755c2f60332b88de39d341e5e86239014ad839bd71c106dec42"
+dependencies = [
+ "block-sys",
+ "objc2-encode",
+]
+
+[[package]]
+name = "bones_asset"
+version = "0.3.0"
+source = "git+https://github.com/fishfolk/bones#65d667e2ccd691388f0318c76d3a236bee9d11be"
+dependencies = [
+ "anyhow",
+ "append-only-vec",
+ "async-channel",
+ "bevy_tasks",
+ "bones_schema",
+ "bones_utils",
+ "bs58",
+ "dashmap",
+ "ehttp",
+ "erased-serde",
+ "event-listener 3.0.0",
+ "notify",
+ "once_cell",
+ "paste",
+ "path-absolutize",
+ "semver",
+ "serde",
+ "serde_json",
+ "serde_yaml",
+ "sha2",
+ "tracing",
+ "ulid",
+]
+
+[[package]]
+name = "bones_bevy_renderer"
+version = "0.3.0"
+source = "git+https://github.com/fishfolk/bones#65d667e2ccd691388f0318c76d3a236bee9d11be"
+dependencies = [
+ "anyhow",
+ "bevy",
+ "bevy_egui",
+ "bevy_prototype_lyon",
+ "bones_framework",
+ "directories 5.0.1",
+ "glam",
+ "serde",
+ "serde_yaml",
+ "web-sys",
+]
+
+[[package]]
+name = "bones_ecs"
+version = "0.3.0"
+source = "git+https://github.com/fishfolk/bones#65d667e2ccd691388f0318c76d3a236bee9d11be"
+dependencies = [
+ "anyhow",
+ "atomicell",
+ "bitset-core",
+ "bones_schema",
+ "bones_utils",
+ "glam",
+ "paste",
+ "thiserror",
+]
+
+[[package]]
+name = "bones_framework"
+version = "0.3.0"
+source = "git+https://github.com/fishfolk/bones#65d667e2ccd691388f0318c76d3a236bee9d11be"
+dependencies = [
+ "bones_asset",
+ "bones_lib",
+ "bones_schema",
+ "csscolorparser",
+ "egui",
+ "fluent",
+ "fluent-langneg",
+ "glam",
+ "hex",
+ "image",
+ "instant",
+ "intl-memoizer",
+ "kira",
+ "noise",
+ "serde",
+ "serde_yaml",
+ "sys-locale",
+ "thiserror",
+ "tracing",
+ "ttf-parser",
+ "unic-langid",
+]
+
+[[package]]
+name = "bones_lib"
+version = "0.3.0"
+source = "git+https://github.com/fishfolk/bones#65d667e2ccd691388f0318c76d3a236bee9d11be"
+dependencies = [
+ "bones_ecs",
+ "instant",
+]
+
+[[package]]
+name = "bones_schema"
+version = "0.3.0"
+source = "git+https://github.com/fishfolk/bones#65d667e2ccd691388f0318c76d3a236bee9d11be"
+dependencies = [
+ "append-only-vec",
+ "bones_schema_macros",
+ "bones_utils",
+ "erased-serde",
+ "glam",
+ "humantime",
+ "paste",
+ "serde",
+ "sptr",
+ "ulid",
+]
+
+[[package]]
+name = "bones_schema_macros"
+version = "0.3.0"
+source = "git+https://github.com/fishfolk/bones#65d667e2ccd691388f0318c76d3a236bee9d11be"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "venial",
+]
+
+[[package]]
+name = "bones_utils"
+version = "0.3.0"
+source = "git+https://github.com/fishfolk/bones#65d667e2ccd691388f0318c76d3a236bee9d11be"
+dependencies = [
+ "bevy_ptr",
+ "bones_utils_macros",
+ "branches",
+ "futures-lite",
+ "fxhash",
+ "getrandom 0.2.10",
+ "hashbrown 0.14.1",
+ "instant",
+ "maybe-owned",
+ "parking_lot",
+ "serde",
+ "smallvec",
+ "turborand",
+ "ulid",
+ "ustr",
+]
+
+[[package]]
+name = "bones_utils_macros"
+version = "0.3.0"
+source = "git+https://github.com/fishfolk/bones#65d667e2ccd691388f0318c76d3a236bee9d11be"
+dependencies = [
+ "quote",
+ "venial",
+]
+
+[[package]]
+name = "branches"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7958fb9748a08a6f46ef773e87c43997a844709bc293b4c3de48135debaf9d2a"
+
+[[package]]
+name = "bs58"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec"
+
+[[package]]
+name = "bytemuck"
+version = "1.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6"
+dependencies = [
+ "bytemuck_derive",
+]
+
+[[package]]
+name = "bytemuck_derive"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "byteorder"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
+
+[[package]]
+name = "bytes"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223"
+
+[[package]]
+name = "cc"
+version = "1.0.83"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
+dependencies = [
+ "jobserver",
+ "libc",
+]
+
+[[package]]
+name = "cesu8"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
+
+[[package]]
+name = "cexpr"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
+dependencies = [
+ "nom",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "cfg_aliases"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e"
+
+[[package]]
+name = "clang-sys"
+version = "1.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f"
+dependencies = [
+ "glob",
+ "libc",
+ "libloading 0.7.4",
+]
+
+[[package]]
+name = "clipboard-win"
+version = "4.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7191c27c2357d9b7ef96baac1773290d4ca63b24205b82a3fd8a0637afcf0362"
+dependencies = [
+ "error-code",
+ "str-buf",
+ "winapi",
+]
+
+[[package]]
+name = "codespan-reporting"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e"
+dependencies = [
+ "termcolor",
+ "unicode-width",
+]
+
+[[package]]
+name = "color_quant"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
+
+[[package]]
+name = "com-rs"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf43edc576402991846b093a7ca18a3477e0ef9c588cde84964b5d3e43016642"
+
+[[package]]
+name = "combine"
+version = "4.6.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4"
+dependencies = [
+ "bytes",
+ "memchr",
+]
+
+[[package]]
+name = "concurrent-queue"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f057a694a54f12365049b0958a1685bb52d567f5593b355fbf685838e873d400"
+dependencies = [
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "console_error_panic_hook"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc"
+dependencies = [
+ "cfg-if",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "const_panic"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6051f239ecec86fde3410901ab7860d458d160371533842974fc61f96d15879b"
+
+[[package]]
+name = "const_soft_float"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87ca1caa64ef4ed453e68bb3db612e51cf1b2f5b871337f0fcab1c8f87cc3dff"
+
+[[package]]
+name = "constgebra"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "edd23e864550e6dafc1e41ac78ce4f1ccddc8672b40c403524a04ff3f0518420"
+dependencies = [
+ "const_soft_float",
+]
+
+[[package]]
+name = "core-foundation"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"
+
+[[package]]
+name = "core-graphics"
+version = "0.22.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb"
+dependencies = [
+ "bitflags 1.3.2",
+ "core-foundation",
+ "core-graphics-types",
+ "foreign-types",
+ "libc",
+]
+
+[[package]]
+name = "core-graphics-types"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2bb142d41022986c1d8ff29103a1411c8a3dfad3552f87a4f8dc50d61d4f4e33"
+dependencies = [
+ "bitflags 1.3.2",
+ "core-foundation",
+ "libc",
+]
+
+[[package]]
+name = "coreaudio-rs"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace"
+dependencies = [
+ "bitflags 1.3.2",
+ "core-foundation-sys",
+ "coreaudio-sys",
+]
+
+[[package]]
+name = "coreaudio-sys"
+version = "0.2.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8478e5bdad14dce236b9898ea002eabfa87cbe14f0aa538dbe3b6a4bec4332d"
+dependencies = [
+ "bindgen",
+]
+
+[[package]]
+name = "cpal"
+version = "0.15.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d959d90e938c5493000514b446987c07aed46c668faaa7d34d6c7a67b1a578c"
+dependencies = [
+ "alsa",
+ "core-foundation-sys",
+ "coreaudio-rs",
+ "dasp_sample",
+ "jni 0.19.0",
+ "js-sys",
+ "libc",
+ "mach2",
+ "ndk",
+ "ndk-context",
+ "oboe",
+ "once_cell",
+ "parking_lot",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+ "windows 0.46.0",
+]
+
+[[package]]
+name = "cpufeatures"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "crc32fast"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "crossbeam"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2801af0d36612ae591caa9568261fddce32ce6e08a7275ea334a06a4ad021a2c"
+dependencies = [
+ "cfg-if",
+ "crossbeam-channel",
+ "crossbeam-deque",
+ "crossbeam-epoch",
+ "crossbeam-queue",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef"
+dependencies = [
+ "cfg-if",
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7"
+dependencies = [
+ "autocfg",
+ "cfg-if",
+ "crossbeam-utils",
+ "memoffset 0.9.0",
+ "scopeguard",
+]
+
+[[package]]
+name = "crossbeam-queue"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "crypto-common"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
+dependencies = [
+ "generic-array",
+ "typenum",
+]
+
+[[package]]
+name = "csscolorparser"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb2a7d3066da2de787b7f032c736763eb7ae5d355f81a68bab2675a96008b0bf"
+dependencies = [
+ "phf",
+]
+
+[[package]]
+name = "d3d12"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8f0de2f5a8e7bd4a9eec0e3c781992a4ce1724f68aec7d7a3715344de8b39da"
+dependencies = [
+ "bitflags 1.3.2",
+ "libloading 0.7.4",
+ "winapi",
+]
+
+[[package]]
+name = "dashmap"
+version = "5.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856"
+dependencies = [
+ "cfg-if",
+ "hashbrown 0.14.1",
+ "lock_api",
+ "once_cell",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "dasp_sample"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f"
+
+[[package]]
+name = "data-encoding"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308"
+
+[[package]]
+name = "digest"
+version = "0.10.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
+dependencies = [
+ "block-buffer",
+ "crypto-common",
+]
+
+[[package]]
+name = "directories"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72d337a64190607d4fcca2cb78982c5dd57f4916e19696b48a575fa746b6cb0f"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "directories"
+version = "5.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35"
+dependencies = [
+ "dirs-sys",
+]
+
+[[package]]
+name = "dirs-sys"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c"
+dependencies = [
+ "libc",
+ "option-ext",
+ "redox_users",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "dispatch"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b"
+
+[[package]]
+name = "displaydoc"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "document-features"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e493c573fce17f00dcab13b6ac057994f3ce17d1af4dc39bfd482b83c6eb6157"
+dependencies = [
+ "litrs",
+]
+
+[[package]]
+name = "downcast-rs"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650"
+
+[[package]]
+name = "ecolor"
+version = "0.23.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cfdf4e52dbbb615cfd30cf5a5265335c217b5fd8d669593cea74a517d9c605af"
+dependencies = [
+ "bytemuck",
+ "serde",
+]
+
+[[package]]
+name = "egui"
+version = "0.23.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8bd69fed5fcf4fbb8225b24e80ea6193b61e17a625db105ef0c4d71dde6eb8b7"
+dependencies = [
+ "accesskit",
+ "ahash",
+ "epaint",
+ "nohash-hasher",
+ "serde",
+]
+
+[[package]]
+name = "egui_extras"
+version = "0.23.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68ffe3fe5c00295f91c2a61a74ee271c32f74049c94ba0b1cea8f26eb478bc07"
+dependencies = [
+ "egui",
+ "enum-map",
+ "log",
+ "serde",
+]
+
+[[package]]
+name = "ehttp"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f88f45662356f96afc7d9e2bc9910ad8352ee01417f7c69b8b16a53c8767a75d"
+dependencies = [
+ "document-features",
+ "js-sys",
+ "ureq",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+]
+
+[[package]]
+name = "either"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
+
+[[package]]
+name = "emath"
+version = "0.23.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ef2b29de53074e575c18b694167ccbe6e5191f7b25fe65175a0d905a32eeec0"
+dependencies = [
+ "bytemuck",
+ "serde",
+]
+
+[[package]]
+name = "encase"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fce2eeef77fd4a293a54b62aa00ac9daebfbcda4bf8998c5a815635b004aa1c"
+dependencies = [
+ "const_panic",
+ "encase_derive",
+ "glam",
+ "thiserror",
+]
+
+[[package]]
+name = "encase_derive"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e520cde08cbf4f7cc097f61573ec06ce467019803de8ae82fb2823fa1554a0e"
+dependencies = [
+ "encase_derive_impl",
+]
+
+[[package]]
+name = "encase_derive_impl"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3fe2568f851fd6144a45fa91cfed8fe5ca8fc0b56ba6797bfc1ed2771b90e37c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "encoding_rs"
+version = "0.8.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "enum-map"
+version = "2.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c188012f8542dee7b3996e44dd89461d64aa471b0a7c71a1ae2f595d259e96e5"
+dependencies = [
+ "enum-map-derive",
+ "serde",
+]
+
+[[package]]
+name = "enum-map-derive"
+version = "0.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04d0b288e3bb1d861c4403c1774a6f7a798781dfc519b3647df2a3dd4ae95f25"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "enumn"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2ad8cef1d801a4686bfd8919f0b30eac4c8e48968c437a6405ded4fb5272d2b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "epaint"
+version = "0.23.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "58067b840d009143934d91d8dcb8ded054d8301d7c11a517ace0a99bb1e1595e"
+dependencies = [
+ "ab_glyph",
+ "ahash",
+ "bytemuck",
+ "ecolor",
+ "emath",
+ "nohash-hasher",
+ "parking_lot",
+ "serde",
+]
+
+[[package]]
+name = "equivalent"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
+
+[[package]]
+name = "erased-serde"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c138974f9d5e7fe373eb04df7cae98833802ae4b11c24ac7039a21d5af4b26c"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "error-code"
+version = "2.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64f18991e7bf11e7ffee451b5318b5c1a73c52d0d0ada6e5a3017c8c1ced6a21"
+dependencies = [
+ "libc",
+ "str-buf",
+]
+
+[[package]]
+name = "euclid"
+version = "0.22.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87f253bc5c813ca05792837a0ff4b3a580336b224512d48f7eda1d7dd9210787"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "event-listener"
+version = "2.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
+
+[[package]]
+name = "event-listener"
+version = "3.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "29e56284f00d94c1bc7fd3c77027b4623c88c1f53d8d2394c6199f2921dea325"
+dependencies = [
+ "concurrent-queue",
+ "parking",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "fastrand"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
+dependencies = [
+ "instant",
+]
+
+[[package]]
+name = "fastrand"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"
+
+[[package]]
+name = "fdeflate"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d329bdeac514ee06249dabc27877490f17f5d371ec693360768b838e19f3ae10"
+dependencies = [
+ "simd-adler32",
+]
+
+[[package]]
+name = "filetime"
+version = "0.2.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall 0.3.5",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "fixedbitset"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
+
+[[package]]
+name = "flate2"
+version = "1.0.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e"
+dependencies = [
+ "crc32fast",
+ "miniz_oxide",
+]
+
+[[package]]
+name = "float_next_after"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fc612c5837986b7104a87a0df74a5460931f1c5274be12f8d0f40aa2f30d632"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "fluent"
+version = "0.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc4d7142005e2066e4844caf9f271b93fc79836ee96ec85057b8c109687e629a"
+dependencies = [
+ "fluent-bundle",
+ "unic-langid",
+]
+
+[[package]]
+name = "fluent-bundle"
+version = "0.15.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e242c601dec9711505f6d5bbff5bedd4b61b2469f2e8bb8e57ee7c9747a87ffd"
+dependencies = [
+ "fluent-langneg",
+ "fluent-syntax",
+ "intl-memoizer",
+ "intl_pluralrules",
+ "rustc-hash",
+ "self_cell",
+ "smallvec",
+ "unic-langid",
+]
+
+[[package]]
+name = "fluent-langneg"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c4ad0989667548f06ccd0e306ed56b61bd4d35458d54df5ec7587c0e8ed5e94"
+dependencies = [
+ "unic-langid",
+]
+
+[[package]]
+name = "fluent-syntax"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0abed97648395c902868fee9026de96483933faa54ea3b40d652f7dfe61ca78"
+dependencies = [
+ "thiserror",
+]
+
+[[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.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652"
+dependencies = [
+ "percent-encoding",
+]
+
+[[package]]
+name = "fsevent-sys"
+version = "4.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "funty"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
+
+[[package]]
+name = "futures-core"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c"
+
+[[package]]
+name = "futures-io"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964"
+
+[[package]]
+name = "futures-lite"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce"
+dependencies = [
+ "fastrand 1.9.0",
+ "futures-core",
+ "futures-io",
+ "memchr",
+ "parking",
+ "pin-project-lite",
+ "waker-fn",
+]
+
+[[package]]
+name = "fxhash"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
+dependencies = [
+ "byteorder",
+]
+
+[[package]]
+name = "generic-array"
+version = "0.14.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
+dependencies = [
+ "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "gethostname"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.1.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi 0.9.0+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427"
+dependencies = [
+ "cfg-if",
+ "js-sys",
+ "libc",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "gilrs"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62fd19844d0eb919aca41d3e4ea0e0b6bf60e1e827558b101c269015b8f5f27a"
+dependencies = [
+ "fnv",
+ "gilrs-core",
+ "log",
+ "uuid",
+ "vec_map",
+]
+
+[[package]]
+name = "gilrs-core"
+version = "0.5.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ccc99e9b8d63ffcaa334c4babfa31f46e156618a11f63efb6e8e6bcb37b830d"
+dependencies = [
+ "core-foundation",
+ "io-kit-sys",
+ "js-sys",
+ "libc",
+ "libudev-sys",
+ "log",
+ "nix 0.26.4",
+ "uuid",
+ "vec_map",
+ "wasm-bindgen",
+ "web-sys",
+ "windows 0.51.1",
+]
+
+[[package]]
+name = "gimli"
+version = "0.28.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0"
+
+[[package]]
+name = "glam"
+version = "0.24.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b5418c17512bdf42730f9032c74e1ae39afc408745ebb2acf72fbc4691c17945"
+dependencies = [
+ "bytemuck",
+ "mint",
+ "serde",
+]
+
+[[package]]
+name = "glob"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
+
+[[package]]
+name = "glow"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca0fe580e4b60a8ab24a868bc08e2f03cbcb20d3d676601fa909386713333728"
+dependencies = [
+ "js-sys",
+ "slotmap",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "gpu-alloc"
+version = "0.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22beaafc29b38204457ea030f6fb7a84c9e4dd1b86e311ba0542533453d87f62"
+dependencies = [
+ "bitflags 1.3.2",
+ "gpu-alloc-types",
+]
+
+[[package]]
+name = "gpu-alloc-types"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54804d0d6bc9d7f26db4eaec1ad10def69b599315f487d32c334a80d1efe67a5"
+dependencies = [
+ "bitflags 1.3.2",
+]
+
+[[package]]
+name = "gpu-allocator"
+version = "0.22.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce95f9e2e11c2c6fadfce42b5af60005db06576f231f5c92550fdded43c423e8"
+dependencies = [
+ "backtrace",
+ "log",
+ "thiserror",
+ "winapi",
+ "windows 0.44.0",
+]
+
+[[package]]
+name = "gpu-descriptor"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c"
+dependencies = [
+ "bitflags 2.4.0",
+ "gpu-descriptor-types",
+ "hashbrown 0.14.1",
+]
+
+[[package]]
+name = "gpu-descriptor-types"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6bf0b36e6f090b7e1d8a4b49c0cb81c1f8376f72198c65dd3ad9ff3556b8b78c"
+dependencies = [
+ "bitflags 2.4.0",
+]
+
+[[package]]
+name = "guillotiere"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b62d5865c036cb1393e23c50693df631d3f5d7bcca4c04fe4cc0fd592e74a782"
+dependencies = [
+ "euclid",
+ "svg_fmt",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+
+[[package]]
+name = "hashbrown"
+version = "0.14.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7dfda62a12f55daeae5015f81b0baea145391cb4520f86c248fc615d72640d12"
+dependencies = [
+ "ahash",
+ "allocator-api2",
+ "serde",
+]
+
+[[package]]
+name = "hassle-rs"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1397650ee315e8891a0df210707f0fc61771b0cc518c3023896064c5407cb3b0"
+dependencies = [
+ "bitflags 1.3.2",
+ "com-rs",
+ "libc",
+ "libloading 0.7.4",
+ "thiserror",
+ "widestring",
+ "winapi",
+]
+
+[[package]]
+name = "hex"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+
+[[package]]
+name = "hexasphere"
+version = "9.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7cb3df16a7bcb1b5bc092abd55e14f77ca70aea14445026e264586fc62889a10"
+dependencies = [
+ "constgebra",
+ "glam",
+]
+
+[[package]]
+name = "hexf-parse"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df"
+
+[[package]]
+name = "home"
+version = "0.5.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb"
+dependencies = [
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "humantime"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
+
+[[package]]
+name = "humantime-serde"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57a3db5ea5923d99402c94e9feb261dc5ee9b4efa158b0315f788cf549cc200c"
+dependencies = [
+ "humantime",
+ "serde",
+]
+
+[[package]]
+name = "idna"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c"
+dependencies = [
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "image"
+version = "0.24.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711"
+dependencies = [
+ "bytemuck",
+ "byteorder",
+ "color_quant",
+ "num-rational",
+ "num-traits",
+ "png",
+ "tiff",
+]
+
+[[package]]
+name = "indexmap"
+version = "1.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
+dependencies = [
+ "autocfg",
+ "hashbrown 0.12.3",
+ "serde",
+]
+
+[[package]]
+name = "indexmap"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897"
+dependencies = [
+ "equivalent",
+ "hashbrown 0.14.1",
+]
+
+[[package]]
+name = "inotify"
+version = "0.9.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff"
+dependencies = [
+ "bitflags 1.3.2",
+ "inotify-sys",
+ "libc",
+]
+
+[[package]]
+name = "inotify-sys"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "instant"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+dependencies = [
+ "cfg-if",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "intl-memoizer"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c310433e4a310918d6ed9243542a6b83ec1183df95dff8f23f87bb88a264a66f"
+dependencies = [
+ "type-map",
+ "unic-langid",
+]
+
+[[package]]
+name = "intl_pluralrules"
+version = "7.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "078ea7b7c29a2b4df841a7f6ac8775ff6074020c6776d48491ce2268e068f972"
+dependencies = [
+ "unic-langid",
+]
+
+[[package]]
+name = "io-kit-sys"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b2d4429acc1deff0fbdece0325b4997bdb02b2c245ab7023fd5deca0f6348de"
+dependencies = [
+ "core-foundation-sys",
+ "mach2",
+]
+
+[[package]]
+name = "itertools"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
+
+[[package]]
+name = "jni"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec"
+dependencies = [
+ "cesu8",
+ "combine",
+ "jni-sys",
+ "log",
+ "thiserror",
+ "walkdir",
+]
+
+[[package]]
+name = "jni"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c"
+dependencies = [
+ "cesu8",
+ "combine",
+ "jni-sys",
+ "log",
+ "thiserror",
+ "walkdir",
+]
+
+[[package]]
+name = "jni"
+version = "0.21.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97"
+dependencies = [
+ "cesu8",
+ "cfg-if",
+ "combine",
+ "jni-sys",
+ "log",
+ "thiserror",
+ "walkdir",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "jni-sys"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
+
+[[package]]
+name = "jobserver"
+version = "0.1.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "jpeg-decoder"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc0000e42512c92e31c2252315bda326620a4e034105e900c98ec492fa077b3e"
+
+[[package]]
+name = "js-sys"
+version = "0.3.64"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "jumpy"
+version = "0.7.0"
+dependencies = [
+ "async-channel",
+ "bevy_dylib",
+ "bevy_tasks",
+ "bones_bevy_renderer",
+ "bones_framework",
+ "directories 1.0.2",
+ "egui_extras",
+ "humantime-serde",
+ "indexmap 2.0.2",
+ "nalgebra",
+ "once_cell",
+ "ordered-float",
+ "peg",
+ "petgraph",
+ "puffin",
+ "rapier2d",
+ "serde",
+ "serde_yaml",
+ "shiftnanigans",
+ "thiserror",
+ "tracing",
+ "turborand",
+]
+
+[[package]]
+name = "khronos-egl"
+version = "4.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c2352bd1d0bceb871cb9d40f24360c8133c11d7486b68b5381c1dd1a32015e3"
+dependencies = [
+ "libc",
+ "libloading 0.7.4",
+ "pkg-config",
+]
+
+[[package]]
+name = "kira"
+version = "0.8.5"
+source = "git+https://github.com/zicklag/kira.git?branch=feat/sync#e587b155e862567677c114d0d6fc2963be37c14b"
+dependencies = [
+ "atomic-arena",
+ "cpal",
+ "glam",
+ "mint",
+ "ringbuf",
+ "symphonia",
+]
+
+[[package]]
+name = "kqueue"
+version = "1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c"
+dependencies = [
+ "kqueue-sys",
+ "libc",
+]
+
+[[package]]
+name = "kqueue-sys"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b"
+dependencies = [
+ "bitflags 1.3.2",
+ "libc",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "lazycell"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
+
+[[package]]
+name = "libc"
+version = "0.2.149"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b"
+
+[[package]]
+name = "libloading"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f"
+dependencies = [
+ "cfg-if",
+ "winapi",
+]
+
+[[package]]
+name = "libloading"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161"
+dependencies = [
+ "cfg-if",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "libm"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058"
+
+[[package]]
+name = "libudev-sys"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324"
+dependencies = [
+ "libc",
+ "pkg-config",
+]
+
+[[package]]
+name = "litrs"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9275e0933cf8bb20f008924c0cb07a0692fe54d8064996520bf998de9eb79aa"
+
+[[package]]
+name = "lock_api"
+version = "0.4.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"
+dependencies = [
+ "autocfg",
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
+
+[[package]]
+name = "lyon_algorithms"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "00a0349cd8f0270781bb93a824b63df6178e3b4a27794e7be3ce3763f5a44d6e"
+dependencies = [
+ "lyon_path",
+ "num-traits",
+]
+
+[[package]]
+name = "lyon_geom"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "74df1ff0a0147282eb10699537a03baa7d31972b58984a1d44ce0624043fe8ad"
+dependencies = [
+ "arrayvec",
+ "euclid",
+ "num-traits",
+]
+
+[[package]]
+name = "lyon_path"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca507745ba7ccbc76e5c44e7b63b1a29d2b0d6126f375806a5bbaf657c7d6c45"
+dependencies = [
+ "lyon_geom",
+ "num-traits",
+]
+
+[[package]]
+name = "lyon_tessellation"
+version = "1.0.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d2124218d5428149f9e09520b9acc024334a607e671f032d06567b61008977c"
+dependencies = [
+ "float_next_after",
+ "lyon_path",
+ "thiserror",
+]
+
+[[package]]
+name = "mach2"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d0d1830bcd151a6fc4aea1369af235b36c1528fe976b8ff678683c9995eade8"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "malloc_buf"
+version = "0.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "matchers"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
+dependencies = [
+ "regex-automata 0.1.10",
+]
+
+[[package]]
+name = "matrixmultiply"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2"
+dependencies = [
+ "autocfg",
+ "rawpointer",
+]
+
+[[package]]
+name = "maybe-owned"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4"
+
+[[package]]
+name = "memchr"
+version = "2.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167"
+
+[[package]]
+name = "memoffset"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "memoffset"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "metal"
+version = "0.24.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "de11355d1f6781482d027a3b4d4de7825dcedb197bf573e0596d00008402d060"
+dependencies = [
+ "bitflags 1.3.2",
+ "block",
+ "core-graphics-types",
+ "foreign-types",
+ "log",
+ "objc",
+]
+
+[[package]]
+name = "minimal-lexical"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+
+[[package]]
+name = "miniz_oxide"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
+dependencies = [
+ "adler",
+ "simd-adler32",
+]
+
+[[package]]
+name = "mint"
+version = "0.5.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e53debba6bda7a793e5f99b8dacf19e626084f525f7829104ba9898f367d85ff"
+
+[[package]]
+name = "mio"
+version = "0.8.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2"
+dependencies = [
+ "libc",
+ "log",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "naga"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbcc2e0513220fd2b598e6068608d4462db20322c0e77e47f6f488dfcfc279cb"
+dependencies = [
+ "bit-set",
+ "bitflags 1.3.2",
+ "codespan-reporting",
+ "hexf-parse",
+ "indexmap 1.9.3",
+ "log",
+ "num-traits",
+ "pp-rs",
+ "rustc-hash",
+ "spirv",
+ "termcolor",
+ "thiserror",
+ "unicode-xid",
+]
+
+[[package]]
+name = "naga_oil"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8be942a5c21c58b9b0bf4d9b99db3634ddb7a916f8e1d1d0b71820cc4150e56b"
+dependencies = [
+ "bit-set",
+ "codespan-reporting",
+ "data-encoding",
+ "indexmap 1.9.3",
+ "naga",
+ "once_cell",
+ "regex",
+ "regex-syntax 0.6.29",
+ "rustc-hash",
+ "thiserror",
+ "tracing",
+ "unicode-ident",
+]
+
+[[package]]
+name = "nalgebra"
+version = "0.32.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "307ed9b18cc2423f29e83f84fd23a8e73628727990181f18641a8b5dc2ab1caa"
+dependencies = [
+ "approx",
+ "glam",
+ "matrixmultiply",
+ "nalgebra-macros",
+ "num-complex",
+ "num-rational",
+ "num-traits",
+ "simba",
+ "typenum",
+]
+
+[[package]]
+name = "nalgebra-macros"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91761aed67d03ad966ef783ae962ef9bbaca728d2dd7ceb7939ec110fffad998"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "ndk"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0"
+dependencies = [
+ "bitflags 1.3.2",
+ "jni-sys",
+ "ndk-sys",
+ "num_enum 0.5.11",
+ "raw-window-handle",
+ "thiserror",
+]
+
+[[package]]
+name = "ndk-context"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b"
+
+[[package]]
+name = "ndk-sys"
+version = "0.4.1+23.1.7779620"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3cf2aae958bd232cac5069850591667ad422d263686d75b52a065f9badeee5a3"
+dependencies = [
+ "jni-sys",
+]
+
+[[package]]
+name = "nix"
+version = "0.24.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069"
+dependencies = [
+ "bitflags 1.3.2",
+ "cfg-if",
+ "libc",
+ "memoffset 0.6.5",
+]
+
+[[package]]
+name = "nix"
+version = "0.26.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b"
+dependencies = [
+ "bitflags 1.3.2",
+ "cfg-if",
+ "libc",
+]
+
+[[package]]
+name = "nohash-hasher"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451"
+
+[[package]]
+name = "noise"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ba869e17168793186c10ca82c7079a4ffdeac4f1a7d9e755b9491c028180e40"
+dependencies = [
+ "num-traits",
+ "rand 0.7.3",
+ "rand_xorshift",
+]
+
+[[package]]
+name = "nom"
+version = "7.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
+dependencies = [
+ "memchr",
+ "minimal-lexical",
+]
+
+[[package]]
+name = "notify"
+version = "6.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d"
+dependencies = [
+ "bitflags 2.4.0",
+ "crossbeam-channel",
+ "filetime",
+ "fsevent-sys",
+ "inotify",
+ "kqueue",
+ "libc",
+ "log",
+ "mio",
+ "walkdir",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "ntapi"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "nu-ansi-term"
+version = "0.46.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
+dependencies = [
+ "overload",
+ "winapi",
+]
+
+[[package]]
+name = "num-complex"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "num-derive"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
+dependencies = [
+ "autocfg",
+ "num-traits",
+]
+
+[[package]]
+name = "num-rational"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c"
+dependencies = [
+ "autocfg",
+ "libm",
+]
+
+[[package]]
+name = "num_enum"
+version = "0.5.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9"
+dependencies = [
+ "num_enum_derive 0.5.11",
+]
+
+[[package]]
+name = "num_enum"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1"
+dependencies = [
+ "num_enum_derive 0.6.1",
+]
+
+[[package]]
+name = "num_enum_derive"
+version = "0.5.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799"
+dependencies = [
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "num_enum_derive"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6"
+dependencies = [
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "objc"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1"
+dependencies = [
+ "malloc_buf",
+ "objc_exception",
+]
+
+[[package]]
+name = "objc-foundation"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9"
+dependencies = [
+ "block",
+ "objc",
+ "objc_id",
+]
+
+[[package]]
+name = "objc-sys"
+version = "0.2.0-beta.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df3b9834c1e95694a05a828b59f55fa2afec6288359cda67146126b3f90a55d7"
+
+[[package]]
+name = "objc2"
+version = "0.3.0-beta.3.patch-leaks.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e01640f9f2cb1220bbe80325e179e532cb3379ebcd1bf2279d703c19fe3a468"
+dependencies = [
+ "block2",
+ "objc-sys",
+ "objc2-encode",
+]
+
+[[package]]
+name = "objc2-encode"
+version = "2.0.0-pre.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "abfcac41015b00a120608fdaa6938c44cb983fee294351cc4bac7638b4e50512"
+dependencies = [
+ "objc-sys",
+]
+
+[[package]]
+name = "objc_exception"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "objc_id"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b"
+dependencies = [
+ "objc",
+]
+
+[[package]]
+name = "object"
+version = "0.32.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "oboe"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8868cc237ee02e2d9618539a23a8d228b9bb3fc2e7a5b11eed3831de77c395d0"
+dependencies = [
+ "jni 0.20.0",
+ "ndk",
+ "ndk-context",
+ "num-derive",
+ "num-traits",
+ "oboe-sys",
+]
+
+[[package]]
+name = "oboe-sys"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f44155e7fb718d3cfddcf70690b2b51ac4412f347cd9e4fbe511abe9cd7b5f2"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
+
+[[package]]
+name = "option-ext"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
+
+[[package]]
+name = "optional"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "978aa494585d3ca4ad74929863093e87cac9790d81fe7aba2b3dc2890643a0fc"
+
+[[package]]
+name = "orbclient"
+version = "0.3.46"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8378ac0dfbd4e7895f2d2c1f1345cab3836910baf3a300b000d04250f0c8428f"
+dependencies = [
+ "redox_syscall 0.3.5",
+]
+
+[[package]]
+name = "ordered-float"
+version = "3.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1e1c390732d15f1d48471625cd92d154e66db2c56645e29a9cd26f4699f72dc"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "overload"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
+
+[[package]]
+name = "owned_ttf_parser"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "706de7e2214113d63a8238d1910463cfce781129a6f263d13fdb09ff64355ba4"
+dependencies = [
+ "ttf-parser",
+]
+
+[[package]]
+name = "parking"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e52c774a4c39359c1d1c52e43f73dd91a75a614652c825408eec30c95a9b2067"
+
+[[package]]
+name = "parking_lot"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+dependencies = [
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall 0.3.5",
+ "smallvec",
+ "windows-targets 0.48.5",
+]
+
+[[package]]
+name = "parry2d"
+version = "0.13.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "104ae65232e20477a98f9f1e75ca9850eae24a2ea846a2b1a0af03ad752136ce"
+dependencies = [
+ "approx",
+ "arrayvec",
+ "bitflags 1.3.2",
+ "downcast-rs",
+ "either",
+ "indexmap 1.9.3",
+ "nalgebra",
+ "num-derive",
+ "num-traits",
+ "rustc-hash",
+ "simba",
+ "slab",
+ "smallvec",
+ "spade",
+]
+
+[[package]]
+name = "paste"
+version = "1.0.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c"
+
+[[package]]
+name = "path-absolutize"
+version = "3.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4af381fe79fa195b4909485d99f73a80792331df0625188e707854f0b3383f5"
+dependencies = [
+ "path-dedot",
+]
+
+[[package]]
+name = "path-dedot"
+version = "3.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07ba0ad7e047712414213ff67533e6dd477af0a4e1d14fb52343e53d30ea9397"
+dependencies = [
+ "once_cell",
+]
+
+[[package]]
+name = "peeking_take_while"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
+
+[[package]]
+name = "peg"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "400bcab7d219c38abf8bd7cc2054eb9bbbd4312d66f6a5557d572a203f646f61"
+dependencies = [
+ "peg-macros",
+ "peg-runtime",
+]
+
+[[package]]
+name = "peg-macros"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "46e61cce859b76d19090f62da50a9fe92bab7c2a5f09e183763559a2ac392c90"
+dependencies = [
+ "peg-runtime",
+ "proc-macro2",
+ "quote",
+]
+
+[[package]]
+name = "peg-runtime"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "36bae92c60fa2398ce4678b98b2c4b5a7c61099961ca1fa305aec04a9ad28922"
+
+[[package]]
+name = "percent-encoding"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94"
+
+[[package]]
+name = "petgraph"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9"
+dependencies = [
+ "fixedbitset",
+ "indexmap 2.0.2",
+]
+
+[[package]]
+name = "phf"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc"
+dependencies = [
+ "phf_macros",
+ "phf_shared",
+]
+
+[[package]]
+name = "phf_generator"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0"
+dependencies = [
+ "phf_shared",
+ "rand 0.8.5",
+]
+
+[[package]]
+name = "phf_macros"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b"
+dependencies = [
+ "phf_generator",
+ "phf_shared",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "phf_shared"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b"
+dependencies = [
+ "siphasher",
+]
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
+
+[[package]]
+name = "png"
+version = "0.17.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64"
+dependencies = [
+ "bitflags 1.3.2",
+ "crc32fast",
+ "fdeflate",
+ "flate2",
+ "miniz_oxide",
+]
+
+[[package]]
+name = "pp-rs"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bb458bb7f6e250e6eb79d5026badc10a3ebb8f9a15d1fff0f13d17c71f4d6dee"
+dependencies = [
+ "unicode-xid",
+]
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+
+[[package]]
+name = "proc-macro-crate"
+version = "1.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919"
+dependencies = [
+ "once_cell",
+ "toml_edit",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "profiling"
+version = "1.0.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f89dff0959d98c9758c88826cc002e2c3d0b9dfac4139711d1f30de442f1139b"
+
+[[package]]
+name = "puffin"
+version = "0.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76425abd4e1a0ad4bd6995dd974b52f414fca9974171df8e3708b3e660d05a21"
+dependencies = [
+ "anyhow",
+ "byteorder",
+ "cfg-if",
+ "instant",
+ "once_cell",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "radium"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09"
+
+[[package]]
+name = "radsort"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17fd96390ed3feda12e1dfe2645ed587e0bea749e319333f104a33ff62f77a0b"
+
+[[package]]
+name = "rand"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
+dependencies = [
+ "getrandom 0.1.16",
+ "libc",
+ "rand_chacha 0.2.2",
+ "rand_core 0.5.1",
+ "rand_hc",
+]
+
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "libc",
+ "rand_chacha 0.3.1",
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
+dependencies = [
+ "ppv-lite86",
+ "rand_core 0.5.1",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+dependencies = [
+ "ppv-lite86",
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
+dependencies = [
+ "getrandom 0.1.16",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+dependencies = [
+ "getrandom 0.2.10",
+]
+
+[[package]]
+name = "rand_hc"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
+dependencies = [
+ "rand_core 0.5.1",
+]
+
+[[package]]
+name = "rand_xorshift"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77d416b86801d23dde1aa643023b775c3a462efc0ed96443add11546cdf1dca8"
+dependencies = [
+ "rand_core 0.5.1",
+]
+
+[[package]]
+name = "range-alloc"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8a99fddc9f0ba0a85884b8d14e3592853e787d581ca1816c91349b10e4eeab"
+
+[[package]]
+name = "rapier2d"
+version = "0.17.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f94d294a9b96694c14888dd0e8ce77620dcc4f2f49264109ef835fa5e2285b84"
+dependencies = [
+ "approx",
+ "arrayvec",
+ "bit-vec",
+ "bitflags 1.3.2",
+ "crossbeam",
+ "downcast-rs",
+ "indexmap 1.9.3",
+ "nalgebra",
+ "num-derive",
+ "num-traits",
+ "parry2d",
+ "rustc-hash",
+ "simba",
+]
+
+[[package]]
+name = "raw-window-handle"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9"
+
+[[package]]
+name = "rawpointer"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3"
+
+[[package]]
+name = "rectangle-pack"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a0d463f2884048e7153449a55166f91028d5b0ea53c79377099ce4e8cf0cf9bb"
+
+[[package]]
+name = "redox_syscall"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+dependencies = [
+ "bitflags 1.3.2",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
+dependencies = [
+ "bitflags 1.3.2",
+]
+
+[[package]]
+name = "redox_users"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"
+dependencies = [
+ "getrandom 0.2.10",
+ "redox_syscall 0.2.16",
+ "thiserror",
+]
+
+[[package]]
+name = "regex"
+version = "1.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aaac441002f822bc9705a681810a4dd2963094b9ca0ddc41cb963a4c189189ea"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata 0.4.2",
+ "regex-syntax 0.8.2",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
+dependencies = [
+ "regex-syntax 0.6.29",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5011c7e263a695dc8ca064cddb722af1be54e517a280b12a5356f98366899e5d"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax 0.8.2",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
+
+[[package]]
+name = "regex-syntax"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
+
+[[package]]
+name = "renderdoc-sys"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "216080ab382b992234dda86873c18d4c48358f5cfcb70fd693d7f6f2131b628b"
+
+[[package]]
+name = "ring"
+version = "0.16.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc"
+dependencies = [
+ "cc",
+ "libc",
+ "once_cell",
+ "spin",
+ "untrusted",
+ "web-sys",
+ "winapi",
+]
+
+[[package]]
+name = "ringbuf"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "79abed428d1fd2a128201cec72c5f6938e2da607c6f3745f769fabea399d950a"
+dependencies = [
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "robust"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5864e7ef1a6b7bcf1d6ca3f655e65e724ed3b52546a0d0a663c991522f552ea"
+
+[[package]]
+name = "ron"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94"
+dependencies = [
+ "base64",
+ "bitflags 2.4.0",
+ "serde",
+ "serde_derive",
+]
+
+[[package]]
+name = "rustc-demangle"
+version = "0.1.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
+
+[[package]]
+name = "rustc-hash"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
+
+[[package]]
+name = "rustls"
+version = "0.21.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8"
+dependencies = [
+ "log",
+ "ring",
+ "rustls-webpki",
+ "sct",
+]
+
+[[package]]
+name = "rustls-webpki"
+version = "0.101.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c7d5dece342910d9ba34d259310cae3e0154b873b35408b787b59bce53d34fe"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
+[[package]]
+name = "ryu"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
+
+[[package]]
+name = "safe_arch"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f398075ce1e6a179b46f51bd88d0598b92b00d3551f1a2d4ac49e771b56ac354"
+dependencies = [
+ "bytemuck",
+]
+
+[[package]]
+name = "same-file"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "scopeguard"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+
+[[package]]
+name = "sct"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
+[[package]]
+name = "self_cell"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ef965a420fe14fdac7dd018862966a4c14094f900e1650bbc71ddd7d580c8af"
+
+[[package]]
+name = "semver"
+version = "1.0.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "serde"
+version = "1.0.189"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.189"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.107"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_yaml"
+version = "0.9.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a49e178e4452f45cb61d0cd8cebc1b0fafd3e41929e996cef79aa3aca91f574"
+dependencies = [
+ "indexmap 2.0.2",
+ "itoa",
+ "ryu",
+ "serde",
+ "unsafe-libyaml",
+]
+
+[[package]]
+name = "sha2"
+version = "0.10.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+]
+
+[[package]]
+name = "sharded-slab"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "shiftnanigans"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9635466532d454fa020acbb12f629f1fc02fc9b4d5b39cc72ca478be37e314bc"
+dependencies = [
+ "bitvec",
+ "fastrand 1.9.0",
+ "itertools",
+ "log",
+ "nohash-hasher",
+]
+
+[[package]]
+name = "shlex"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380"
+
+[[package]]
+name = "simba"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae"
+dependencies = [
+ "approx",
+ "libm",
+ "num-complex",
+ "num-traits",
+ "paste",
+ "wide",
+]
+
+[[package]]
+name = "simd-adler32"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
+
+[[package]]
+name = "siphasher"
+version = "0.3.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
+
+[[package]]
+name = "slab"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "slotmap"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342"
+dependencies = [
+ "version_check",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "smol_str"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "74212e6bbe9a4352329b2f68ba3130c15a3f26fe88ff22dbdc6cdd58fa85e99c"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "spade"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "88e65803986868d2372c582007c39ba89936a36ea5f236bf7a7728dc258f04f9"
+dependencies = [
+ "num-traits",
+ "optional",
+ "robust",
+ "smallvec",
+]
+
+[[package]]
+name = "spin"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
+
+[[package]]
+name = "spirv"
+version = "0.2.0+1.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "246bfa38fe3db3f1dfc8ca5a2cdeb7348c78be2112740cc0ec8ef18b6d94f830"
+dependencies = [
+ "bitflags 1.3.2",
+ "num-traits",
+]
+
+[[package]]
+name = "sptr"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a"
+
+[[package]]
+name = "static_assertions"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+
+[[package]]
+name = "str-buf"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0"
+
+[[package]]
+name = "svg_fmt"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fb1df15f412ee2e9dfc1c504260fa695c1c3f10fe9f4a6ee2d2184d7d6450e2"
+
+[[package]]
+name = "svgtypes"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22975e8a2bac6a76bb54f898a6b18764633b00e780330f0b689f65afb3975564"
+dependencies = [
+ "siphasher",
+]
+
+[[package]]
+name = "symphonia"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62e48dba70095f265fdb269b99619b95d04c89e619538138383e63310b14d941"
+dependencies = [
+ "lazy_static",
+ "symphonia-codec-vorbis",
+ "symphonia-core",
+ "symphonia-format-ogg",
+ "symphonia-metadata",
+]
+
+[[package]]
+name = "symphonia-codec-vorbis"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3953397e3506aa01350c4205817e4f95b58d476877a42f0458d07b665749e203"
+dependencies = [
+ "log",
+ "symphonia-core",
+ "symphonia-utils-xiph",
+]
+
+[[package]]
+name = "symphonia-core"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7c73eb88fee79705268cc7b742c7bc93a7b76e092ab751d0833866970754142"
+dependencies = [
+ "arrayvec",
+ "bitflags 1.3.2",
+ "bytemuck",
+ "lazy_static",
+ "log",
+]
+
+[[package]]
+name = "symphonia-format-ogg"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9bf1a00ccd11452d44048a0368828040f778ae650418dbd9d8765b7ee2574c8d"
+dependencies = [
+ "log",
+ "symphonia-core",
+ "symphonia-metadata",
+ "symphonia-utils-xiph",
+]
+
+[[package]]
+name = "symphonia-metadata"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89c3e1937e31d0e068bbe829f66b2f2bfaa28d056365279e0ef897172c3320c0"
+dependencies = [
+ "encoding_rs",
+ "lazy_static",
+ "log",
+ "symphonia-core",
+]
+
+[[package]]
+name = "symphonia-utils-xiph"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a450ca645b80d69aff8b35576cbfdc7f20940b29998202aab910045714c951f8"
+dependencies = [
+ "symphonia-core",
+ "symphonia-metadata",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.38"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "sys-locale"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e801cf239ecd6ccd71f03d270d67dd53d13e90aab208bf4b8fe4ad957ea949b0"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "sysinfo"
+version = "0.29.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0a18d114d420ada3a891e6bc8e96a2023402203296a47cdd65083377dad18ba5"
+dependencies = [
+ "cfg-if",
+ "core-foundation-sys",
+ "libc",
+ "ntapi",
+ "once_cell",
+ "winapi",
+]
+
+[[package]]
+name = "tap"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
+
+[[package]]
+name = "termcolor"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.49"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.49"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "thread_local"
+version = "1.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+]
+
+[[package]]
+name = "tiff"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d172b0f4d3fba17ba89811858b9d3d97f928aece846475bbda076ca46736211"
+dependencies = [
+ "flate2",
+ "jpeg-decoder",
+ "weezl",
+]
+
+[[package]]
+name = "tinystr"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d5d0e245e80bdc9b4e5356fc45a72184abbc3861992603f515270e9340f5a219"
+dependencies = [
+ "displaydoc",
+]
+
+[[package]]
+name = "tinyvec"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+dependencies = [
+ "tinyvec_macros",
+]
+
+[[package]]
+name = "tinyvec_macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
+
+[[package]]
+name = "toml_datetime"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b"
+
+[[package]]
+name = "toml_edit"
+version = "0.19.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
+dependencies = [
+ "indexmap 2.0.2",
+ "toml_datetime",
+ "winnow",
+]
+
+[[package]]
+name = "tracing"
+version = "0.1.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee2ef2af84856a50c1d430afce2fdded0a4ec7eda868db86409b4543df0797f9"
+dependencies = [
+ "pin-project-lite",
+ "tracing-attributes",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-attributes"
+version = "0.1.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
+dependencies = [
+ "once_cell",
+ "valuable",
+]
+
+[[package]]
+name = "tracing-log"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922"
+dependencies = [
+ "lazy_static",
+ "log",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-subscriber"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77"
+dependencies = [
+ "matchers",
+ "nu-ansi-term",
+ "once_cell",
+ "regex",
+ "sharded-slab",
+ "smallvec",
+ "thread_local",
+ "tracing",
+ "tracing-core",
+ "tracing-log",
+]
+
+[[package]]
+name = "tracing-wasm"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4575c663a174420fa2d78f4108ff68f65bf2fbb7dd89f33749b6e826b3626e07"
+dependencies = [
+ "tracing",
+ "tracing-subscriber",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "ttf-parser"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49d64318d8311fc2668e48b63969f4343e0a85c4a109aa8460d6672e364b8bd1"
+
+[[package]]
+name = "turborand"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e28d61f1c96db8c016037a77961fa5da84fc3a57fe69a15283ace0ab1647bac0"
+dependencies = [
+ "getrandom 0.2.10",
+ "instant",
+]
+
+[[package]]
+name = "type-map"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6d3364c5e96cb2ad1603037ab253ddd34d7fb72a58bdddf4b7350760fc69a46"
+dependencies = [
+ "rustc-hash",
+]
+
+[[package]]
+name = "typenum"
+version = "1.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
+
+[[package]]
+name = "ulid"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e37c4b6cbcc59a8dcd09a6429fbc7890286bcbb79215cea7b38a3c4c0921d93"
+dependencies = [
+ "rand 0.8.5",
+ "serde",
+]
+
+[[package]]
+name = "unic-langid"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "398f9ad7239db44fd0f80fe068d12ff22d78354080332a5077dc6f52f14dcf2f"
+dependencies = [
+ "unic-langid-impl",
+]
+
+[[package]]
+name = "unic-langid-impl"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e35bfd2f2b8796545b55d7d3fd3e89a0613f68a0d1c8bc28cb7ff96b411a35ff"
+dependencies = [
+ "serde",
+ "tinystr",
+]
+
+[[package]]
+name = "unicode-bidi"
+version = "0.3.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "unicode-width"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85"
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
+
+[[package]]
+name = "unsafe-libyaml"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa"
+
+[[package]]
+name = "untrusted"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
+
+[[package]]
+name = "ureq"
+version = "2.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f5ccd538d4a604753ebc2f17cd9946e89b77bf87f6a8e2309667c6f2e87855e3"
+dependencies = [
+ "base64",
+ "flate2",
+ "log",
+ "once_cell",
+ "rustls",
+ "rustls-webpki",
+ "url",
+ "webpki-roots",
+]
+
+[[package]]
+name = "url"
+version = "2.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5"
+dependencies = [
+ "form_urlencoded",
+ "idna",
+ "percent-encoding",
+]
+
+[[package]]
+name = "ustr"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b050b13c1933490b043b8238a75bc7676cb49292f49768c9350eabb284eaeb87"
+dependencies = [
+ "ahash",
+ "byteorder",
+ "lazy_static",
+ "parking_lot",
+ "serde",
+]
+
+[[package]]
+name = "uuid"
+version = "1.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d"
+dependencies = [
+ "getrandom 0.2.10",
+ "serde",
+]
+
+[[package]]
+name = "valuable"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
+
+[[package]]
+name = "vec_map"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
+
+[[package]]
+name = "venial"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61584a325b16f97b5b25fcc852eb9550843a251057a5e3e5992d2376f3df4bb2"
+dependencies = [
+ "proc-macro2",
+ "quote",
+]
+
+[[package]]
+name = "version_check"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+[[package]]
+name = "waker-fn"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690"
+
+[[package]]
+name = "walkdir"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee"
+dependencies = [
+ "same-file",
+ "winapi-util",
+]
+
+[[package]]
+name = "wasi"
+version = "0.9.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
+
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.87"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342"
+dependencies = [
+ "cfg-if",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.87"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd"
+dependencies = [
+ "bumpalo",
+ "log",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.38",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-futures"
+version = "0.4.37"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03"
+dependencies = [
+ "cfg-if",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.87"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.87"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.38",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.87"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1"
+
+[[package]]
+name = "wayland-scanner"
+version = "0.29.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "xml-rs",
+]
+
+[[package]]
+name = "web-sys"
+version = "0.3.64"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "webbrowser"
+version = "0.8.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82b2391658b02c27719fc5a0a73d6e696285138e8b12fba9d4baa70451023c71"
+dependencies = [
+ "core-foundation",
+ "home",
+ "jni 0.21.1",
+ "log",
+ "ndk-context",
+ "objc",
+ "raw-window-handle",
+ "url",
+ "web-sys",
+]
+
+[[package]]
+name = "webpki-roots"
+version = "0.25.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc"
+
+[[package]]
+name = "weezl"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb"
+
+[[package]]
+name = "wgpu"
+version = "0.16.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "480c965c9306872eb6255fa55e4b4953be55a8b64d57e61d7ff840d3dcc051cd"
+dependencies = [
+ "arrayvec",
+ "cfg-if",
+ "js-sys",
+ "log",
+ "naga",
+ "parking_lot",
+ "profiling",
+ "raw-window-handle",
+ "smallvec",
+ "static_assertions",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+ "wgpu-core",
+ "wgpu-hal",
+ "wgpu-types",
+]
+
+[[package]]
+name = "wgpu-core"
+version = "0.16.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f478237b4bf0d5b70a39898a66fa67ca3a007d79f2520485b8b0c3dfc46f8c2"
+dependencies = [
+ "arrayvec",
+ "bit-vec",
+ "bitflags 2.4.0",
+ "codespan-reporting",
+ "log",
+ "naga",
+ "parking_lot",
+ "profiling",
+ "raw-window-handle",
+ "rustc-hash",
+ "smallvec",
+ "thiserror",
+ "web-sys",
+ "wgpu-hal",
+ "wgpu-types",
+]
+
+[[package]]
+name = "wgpu-hal"
+version = "0.16.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ecb3258078e936deee14fd4e0febe1cfe9bbb5ffef165cb60218d2ee5eb4448"
+dependencies = [
+ "android_system_properties",
+ "arrayvec",
+ "ash",
+ "bit-set",
+ "bitflags 2.4.0",
+ "block",
+ "core-graphics-types",
+ "d3d12",
+ "foreign-types",
+ "glow",
+ "gpu-alloc",
+ "gpu-allocator",
+ "gpu-descriptor",
+ "hassle-rs",
+ "js-sys",
+ "khronos-egl",
+ "libc",
+ "libloading 0.8.1",
+ "log",
+ "metal",
+ "naga",
+ "objc",
+ "parking_lot",
+ "profiling",
+ "range-alloc",
+ "raw-window-handle",
+ "renderdoc-sys",
+ "rustc-hash",
+ "smallvec",
+ "thiserror",
+ "wasm-bindgen",
+ "web-sys",
+ "wgpu-types",
+ "winapi",
+]
+
+[[package]]
+name = "wgpu-types"
+version = "0.16.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d0c153280bb108c2979eb5c7391cb18c56642dd3c072e55f52065e13e2a1252a"
+dependencies = [
+ "bitflags 2.4.0",
+ "js-sys",
+ "web-sys",
+]
+
+[[package]]
+name = "wide"
+version = "0.7.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ebecebefc38ff1860b4bc47550bbfa63af5746061cf0d29fcd7fa63171602598"
+dependencies = [
+ "bytemuck",
+ "safe_arch",
+]
+
+[[package]]
+name = "widestring"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8"
+
+[[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-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-util"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "winapi-wsapoll"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44c17110f57155602a80dca10be03852116403c9ff3cd25b079d666f2aa3df6e"
+dependencies = [
+ "winapi",
+]
+
+[[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 = "windows"
+version = "0.44.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e745dab35a0c4c77aa3ce42d595e13d2003d6902d6b08c9ef5fc326d08da12b"
+dependencies = [
+ "windows-targets 0.42.2",
+]
+
+[[package]]
+name = "windows"
+version = "0.46.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdacb41e6a96a052c6cb63a144f24900236121c6f63f4f8219fef5977ecb0c25"
+dependencies = [
+ "windows-targets 0.42.2",
+]
+
+[[package]]
+name = "windows"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"
+dependencies = [
+ "windows-implement",
+ "windows-interface",
+ "windows-targets 0.48.5",
+]
+
+[[package]]
+name = "windows"
+version = "0.51.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9"
+dependencies = [
+ "windows-core",
+ "windows-targets 0.48.5",
+]
+
+[[package]]
+name = "windows-core"
+version = "0.51.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64"
+dependencies = [
+ "windows-targets 0.48.5",
+]
+
+[[package]]
+name = "windows-implement"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e2ee588991b9e7e6c8338edf3333fbe4da35dc72092643958ebb43f0ab2c49c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "windows-interface"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6fb8df20c9bcaa8ad6ab513f7b40104840c8867d5751126e4df3b08388d0cc7"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.45.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
+dependencies = [
+ "windows-targets 0.42.2",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets 0.48.5",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
+dependencies = [
+ "windows_aarch64_gnullvm 0.42.2",
+ "windows_aarch64_msvc 0.42.2",
+ "windows_i686_gnu 0.42.2",
+ "windows_i686_msvc 0.42.2",
+ "windows_x86_64_gnu 0.42.2",
+ "windows_x86_64_gnullvm 0.42.2",
+ "windows_x86_64_msvc 0.42.2",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
+dependencies = [
+ "windows_aarch64_gnullvm 0.48.5",
+ "windows_aarch64_msvc 0.48.5",
+ "windows_i686_gnu 0.48.5",
+ "windows_i686_msvc 0.48.5",
+ "windows_x86_64_gnu 0.48.5",
+ "windows_x86_64_gnullvm 0.48.5",
+ "windows_x86_64_msvc 0.48.5",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
+
+[[package]]
+name = "winit"
+version = "0.28.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9596d90b45384f5281384ab204224876e8e8bf7d58366d9b795ad99aa9894b94"
+dependencies = [
+ "android-activity",
+ "bitflags 1.3.2",
+ "cfg_aliases",
+ "core-foundation",
+ "core-graphics",
+ "dispatch",
+ "instant",
+ "libc",
+ "log",
+ "mio",
+ "ndk",
+ "objc2",
+ "once_cell",
+ "orbclient",
+ "percent-encoding",
+ "raw-window-handle",
+ "redox_syscall 0.3.5",
+ "wasm-bindgen",
+ "wayland-scanner",
+ "web-sys",
+ "windows-sys 0.45.0",
+ "x11-dl",
+]
+
+[[package]]
+name = "winnow"
+version = "0.5.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3b801d0e0a6726477cc207f60162da452f3a95adb368399bef20a946e06f65c"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "wyz"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed"
+dependencies = [
+ "tap",
+]
+
+[[package]]
+name = "x11-dl"
+version = "2.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f"
+dependencies = [
+ "libc",
+ "once_cell",
+ "pkg-config",
+]
+
+[[package]]
+name = "x11rb"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "592b4883219f345e712b3209c62654ebda0bb50887f330cbd018d0f654bfd507"
+dependencies = [
+ "gethostname",
+ "nix 0.24.3",
+ "winapi",
+ "winapi-wsapoll",
+ "x11rb-protocol",
+]
+
+[[package]]
+name = "x11rb-protocol"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56b245751c0ac9db0e006dc812031482784e434630205a93c73cfefcaabeac67"
+dependencies = [
+ "nix 0.24.3",
+]
+
+[[package]]
+name = "xml-rs"
+version = "0.8.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a"
diff --git a/nixpkgs/pkgs/games/jumpy/default.nix b/nixpkgs/pkgs/games/jumpy/default.nix
new file mode 100644
index 000000000000..d4f8a8fcbdbc
--- /dev/null
+++ b/nixpkgs/pkgs/games/jumpy/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+, makeWrapper
+, pkg-config
+, zstd
+, stdenv
+, alsa-lib
+, libxkbcommon
+, udev
+, vulkan-loader
+, wayland
+, xorg
+, darwin
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "jumpy";
+  version = "0.8.0";
+
+  src = fetchFromGitHub {
+    owner = "fishfolk";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-ggePJH2kKJ17aOWRKUnLyolIdSzlc6Axf5Iw74iFfek=";
+  };
+
+  cargoLock = {
+    lockFile = ./Cargo.lock;
+    outputHashes = {
+      "bevy_egui-0.21.0" = "sha256-hu55tZQppw1NajwqIsYsw6de0IAwQwgra3D9OFzSSLc=";
+      "bones_asset-0.3.0" = "sha256-1UeOXW6O/gMQBBUnHxRreJgmiUTPC5SJB+uLn9V8aa4=";
+      "kira-0.8.5" = "sha256-z4R5aIaoRQQprL6JsVrFI69rwTOsW5OH01+jORS+hBQ=";
+    };
+  };
+
+  nativeBuildInputs = [
+    makeWrapper
+    pkg-config
+  ];
+
+  buildInputs = [
+    zstd
+  ] ++ lib.optionals stdenv.isLinux [
+    alsa-lib
+    libxkbcommon
+    udev
+    vulkan-loader
+    wayland
+    xorg.libX11
+    xorg.libXcursor
+    xorg.libXi
+    xorg.libXrandr
+  ] ++ lib.optionals stdenv.isDarwin [
+    darwin.apple_sdk_11_0.frameworks.Cocoa
+    rustPlatform.bindgenHook
+  ];
+
+  cargoBuildFlags = [ "--bin" "jumpy" ];
+
+  env = {
+    ZSTD_SYS_USE_PKG_CONFIG = true;
+  };
+
+  # jumpy only loads assets from the current directory
+  # https://github.com/fishfolk/bones/blob/f84d07c2f2847d9acd5c07098fe1575abc496400/framework_crates/bones_asset/src/io.rs#L50
+  postInstall = ''
+    mkdir $out/share
+    cp -r assets $out/share
+    wrapProgram $out/bin/jumpy --chdir $out/share
+  '';
+
+  postFixup = lib.optionalString stdenv.isLinux ''
+    patchelf $out/bin/.jumpy-wrapped \
+      --add-rpath ${lib.makeLibraryPath [ vulkan-loader ]}
+  '';
+
+  meta = with lib; {
+    description = "A tactical 2D shooter played by up to 4 players online or on a shared screen";
+    homepage = "https://fishfight.org/";
+    changelog = "https://github.com/fishfolk/jumpy/releases/tag/v${version}";
+    license = with licenses; [ mit /* or */ asl20 ];
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/kabeljau/default.nix b/nixpkgs/pkgs/games/kabeljau/default.nix
new file mode 100644
index 000000000000..0b5b1167ead3
--- /dev/null
+++ b/nixpkgs/pkgs/games/kabeljau/default.nix
@@ -0,0 +1,40 @@
+{ stdenvNoCC, lib, fetchFromGitea, just, inkscape, makeWrapper, bash, dialog }:
+
+stdenvNoCC.mkDerivation rec {
+  pname = "kabeljau";
+  version = "1.2.0";
+
+  src = fetchFromGitea {
+    domain = "codeberg.org";
+    owner = "annaaurora";
+    repo = "kabeljau";
+    rev = "v${version}";
+    sha256 = "sha256-RedVItgfr6vgqXHA3bOiHXDpfGuHI+sX4jCHL9G5jYk=";
+  };
+
+  # Inkscape is needed in a just recipe where it is used to export the SVG icon to several different sized PNGs.
+  nativeBuildInputs = [ just inkscape makeWrapper ];
+  postPatch = ''
+    patchShebangs --host ${pname}
+    substituteInPlace ./justfile \
+      --replace " /bin" " $out/bin" \
+      --replace " /usr" " $out"
+  '';
+  installPhase = ''
+    runHook preInstall
+
+    just install
+    wrapProgram $out/bin/${pname} --suffix PATH : ${
+      lib.makeBinPath [ dialog ]
+    }
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Survive as a stray cat in an ncurses game";
+    homepage = "https://codeberg.org/annaaurora/kabeljau";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ annaaurora ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/katago/default.nix b/nixpkgs/pkgs/games/katago/default.nix
new file mode 100644
index 000000000000..4a66f6cc711e
--- /dev/null
+++ b/nixpkgs/pkgs/games/katago/default.nix
@@ -0,0 +1,115 @@
+{ stdenv
+, boost
+, cmake
+, config
+, cudaPackages
+, eigen
+, fetchFromGitHub
+, gperftools
+, lib
+, libzip
+, makeWrapper
+, mesa
+, ocl-icd
+, opencl-headers
+, openssl
+, writeShellScriptBin
+, enableAVX2 ? stdenv.hostPlatform.avx2Support
+, backend ? if config.cudaSupport then "cuda" else "opencl"
+, enableBigBoards ? false
+, enableContrib ? false
+, enableTcmalloc ? true
+}:
+
+assert lib.assertOneOf "backend" backend [ "opencl" "cuda" "tensorrt" "eigen" ];
+
+# N.b. older versions of cuda toolkit (e.g. 10) do not support newer versions
+# of gcc.  If you need to use cuda10, please override stdenv with gcc8Stdenv
+stdenv.mkDerivation rec {
+  pname = "katago";
+  version = "1.14.0";
+  githash = "c6de1bbda837a0717eaeca46102f7326ed0da0d4";
+
+  src = fetchFromGitHub {
+    owner = "lightvector";
+    repo = "katago";
+    rev = "v${version}";
+    sha256 = "sha256-0WB/weQIJkLXedcOJO7D/N85oXTufvbmyfIp8XdrACg=";
+  };
+
+  fakegit = writeShellScriptBin "git" "echo ${githash}";
+
+  nativeBuildInputs = [
+    cmake
+    makeWrapper
+  ];
+
+  buildInputs = [
+    libzip
+    boost
+  ] ++ lib.optionals (backend == "eigen") [
+    eigen
+  ] ++ lib.optionals (backend == "cuda") [
+    cudaPackages.cudnn
+    cudaPackages.cudatoolkit
+    mesa.drivers
+  ] ++ lib.optionals (backend == "tensorrt") [
+      cudaPackages.cudatoolkit
+      cudaPackages.tensorrt
+      mesa.drivers
+  ] ++ lib.optionals (backend == "opencl") [
+    opencl-headers
+    ocl-icd
+  ] ++ lib.optionals enableContrib [
+    openssl
+  ] ++ lib.optionals enableTcmalloc [
+    gperftools
+  ];
+
+  cmakeFlags = [
+    "-DNO_GIT_REVISION=ON"
+  ] ++ lib.optionals enableAVX2 [
+    "-DUSE_AVX2=ON"
+  ] ++ lib.optionals (backend == "eigen") [
+    "-DUSE_BACKEND=EIGEN"
+  ] ++ lib.optionals (backend == "cuda") [
+    "-DUSE_BACKEND=CUDA"
+  ] ++ lib.optionals (backend == "tensorrt") [
+    "-DUSE_BACKEND=TENSORRT"
+  ] ++ lib.optionals (backend == "opencl") [
+    "-DUSE_BACKEND=OPENCL"
+  ] ++ 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 (backend == "cuda" || backend == "tensorrt") ''
+    export CUDA_PATH="${cudaPackages.cudatoolkit}"
+    export EXTRA_LDFLAGS="-L/run/opengl-driver/lib"
+  '';
+
+  installPhase = ''
+    runHook preInstall
+    mkdir -p $out/bin; cp katago $out/bin;
+  '' + lib.optionalString (backend == "cuda" || backend == "tensorrt") ''
+    wrapProgram $out/bin/katago \
+      --prefix LD_LIBRARY_PATH : "/run/opengl-driver/lib"
+  '' + ''
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Go engine modeled after AlphaGo Zero";
+    homepage    = "https://github.com/lightvector/katago";
+    license     = licenses.mit;
+    maintainers = [ maintainers.omnipotententity ];
+    platforms   = [ "x86_64-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/katawa-shoujo/default.nix b/nixpkgs/pkgs/games/katawa-shoujo/default.nix
new file mode 100644
index 000000000000..e549fbbcf963
--- /dev/null
+++ b/nixpkgs/pkgs/games/katawa-shoujo/default.nix
@@ -0,0 +1,181 @@
+{ stdenvNoCC
+, lib
+, fetchurl
+, autoPatchelfHook
+, copyDesktopItems
+, freetype
+, makeDesktopItem
+, makeWrapper
+, libGL
+, libGLU
+# Darwin cannot handle these when devendored:
+# - DYLD_LIBRARY_PATH masks system libraries with similar, differently-cased names and cause missing symbol errors
+# - symlinks cause unrelated BMP image loading to fail(?)
+, devendorImageLibs ? !stdenvNoCC.hostPlatform.isDarwin
+, libjpeg
+, libpng12
+, libX11
+, libXext
+, libXi
+, libXmu
+, runtimeShell
+, SDL_compat
+, SDL_image
+, SDL_ttf
+, undmg
+, unrpa
+, zlib
+}:
+
+let
+  stdenv = stdenvNoCC;
+  srcDetails = rec {
+    x86_64-linux = {
+      urlSuffix = "%5blinux-x86%5d%5b18161880%5d.tar.bz2";
+      hash = "sha256-7FoFz88dWYHs2/pxkEwnmiFeeb3+slayrWknEJoAB9o=";
+    };
+    i686-linux = x86_64-linux;
+    x86_64-darwin = {
+      urlSuffix = "%5bmac%5d%5b1DFC84A6%5d.dmg";
+      hash = "sha256-Sc5BAlpJsffjcNrZ8+VU3n7G10DoqDKQn/leHDW32Y8=";
+    };
+  }.${stdenv.hostPlatform.system} or (throw "Don't know how to fetch source for ${stdenv.hostPlatform.system}!");
+in
+stdenv.mkDerivation rec {
+  pname = "katawa-shoujo";
+  version = "1.3.1";
+
+  src = fetchurl {
+    url = "https://dl.katawa-shoujo.com/gold_${version}/%5b4ls%5d_katawa_shoujo_${version}-${srcDetails.urlSuffix}";
+    inherit (srcDetails) hash;
+  };
+
+  # fetchzip requires a custom unpackPhase to handle dmg, fetchurl cannot handle undmg producing >1 directory without this
+  sourceRoot = ".";
+
+  nativeBuildInputs = lib.optionals stdenv.hostPlatform.isLinux [
+    autoPatchelfHook
+    copyDesktopItems
+    unrpa
+  ] ++ lib.optionals stdenv.hostPlatform.isDarwin [
+    makeWrapper
+    undmg
+  ];
+
+  buildInputs = [
+    freetype
+    SDL_compat
+    zlib
+  ] ++ lib.optionals devendorImageLibs [
+    libjpeg
+    libpng12
+  ] ++ lib.optionals stdenv.hostPlatform.isLinux [
+    libX11
+    libXext
+    libXi
+    libXmu
+    libGL
+    libGLU
+  ];
+
+  desktopItems = [(makeDesktopItem rec {
+    name = "katawa-shoujo";
+    desktopName = "Katawa Shoujo";
+    comment = meta.description;
+    exec = name;
+    icon = name;
+    categories = [ "Game" ];
+  })];
+
+  dontConfigure = true;
+  dontBuild = true;
+
+  installPhase = let
+    platformDetails = with stdenv.hostPlatform; if isDarwin then rec {
+      arch = "darwin-x86_64";
+      sourceDir = "'Katawa Shoujo'.app";
+      installDir = "$out/Applications/'Katawa Shoujo'.app";
+      dataDir = "${installDir}/Contents/Resources/autorun";
+      bin = "${installDir}/Contents/MacOS/'Katawa Shoujo'";
+    } else rec {
+      arch = "linux-${if isx86_64 then "x86_64" else "i686"}";
+      sourceDir = "'Katawa Shoujo'-${version}-linux";
+      installDir = "$out/share/katawa-shoujo";
+      dataDir = installDir;
+      bin = "${installDir}/'Katawa Shoujo'.sh";
+    };
+    libDir = with platformDetails; "${dataDir}/lib/${arch}";
+  in with platformDetails; ''
+    runHook preInstall
+
+    mkdir -p "$(dirname ${installDir})"
+    cp -R ${sourceDir} ${installDir}
+
+    # Simplify launcher script
+    cat <<EOF >${bin}
+    #!${runtimeShell}
+    exec \$RENPY_GDB ${libDir}/'Katawa Shoujo' \$RENPY_PYARGS -EO ${dataDir}/'Katawa Shoujo'.py "\$@"
+    EOF
+
+  '' + (if stdenv.hostPlatform.isDarwin then ''
+    # No autoPatchelfHook on Darwin
+    wrapProgram ${bin} \
+      --prefix DYLD_LIBRARY_PATH : ${lib.makeLibraryPath buildInputs}
+  '' else ''
+    # Extract icon for xdg desktop file
+    unrpa ${dataDir}/game/data.rpa
+    install -Dm644 ui/icon.png $out/share/icons/hicolor/512x512/apps/katawa-shoujo.png
+  '') + ''
+
+    # Delete binaries for wrong arch, autoPatchelfHook gets confused by them & less to keep in the store
+    find "$(dirname ${libDir})" -mindepth 1 -maxdepth 1 \
+      -not -name 'python*' -not -name ${arch} \
+      -exec rm -r {} \;
+
+    # Replace some bundled libs so Nixpkgs' versions are used
+    rm ${libDir}/libz*
+    rm ${libDir}/libfreetype*
+    rm ${libDir}/libSDL-1.2*
+  '' + lib.optionalString devendorImageLibs ''
+    rm ${libDir}/libjpeg*
+    rm ${libDir}/libpng12*
+  '' + ''
+
+    mkdir -p $out/share/{doc,licenses}/katawa-shoujo
+    mv ${dataDir}/'Game Manual'.pdf $out/share/doc/katawa-shoujo/
+    mv ${dataDir}/LICENSE.txt $out/share/licenses/katawa-shoujo/
+
+    mkdir -p $out/bin
+    ln -s ${bin} $out/bin/katawa-shoujo
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Bishoujo-style visual novel by Four Leaf Studios, built in Ren'Py";
+    longDescription = ''
+      Katawa Shoujo is a bishoujo-style visual novel set in the fictional Yamaku High School for disabled children,
+      located somewhere in modern Japan. Hisao Nakai, a normal boy living a normal life, has his life turned upside down
+      when a congenital heart defect forces him to move to a new school after a long hospitalization. Despite his difficulties,
+      Hisao is able to find friends—and perhaps love, if he plays his cards right. There are five main paths corresponding
+      to the 5 main female characters, each path following the storyline pertaining to that character.
+
+      The story is told through the perspective of the main character, using a first person narrative. The game uses a
+      traditional text and sprite-based visual novel model with an ADV text box.
+
+      Katawa Shoujo contains adult material, and was created using the Ren'Py scripting system. It is the product of an
+      international team of amateur developers, and is available free of charge under the Creative Commons BY-NC-ND License.
+    '';
+    homepage = "https://www.katawa-shoujo.com/";
+    # https://www.katawa-shoujo.com/about.php
+    # November 2022: Update, is it still ND?
+    # https://ks.renai.us/viewtopic.php?f=13&p=248149#p248149
+    license = with licenses; [ cc-by-nc-nd-30 ];
+    maintainers = with maintainers; [ OPNA2608 ];
+    # Building Ren'Py6 from source would allow more, but too much of a hassle
+    platforms = platforms.x86;
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    # Needs different srcDetails & installPhase
+    broken = stdenv.hostPlatform.isWindows;
+  };
+}
diff --git a/nixpkgs/pkgs/games/keen4/default.nix b/nixpkgs/pkgs/games/keen4/default.nix
new file mode 100644
index 000000000000..5e2468a8f9ea
--- /dev/null
+++ b/nixpkgs/pkgs/games/keen4/default.nix
@@ -0,0 +1,50 @@
+{ lib, stdenv, fetchurl, dosbox, unzip }:
+
+stdenv.mkDerivation {
+  name = "keen4";
+
+  src = fetchurl {
+    url = "http://tarballs.nixos.org/keen4.zip";
+    sha256 = "12rnc9ksl7v6l8wsxvr26ylkafzq80dbsa7yafzw9pqc8pafkhx1";
+  };
+
+  nativeBuildInputs = [ unzip ];
+
+  installPhase = ''
+    mkdir -p $out/share/keen4
+    mv * $out/share/keen4
+
+    mkdir -p $out/bin
+    cat > $out/bin/keen4 <<EOF
+    #! $SHELL -e
+    if test -z "\$HOME"; then
+        echo "HOME directory not set"
+        exit 1
+    fi
+
+    # Game wants to write in the current directory, but of course we can't
+    # let it write in the Nix store.  So create symlinks to the game files
+    # in ~/.keen4 and execute game from there.
+    mkdir -p \$HOME/.keen4
+    cd \$HOME/.keen4
+
+    ln -sf $out/share/keen4/* .
+
+    ${dosbox}/bin/dosbox ./KEEN4E.EXE -fullscreen -exit || true
+
+    # Cleanup the symlinks.
+    for i in *; do
+        if test -L "\$i"; then
+            rm "\$i"
+        fi
+    done
+    EOF
+    chmod +x $out/bin/keen4
+  '';
+
+  meta = {
+    description = "Commander Keen Episode 4: Secret of the Oracle";
+    license = lib.licenses.unfree;
+    maintainers = [ lib.maintainers.eelco ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/keeperrl/default.nix b/nixpkgs/pkgs/games/keeperrl/default.nix
new file mode 100644
index 000000000000..c66ffdee920d
--- /dev/null
+++ b/nixpkgs/pkgs/games/keeperrl/default.nix
@@ -0,0 +1,91 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, requireFile
+, openal
+, curl
+, libogg
+, libvorbis
+, SDL2
+, SDL2_image
+, zlib
+, clang
+, libtheora
+, unfree_assets ? false }:
+
+let
+  pname = "keeperrl";
+  version = "alpha34";
+
+  free_src = fetchFromGitHub {
+    owner = "miki151";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-0sww+ppctXvxMouclG3OdXpcNgrrOZJw9z8s2GhJ+IE=";
+  };
+
+  assets = requireFile rec {
+    name = "keeperrl_data_${version}.tar.gz";
+    message = ''
+      This nix expression requires that the KeeperRL art assets are already
+      part of the store. These can be obtained from a purchased copy of the game
+      and found in the "data" directory. Make a tar archive of this directory
+      with
+
+      "tar czf ${name} data"
+
+      Then add this archive to the nix store with
+
+      "nix-prefetch-url file://\$PWD/${name}".
+    '';
+    sha256 = "0115pxdzdyma2vicxgr0j21pp82gxdyrlj090s8ihp0b50f0nlll";
+  };
+in
+
+stdenv.mkDerivation {
+  inherit pname version;
+
+  srcs = [ free_src ] ++ lib.optional unfree_assets assets;
+
+  sourceRoot = free_src.name;
+
+  postUnpack = lib.optionalString unfree_assets ''
+    mv data $sourceRoot
+  '';
+
+  buildInputs = [
+    openal curl libogg libvorbis libtheora SDL2 SDL2_image zlib clang
+  ];
+
+  env.NIX_CFLAGS_COMPILE = toString [
+    "-I${SDL2.dev}/include/SDL2"
+  ];
+
+  enableParallelBuilding = true;
+
+  makeFlags = [
+    "OPT=true"
+    "RELEASE=true"
+    "DATA_DIR=$(out)/share"
+    "ENABLE_LOCAL_USER_DIR=true"
+    "NO_STEAMWORKS=true"
+  ];
+
+  installPhase = ''
+    install -Dm755 keeper $out/bin/keeper
+    install -Dm755 appconfig.txt $out/share/appconfig.txt
+
+    cp -r data_free $out/share
+    cp -r data_contrib $out/share
+    ${lib.optionalString unfree_assets "cp -r data $out/share"}
+  '';
+
+  meta = with lib; {
+    description = "A dungeon management rogue-like";
+    homepage = "https://keeperrl.com/";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ onny ];
+    # TODO: Add OS X
+    platforms = [ "i686-linux" "x86_64-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/klavaro/default.nix b/nixpkgs/pkgs/games/klavaro/default.nix
new file mode 100644
index 000000000000..b99969bf6a81
--- /dev/null
+++ b/nixpkgs/pkgs/games/klavaro/default.nix
@@ -0,0 +1,57 @@
+{ lib, stdenv
+, fetchurl
+, makeWrapper
+, curl
+, espeak
+, file
+, gtk3
+, gtkdatabox
+, intltool
+, pkg-config
+}:
+
+stdenv.mkDerivation rec {
+  pname = "klavaro";
+  version = "3.14";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/klavaro/${pname}-${version}.tar.bz2";
+    hash = "sha256-hxh+SdMBxRDmlkCYzbYSEmvwMNKodf15nq3K0+rlbas=";
+  };
+
+  nativeBuildInputs = [ intltool makeWrapper pkg-config ];
+  buildInputs = [ curl gtk3 gtkdatabox ];
+
+  postPatch = ''
+    substituteInPlace src/tutor.c --replace '"espeak ' '"${espeak}/bin/espeak '
+  '';
+
+  postInstall = ''
+    wrapProgram $out/bin/klavaro \
+      --prefix LD_LIBRARY_PATH : $out/lib
+  '';
+
+  # Fixes /usr/bin/file: No such file or directory
+  preConfigure = ''
+    substituteInPlace configure \
+      --replace "/usr/bin/file" "${file}/bin/file"
+  '';
+
+  # remove forbidden references to $TMPDIR
+  preFixup = lib.optionalString stdenv.isLinux ''
+    for f in "$out"/bin/*; do
+      if isELF "$f"; then
+        patchelf --shrink-rpath --allowed-rpath-prefixes "$NIX_STORE" "$f"
+      fi
+    done
+  '';
+
+  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/nixpkgs/pkgs/games/kobodeluxe/default.nix b/nixpkgs/pkgs/games/kobodeluxe/default.nix
new file mode 100644
index 000000000000..9dea90824204
--- /dev/null
+++ b/nixpkgs/pkgs/games/kobodeluxe/default.nix
@@ -0,0 +1,25 @@
+{lib, stdenv, fetchurl, SDL, SDL_image, libGLU, libGL} :
+
+stdenv.mkDerivation rec {
+  pname = "kobodeluxe";
+  version = "0.5.1";
+  src = fetchurl {
+    url = "http://olofson.net/kobodl/download/KoboDeluxe-${version}.tar.bz2";
+    sha256 = "0f7b910a399d985437564af8c5d81d6dcf22b96b26b01488d72baa6a6fdb5c2c";
+  };
+
+  buildInputs = [ SDL SDL_image libGLU libGL ];
+
+  prePatch = ''
+    sed -e 's/char \*tok/const char \*tok/' -i graphics/window.cpp
+  '';
+
+  patches = [ ./glibc29.patch ];
+
+  meta = {
+    homepage = "http://olofson.net/kobodl/";
+    description = "Enhanced version of Akira Higuchi's game XKobo  for Un*x systems with X11";
+    license = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/kobodeluxe/glibc29.patch b/nixpkgs/pkgs/games/kobodeluxe/glibc29.patch
new file mode 100644
index 000000000000..7a9ef355a821
--- /dev/null
+++ b/nixpkgs/pkgs/games/kobodeluxe/glibc29.patch
@@ -0,0 +1,83 @@
+--- a/enemies.h
++++ b/enemies.h
+@@ -70,9 +70,9 @@
+ extern const enemy_kind bomb2;
+ extern const enemy_kind bombdeto;
+ extern const enemy_kind cannon;
+-extern const enemy_kind pipe1;
++extern const enemy_kind pipeone;
+ extern const enemy_kind core;
+-extern const enemy_kind pipe2;
++extern const enemy_kind pipetwo;
+ extern const enemy_kind rock;
+ extern const enemy_kind ring;
+ extern const enemy_kind enemy_m1;
+@@ -430,7 +430,7 @@
+ 
+ inline int _enemy::is_pipe()
+ {
+-	return ((_state != notuse) && ((ek == &pipe1) || (ek == &pipe2)));
++	return ((_state != notuse) && ((ek == &pipeone) || (ek == &pipetwo)));
+ }
+ 
+ 
+--- a/enemy.cpp
++++ b/enemy.cpp
+@@ -713,7 +713,7 @@
+ 
+ void _enemy::kill_cannon()
+ {
+-	enemies.make(&pipe1, CS2PIXEL(x), CS2PIXEL(y));
++	enemies.make(&pipeone, CS2PIXEL(x), CS2PIXEL(y));
+ 	sound.g_base_node_explo(x, y);
+ 	release();
+ }
+@@ -755,10 +755,10 @@
+ 
+ void _enemy::kill_core()
+ {
+-	enemies.make(&pipe2, CS2PIXEL(x), CS2PIXEL(y), 0, 0, 3);
+-	enemies.make(&pipe2, CS2PIXEL(x), CS2PIXEL(y), 0, 0, 7);
+-	enemies.make(&pipe2, CS2PIXEL(x), CS2PIXEL(y), 0, 0, 1);
+-	enemies.make(&pipe2, CS2PIXEL(x), CS2PIXEL(y), 0, 0, 5);
++	enemies.make(&pipetwo, CS2PIXEL(x), CS2PIXEL(y), 0, 0, 3);
++	enemies.make(&pipetwo, CS2PIXEL(x), CS2PIXEL(y), 0, 0, 7);
++	enemies.make(&pipetwo, CS2PIXEL(x), CS2PIXEL(y), 0, 0, 1);
++	enemies.make(&pipetwo, CS2PIXEL(x), CS2PIXEL(y), 0, 0, 5);
+ 	enemies.make(&explosion4, CS2PIXEL(x), CS2PIXEL(y));
+ 	sound.g_base_core_explo(x, y);
+ 	release();
+@@ -851,7 +851,7 @@
+ 		screen.set_map(x1, y1, m ^ a);
+ 	release();
+ }
+-const enemy_kind pipe1 = {
++const enemy_kind pipeone = {
+ 	0,
+ 	&_enemy::make_pipe1,
+ 	&_enemy::move_pipe1,
+@@ -978,19 +978,19 @@
+ 	}
+ 	p ^= a;
+ 	if(p & U_MASK)
+-		enemies.make(&pipe2, CS2PIXEL(x), CS2PIXEL(y), 0, 0, 1);
++		enemies.make(&pipetwo, CS2PIXEL(x), CS2PIXEL(y), 0, 0, 1);
+ 	if(p & R_MASK)
+-		enemies.make(&pipe2, CS2PIXEL(x), CS2PIXEL(y), 0, 0, 3);
++		enemies.make(&pipetwo, CS2PIXEL(x), CS2PIXEL(y), 0, 0, 3);
+ 	if(p & D_MASK)
+-		enemies.make(&pipe2, CS2PIXEL(x), CS2PIXEL(y), 0, 0, 5);
++		enemies.make(&pipetwo, CS2PIXEL(x), CS2PIXEL(y), 0, 0, 5);
+ 	if(p & L_MASK)
+-		enemies.make(&pipe2, CS2PIXEL(x), CS2PIXEL(y), 0, 0, 7);
++		enemies.make(&pipetwo, CS2PIXEL(x), CS2PIXEL(y), 0, 0, 7);
+ 	manage.add_score(10);
+ 	release();
+ }
+ 
+ 
+-const enemy_kind pipe2 = {
++const enemy_kind pipetwo = {
+ 	0,
+ 	&_enemy::make_pipe2,
+ 	&_enemy::move_pipe2,
diff --git a/nixpkgs/pkgs/games/koboredux/default.nix b/nixpkgs/pkgs/games/koboredux/default.nix
new file mode 100644
index 000000000000..91981fc85fba
--- /dev/null
+++ b/nixpkgs/pkgs/games/koboredux/default.nix
@@ -0,0 +1,94 @@
+{ lib, stdenv
+, fetchFromGitHub
+, fetchpatch
+, requireFile
+, cmake
+, pkg-config
+, SDL2
+, SDL2_image
+, audiality2
+, useProprietaryAssets ? true
+}:
+
+with lib;
+
+let
+  pname = "koboredux";
+  version = "0.7.5.1";
+
+  main_src = fetchFromGitHub {
+    owner = "olofson";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "09h9r65z8bar2z89s09j6px0gdq355kjf38rmd85xb2aqwnm6xig";
+  };
+
+  assets_src = 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.
+    '';
+  };
+
+in
+
+stdenv.mkDerivation rec {
+  inherit pname version;
+
+  src = [ main_src ] ++ optional useProprietaryAssets assets_src;
+
+  sourceRoot = main_src.name;
+
+  # 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/nixpkgs/pkgs/games/koules/default.nix b/nixpkgs/pkgs/games/koules/default.nix
new file mode 100644
index 000000000000..360415dc2e1d
--- /dev/null
+++ b/nixpkgs/pkgs/games/koules/default.nix
@@ -0,0 +1,77 @@
+{ stdenv
+, lib
+, fetchurl
+, fetchzip
+, copyDesktopItems
+, gccmakedep
+, imake
+, installShellFiles
+, libX11
+, libXext
+, makeDesktopItem
+}:
+
+let
+  debian-extras = fetchzip {
+    url = "mirror://debian/pool/main/k/koules/koules_1.4-27.debian.tar.xz";
+    hash = "sha256-g0Z6C1YSZL6N2eYUuZgXkPDoOLc4e9jAFL3ivk3OAS8=";
+  };
+in
+stdenv.mkDerivation rec {
+  pname = "koules";
+  version = "1.4";
+
+  src = fetchurl {
+    url = "https://www.ucw.cz/~hubicka/koules/packages/${pname}${version}-src.tar.gz";
+    hash = "sha256-w2+T/q/uvVmYO/RBACQOZ6hKi6yr1+5SjJMEbe/kohs=";
+  };
+
+  nativeBuildInputs = [ imake gccmakedep installShellFiles copyDesktopItems ];
+  buildInputs = [ libX11 libXext ];
+
+  # Debian maintains lots of patches for koules. Let's include all of them.
+  prePatch = ''
+    patches="$patches $(cat ${debian-extras}/patches/series | sed 's|^|${debian-extras}/patches/|')"
+  '';
+
+  postPatch = ''
+    # We do not want to depend on that particular font to be available in the
+    # xserver, hence substitute it by a font which is always available
+    sed -ie 's:-schumacher-clean-bold-r-normal--8-80-75-75-c-80-\*iso\*:fixed:' xlib/init.c
+  '';
+
+  preBuild = ''
+    cp xkoules.6 xkoules.man  # else "make" will not succeed
+    sed -ie "s:^SOUNDDIR\s*=.*:SOUNDDIR=$out/lib:" Makefile
+    sed -ie "s:^KOULESDIR\s*=.*:KOULESDIR=$out:" Makefile
+  '';
+
+  installPhase = ''
+    runHook preInstall
+    install -Dm755 xkoules $out/bin/xkoules
+    install -Dm755 koules.sndsrv.linux $out/lib/koules.sndsrv.linux
+    install -m644 sounds/* $out/lib/
+    install -Dm644 Koules.xpm $out/share/pixmaps/koules.xpm
+    installManPage xkoules.6
+    runHook postInstall
+  '';
+
+  desktopItems = [
+    (makeDesktopItem {
+      desktopName = "Koules";
+      name = "koules";
+      exec = "xkoules";
+      icon = "koules";
+      comment = "Push your enemies away, but stay away from obstacles";
+      categories = [ "Game" "ArcadeGame" ];
+    })
+  ];
+
+  meta = with lib; {
+    homepage = "https://www.ucw.cz/~hubicka/koules/English/";
+    description = "Fast arcade game based on the fundamental law of body attraction";
+    license = licenses.gpl2Plus;
+    maintainers = [ maintainers.iblech ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/ldmud/default.nix b/nixpkgs/pkgs/games/ldmud/default.nix
new file mode 100644
index 000000000000..41348fa0bcfa
--- /dev/null
+++ b/nixpkgs/pkgs/games/ldmud/default.nix
@@ -0,0 +1,102 @@
+{ lib
+, fetchFromGitHub
+, stdenv
+, autoreconfHook
+, pkg-config
+, bison
+, libiconv
+, pcre
+, libgcrypt
+, libxcrypt
+, json_c
+, libxml2
+, ipv6Support ? false
+, mccpSupport ? false
+, zlib
+, mysqlSupport ? false
+, libmysqlclient
+, postgresSupport ? false
+, postgresql
+, sqliteSupport ? false
+, sqlite
+, tlsSupport ? false
+, openssl
+, pythonSupport ? false
+, python310
+, ...
+}:
+
+stdenv.mkDerivation rec {
+  pname = "ldmud";
+  version = "3.6.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-PkrjP7tSZMaj61Hsn++7+CumhqFPLbf0+eAI6afP9HA=";
+  };
+
+  sourceRoot = "${src.name}/src";
+
+  nativeBuildInputs =
+    [ autoreconfHook pkg-config bison ];
+  buildInputs = [ libgcrypt libxcrypt pcre json_c libxml2 ]
+    ++ lib.optional mccpSupport zlib ++ lib.optional mysqlSupport libmysqlclient
+    ++ lib.optional postgresSupport postgresql
+    ++ lib.optional sqliteSupport sqlite ++ lib.optional tlsSupport openssl
+    ++ lib.optional pythonSupport python310
+    ++ lib.optionals stdenv.isDarwin [ libiconv ];
+
+  # To support systems without autoconf LD puts its configure.ac in a non-default
+  # location and uses a helper script. We skip that script and symlink the .ac
+  # file to where the autoreconfHook find it.
+  preAutoreconf = ''
+    ln -fs ./autoconf/configure.ac ./
+  '';
+
+  configureFlags = [
+    "--enable-erq=xerq"
+    "--enable-filename-spaces"
+    "--enable-use-json"
+    "--enable-use-xml=xml2"
+    (lib.enableFeature ipv6Support "use-ipv6")
+    (lib.enableFeature mccpSupport "use-mccp")
+    (lib.enableFeature mysqlSupport "use-mysql")
+    (lib.enableFeature postgresSupport "use-pgsql")
+    (lib.enableFeature sqliteSupport "use-sqlite")
+    (lib.enableFeatureAs tlsSupport "use-tls" "ssl")
+    (lib.enableFeature pythonSupport "use-python")
+  ];
+
+  preConfigure = lib.optionalString mysqlSupport ''
+    export CPPFLAGS="-I${lib.getDev libmysqlclient}/include/mysql"
+    export LDFLAGS="-L${libmysqlclient}/lib/mysql"
+  '';
+
+  installTargets = [ "install-driver" "install-utils" "install-headers" ];
+
+  postInstall = ''
+    mkdir -p "$out/share/"
+    cp -v ../COPYRIGHT $out/share/
+  '';
+
+  meta = with lib; {
+    description = "A gamedriver for LPMuds including a LPC compiler, interpreter and runtime";
+    homepage = "https://ldmud.eu";
+    changelog = "https://github.com/ldmud/ldmud/blob/${version}/HISTORY";
+    longDescription = ''
+      LDMud started as a project to clean up and modernize Amylaar's LPMud
+      gamedriver. Primary goals are full documentation, a commented source body
+      and out-of-the-box support for the major mudlibs, of which the commented
+      source body has been pretty much completed. During the course of work
+      a lot of bug fixes and improvements found their way into the driver - much
+      more than originally expected, and definitely enough to make LDMud
+      a driver in its own right.
+    '';
+    # See https://github.com/ldmud/ldmud/blob/master/COPYRIGHT
+    license = licenses.unfreeRedistributable;
+    platforms = with platforms; linux ++ darwin;
+    maintainers = with maintainers; [ cpu ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/leela-zero/default.nix b/nixpkgs/pkgs/games/leela-zero/default.nix
new file mode 100644
index 000000000000..e7b6c7934188
--- /dev/null
+++ b/nixpkgs/pkgs/games/leela-zero/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, boost
+, opencl-headers
+, ocl-icd
+, qtbase
+, zlib
+}:
+
+stdenv.mkDerivation rec {
+  pname = "leela-zero";
+  version = "0.17";
+
+  src = fetchFromGitHub {
+    owner = "gcp";
+    repo = "leela-zero";
+    rev = "v${version}";
+    sha256 = "sha256-AQRp2rkL9KCZdsJN6uz2Y+3kV4lyRLYjWn0p7UOjBMw=";
+    fetchSubmodules = true;
+  };
+
+  buildInputs = [ boost opencl-headers ocl-icd qtbase zlib ];
+
+  nativeBuildInputs = [ cmake ];
+
+  dontWrapQtApps = true;
+
+  meta = with lib; {
+    description = "Go engine modeled after AlphaGo Zero";
+    homepage = "https://github.com/gcp/leela-zero";
+    license = licenses.gpl3Plus;
+    maintainers = [ maintainers.averelld maintainers.omnipotententity ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/left4gore/default.nix b/nixpkgs/pkgs/games/left4gore/default.nix
new file mode 100644
index 000000000000..c203d03ab13e
--- /dev/null
+++ b/nixpkgs/pkgs/games/left4gore/default.nix
@@ -0,0 +1,48 @@
+{ stdenvNoCC, lib, fetchurl, buildFHSEnv }:
+
+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 = buildFHSEnv {
+    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/nixpkgs/pkgs/games/legendary-gl/default.nix b/nixpkgs/pkgs/games/legendary-gl/default.nix
new file mode 100644
index 000000000000..355002d716f1
--- /dev/null
+++ b/nixpkgs/pkgs/games/legendary-gl/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, gitUpdater
+, fetchFromGitHub
+, buildPythonApplication
+, pythonOlder
+, requests
+, filelock
+}:
+
+buildPythonApplication rec {
+  pname = "legendary-gl"; # Name in pypi
+  version = "0.20.34";
+
+  src = fetchFromGitHub {
+    owner = "derrod";
+    repo = "legendary";
+    rev = "56d439ed2d3d9f34e2b08fa23e627c23a487b8d6";
+    sha256 = "sha256-yCHeeEGw+9gtRMGyIhbStxJhmSM/1Fqly7HSRDkZILQ=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    filelock
+  ];
+
+  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; [ equirosa ];
+  };
+
+  passthru.updateScript = gitUpdater { };
+}
diff --git a/nixpkgs/pkgs/games/lgames/barrage/default.nix b/nixpkgs/pkgs/games/lgames/barrage/default.nix
new file mode 100644
index 000000000000..822ec04f1d45
--- /dev/null
+++ b/nixpkgs/pkgs/games/lgames/barrage/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, stdenv
+, fetchurl
+, SDL
+, SDL_mixer
+}:
+
+stdenv.mkDerivation rec {
+  pname = "barrage";
+  version = "1.0.7";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/lgames/${pname}-${version}.tar.gz";
+    hash = "sha256-cGYrG7A4Ffh51KyR+UpeWu7A40eqxI8g4LefBIs18kg=";
+  };
+
+  buildInputs = [
+    SDL
+    SDL_mixer
+  ];
+
+  hardeningDisable = [ "format" ];
+
+  meta = with lib; {
+    homepage = "https://lgames.sourceforge.io/Barrage/";
+    description = "A destructive action game";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ AndersonTorres ];
+    inherit (SDL.meta) platforms;
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/games/lgames/lbreakout2/default.nix b/nixpkgs/pkgs/games/lgames/lbreakout2/default.nix
new file mode 100644
index 000000000000..f554a1683eee
--- /dev/null
+++ b/nixpkgs/pkgs/games/lgames/lbreakout2/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, stdenv
+, fetchurl
+, fetchpatch
+, SDL
+, SDL_mixer
+, libintl
+, libpng
+, zlib
+}:
+
+stdenv.mkDerivation rec {
+  pname = "lbreakout2";
+  version = "2.6.5";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/lgames/${pname}-${version}.tar.gz";
+    sha256 = "0vwdlyvh7c4y80q5vp7fyfpzbqk9lq3w8pvavi139njkalbxc14i";
+  };
+
+  # Can't exit from pause without this patch
+  patches = [(fetchpatch {
+    url = "https://sources.debian.org/data/main/l/lbreakout2/2.6.5-2/debian/patches/sdl_fix_pauses.patch";
+    hash = "sha256-ycsuxfokpOblLky42MwtJowdEp7v5dZRMFIR4id4ZBI=";
+  })];
+
+  buildInputs = [
+    SDL
+    SDL_mixer
+    libintl
+    libpng
+    zlib
+  ];
+
+  # With fortify it crashes at runtime:
+  #   *** buffer overflow detected ***: terminated
+  #   Aborted (core dumped)
+  hardeningDisable = [ "fortify" ];
+
+  meta = with lib; {
+    homepage = "http://lgames.sourceforge.net/LBreakout2/";
+    description = "Breakout clone from the LGames series";
+    license = licenses.gpl2Plus;
+    maintainers = [ maintainers.ciil ];
+    platforms = platforms.unix;
+    hydraPlatforms = lib.platforms.linux; # sdl-config times out on darwin
+  };
+}
diff --git a/nixpkgs/pkgs/games/lgames/lbreakouthd/default.nix b/nixpkgs/pkgs/games/lgames/lbreakouthd/default.nix
new file mode 100644
index 000000000000..0f25ff36fa86
--- /dev/null
+++ b/nixpkgs/pkgs/games/lgames/lbreakouthd/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, stdenv
+, fetchurl
+, directoryListingUpdater
+, SDL2
+, SDL2_image
+, SDL2_mixer
+, SDL2_ttf
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "lbreakouthd";
+  version = "1.1.5";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/lgames/lbreakouthd-${finalAttrs.version}.tar.gz";
+    hash = "sha256-dejGWf/UQaXHaT3Q79T7IO1WBFE1ZbqE9QW5nRPbDeo=";
+  };
+
+  buildInputs = [
+    SDL2
+    SDL2_image
+    SDL2_mixer
+    SDL2_ttf
+  ];
+
+  hardeningDisable = [ "format" ];
+
+  passthru.updateScript = directoryListingUpdater {
+    inherit (finalAttrs) pname version;
+    url = "https://lgames.sourceforge.io/LBreakoutHD/";
+    extraRegex = "(?!.*-win(32|64)).*";
+  };
+
+  meta = {
+    homepage = "https://lgames.sourceforge.io/LBreakoutHD/";
+    description = "A widescreen Breakout clone";
+    license = lib.licenses.gpl2Plus;
+    maintainers = with lib.maintainers; [ AndersonTorres ];
+    inherit (SDL2.meta) platforms;
+    broken = stdenv.isDarwin;
+  };
+})
diff --git a/nixpkgs/pkgs/games/lgames/lpairs2/default.nix b/nixpkgs/pkgs/games/lgames/lpairs2/default.nix
new file mode 100644
index 000000000000..7993fd0657da
--- /dev/null
+++ b/nixpkgs/pkgs/games/lgames/lpairs2/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, stdenv
+, fetchurl
+, SDL2
+, SDL2_image
+, SDL2_mixer
+, SDL2_ttf
+, directoryListingUpdater
+}:
+
+stdenv.mkDerivation rec {
+  pname = "lpairs2";
+  version = "2.3";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/lgames/${pname}-${version}.tar.gz";
+    hash = "sha256-gw1BNkcztyTuoXRdx5+TBZNJEJNrLCfEUCQ1JzROogA=";
+  };
+
+  buildInputs = [
+    SDL2
+    SDL2_image
+    SDL2_mixer
+    SDL2_ttf
+  ];
+
+  passthru.updateScript = directoryListingUpdater {
+    inherit pname version;
+    url = "https://lgames.sourceforge.io/LPairs/";
+    extraRegex = "(?!.*-win(32|64)).*";
+  };
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    homepage = "http://lgames.sourceforge.net/LPairs/";
+    description = "Matching the pairs - a typical Memory Game";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ AndersonTorres ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/games/lgames/ltris/default.nix b/nixpkgs/pkgs/games/lgames/ltris/default.nix
new file mode 100644
index 000000000000..8cf581b376bf
--- /dev/null
+++ b/nixpkgs/pkgs/games/lgames/ltris/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, stdenv
+, fetchurl
+, SDL
+, SDL_mixer
+, directoryListingUpdater
+}:
+
+stdenv.mkDerivation rec {
+  pname = "ltris";
+  version = "1.2.7";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/lgames/${pname}-${version}.tar.gz";
+    hash = "sha256-EpHGpkLQa57hU6wKLnhVosmD6DnGGPGilN8E2ClSXLA=";
+  };
+
+  buildInputs = [
+    SDL
+    SDL_mixer
+  ];
+
+  hardeningDisable = [ "format" ];
+
+  passthru.updateScript = directoryListingUpdater {
+    inherit pname version;
+    url = "https://lgames.sourceforge.io/LTris/";
+    extraRegex = "(?!.*-win(32|64)).*";
+  };
+
+  meta = with lib; {
+    homepage = "https://lgames.sourceforge.io/LTris/";
+    description = "Tetris clone from the LGames series";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ AndersonTorres ciil ];
+    inherit (SDL.meta) platforms;
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/games/lgogdownloader/default.nix b/nixpkgs/pkgs/games/lgogdownloader/default.nix
new file mode 100644
index 000000000000..a28ccea53ca1
--- /dev/null
+++ b/nixpkgs/pkgs/games/lgogdownloader/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, pkg-config
+, curl
+, boost
+, liboauth
+, jsoncpp
+, htmlcxx
+, rhash
+, tinyxml-2
+, help2man
+, wrapQtAppsHook
+, qtbase
+, qtwebengine
+, testers
+, lgogdownloader
+
+, enableGui ? true
+}:
+
+stdenv.mkDerivation rec {
+  pname = "lgogdownloader";
+  version = "3.12";
+
+  src = fetchFromGitHub {
+    owner = "Sude-";
+    repo = "lgogdownloader";
+    rev = "v${version}";
+    hash = "sha256-IjZizO0HWDqtviY3TZ3AYYm5A0sU74YXjfFEtvQvv04=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+    help2man
+  ] ++ lib.optional enableGui wrapQtAppsHook;
+
+  buildInputs = [
+    boost
+    curl
+    htmlcxx
+    jsoncpp
+    liboauth
+    rhash
+    tinyxml-2
+  ] ++ lib.optionals enableGui [
+    qtbase
+    qtwebengine
+  ];
+
+  cmakeFlags = lib.optional enableGui "-DUSE_QT_GUI=ON";
+
+  passthru.tests = {
+    version = testers.testVersion { package = lgogdownloader; };
+  };
+
+  meta = with lib; {
+    description = "Unofficial downloader to GOG.com for Linux users. It uses the same API as the official GOGDownloader";
+    homepage = "https://github.com/Sude-/lgogdownloader";
+    license = licenses.wtfpl;
+    maintainers = with maintainers; [ _0x4A6F ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/liberal-crime-squad/default.nix b/nixpkgs/pkgs/games/liberal-crime-squad/default.nix
new file mode 100644
index 000000000000..f46bd3b50a38
--- /dev/null
+++ b/nixpkgs/pkgs/games/liberal-crime-squad/default.nix
@@ -0,0 +1,30 @@
+{ fetchFromGitHub, lib, stdenv, autoreconfHook, libiconv, ncurses, SDL2, SDL2_mixer }:
+
+stdenv.mkDerivation {
+  version = "2016-07-06";
+  pname = "liberal-crime-squad";
+
+  src = fetchFromGitHub {
+    owner = "Kamal-Sadek";
+    repo = "Liberal-Crime-Squad";
+    rev = "2ace84e";
+    sha256 = "0mcldn8ivlfyjfx22ygzcbbw3bzl0j6vi3g6jyj8jmcrni61mgmb";
+  };
+
+  nativeBuildInputs = [ autoreconfHook ];
+  buildInputs = [ libiconv ncurses SDL2 SDL2_mixer ];
+
+  enableParallelBuilding = true;
+
+  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.
+    '';
+    homepage = "https://github.com/Kamal-Sadek/Liberal-Crime-Squad";
+    maintainers = [ maintainers.rardiol ];
+    mainProgram = "crimesquad";
+    license = licenses.gpl2;
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/games/liberation-circuit/default.nix b/nixpkgs/pkgs/games/liberation-circuit/default.nix
new file mode 100644
index 000000000000..365fbb2983eb
--- /dev/null
+++ b/nixpkgs/pkgs/games/liberation-circuit/default.nix
@@ -0,0 +1,42 @@
+{ stdenv, lib, fetchFromGitHub, fetchurl, pkg-config, makeWrapper, allegro5, libGL }:
+
+stdenv.mkDerivation rec {
+  pname = "liberation-circuit";
+  version = "unstable-2022-01-02";
+
+  src = fetchFromGitHub {
+    owner = "linleyh";
+    repo = pname;
+    rev = "19e3363547793e931fd9419b61ebc2cd8e257714";
+    sha256 = "zIwjh4CBSmKz7pF7GM5af+VslWho5jHOLsulbW4C8TY=";
+  };
+
+  nativeBuildInputs = [ pkg-config makeWrapper ];
+  buildInputs = [ allegro5 libGL ];
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/opt
+    cp -r bin $out/opt/liberation-circuit
+    chmod +x $out/opt/liberation-circuit/launcher.sh
+    makeWrapper $out/opt/liberation-circuit/launcher.sh $out/bin/liberation-circuit
+
+    install -D linux-packaging/liberation-circuit.desktop $out/share/applications/liberation-circuit.desktop
+    install -D linux-packaging/liberation-circuit.appdata.xml $out/share/metainfo/liberation-circuit.appdata.xml
+    install -D linux-packaging/icon-256px.png $out/share/pixmaps/liberation-circuit.png
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Real-time strategy game with programmable units";
+    longDescription = ''
+      Escape from a hostile computer system! Harvest data to create an armada of battle-processes to aid your escape! Take command directly and play the game as an RTS, or use the game's built-in editor and compiler to write your own unit AI in a simplified version of C.
+    '';
+    homepage = "https://linleyh.itch.io/liberation-circuit";
+    maintainers = with maintainers; [ emilytrau ];
+    license = licenses.gpl3Only;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/libremines/default.nix b/nixpkgs/pkgs/games/libremines/default.nix
new file mode 100644
index 000000000000..fb7f6ae96873
--- /dev/null
+++ b/nixpkgs/pkgs/games/libremines/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, wrapQtAppsHook
+, qtmultimedia
+, qtwayland
+}:
+
+stdenv.mkDerivation rec {
+  pname = "libremines";
+  version = "1.10.0";
+
+  src = fetchFromGitHub {
+    owner = "Bollos00";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-aqWzTvvRoke+Rakb6dNpDoD7haKHEKW3XARGLrH2WiY=";
+  };
+
+  nativeBuildInputs = [ cmake wrapQtAppsHook ];
+
+  buildInputs = [
+    qtmultimedia
+  ] ++ lib.optionals stdenv.isLinux [
+    qtwayland
+  ];
+
+  cmakeFlags = [ "-DUSE_QT6=TRUE" ];
+
+  meta = with lib; {
+    description = "Qt based Minesweeper game";
+    longDescription = ''
+      A Free/Libre and Open Source Software Qt based Minesweeper game available for GNU/Linux, FreeBSD and Windows systems.
+    '';
+    homepage = "https://bollos00.github.io/LibreMines";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ aleksana ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/games/lincity/default.nix b/nixpkgs/pkgs/games/lincity/default.nix
new file mode 100644
index 000000000000..50b48f0a1582
--- /dev/null
+++ b/nixpkgs/pkgs/games/lincity/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv, fetchurl, fetchpatch, libX11, libXext, xorgproto, libICE, libSM, libpng12, zlib }:
+
+stdenv.mkDerivation rec {
+  pname = "lincity";
+  version = "1.13.1";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/lincity/${pname}-${version}.tar.gz";
+    sha256 = "0p81wl7labyfb6rgp0hi42l2akn3n7r2bnxal1wyvjylzw8vsk3v";
+  };
+
+  buildInputs = [
+    libICE libpng12 libSM libX11 libXext
+    xorgproto zlib
+  ];
+
+  patches = [
+    (fetchpatch {
+      url = "https://sources.debian.net/data/main/l/lincity/1.13.1-13/debian/patches/extern-inline-functions-777982";
+      sha256 = "06dp3zwk0z5wr5a3xaaj2my75vcjcy98vc22hsag7ggd9jwrkcp0";
+    })
+    (fetchpatch {
+      url = "https://sources.debian.net/data/main/l/lincity/1.13.1-13/debian/patches/clang-ftbfs-757859";
+      sha256 = "098rnywcsyc0m11x4a5m3dza8i0jmfh6pacfgma1vvxpsfkb6ngp";
+    })
+  ];
+
+  # Workaround build failure on -fno-common toolchains like upstream
+  # gcc-10. Otherwise build fails as:
+  #   ld: modules/.libs/libmodules.a(rocket_pad.o):/build/lincity-1.13.1/modules/../screen.h:23:
+  #     multiple definition of `monthgraph_style'; ldsvguts.o:/build/lincity-1.13.1/screen.h:23: first defined here
+  env.NIX_CFLAGS_COMPILE = "-fcommon";
+
+  meta = with lib; {
+    description = "City simulation game";
+    license = licenses.gpl2Plus;
+    homepage = "https://sourceforge.net/projects/lincity";
+    maintainers = with maintainers; [ ];
+    # ../lcintl.h:14:10: fatal error: 'libintl.h' file not found
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/games/lincity/ng.nix b/nixpkgs/pkgs/games/lincity/ng.nix
new file mode 100644
index 000000000000..9901255be4dc
--- /dev/null
+++ b/nixpkgs/pkgs/games/lincity/ng.nix
@@ -0,0 +1,84 @@
+{ stdenv
+, SDL2
+, SDL2_gfx
+, SDL2_image
+, SDL2_mixer
+, SDL2_ttf
+, autoreconfHook
+, fetchFromGitHub
+, jam
+, lib
+, libGL
+, libGLU
+, libX11
+, libxml2
+, libxslt
+, physfs
+, pkg-config
+, xorgproto
+, zlib
+}:
+
+stdenv.mkDerivation {
+  pname = "lincity-ng";
+  version = "2.9beta.20211125";
+
+  src = fetchFromGitHub {
+    owner = "lincity-ng";
+    repo = "lincity-ng";
+    rev = "b9062bec252632ca5d26b98d71453b8762c63173";
+    sha256 = "0l07cn8rmpmlqdppjc2ikh5c7xmwib27504zpmn3n9pryp394r46";
+  };
+
+  hardeningDisable = [ "format" ];
+
+  nativeBuildInputs = [
+    autoreconfHook
+    jam
+    pkg-config
+  ];
+
+  buildInputs = [
+    SDL2
+    SDL2_gfx
+    SDL2_image
+    SDL2_mixer
+    SDL2_ttf
+    libGL
+    libGLU
+    libX11
+    libxml2
+    libxslt
+    physfs
+    xorgproto
+    zlib
+  ];
+
+  autoreconfPhase = ''
+    ./autogen.sh
+  '';
+
+  buildPhase = ''
+    runHook preBuild
+
+    AR='ar r' jam -j $NIX_BUILD_CORES
+
+    runHook postBuild
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    touch CREDITS
+    AR='ar r' jam install
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "City building game";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ raskin ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/linthesia/default.nix b/nixpkgs/pkgs/games/linthesia/default.nix
new file mode 100644
index 000000000000..0fd252e7ba5d
--- /dev/null
+++ b/nixpkgs/pkgs/games/linthesia/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, SDL2
+, SDL2_image
+, SDL2_ttf
+, alsa-lib
+, fetchFromGitHub
+, glibmm
+, gtk3
+, libGL
+, libGLU
+, meson
+, ninja
+, pkg-config
+, python3
+, sqlite
+, stdenv
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "linthesia";
+  version = "unstable-2023-05-23";
+
+  src = fetchFromGitHub {
+    owner = "linthesia";
+    repo = "linthesia";
+    rev = "1f2701241f8865c2f5c14a97b81ae64884cf0396";
+    sha256 = "sha256-3uPcpDUGtAGW9q/u8Cn+0bNqikII1Y/a0PKARW/5nao=";
+  };
+
+  postPatch = ''
+    patchShebangs meson_post_install.py
+  '';
+
+  nativeBuildInputs = [ meson ninja pkg-config python3 wrapGAppsHook ];
+  buildInputs = [
+    libGL
+    libGLU
+    alsa-lib
+    glibmm
+    sqlite
+    SDL2
+    SDL2_ttf
+    SDL2_image
+    gtk3.out # icon cache
+  ];
+
+  meta = with lib; {
+    description = "A game of playing music using a MIDI keyboard following a MIDI file";
+    inherit (src.meta) homepage;
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ ckie ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/liquidwar/5.nix b/nixpkgs/pkgs/games/liquidwar/5.nix
new file mode 100644
index 000000000000..fc9802d46e5e
--- /dev/null
+++ b/nixpkgs/pkgs/games/liquidwar/5.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, fetchurl, allegro }:
+stdenv.mkDerivation rec {
+  version = "5.6.5";
+  pname = "liquidwar5";
+  src = fetchurl {
+    url = "http://www.ufoot.org/download/liquidwar/v5/${version}/liquidwar-${version}.tar.gz";
+    sha256 = "2tCqhN1BbK0FVCHtm0DfOe+ueNPfdZwFg8ZMVPfy/18=";
+  };
+
+  buildInputs = [ allegro ];
+
+  configureFlags = lib.optional stdenv.isx86_64 "--disable-asm";
+
+  hardeningDisable = [ "format" ];
+
+  env.NIX_CFLAGS_COMPILE = toString [
+    # Workaround build failure on -fno-common toolchains like upstream
+    # gcc-10. Otherwise build fails as:
+    #   ld: random.o:(.bss+0x0): multiple definition of `LW_RANDOM_ON'; game.o:(.bss+0x4): first defined here
+    "-fcommon"
+
+    "-lm"
+  ];
+
+  meta = with lib; {
+    description = "The classic version of a quick tactics game LiquidWar";
+    maintainers = [ maintainers.raskin ];
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/liquidwar/default.nix b/nixpkgs/pkgs/games/liquidwar/default.nix
new file mode 100644
index 000000000000..83ac293f8b63
--- /dev/null
+++ b/nixpkgs/pkgs/games/liquidwar/default.nix
@@ -0,0 +1,53 @@
+{ 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
+, pkg-config }:
+
+stdenv.mkDerivation rec {
+  pname = "liquidwar6";
+  version = "0.6.3902";
+
+  src = fetchurl {
+    url = "mirror://gnu/liquidwar6/${pname}-${version}.tar.gz";
+    sha256 = "1976nnl83d8wspjhb5d5ivdvdxgb8lp34wp54jal60z4zad581fn";
+  };
+
+  buildInputs = [
+    xorgproto libX11 gmp guile
+    libjpeg libpng
+    expat gettext perl
+    SDL SDL_image SDL_mixer SDL_ttf
+    curl sqlite
+    libogg libvorbis csound
+    libXrender libcaca cunit
+    libtool readline
+  ];
+
+  nativeBuildInputs = [ pkg-config ];
+
+  hardeningDisable = [ "format" ];
+
+  env.NIX_CFLAGS_COMPILE = toString (lib.optionals (stdenv.cc.isGNU && lib.versionAtLeast stdenv.cc.version "12") [
+    # Needed with GCC 12 but problematic with some old GCCs
+    "-Wno-error=address"
+    "-Wno-error=use-after-free"
+  ] ++ [
+    "-Wno-error=deprecated-declarations"
+    # Avoid GL_GLEXT_VERSION double definition
+    " -DNO_SDL_GLEXT"
+  ]);
+
+  # To avoid problems finding SDL_types.h.
+  configureFlags = [ "CFLAGS=-I${lib.getDev SDL}/include/SDL" ];
+
+  meta = with lib; {
+    description = "Quick tactics game";
+    homepage = "https://www.gnu.org/software/liquidwar6/";
+    maintainers = [ maintainers.raskin ];
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/lugaru/default.nix b/nixpkgs/pkgs/games/lugaru/default.nix
new file mode 100644
index 000000000000..9d10691fe49c
--- /dev/null
+++ b/nixpkgs/pkgs/games/lugaru/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, fetchFromGitLab, cmake, openal, pkg-config, libogg,
+  libvorbis, SDL2, makeWrapper, libpng, libjpeg_turbo, libGLU }:
+
+with lib;
+
+stdenv.mkDerivation rec {
+
+  pname = "lugaru";
+  version = "1.2";
+
+  src = fetchFromGitLab {
+    owner = "osslugaru";
+    repo = "lugaru";
+    rev = version;
+    sha256 = "089rblf8xw3c6dq96vnfla6zl8gxcpcbc1bj5jysfpq63hhdpypz";
+  };
+
+  nativeBuildInputs = [ makeWrapper cmake pkg-config ];
+
+  buildInputs = [ libGLU openal SDL2 libogg libvorbis libpng libjpeg_turbo ];
+
+  cmakeFlags = [ "-DSYSTEM_INSTALL=ON" ];
+
+  meta = {
+    description = "Third person ninja rabbit fighting game";
+    homepage = "https://osslugaru.gitlab.io";
+    maintainers = [ ];
+    platforms = platforms.linux;
+    license = lib.licenses.gpl2Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/games/lzwolf/default.nix b/nixpkgs/pkgs/games/lzwolf/default.nix
new file mode 100644
index 000000000000..37bcc7fc8e06
--- /dev/null
+++ b/nixpkgs/pkgs/games/lzwolf/default.nix
@@ -0,0 +1,62 @@
+{ stdenv
+, lib
+, fetchFromBitbucket
+, p7zip
+, cmake
+, SDL2
+, bzip2
+, zlib
+, libjpeg
+, libsndfile
+, mpg123
+, pkg-config
+, SDL2_net
+, SDL2_mixer
+}:
+
+stdenv.mkDerivation rec {
+  pname = "lzwolf";
+  # Fix-Me: Remember to remove SDL2_mixer pin (at top-level) on next lzwolf upgrade.
+  version = "unstable-2022-12-26";
+
+  src = fetchFromBitbucket {
+    owner = "linuxwolf6";
+    repo = "lzwolf";
+    rev = "a24190604296e16941c601b57afe4350462fc659";
+    sha256 = "sha256-CtBdvk6LXb/ll92Fxig/M4t4QNj8dNFJYd8F99b47kQ=";
+  };
+
+  postPatch = ''
+    # SDL2_net-2.2.0 changed CMake component name slightly.
+    substituteInPlace src/CMakeLists.txt \
+      --replace 'SDL2::SDL2_net' 'SDL2_net::SDL2_net'
+  '';
+
+  nativeBuildInputs = [ p7zip pkg-config cmake ];
+  buildInputs = [
+    SDL2 bzip2 zlib libjpeg SDL2_mixer SDL2_net libsndfile mpg123
+  ];
+
+  cmakeFlags = [
+    "-DGPL=ON"
+  ];
+
+  doCheck = true;
+
+  installPhase = ''
+    install -Dm755 lzwolf "$out/lib/lzwolf/lzwolf"
+    for i in *.pk3; do
+      install -Dm644 "$i" "$out/lib/lzwolf/$i"
+    done
+    mkdir -p $out/bin
+    ln -s $out/lib/lzwolf/lzwolf $out/bin/lzwolf
+  '';
+
+  meta = with lib; {
+    homepage = "https://bitbucket.org/linuxwolf6/lzwolf";
+    description = "Enhanced fork of ECWolf, a Wolfenstein 3D source port";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ tgunnoe ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/macopix/default.nix b/nixpkgs/pkgs/games/macopix/default.nix
new file mode 100644
index 000000000000..277752dc91c3
--- /dev/null
+++ b/nixpkgs/pkgs/games/macopix/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, fetchurl, pkg-config, gtk, openssl }:
+
+stdenv.mkDerivation rec {
+  pname = "macopix";
+  version = "1.7.4";
+
+  src = fetchurl {
+    url = "http://rosegray.sakura.ne.jp/macopix/macopix-${version}.tar.bz2";
+    sha256 = "0sgnr0wrw3hglcnsyvipll7icfv69ssmyw584zfhk1rgramlkzyb";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ gtk openssl ];
+
+  preConfigure = ''
+    # Build fails on Linux with windres.
+    export ac_cv_prog_WINDRES=
+  '';
+
+  enableParallelBuilding = true;
+
+  # Workaround build failure on -fno-common toolchains:
+  #   ld: dnd.o:src/main.h:136: multiple definition of
+  #     `MENU_EXT'; main.o:src/main.h:136: first defined here
+  env.NIX_CFLAGS_COMPILE = "-fcommon";
+
+  NIX_LDFLAGS = "-lX11";
+
+  meta = {
+    description = "Mascot Constructive Pilot for X";
+    homepage = "http://rosegray.sakura.ne.jp/macopix/index-e.html";
+    license = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/maelstrom/default.nix b/nixpkgs/pkgs/games/maelstrom/default.nix
new file mode 100644
index 000000000000..065784d605ef
--- /dev/null
+++ b/nixpkgs/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/nixpkgs/pkgs/games/maelstrom/fix-compilation.patch b/nixpkgs/pkgs/games/maelstrom/fix-compilation.patch
new file mode 100644
index 000000000000..3fa8980c5ee1
--- /dev/null
+++ b/nixpkgs/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/nixpkgs/pkgs/games/manaplus/default.nix b/nixpkgs/pkgs/games/manaplus/default.nix
new file mode 100644
index 000000000000..1ea5231a65ea
--- /dev/null
+++ b/nixpkgs/pkgs/games/manaplus/default.nix
@@ -0,0 +1,33 @@
+{ 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 = "2.1.3.17";
+
+  src = fetchurl {
+    url = "https://download.evolonline.org/manaplus/download/${version}/manaplus-${version}.tar.xz";
+    sha256 = "sha256-6NFqxUjEAp7aiIScyTOFh2tT7PfuTCKH1vTgPpTm+j0=";
+  };
+
+  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;
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/games/maptool/default.nix b/nixpkgs/pkgs/games/maptool/default.nix
new file mode 100644
index 000000000000..d5fcbc47529b
--- /dev/null
+++ b/nixpkgs/pkgs/games/maptool/default.nix
@@ -0,0 +1,123 @@
+{ lib
+, copyDesktopItems
+, fetchurl
+, ffmpeg
+, gitUpdater
+, jre
+, libarchive
+, makeDesktopItem
+, openjfx
+, stdenvNoCC
+, wrapGAppsHook
+}:
+let
+  pname = "maptool";
+  version = "1.13.2";
+  repoBase = "https://github.com/RPTools/maptool";
+  src = fetchurl {
+    url = "${repoBase}/releases/download/${version}/maptool-${version}-x86_64.pkg.tar.zst";
+    hash = "sha256-Ntmro+t4qpP5BXW20t97ki0wt2NKaK5yQarsxDEKbb0=";
+  };
+
+  meta = with lib; {
+    description = "Virtual Tabletop for playing roleplaying games with remote players or face to face";
+    homepage = "https://www.rptools.net/toolbox/maptool/";
+    sourceProvenance = with sourceTypes; [
+      binaryBytecode
+      binaryNativeCode
+    ];
+    license = licenses.agpl3;
+    maintainers = with maintainers; [ rhendric ];
+    platforms = [ "x86_64-linux" ];
+  };
+
+  javafxModules = [ "base" "controls" "media" "swing" "web" "fxml" "graphics" ];
+
+  appClasspath = "share/${pname}";
+
+  classpath =
+    lib.concatMap (mod: [
+      "${openjfx}/modules_src/javafx.${mod}/module-info.java"
+      "${openjfx}/modules/javafx.${mod}"
+      "${openjfx}/modules_libs/javafx.${mod}"
+    ]) javafxModules ++
+    [ "$out/${appClasspath}/*" ];
+
+  jvmArgs = [
+    "-cp" (lib.concatStringsSep ":" classpath)
+    "-Xss8M"
+    "-Dsun.java2d.d3d=false"
+    "-Dfile.encoding=UTF-8"
+    "-Dpolyglot.engine.WarnInterpreterOnly=false"
+    "-XX:+ShowCodeDetailsInExceptionMessages"
+    "--add-opens=java.desktop/java.awt=ALL-UNNAMED"
+    "--add-opens=java.desktop/java.awt.geom=ALL-UNNAMED"
+    "--add-opens=java.desktop/sun.awt.geom=ALL-UNNAMED"
+    "--add-opens=java.base/java.util=ALL-UNNAMED"
+    "--add-opens=javafx.web/javafx.scene.web=ALL-UNNAMED"
+    "--add-opens=javafx.web/com.sun.webkit=ALL-UNNAMED"
+    "--add-opens=javafx.web/com.sun.webkit.dom=ALL-UNNAMED"
+    "--add-opens=java.desktop/javax.swing=ALL-UNNAMED"
+    "--add-opens=java.desktop/sun.awt.shell=ALL-UNNAMED"
+    "--add-opens=java.desktop/com.sun.java.swing.plaf.windows=ALL-UNNAMED"
+
+    # disable telemetry (the empty DSN disables the Sentry library, setting the
+    # environment to Development disables some logic inside MapTool)
+    "-Dsentry.dsn"
+    "-Dsentry.environment=Development"
+  ];
+
+  binName = pname;
+  rdnsName = "net.rptools.maptool";
+in
+stdenvNoCC.mkDerivation {
+  inherit pname version src meta;
+
+  dontUnpack = true;
+  dontConfigure = true;
+  dontBuild = true;
+  dontWrapGApps = true;
+
+  nativeBuildInputs = [
+    copyDesktopItems
+    libarchive
+    wrapGAppsHook
+  ];
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = rdnsName;
+      desktopName = "MapTool";
+      icon = rdnsName;
+      exec = binName;
+      comment = meta.description;
+      categories = [ "Game" ];
+    })
+  ];
+
+  installPhase = ''
+    runHook preInstall
+
+    dest=$out/${appClasspath}
+    install -dm755 "$dest"
+    bsdtar -xf "$src" -C "$dest" --strip-components 4 opt/maptool/lib/app/{'*.jar',readme}
+
+    dest=$out/share/icons/hicolor/256x256/apps
+    install -dm755 "$dest"
+    bsdtar -xOf "$src" opt/maptool/lib/MapTool.png > "$dest"/${rdnsName}.png
+
+    dest=$out/bin
+    install -dm755 "$dest"
+    makeWrapper ${jre}/bin/java "$dest"/${binName} \
+      "''${gappsWrapperArgs[@]}" \
+      --prefix LD_LIBRARY_PATH : ${lib.makeLibraryPath [ ffmpeg ]} \
+      --add-flags "${lib.concatStringsSep " " jvmArgs} net.rptools.maptool.client.LaunchInstructions"
+
+    runHook postInstall
+  '';
+
+  passthru.updateScript = gitUpdater {
+    url = "${repoBase}.git";
+    ignoredVersions = "-";
+  };
+}
diff --git a/nixpkgs/pkgs/games/mar1d/default.nix b/nixpkgs/pkgs/games/mar1d/default.nix
new file mode 100644
index 000000000000..6b3fe5feb2de
--- /dev/null
+++ b/nixpkgs/pkgs/games/mar1d/default.nix
@@ -0,0 +1,46 @@
+{ stdenv
+, lib
+, SDL2
+, SDL2_mixer
+, libGLU
+, libconfig
+, meson
+, ninja
+, pkg-config
+, fetchFromGitHub
+}:
+
+stdenv.mkDerivation rec {
+  pname = "MAR1D";
+  version = "0.3.1";
+
+  src = fetchFromGitHub {
+    sha256 = "sha256-c48azBGdnzhEQGUeRJWlNLJhtrYjnpiORuWvowcQK5Y=";
+    rev = "v${version}";
+    repo = "MAR1D";
+    owner = "Radvendii";
+  };
+
+  nativeBuildInputs = [ meson ninja pkg-config ];
+
+  buildInputs = [
+    SDL2
+    SDL2_mixer
+    libconfig
+    libGLU
+  ];
+
+  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
+      shoes in this first person clone of the classic Mario game. True to the
+      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://mar1d.com";
+    license = licenses.agpl3;
+    maintainers = with maintainers; [ taeer ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/games/marble-marcher-ce/default.nix b/nixpkgs/pkgs/games/marble-marcher-ce/default.nix
new file mode 100644
index 000000000000..08ff58addf59
--- /dev/null
+++ b/nixpkgs/pkgs/games/marble-marcher-ce/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, stdenv
+, makeWrapper
+, makeDesktopItem
+, copyDesktopItems
+, fetchFromGitHub
+, sfml
+, anttweakbar
+, glm
+, eigen
+, glew
+, cmake
+}:
+stdenv.mkDerivation rec {
+  pname = "marble-marcher-ce";
+  version = "1.4.5";
+
+  src = fetchFromGitHub {
+    owner = "WAUthethird";
+    repo = "Marble-Marcher-Community-Edition";
+    rev = version;
+    hash = "sha256-m5i/Q4k5S4wcojHqMYS7e1W/Ph7q/95j3oOK2xbrHSk=";
+  };
+
+  buildInputs = [ sfml anttweakbar glm eigen glew ];
+  nativeBuildInputs = [ cmake makeWrapper copyDesktopItems ];
+  installFlags = [ "DESTDIR=$(out)" ];
+
+  prePatch = ''
+    # the path /home/MMCE is always added to DESTDIR
+    # we change this to a more sensible path
+    # see https://github.com/WAUthethird/Marble-Marcher-Community-Edition/issues/23
+    substituteInPlace CMakeLists.txt \
+      --replace '/home/MMCE' '/share/MMCE'
+  '';
+
+  postInstall = ''
+    mkdir $out/bin
+    mkdir -p $out/share/icons/
+    # The executable has to be run from the same directory the assets are in
+    makeWrapper $out/share/MMCE/MarbleMarcher $out/bin/${pname} --chdir $out/share/MMCE
+    ln -s $out/share/MMCE/images/MarbleMarcher.png $out/share/icons/${pname}.png
+  '';
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = pname;
+      exec = pname;
+      icon = pname;
+      desktopName = pname;
+      comment = meta.description;
+      categories = [ "Game" ];
+    })
+  ];
+
+  meta = with lib; {
+    description = "A fractal physics game.";
+    longDescription = "A community-developed version of the original Marble Marcher - a fractal physics game.";
+    homepage = "https://michaelmoroz.itch.io/mmce";
+    license = with licenses; [
+      gpl2Plus # Code
+      cc-by-30 # Assets
+      ofl # Fonts
+    ];
+    maintainers = with maintainers; [ rampoina ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/mari0/default.nix b/nixpkgs/pkgs/games/mari0/default.nix
new file mode 100644
index 000000000000..6e644245c4fb
--- /dev/null
+++ b/nixpkgs/pkgs/games/mari0/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, copyDesktopItems
+, fetchFromGitHub
+, love
+, makeDesktopItem
+, makeWrapper
+, stdenv
+, strip-nondeterminism
+, zip
+}:
+
+stdenv.mkDerivation rec {
+  pname = "mari0";
+  version = "1.6.2";
+
+  src = fetchFromGitHub {
+    owner = "Stabyourself";
+    repo = pname;
+    rev = version;
+    sha256 = "1zqaq4w599scsjvy1rsb21fd2r8j3srx9vym4ir9bh666dp36gxa";
+  };
+
+  nativeBuildInputs = [
+    copyDesktopItems
+    makeWrapper
+    strip-nondeterminism
+    zip
+  ];
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "mari0";
+      exec = pname;
+      comment = "Crossover between Super Mario Bros. and Portal";
+      desktopName = "mari0";
+      genericName = "mari0";
+      categories = [ "Game" ];
+    })
+  ];
+
+  installPhase = ''
+    runHook preInstall
+    zip -9 -r mari0.love ./*
+    strip-nondeterminism --type zip mari0.love
+    install -Dm444 -t $out/share/games/lovegames/ mari0.love
+    makeWrapper ${love}/bin/love $out/bin/mari0 \
+      --add-flags $out/share/games/lovegames/mari0.love
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Crossover between Super Mario Bros. and Portal";
+    platforms = platforms.linux;
+    license = licenses.mit;
+    downloadPage = "https://stabyourself.net/mari0/";
+  };
+
+}
diff --git a/nixpkgs/pkgs/games/mars/default.nix b/nixpkgs/pkgs/games/mars/default.nix
new file mode 100644
index 000000000000..3ce42bb7748e
--- /dev/null
+++ b/nixpkgs/pkgs/games/mars/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, fetchFromGitHub, cmake, libGLU, libGL, sfml, fribidi, taglib }:
+stdenv.mkDerivation rec {
+  pname = "mars";
+  version = "unstable-17.10.2021";
+
+  src = fetchFromGitHub {
+    owner = "thelaui";
+    repo = "M.A.R.S.";
+    rev = "84664cda094efe6e49d9b1550e4f4f98c33eefa2";
+    sha256 = "sha256-SWLP926SyVTjn+UT1DCaJSo4Ue0RbyzImVnlNJQksS0=";
+  };
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ libGLU libGL sfml fribidi taglib ];
+  installPhase = ''
+    cd ..
+    mkdir -p "$out/share/mars/"
+    mkdir -p "$out/bin/"
+    cp -rv data resources credits.txt license.txt "$out/share/mars/"
+    cp -v marsshooter "$out/bin/mars.bin"
+    cat << EOF > "$out/bin/mars"
+    #! ${stdenv.shell}
+    cd "$out/share/mars/"
+    exec "$out/bin/mars.bin" "\$@"
+    EOF
+    chmod +x "$out/bin/mars"
+  '';
+  meta = with lib; {
+    homepage = "https://mars-game.sourceforge.net/";
+    description = "A game about fighting with ships in a 2D space setting";
+    license = licenses.gpl3Plus;
+    maintainers = [ maintainers.astsmtl ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/mchprs/Cargo.lock b/nixpkgs/pkgs/games/mchprs/Cargo.lock
new file mode 100644
index 000000000000..79850247ef9a
--- /dev/null
+++ b/nixpkgs/pkgs/games/mchprs/Cargo.lock
@@ -0,0 +1,3052 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "addr2line"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97"
+dependencies = [
+ "gimli",
+]
+
+[[package]]
+name = "adler"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+
+[[package]]
+name = "ahash"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47"
+dependencies = [
+ "getrandom",
+ "once_cell",
+ "version_check",
+]
+
+[[package]]
+name = "ahash"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "version_check",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "anes"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299"
+
+[[package]]
+name = "anyhow"
+version = "1.0.71"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8"
+
+[[package]]
+name = "arrayvec"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6"
+
+[[package]]
+name = "atty"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
+dependencies = [
+ "hermit-abi 0.1.19",
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "backtrace"
+version = "0.3.67"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca"
+dependencies = [
+ "addr2line",
+ "cc",
+ "cfg-if",
+ "libc",
+ "miniz_oxide 0.6.2",
+ "object",
+ "rustc-demangle",
+]
+
+[[package]]
+name = "base64"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
+
+[[package]]
+name = "base64"
+version = "0.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a"
+
+[[package]]
+name = "bigdecimal"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6aaf33151a6429fe9211d1b276eafdf70cdff28b071e76c0b0e1503221ea3744"
+dependencies = [
+ "num-bigint",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "bincode"
+version = "1.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "bindgen"
+version = "0.59.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2bd2a9a458e8f4304c52c43ebb0cfbd520289f8379a52e329a38afda99bf8eb8"
+dependencies = [
+ "bitflags",
+ "cexpr",
+ "clang-sys",
+ "lazy_static",
+ "lazycell",
+ "peeking_take_while",
+ "proc-macro2",
+ "quote",
+ "regex",
+ "rustc-hash",
+ "shlex",
+]
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "bitvec"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c"
+dependencies = [
+ "funty",
+ "radium",
+ "tap",
+ "wyz",
+]
+
+[[package]]
+name = "block-buffer"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "borsh"
+version = "0.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b"
+dependencies = [
+ "borsh-derive",
+ "hashbrown 0.13.2",
+]
+
+[[package]]
+name = "borsh-derive"
+version = "0.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0754613691538d51f329cce9af41d7b7ca150bc973056f1156611489475f54f7"
+dependencies = [
+ "borsh-derive-internal",
+ "borsh-schema-derive-internal",
+ "proc-macro-crate",
+ "proc-macro2",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "borsh-derive-internal"
+version = "0.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "borsh-schema-derive-internal"
+version = "0.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "bufstream"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "40e38929add23cdf8a366df9b0e088953150724bcbe5fc330b0d8eb3b328eec8"
+
+[[package]]
+name = "bumpalo"
+version = "3.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b1ce199063694f33ffb7dd4e0ee620741495c32833cde5aa08f02a0bf96f0c8"
+
+[[package]]
+name = "bus"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34701d821c19736317bc716b8eb6153a78b431b06fbd3950716cedc705a6c811"
+dependencies = [
+ "crossbeam-channel",
+ "num_cpus",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "bytecheck"
+version = "0.6.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "13fe11640a23eb24562225322cd3e452b93a3d4091d62fab69c70542fcd17d1f"
+dependencies = [
+ "bytecheck_derive",
+ "ptr_meta",
+ "simdutf8",
+]
+
+[[package]]
+name = "bytecheck_derive"
+version = "0.6.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "byteorder"
+version = "1.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+
+[[package]]
+name = "bytes"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be"
+
+[[package]]
+name = "cast"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
+
+[[package]]
+name = "cc"
+version = "1.0.79"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
+
+[[package]]
+name = "cesu8"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
+
+[[package]]
+name = "cexpr"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
+dependencies = [
+ "nom",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "chrono"
+version = "0.4.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b"
+dependencies = [
+ "iana-time-zone",
+ "js-sys",
+ "num-integer",
+ "num-traits",
+ "time 0.1.45",
+ "wasm-bindgen",
+ "winapi",
+]
+
+[[package]]
+name = "ciborium"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0c137568cc60b904a7724001b35ce2630fd00d5d84805fbb608ab89509d788f"
+dependencies = [
+ "ciborium-io",
+ "ciborium-ll",
+ "serde",
+]
+
+[[package]]
+name = "ciborium-io"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "346de753af073cc87b52b2083a506b38ac176a44cfb05497b622e27be899b369"
+
+[[package]]
+name = "ciborium-ll"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "213030a2b5a4e0c0892b6652260cf6ccac84827b83a85a534e178e3906c4cf1b"
+dependencies = [
+ "ciborium-io",
+ "half",
+]
+
+[[package]]
+name = "clang-sys"
+version = "1.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f"
+dependencies = [
+ "glob",
+ "libc",
+ "libloading",
+]
+
+[[package]]
+name = "clap"
+version = "3.2.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123"
+dependencies = [
+ "bitflags",
+ "clap_lex",
+ "indexmap",
+ "textwrap",
+]
+
+[[package]]
+name = "clap_lex"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5"
+dependencies = [
+ "os_str_bytes",
+]
+
+[[package]]
+name = "cmake"
+version = "0.1.50"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "codespan-reporting"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e"
+dependencies = [
+ "termcolor",
+ "unicode-width",
+]
+
+[[package]]
+name = "core-foundation"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"
+
+[[package]]
+name = "cpufeatures"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "crc32fast"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "criterion"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7c76e09c1aae2bc52b3d2f29e13c6572553b30c4aa1b8a49fd70de6412654cb"
+dependencies = [
+ "anes",
+ "atty",
+ "cast",
+ "ciborium",
+ "clap",
+ "criterion-plot",
+ "itertools",
+ "lazy_static",
+ "num-traits",
+ "oorandom",
+ "plotters",
+ "rayon",
+ "regex",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "tinytemplate",
+ "walkdir",
+]
+
+[[package]]
+name = "criterion-plot"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1"
+dependencies = [
+ "cast",
+ "itertools",
+]
+
+[[package]]
+name = "crossbeam"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2801af0d36612ae591caa9568261fddce32ce6e08a7275ea334a06a4ad021a2c"
+dependencies = [
+ "cfg-if",
+ "crossbeam-channel",
+ "crossbeam-deque",
+ "crossbeam-epoch",
+ "crossbeam-queue",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef"
+dependencies = [
+ "cfg-if",
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695"
+dependencies = [
+ "autocfg",
+ "cfg-if",
+ "crossbeam-utils",
+ "memoffset",
+ "scopeguard",
+]
+
+[[package]]
+name = "crossbeam-queue"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "crypto-common"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
+dependencies = [
+ "generic-array",
+ "typenum",
+]
+
+[[package]]
+name = "ctrlc"
+version = "3.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbcf33c2a618cbe41ee43ae6e9f2e48368cd9f9db2896f10167d8d762679f639"
+dependencies = [
+ "nix",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "cxx"
+version = "1.0.94"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f61f1b6389c3fe1c316bf8a4dccc90a38208354b330925bce1f74a6c4756eb93"
+dependencies = [
+ "cc",
+ "cxxbridge-flags",
+ "cxxbridge-macro",
+ "link-cplusplus",
+]
+
+[[package]]
+name = "cxx-build"
+version = "1.0.94"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "12cee708e8962df2aeb38f594aae5d827c022b6460ac71a7a3e2c3c2aae5a07b"
+dependencies = [
+ "cc",
+ "codespan-reporting",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "scratch",
+ "syn 2.0.15",
+]
+
+[[package]]
+name = "cxxbridge-flags"
+version = "1.0.94"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7944172ae7e4068c533afbb984114a56c46e9ccddda550499caa222902c7f7bb"
+
+[[package]]
+name = "cxxbridge-macro"
+version = "1.0.94"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2345488264226bf682893e25de0769f3360aac9957980ec49361b083ddaa5bc5"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.15",
+]
+
+[[package]]
+name = "derive_utils"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dff8f6a793f528719e1ad4425a52a213ac1214ac7158c5fb97a7f50a64bfc96d"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.15",
+]
+
+[[package]]
+name = "digest"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f"
+dependencies = [
+ "block-buffer",
+ "crypto-common",
+]
+
+[[package]]
+name = "either"
+version = "1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
+
+[[package]]
+name = "encoding_rs"
+version = "0.8.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "enum_dispatch"
+version = "0.3.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "11f36e95862220b211a6e2aa5eca09b4fa391b13cd52ceb8035a24bf65a79de2"
+dependencies = [
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "errno"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a"
+dependencies = [
+ "errno-dragonfly",
+ "libc",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "errno-dragonfly"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
+dependencies = [
+ "cc",
+ "libc",
+]
+
+[[package]]
+name = "fallible-iterator"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7"
+
+[[package]]
+name = "fallible-streaming-iterator"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a"
+
+[[package]]
+name = "fastrand"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
+dependencies = [
+ "instant",
+]
+
+[[package]]
+name = "fixedbitset"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
+
+[[package]]
+name = "flate2"
+version = "1.0.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743"
+dependencies = [
+ "crc32fast",
+ "libz-sys",
+ "miniz_oxide 0.7.1",
+]
+
+[[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.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8"
+dependencies = [
+ "percent-encoding",
+]
+
+[[package]]
+name = "frunk"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a89c703bf50009f383a0873845357cc400a95fc535f836feddfe015d7df6e1e0"
+dependencies = [
+ "frunk_core",
+ "frunk_derives",
+ "frunk_proc_macros",
+]
+
+[[package]]
+name = "frunk_core"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a446d01a558301dca28ef43222864a9fa2bd9a2e71370f769d5d5d5ec9f3537"
+
+[[package]]
+name = "frunk_derives"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b83164912bb4c97cfe0772913c7af7387ee2e00cb6d4636fb65a35b3d0c8f173"
+dependencies = [
+ "frunk_proc_macro_helpers",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "frunk_proc_macro_helpers"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "015425591bbeb0f5b8a75593340f1789af428e9f887a4f1e36c0c471f067ef50"
+dependencies = [
+ "frunk_core",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "frunk_proc_macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea01524f285deab48affffb342b97f186e657b119c3f1821ac531780e0fbfae0"
+dependencies = [
+ "frunk_core",
+ "frunk_proc_macros_impl",
+ "proc-macro-hack",
+]
+
+[[package]]
+name = "frunk_proc_macros_impl"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0a802d974cc18ee7fe1a7868fc9ce31086294fd96ba62f8da64ecb44e92a2653"
+dependencies = [
+ "frunk_core",
+ "frunk_proc_macro_helpers",
+ "proc-macro-hack",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "funty"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
+
+[[package]]
+name = "futures-channel"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2"
+dependencies = [
+ "futures-core",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c"
+
+[[package]]
+name = "futures-sink"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e"
+
+[[package]]
+name = "futures-task"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65"
+
+[[package]]
+name = "futures-util"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "pin-project-lite",
+ "pin-utils",
+]
+
+[[package]]
+name = "generic-array"
+version = "0.14.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
+dependencies = [
+ "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "gimli"
+version = "0.27.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4"
+
+[[package]]
+name = "glob"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
+
+[[package]]
+name = "h2"
+version = "0.3.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17f8a914c2987b688368b5138aa05321db91f4090cf26118185672ad588bce21"
+dependencies = [
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "futures-util",
+ "http",
+ "indexmap",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
+[[package]]
+name = "half"
+version = "1.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7"
+
+[[package]]
+name = "hashbrown"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+dependencies = [
+ "ahash 0.7.6",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.13.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e"
+dependencies = [
+ "ahash 0.8.3",
+]
+
+[[package]]
+name = "hashlink"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "69fe1fcf8b4278d860ad0548329f892a3631fb63f82574df68275f34cdbe0ffa"
+dependencies = [
+ "hashbrown 0.12.3",
+]
+
+[[package]]
+name = "hematite-nbt"
+version = "0.5.2"
+source = "git+https://github.com/StackDoubleFlow/hematite_nbt#50bf06b3de166603dfef611b9f4773fdb118f8ff"
+dependencies = [
+ "byteorder",
+ "cesu8",
+ "flate2",
+ "serde",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.1.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286"
+
+[[package]]
+name = "http"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
+[[package]]
+name = "http-body"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
+dependencies = [
+ "bytes",
+ "http",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "httparse"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
+
+[[package]]
+name = "httpdate"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421"
+
+[[package]]
+name = "hyper"
+version = "0.14.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "pin-project-lite",
+ "socket2",
+ "tokio",
+ "tower-service",
+ "tracing",
+ "want",
+]
+
+[[package]]
+name = "hyper-tls"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905"
+dependencies = [
+ "bytes",
+ "hyper",
+ "native-tls",
+ "tokio",
+ "tokio-native-tls",
+]
+
+[[package]]
+name = "iana-time-zone"
+version = "0.1.56"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0722cd7114b7de04316e7ea5456a0bbb20e4adb46fd27a3697adb812cff0f37c"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca"
+dependencies = [
+ "cxx",
+ "cxx-build",
+]
+
+[[package]]
+name = "idna"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6"
+dependencies = [
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "impls"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a46645bbd70538861a90d0f26c31537cdf1e44aae99a794fb75a664b70951bc"
+
+[[package]]
+name = "indexmap"
+version = "1.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
+dependencies = [
+ "autocfg",
+ "hashbrown 0.12.3",
+]
+
+[[package]]
+name = "instant"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "io-enum"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "01c662c349c9c9f542e7bfd9134143beb27da4b20dfbc3b3ef5b2a5b507dafbd"
+dependencies = [
+ "derive_utils",
+ "syn 2.0.15",
+]
+
+[[package]]
+name = "io-lifetimes"
+version = "1.0.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220"
+dependencies = [
+ "hermit-abi 0.3.1",
+ "libc",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "ipnet"
+version = "2.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f"
+
+[[package]]
+name = "itertools"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6"
+
+[[package]]
+name = "js-sys"
+version = "0.3.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "lazycell"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
+
+[[package]]
+name = "lexical"
+version = "6.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c7aefb36fd43fef7003334742cbf77b243fcd36418a1d1bdd480d613a67968f6"
+dependencies = [
+ "lexical-core",
+]
+
+[[package]]
+name = "lexical-core"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2cde5de06e8d4c2faabc400238f9ae1c74d5412d03a7bd067645ccbc47070e46"
+dependencies = [
+ "lexical-parse-float",
+ "lexical-parse-integer",
+ "lexical-util",
+ "lexical-write-float",
+ "lexical-write-integer",
+]
+
+[[package]]
+name = "lexical-parse-float"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "683b3a5ebd0130b8fb52ba0bdc718cc56815b6a097e28ae5a6997d0ad17dc05f"
+dependencies = [
+ "lexical-parse-integer",
+ "lexical-util",
+ "static_assertions",
+]
+
+[[package]]
+name = "lexical-parse-integer"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d0994485ed0c312f6d965766754ea177d07f9c00c9b82a5ee62ed5b47945ee9"
+dependencies = [
+ "lexical-util",
+ "static_assertions",
+]
+
+[[package]]
+name = "lexical-util"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5255b9ff16ff898710eb9eb63cb39248ea8a5bb036bea8085b1a767ff6c4e3fc"
+dependencies = [
+ "static_assertions",
+]
+
+[[package]]
+name = "lexical-write-float"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "accabaa1c4581f05a3923d1b4cfd124c329352288b7b9da09e766b0668116862"
+dependencies = [
+ "lexical-util",
+ "lexical-write-integer",
+ "static_assertions",
+]
+
+[[package]]
+name = "lexical-write-integer"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1b6f3d1f4422866b68192d62f77bc5c700bee84f3069f2469d7bc8c77852446"
+dependencies = [
+ "lexical-util",
+ "static_assertions",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.142"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317"
+
+[[package]]
+name = "libloading"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f"
+dependencies = [
+ "cfg-if",
+ "winapi",
+]
+
+[[package]]
+name = "libsqlite3-sys"
+version = "0.25.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "29f835d03d717946d28b1d1ed632eb6f0e24a299388ee623d0c23118d3e8a7fa"
+dependencies = [
+ "cc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "libz-sys"
+version = "1.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56ee889ecc9568871456d42f603d6a0ce59ff328d291063a45cbdf0036baf6db"
+dependencies = [
+ "cc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "link-cplusplus"
+version = "1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b64f40e5e03e0d54f03845c8197d0291253cdbedfb1cb46b13c2c117554a9f4c"
+
+[[package]]
+name = "log"
+version = "0.4.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "lru"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6e8aaa3f231bb4bd57b84b2d5dc3ae7f350265df8aa96492e0bc394a1571909"
+dependencies = [
+ "hashbrown 0.12.3",
+]
+
+[[package]]
+name = "matchers"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
+dependencies = [
+ "regex-automata",
+]
+
+[[package]]
+name = "mchprs"
+version = "0.4.1"
+dependencies = [
+ "mchprs_core",
+ "tracing",
+ "tracing-appender",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "mchprs_blocks"
+version = "0.1.0"
+dependencies = [
+ "hematite-nbt",
+ "mchprs_proc_macros",
+ "mchprs_utils",
+ "serde",
+]
+
+[[package]]
+name = "mchprs_core"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "backtrace",
+ "bincode",
+ "bitflags",
+ "bus",
+ "byteorder",
+ "chrono",
+ "criterion",
+ "ctrlc",
+ "enum_dispatch",
+ "hematite-nbt",
+ "impls",
+ "itertools",
+ "mchprs_blocks",
+ "mchprs_network",
+ "mchprs_proc_macros",
+ "mchprs_save_data",
+ "mchprs_utils",
+ "mchprs_world",
+ "md5",
+ "mysql",
+ "once_cell",
+ "petgraph",
+ "rand",
+ "redpiler_graph",
+ "regex",
+ "reqwest",
+ "rusqlite",
+ "serde",
+ "serde_json",
+ "smallvec",
+ "tokio",
+ "toml 0.7.3",
+ "toml_edit",
+ "tracing",
+]
+
+[[package]]
+name = "mchprs_network"
+version = "0.1.0"
+dependencies = [
+ "byteorder",
+ "flate2",
+ "hematite-nbt",
+ "serde",
+ "tracing",
+]
+
+[[package]]
+name = "mchprs_proc_macros"
+version = "0.1.0"
+dependencies = [
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "mchprs_save_data"
+version = "0.1.0"
+dependencies = [
+ "bincode",
+ "byteorder",
+ "mchprs_blocks",
+ "mchprs_world",
+ "serde",
+ "thiserror",
+]
+
+[[package]]
+name = "mchprs_utils"
+version = "0.1.0"
+
+[[package]]
+name = "mchprs_world"
+version = "0.1.0"
+dependencies = [
+ "mchprs_blocks",
+ "serde",
+]
+
+[[package]]
+name = "md5"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771"
+
+[[package]]
+name = "memchr"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+
+[[package]]
+name = "memoffset"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "mime"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
+
+[[package]]
+name = "minimal-lexical"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+
+[[package]]
+name = "miniz_oxide"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa"
+dependencies = [
+ "adler",
+]
+
+[[package]]
+name = "miniz_oxide"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
+dependencies = [
+ "adler",
+]
+
+[[package]]
+name = "mio"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9"
+dependencies = [
+ "libc",
+ "log",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "mysql"
+version = "23.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05f11339ca5c251941805d51362a07823605a80586ced92914ab7de84fba813f"
+dependencies = [
+ "bufstream",
+ "bytes",
+ "crossbeam",
+ "flate2",
+ "io-enum",
+ "libc",
+ "lru",
+ "mysql_common",
+ "named_pipe",
+ "native-tls",
+ "once_cell",
+ "pem",
+ "percent-encoding",
+ "serde",
+ "serde_json",
+ "socket2",
+ "twox-hash",
+ "url",
+]
+
+[[package]]
+name = "mysql_common"
+version = "0.29.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9006c95034ccf7b903d955f210469119f6c3477fc9c9e7a7845ce38a3e665c2a"
+dependencies = [
+ "base64 0.13.1",
+ "bigdecimal",
+ "bindgen",
+ "bitflags",
+ "bitvec",
+ "byteorder",
+ "bytes",
+ "cc",
+ "cmake",
+ "crc32fast",
+ "flate2",
+ "frunk",
+ "lazy_static",
+ "lexical",
+ "num-bigint",
+ "num-traits",
+ "rand",
+ "regex",
+ "rust_decimal",
+ "saturating",
+ "serde",
+ "serde_json",
+ "sha1",
+ "sha2",
+ "smallvec",
+ "subprocess",
+ "thiserror",
+ "time 0.3.20",
+ "uuid",
+]
+
+[[package]]
+name = "named_pipe"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad9c443cce91fc3e12f017290db75dde490d685cdaaf508d7159d7cf41f0eb2b"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "native-tls"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e"
+dependencies = [
+ "lazy_static",
+ "libc",
+ "log",
+ "openssl",
+ "openssl-probe",
+ "openssl-sys",
+ "schannel",
+ "security-framework",
+ "security-framework-sys",
+ "tempfile",
+]
+
+[[package]]
+name = "nix"
+version = "0.26.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a"
+dependencies = [
+ "bitflags",
+ "cfg-if",
+ "libc",
+ "static_assertions",
+]
+
+[[package]]
+name = "nom"
+version = "7.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
+dependencies = [
+ "memchr",
+ "minimal-lexical",
+]
+
+[[package]]
+name = "nu-ansi-term"
+version = "0.46.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
+dependencies = [
+ "overload",
+ "winapi",
+]
+
+[[package]]
+name = "num-bigint"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
+dependencies = [
+ "autocfg",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b"
+dependencies = [
+ "hermit-abi 0.2.6",
+ "libc",
+]
+
+[[package]]
+name = "object"
+version = "0.30.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.17.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3"
+
+[[package]]
+name = "oorandom"
+version = "11.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575"
+
+[[package]]
+name = "openssl"
+version = "0.10.55"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d"
+dependencies = [
+ "bitflags",
+ "cfg-if",
+ "foreign-types",
+ "libc",
+ "once_cell",
+ "openssl-macros",
+ "openssl-sys",
+]
+
+[[package]]
+name = "openssl-macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.15",
+]
+
+[[package]]
+name = "openssl-probe"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
+
+[[package]]
+name = "openssl-sys"
+version = "0.9.90"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "os_str_bytes"
+version = "6.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267"
+
+[[package]]
+name = "overload"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall 0.2.16",
+ "smallvec",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "peeking_take_while"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
+
+[[package]]
+name = "pem"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8"
+dependencies = [
+ "base64 0.13.1",
+]
+
+[[package]]
+name = "percent-encoding"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e"
+
+[[package]]
+name = "petgraph"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4"
+dependencies = [
+ "fixedbitset",
+ "indexmap",
+]
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
+
+[[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.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160"
+
+[[package]]
+name = "plotters"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2538b639e642295546c50fcd545198c9d64ee2a38620a628724a3b266d5fbf97"
+dependencies = [
+ "num-traits",
+ "plotters-backend",
+ "plotters-svg",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "plotters-backend"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "193228616381fecdc1224c62e96946dfbc73ff4384fba576e052ff8c1bea8142"
+
+[[package]]
+name = "plotters-svg"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9a81d2759aae1dae668f783c308bc5c8ebd191ff4184aaa1b37f65a6ae5a56f"
+dependencies = [
+ "plotters-backend",
+]
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+
+[[package]]
+name = "proc-macro-crate"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785"
+dependencies = [
+ "toml 0.5.11",
+]
+
+[[package]]
+name = "proc-macro-hack"
+version = "0.5.20+deprecated"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.56"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "ptr_meta"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1"
+dependencies = [
+ "ptr_meta_derive",
+]
+
+[[package]]
+name = "ptr_meta_derive"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "radium"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09"
+
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "libc",
+ "rand_chacha",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+dependencies = [
+ "ppv-lite86",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+dependencies = [
+ "getrandom",
+]
+
+[[package]]
+name = "rayon"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b"
+dependencies = [
+ "either",
+ "rayon-core",
+]
+
+[[package]]
+name = "rayon-core"
+version = "1.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d"
+dependencies = [
+ "crossbeam-channel",
+ "crossbeam-deque",
+ "crossbeam-utils",
+ "num_cpus",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "redpiler_graph"
+version = "0.1.0"
+dependencies = [
+ "bincode",
+ "serde",
+]
+
+[[package]]
+name = "regex"
+version = "1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax 0.7.1",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
+dependencies = [
+ "regex-syntax 0.6.29",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
+
+[[package]]
+name = "regex-syntax"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c"
+
+[[package]]
+name = "rend"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "581008d2099240d37fb08d77ad713bcaec2c4d89d50b5b21a8bb1996bbab68ab"
+dependencies = [
+ "bytecheck",
+]
+
+[[package]]
+name = "reqwest"
+version = "0.11.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "13293b639a097af28fc8a90f22add145a9c954e49d77da06263d58cf44d5fb91"
+dependencies = [
+ "base64 0.21.0",
+ "bytes",
+ "encoding_rs",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "hyper",
+ "hyper-tls",
+ "ipnet",
+ "js-sys",
+ "log",
+ "mime",
+ "native-tls",
+ "once_cell",
+ "percent-encoding",
+ "pin-project-lite",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "tokio",
+ "tokio-native-tls",
+ "tower-service",
+ "url",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+ "winreg",
+]
+
+[[package]]
+name = "rkyv"
+version = "0.7.41"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "21499ed91807f07ae081880aabb2ccc0235e9d88011867d984525e9a4c3cfa3e"
+dependencies = [
+ "bytecheck",
+ "hashbrown 0.12.3",
+ "ptr_meta",
+ "rend",
+ "rkyv_derive",
+ "seahash",
+]
+
+[[package]]
+name = "rkyv_derive"
+version = "0.7.41"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac1c672430eb41556291981f45ca900a0239ad007242d1cb4b4167af842db666"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "rusqlite"
+version = "0.28.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "01e213bc3ecb39ac32e81e51ebe31fd888a940515173e3a18a35f8c6e896422a"
+dependencies = [
+ "bitflags",
+ "fallible-iterator",
+ "fallible-streaming-iterator",
+ "hashlink",
+ "libsqlite3-sys",
+ "smallvec",
+]
+
+[[package]]
+name = "rust_decimal"
+version = "1.29.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26bd36b60561ee1fb5ec2817f198b6fd09fa571c897a5e86d1487cfc2b096dfc"
+dependencies = [
+ "arrayvec",
+ "borsh",
+ "bytecheck",
+ "byteorder",
+ "bytes",
+ "num-traits",
+ "rand",
+ "rkyv",
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "rustc-demangle"
+version = "0.1.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
+
+[[package]]
+name = "rustc-hash"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
+
+[[package]]
+name = "rustix"
+version = "0.37.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8bbfc1d1c7c40c01715f47d71444744a81669ca84e8b63e25a55e169b1f86433"
+dependencies = [
+ "bitflags",
+ "errno",
+ "io-lifetimes",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "ryu"
+version = "1.0.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041"
+
+[[package]]
+name = "same-file"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "saturating"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ece8e78b2f38ec51c51f5d475df0a7187ba5111b2a28bdc761ee05b075d40a71"
+
+[[package]]
+name = "schannel"
+version = "0.1.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3"
+dependencies = [
+ "windows-sys 0.42.0",
+]
+
+[[package]]
+name = "scopeguard"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+
+[[package]]
+name = "scratch"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1792db035ce95be60c3f8853017b3999209281c24e2ba5bc8e59bf97a0c590c1"
+
+[[package]]
+name = "seahash"
+version = "4.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b"
+
+[[package]]
+name = "security-framework"
+version = "2.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254"
+dependencies = [
+ "bitflags",
+ "core-foundation",
+ "core-foundation-sys",
+ "libc",
+ "security-framework-sys",
+]
+
+[[package]]
+name = "security-framework-sys"
+version = "2.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "serde"
+version = "1.0.160"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.160"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.15",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.96"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_spanned"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0efd8caf556a6cebd3b285caf480045fcc1ac04f6bd786b09a6f11af30c4fcf4"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "serde_urlencoded"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
+dependencies = [
+ "form_urlencoded",
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "sha1"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+]
+
+[[package]]
+name = "sha2"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+]
+
+[[package]]
+name = "sharded-slab"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "shlex"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3"
+
+[[package]]
+name = "simdutf8"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a"
+
+[[package]]
+name = "slab"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
+
+[[package]]
+name = "socket2"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "static_assertions"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+
+[[package]]
+name = "subprocess"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c2e86926081dda636c546d8c5e641661049d7562a68f5488be4a1f7f66f6086"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "tap"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
+
+[[package]]
+name = "tempfile"
+version = "3.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998"
+dependencies = [
+ "cfg-if",
+ "fastrand",
+ "redox_syscall 0.3.5",
+ "rustix",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "termcolor"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "textwrap"
+version = "0.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d"
+
+[[package]]
+name = "thiserror"
+version = "1.0.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.15",
+]
+
+[[package]]
+name = "thread_local"
+version = "1.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+]
+
+[[package]]
+name = "time"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a"
+dependencies = [
+ "libc",
+ "wasi 0.10.0+wasi-snapshot-preview1",
+ "winapi",
+]
+
+[[package]]
+name = "time"
+version = "0.3.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890"
+dependencies = [
+ "itoa",
+ "serde",
+ "time-core",
+ "time-macros",
+]
+
+[[package]]
+name = "time-core"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd"
+
+[[package]]
+name = "time-macros"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36"
+dependencies = [
+ "time-core",
+]
+
+[[package]]
+name = "tinytemplate"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc"
+dependencies = [
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "tinyvec"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+dependencies = [
+ "tinyvec_macros",
+]
+
+[[package]]
+name = "tinyvec_macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
+
+[[package]]
+name = "tokio"
+version = "1.28.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3c786bf8134e5a3a166db9b29ab8f48134739014a3eca7bc6bfa95d673b136f"
+dependencies = [
+ "autocfg",
+ "bytes",
+ "libc",
+ "mio",
+ "num_cpus",
+ "pin-project-lite",
+ "socket2",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "tokio-native-tls"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2"
+dependencies = [
+ "native-tls",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-util"
+version = "0.7.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "pin-project-lite",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "toml"
+version = "0.5.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "toml"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b403acf6f2bb0859c93c7f0d967cb4a75a7ac552100f9322faf64dc047669b21"
+dependencies = [
+ "serde",
+ "serde_spanned",
+ "toml_datetime",
+ "toml_edit",
+]
+
+[[package]]
+name = "toml_datetime"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "toml_edit"
+version = "0.19.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13"
+dependencies = [
+ "indexmap",
+ "serde",
+ "serde_spanned",
+ "toml_datetime",
+ "winnow",
+]
+
+[[package]]
+name = "tower-service"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
+
+[[package]]
+name = "tracing"
+version = "0.1.37"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
+dependencies = [
+ "cfg-if",
+ "pin-project-lite",
+ "tracing-attributes",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-appender"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09d48f71a791638519505cefafe162606f706c25592e4bde4d97600c0195312e"
+dependencies = [
+ "crossbeam-channel",
+ "time 0.3.20",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "tracing-attributes"
+version = "0.1.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.15",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a"
+dependencies = [
+ "once_cell",
+ "valuable",
+]
+
+[[package]]
+name = "tracing-log"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922"
+dependencies = [
+ "lazy_static",
+ "log",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-subscriber"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77"
+dependencies = [
+ "matchers",
+ "nu-ansi-term",
+ "once_cell",
+ "regex",
+ "sharded-slab",
+ "smallvec",
+ "thread_local",
+ "tracing",
+ "tracing-core",
+ "tracing-log",
+]
+
+[[package]]
+name = "try-lock"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed"
+
+[[package]]
+name = "twox-hash"
+version = "1.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675"
+dependencies = [
+ "cfg-if",
+ "rand",
+ "static_assertions",
+]
+
+[[package]]
+name = "typenum"
+version = "1.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"
+
+[[package]]
+name = "unicode-bidi"
+version = "0.3.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4"
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "unicode-width"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
+
+[[package]]
+name = "url"
+version = "2.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643"
+dependencies = [
+ "form_urlencoded",
+ "idna",
+ "percent-encoding",
+]
+
+[[package]]
+name = "uuid"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4dad5567ad0cf5b760e5665964bec1b47dfd077ba8a2544b513f3556d3d239a2"
+
+[[package]]
+name = "valuable"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
+
+[[package]]
+name = "vcpkg"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+
+[[package]]
+name = "version_check"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+[[package]]
+name = "walkdir"
+version = "2.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698"
+dependencies = [
+ "same-file",
+ "winapi-util",
+]
+
+[[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.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
+
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b"
+dependencies = [
+ "cfg-if",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9"
+dependencies = [
+ "bumpalo",
+ "log",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-futures"
+version = "0.4.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454"
+dependencies = [
+ "cfg-if",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d"
+
+[[package]]
+name = "web-sys"
+version = "0.3.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[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-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-util"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+dependencies = [
+ "winapi",
+]
+
+[[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 = "windows"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"
+dependencies = [
+ "windows-targets 0.48.0",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
+dependencies = [
+ "windows_aarch64_gnullvm 0.42.2",
+ "windows_aarch64_msvc 0.42.2",
+ "windows_i686_gnu 0.42.2",
+ "windows_i686_msvc 0.42.2",
+ "windows_x86_64_gnu 0.42.2",
+ "windows_x86_64_gnullvm 0.42.2",
+ "windows_x86_64_msvc 0.42.2",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.45.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
+dependencies = [
+ "windows-targets 0.42.2",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets 0.48.0",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
+dependencies = [
+ "windows_aarch64_gnullvm 0.42.2",
+ "windows_aarch64_msvc 0.42.2",
+ "windows_i686_gnu 0.42.2",
+ "windows_i686_msvc 0.42.2",
+ "windows_x86_64_gnu 0.42.2",
+ "windows_x86_64_gnullvm 0.42.2",
+ "windows_x86_64_msvc 0.42.2",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5"
+dependencies = [
+ "windows_aarch64_gnullvm 0.48.0",
+ "windows_aarch64_msvc 0.48.0",
+ "windows_i686_gnu 0.48.0",
+ "windows_i686_msvc 0.48.0",
+ "windows_x86_64_gnu 0.48.0",
+ "windows_x86_64_gnullvm 0.48.0",
+ "windows_x86_64_msvc 0.48.0",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
+
+[[package]]
+name = "winnow"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61de7bac303dc551fe038e2b3cef0f571087a47571ea6e79a87692ac99b99699"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "winreg"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "wyz"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed"
+dependencies = [
+ "tap",
+]
diff --git a/nixpkgs/pkgs/games/mchprs/default.nix b/nixpkgs/pkgs/games/mchprs/default.nix
new file mode 100644
index 000000000000..feda0c496f9c
--- /dev/null
+++ b/nixpkgs/pkgs/games/mchprs/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+, pkg-config
+, openssl
+, sqlite
+, zlib
+, stdenv
+, darwin
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "mchprs";
+  version = "0.4.1";
+
+  src = fetchFromGitHub {
+    owner = "MCHPR";
+    repo = "MCHPRS";
+    rev = "v${version}";
+    hash = "sha256-y1ILZvnDWVlghvUVe8xU5wP2TMW+Q/l+V+bqDZrpnBk=";
+  };
+
+  cargoLock = {
+    lockFile = ./Cargo.lock;
+    outputHashes = {
+      "hematite-nbt-0.5.2" = "sha256-knBmH/32JJclhFZbKTNx5XgLSQ2rIrXUGu8uoAHAXMk=";
+    };
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+    rustPlatform.bindgenHook
+  ];
+
+  buildInputs = [
+    openssl
+    sqlite
+    zlib
+  ] ++ lib.optionals stdenv.isDarwin [
+    darwin.apple_sdk.frameworks.CoreFoundation
+    darwin.apple_sdk.frameworks.Security
+  ];
+
+  meta = with lib; {
+    mainProgram = "mchprs";
+    description = "A multithreaded Minecraft server built for redstone";
+    homepage = "https://github.com/MCHPR/MCHPRS";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gdd ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/megaglest/default.nix b/nixpkgs/pkgs/games/megaglest/default.nix
new file mode 100644
index 000000000000..83954c1b2463
--- /dev/null
+++ b/nixpkgs/pkgs/games/megaglest/default.nix
@@ -0,0 +1,88 @@
+{ lib, stdenv, cmake, pkg-config, git, curl, SDL2, xercesc, openal, lua, libvlc
+, libjpeg, wxGTK32, cppunit, ftgl, glew, libogg, libvorbis, buildEnv, libpng
+, fontconfig, freetype, xorg, makeWrapper, bash, which, gnome, libGLU, glib
+, fetchFromGitHub, fetchpatch
+}:
+let
+  version = "3.13.0";
+  lib-env = buildEnv {
+    name = "megaglest-lib-env";
+    paths = [ SDL2 xorg.libSM xorg.libICE xorg.libX11 xorg.libXext
+      xercesc openal libvorbis lua libjpeg libpng curl fontconfig ftgl freetype
+      stdenv.cc.cc glew libGLU wxGTK32 ];
+  };
+  path-env = buildEnv {
+    name = "megaglest-path-env";
+    paths = [ bash which gnome.zenity ];
+  };
+in
+stdenv.mkDerivation {
+  pname = "megaglest";
+  inherit version;
+
+  src = fetchFromGitHub {
+    owner = "MegaGlest";
+    repo = "megaglest-source";
+    rev = version;
+    fetchSubmodules = true;
+    sha256 = "0fb58a706nic14ss89zrigphvdiwy5s9dwvhscvvgrfvjpahpcws";
+  };
+
+  patches = [
+    # Pull upstream fix for -fno-common toolchains
+    (fetchpatch {
+      name = "fno-common.patch";
+      url = "https://github.com/MegaGlest/megaglest-source/commit/5a3520540276a6fd06f7c88e571b6462978e3eab.patch";
+      sha256 = "0y554kjw56dikq87vs709pmq97hdx9hvqsk27f81v4g90m3b3qhi";
+    })
+    # Pull upstream and Debian fixes for wxWidgets 3.2
+    (fetchpatch {
+      name = "get-rid-of-manual-wxPaintEvent-creation-1.patch";
+      url = "https://github.com/MegaGlest/megaglest-source/commit/e09ba53c436279588f769d6ce8852e74d58f8391.patch";
+      hash = "sha256-1ZG6AjnLXW18wwad05kjH7W5rTaP1SDpZ5zLH4nRQt4=";
+    })
+    (fetchpatch {
+      name = "get-rid-of-manual-wxPaintEvent-creation-2.patch";
+      url = "https://sources.debian.org/data/main/m/megaglest/3.13.0-9/debian/patches/fbd0cfb17ed759d24aeb577a602b0d97f7895cc2.patch";
+      hash = "sha256-aMDDboNdH22r7YOiZCEApwz+FpM60anBp82tLwiIH6g=";
+    })
+    (fetchpatch {
+      name = "get-rid-of-manual-wxPaintEvent-creation-3.patch";
+      url = "https://github.com/MegaGlest/megaglest-source/commit/5801b1fafff8ad9618248d4d5d5c751fdf52be2f.patch";
+      hash = "sha256-/RpBoT1JsSFtOrAXphHrPp9DnTbaEN/2h8EZmQ9PIPU=";
+    })
+    (fetchpatch {
+      name = "fix-editor-and-g3dviewer-for-wx-3.1.x.patch";
+      url = "https://github.com/MegaGlest/megaglest-source/commit/789e1cdf371137b729e832e28a5feb6e97a3a243.patch";
+      hash = "sha256-fK7vkHCu6bqVB6I7vMsWMGiczSdxVgo1KqqBNMkEbfM=";
+    })
+  ];
+
+  nativeBuildInputs = [ cmake pkg-config makeWrapper git ];
+  buildInputs = [ curl SDL2 xercesc openal lua libpng libjpeg libvlc wxGTK32
+    glib cppunit fontconfig freetype ftgl glew libogg libvorbis libGLU ];
+
+  cmakeFlags = [
+    "-DCMAKE_INSTALL_PREFIX=${placeholder "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
+      wrapProgram $i \
+        --prefix LD_LIBRARY_PATH ":" "${lib-env}/lib" \
+        --prefix PATH ":" "${path-env}/bin"
+    done
+  '';
+
+  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 = "https://megaglest.org/";
+    maintainers = [ maintainers.matejc ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/methane/default.nix b/nixpkgs/pkgs/games/methane/default.nix
new file mode 100644
index 000000000000..071e1a64b545
--- /dev/null
+++ b/nixpkgs/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/nixpkgs/pkgs/games/mindustry/0001-fix-include-path-for-SDL2-on-linux.patch b/nixpkgs/pkgs/games/mindustry/0001-fix-include-path-for-SDL2-on-linux.patch
new file mode 100644
index 000000000000..3df759d63e21
--- /dev/null
+++ b/nixpkgs/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/arc/backend/sdl/jni/SDL.java            | 8 --------
+ 1 file changed, 8 deletions(-)
+
+diff --git a/backends/backend-sdl/src/arc/backend/sdl/jni/SDL.java b/backends/backend-sdl/src/arc/backend/sdl/jni/SDL.java
+index 62d9286a..2853119d 100644
+--- a/Arc/backends/backend-sdl/src/arc/backend/sdl/jni/SDL.java
++++ b/Arc/backends/backend-sdl/src/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/nixpkgs/pkgs/games/mindustry/default.nix b/nixpkgs/pkgs/games/mindustry/default.nix
new file mode 100644
index 000000000000..d901fba57af7
--- /dev/null
+++ b/nixpkgs/pkgs/games/mindustry/default.nix
@@ -0,0 +1,253 @@
+{ lib, stdenv, fetchurl
+, makeWrapper
+, makeDesktopItem
+, copyDesktopItems
+, fetchFromGitHub
+, gradle
+, jdk
+, perl
+
+# for arc
+, SDL2
+, pkg-config
+, stb
+, ant
+, alsa-lib
+, alsa-plugins
+, glew
+, glew-egl
+
+# for soloud
+, libpulseaudio ? null
+, libjack2 ? null
+
+, nixosTests
+
+
+# Make the build version easily overridable.
+# Server and client build versions must match, and an empty build version means
+# any build is allowed, so this parameter acts as a simple whitelist.
+# Takes the package version and returns the build version.
+, makeBuildVersion ? (v: v)
+, enableClient ? true
+, enableServer ? true
+
+, enableWayland ? false
+}:
+
+let
+  pname = "mindustry";
+  version = "146";
+  buildVersion = makeBuildVersion version;
+
+  gradleWithJdk = gradle.override { java = jdk; };
+
+  selectedGlew = if enableWayland then glew-egl else glew;
+
+  Mindustry = fetchFromGitHub {
+    owner = "Anuken";
+    repo = "Mindustry";
+    rev = "v${version}";
+    hash = "sha256-pJAJjb8rgDL5q2hfuXH2Cyb1Szu4GixeXoLMdnIAlno=";
+  };
+  Arc = fetchFromGitHub {
+    owner = "Anuken";
+    repo = "Arc";
+    rev = "v${version}";
+    hash = "sha256-L+5fshI1oo1lVdTMTBuPzqtEeR2dq1NORP84rZ83rT0=";
+  };
+  soloud = fetchFromGitHub {
+    owner = "Anuken";
+    repo = "soloud";
+    # This is pinned in Arc's arc-core/build.gradle
+    rev = "v0.9";
+    hash = "sha256-6KlqOtA19MxeqZttNyNrMU7pKqzlNiA4rBZKp9ekanc=";
+  };
+  freetypeSource = fetchurl {
+    # This is pinned in Arc's extensions/freetype/build.gradle
+    url = "https://download.savannah.gnu.org/releases/freetype/freetype-2.10.4.tar.gz";
+    hash = "sha256-Xqt5XrsjrHcAHPtot9TVC11sdGkkewsBsslTJp9ljaw=";
+  };
+  glewSource = fetchurl {
+    # This is pinned in Arc's backends/backend-sdl/build.gradle
+    url = "https://github.com/nigels-com/glew/releases/download/glew-2.2.0/glew-2.2.0.zip";
+    hash = "sha256-qQRqkTd0OVoJXtzAsKwtgcOqzKYXh7OYOblB6b4U4NQ=";
+  };
+  SDLmingwSource = fetchurl {
+    # This is pinned in Arc's backends/backend-sdl/build.gradle
+    url = "https://www.libsdl.org/release/SDL2-devel-2.0.20-mingw.tar.gz";
+    hash = "sha256-OAlNgqhX1sYjUuXFzex0lIxbTSXFnL0pjW0jNWiXa9E=";
+  };
+
+  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 {
+    name = "Mindustry";
+    desktopName = "Mindustry";
+    exec = "mindustry";
+    icon = "mindustry";
+  };
+
+  cleanupMindustrySrc = ''
+    # Ensure the prebuilt shared objects don't accidentally get shipped
+    rm -r Arc/natives/natives-*/libs/*
+    rm -r Arc/backends/backend-*/libs/*
+
+    # Remove unbuildable iOS stuff
+    sed -i '/^project(":ios"){/,/^}/d' Mindustry/build.gradle
+    sed -i '/robo(vm|VM)/d' Mindustry/build.gradle
+    rm Mindustry/ios/build.gradle
+  '';
+
+  # fake build to pre-download deps into fixed-output derivation
+  deps = stdenv.mkDerivation {
+    pname = "${pname}-deps";
+    inherit version unpackPhase patches;
+    postPatch = cleanupMindustrySrc;
+
+    nativeBuildInputs = [ gradleWithJdk 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 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 = ''
+      find $GRADLE_USER_HOME/caches/modules-2 -type f -regex '.*\.\(jar\|pom\)' \
+        | perl -pe 's#(.*/([^/]+)/([^/]+)/([^/]+)/[0-9a-f]{30,40}/([^/\s]+))$# ($x = $2) =~ tr|\.|/|; "install -Dm444 $1 \$out/$x/$3/$4/$5" #e' \
+        | sh
+    '';
+    outputHashMode = "recursive";
+    outputHash = "sha256-hbWLsWorEo+1BBURvrFMXpxvZjJBZ1p7HVlJN5e5JZc=";
+  };
+
+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 = cleanupMindustrySrc;
+
+  buildInputs = lib.optionals enableClient [
+    SDL2
+    selectedGlew
+    alsa-lib
+  ];
+  nativeBuildInputs = [
+    pkg-config
+    gradleWithJdk
+    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 "1ipluginManagement { repositories { maven { url '${deps}' } } }; " Mindustry/settings.gradle
+    sed -ie "s#mavenLocal()#mavenLocal(); maven { url '${deps}' }#g" Mindustry/build.gradle
+    sed -ie "s#mavenCentral()#mavenCentral(); maven { url '${deps}' }#g" Arc/build.gradle
+    sed -ie "s#wget.*freetype.* -O #cp ${freetypeSource} #" Arc/extensions/freetype/build.gradle
+    sed -ie "/curl.*glew/{;s#curl -o #cp ${glewSource} #;s# -L http.*\.zip##;}" Arc/backends/backend-sdl/build.gradle
+    sed -ie "/curl.*sdlmingw/{;s#curl -o #cp ${SDLmingwSource} #;s# -L http.*\.tar.gz##;}" Arc/backends/backend-sdl/build.gradle
+
+    pushd Mindustry
+  '' + optionalString enableClient ''
+
+    pushd ../Arc
+    gradle --offline --no-daemon jnigenBuild -Pbuildversion=${buildVersion}
+    gradle --offline --no-daemon jnigenJarNativesDesktop -Pbuildversion=${buildVersion}
+    glewlib=${lib.getLib selectedGlew}/lib/libGLEW.so
+    sdllib=${lib.getLib SDL2}/lib/libSDL2.so
+    patchelf backends/backend-sdl/libs/linux64/libsdl-arc*.so \
+      --add-needed $glewlib \
+      --add-needed $sdllib
+    # Put the freshly-built libraries where the pre-built libraries used to be:
+    cp arc-core/libs/*/* natives/natives-desktop/libs/
+    cp extensions/freetype/libs/*/* natives/natives-freetype-desktop/libs/
+    popd
+
+    gradle --offline --no-daemon desktop:dist -Pbuildversion=${buildVersion}
+  '' + optionalString enableServer ''
+    gradle --offline --no-daemon server:dist -Pbuildversion=${buildVersion}
+  '';
+
+  installPhase = with lib; let
+    installClient = ''
+      install -Dm644 desktop/build/libs/Mindustry.jar $out/share/mindustry.jar
+      mkdir -p $out/bin
+      makeWrapper ${jdk}/bin/java $out/bin/mindustry \
+        --add-flags "-jar $out/share/mindustry.jar" \
+        --suffix LD_LIBRARY_PATH : ${lib.makeLibraryPath [libpulseaudio alsa-lib libjack2]} \
+        --set ALSA_PLUGIN_DIR ${alsa-plugins}/lib/alsa-lib/'' + optionalString enableWayland '' \
+        --set SDL_VIDEODRIVER wayland \
+        --set SDL_VIDEO_WAYLAND_WMCLASS Mindustry
+      '' + ''
+
+      # Retain runtime depends to prevent them from being cleaned up.
+      # Since a jar is a compressed archive, nix can't figure out that the dependency is actually in there,
+      # and will assume that it's not actually needed.
+      # This can cause issues.
+      # See https://github.com/NixOS/nixpkgs/issues/109798.
+      echo "# Retained runtime dependencies: " >> $out/bin/mindustry
+      for dep in ${SDL2.out} ${alsa-lib.out} ${selectedGlew.out}; do
+        echo "# $dep" >> $out/bin/mindustry
+      done
+
+      install -Dm644 core/assets/icons/icon_64.png $out/share/icons/hicolor/64x64/apps/mindustry.png
+    '';
+    installServer = ''
+      install -Dm644 server/build/libs/server-release.jar $out/share/mindustry-server.jar
+      mkdir -p $out/bin
+      makeWrapper ${jdk}/bin/java $out/bin/mindustry-server \
+        --add-flags "-jar $out/share/mindustry-server.jar"
+    '';
+  in ''
+    runHook preInstall
+  '' + optionalString enableClient installClient
+     + optionalString enableServer installServer
+     + ''
+    runHook postInstall
+  '';
+
+  passthru.tests = {
+    nixosTest = nixosTests.mindustry;
+  };
+
+  meta = with lib; {
+    homepage = "https://mindustrygame.github.io/";
+    downloadPage = "https://github.com/Anuken/Mindustry/releases";
+    description = "A sandbox tower defense game";
+    sourceProvenance = with sourceTypes; [
+      fromSource
+      binaryBytecode  # deps
+    ];
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ chkno fgaz thekostins ];
+    platforms = if enableClient then platforms.x86_64 else platforms.linux;
+    # Hash mismatch on darwin:
+    # https://github.com/NixOS/nixpkgs/pull/105590#issuecomment-737120293
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/games/minecraft-servers/default.nix b/nixpkgs/pkgs/games/minecraft-servers/default.nix
new file mode 100644
index 000000000000..f3d4aad16698
--- /dev/null
+++ b/nixpkgs/pkgs/games/minecraft-servers/default.nix
@@ -0,0 +1,24 @@
+{ callPackage, lib, javaPackages }:
+let
+  versions = lib.importJSON ./versions.json;
+
+  latestVersion = lib.last (builtins.sort lib.versionOlder (builtins.attrNames versions));
+  escapeVersion = builtins.replaceStrings [ "." ] [ "-" ];
+
+  getJavaVersion = v: (builtins.getAttr "openjdk${toString v}" javaPackages.compiler).headless;
+
+  packages = lib.mapAttrs'
+    (version: value: {
+      name = "vanilla-${escapeVersion version}";
+      value = callPackage ./derivation.nix {
+        inherit (value) version url sha1;
+        jre_headless = getJavaVersion (if value.javaVersion == null then 8 else value.javaVersion); # versions <= 1.6 will default to 8
+      };
+    })
+    versions;
+in
+lib.recurseIntoAttrs (
+  packages // {
+    vanilla = builtins.getAttr "vanilla-${escapeVersion latestVersion}" packages;
+  }
+)
diff --git a/nixpkgs/pkgs/games/minecraft-servers/derivation.nix b/nixpkgs/pkgs/games/minecraft-servers/derivation.nix
new file mode 100644
index 000000000000..0773be6bcfc7
--- /dev/null
+++ b/nixpkgs/pkgs/games/minecraft-servers/derivation.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv, fetchurl, nixosTests, jre_headless, version, url, sha1 }:
+stdenv.mkDerivation {
+  pname = "minecraft-server";
+  inherit version;
+
+  src = fetchurl { inherit url sha1; };
+
+  preferLocalBuild = true;
+
+  installPhase = ''
+    mkdir -p $out/bin $out/lib/minecraft
+    cp -v $src $out/lib/minecraft/server.jar
+
+    cat > $out/bin/minecraft-server << EOF
+    #!/bin/sh
+    exec ${jre_headless}/bin/java \$@ -jar $out/lib/minecraft/server.jar nogui
+    EOF
+
+    chmod +x $out/bin/minecraft-server
+  '';
+
+  dontUnpack = true;
+
+  passthru = {
+    tests = { inherit (nixosTests) minecraft-server; };
+    updateScript = ./update.py;
+  };
+
+  meta = with lib; {
+    description = "Minecraft Server";
+    homepage = "https://minecraft.net";
+    sourceProvenance = with sourceTypes; [ binaryBytecode ];
+    license = licenses.unfreeRedistributable;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ thoughtpolice tomberek costrouc joelkoen ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/minecraft-servers/update.py b/nixpkgs/pkgs/games/minecraft-servers/update.py
new file mode 100755
index 000000000000..f272c8b71a84
--- /dev/null
+++ b/nixpkgs/pkgs/games/minecraft-servers/update.py
@@ -0,0 +1,159 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -i python3 -p python3Packages.requests python3Packages.dataclasses-json
+
+import json
+from dataclasses import dataclass, field
+from datetime import datetime
+from pathlib import Path
+from typing import Any, Dict, List, Optional
+
+import requests
+from dataclasses_json import DataClassJsonMixin, LetterCase, config
+from marshmallow import fields
+
+
+@dataclass
+class Download(DataClassJsonMixin):
+    sha1: str
+    size: int
+    url: str
+
+
+@dataclass
+class Version(DataClassJsonMixin):
+    id: str
+    type: str
+    url: str
+    time: datetime = field(
+        metadata=config(
+            encoder=datetime.isoformat,
+            decoder=datetime.fromisoformat,
+            mm_field=fields.DateTime(format="iso"),
+        )
+    )
+    release_time: datetime = field(
+        metadata=config(
+            encoder=datetime.isoformat,
+            decoder=datetime.fromisoformat,
+            mm_field=fields.DateTime(format="iso"),
+            letter_case=LetterCase.CAMEL,
+        )
+    )
+
+    def get_manifest(self) -> Any:
+        """Return the version's manifest."""
+        response = requests.get(self.url)
+        response.raise_for_status()
+        return response.json()
+
+    def get_downloads(self) -> Dict[str, Download]:
+        """
+        Return all downloadable files from the version's manifest, in Download
+        objects.
+        """
+        return {
+            download_name: Download.from_dict(download_info)
+            for download_name, download_info in self.get_manifest()["downloads"].items()
+        }
+
+    def get_java_version(self) -> Any:
+        """
+        Return the java version specified in a version's manifest, if it is
+        present. Versions <= 1.6 do not specify this.
+        """
+        return self.get_manifest().get("javaVersion", {}).get("majorVersion", None)
+
+    def get_server(self) -> Optional[Download]:
+        """
+        If the version has a server download available, return the Download
+        object for the server download. If the version does not have a server
+        download avilable, return None.
+        """
+        downloads = self.get_downloads()
+        if "server" in downloads:
+            return downloads["server"]
+        return None
+
+
+def get_versions() -> List[Version]:
+    """Return a list of Version objects for all available versions."""
+    response = requests.get(
+        "https://launchermeta.mojang.com/mc/game/version_manifest.json"
+    )
+    response.raise_for_status()
+    data = response.json()
+    return [Version.from_dict(version) for version in data["versions"]]
+
+
+def get_major_release(version_id: str) -> str:
+    """
+    Return the major release for a version. The major release for 1.17 and
+    1.17.1 is 1.17.
+    """
+    if not len(version_id.split(".")) >= 2:
+        raise ValueError(f"version not in expected format: '{version_id}'")
+    return ".".join(version_id.split(".")[:2])
+
+
+def group_major_releases(releases: List[Version]) -> Dict[str, List[Version]]:
+    """
+    Return a dictionary containing each version grouped by each major release.
+    The key "1.17" contains a list with two Version objects, one for "1.17"
+    and another for "1.17.1".
+    """
+    groups: Dict[str, List[Version]] = {}
+    for release in releases:
+        major_release = get_major_release(release.id)
+        if major_release not in groups:
+            groups[major_release] = []
+        groups[major_release].append(release)
+    return groups
+
+
+def get_latest_major_releases(releases: List[Version]) -> Dict[str, Version]:
+    """
+    Return a dictionary containing the latest version for each major release.
+    The latest major release for 1.16 is 1.16.5, so the key "1.16" contains a
+    Version object for 1.16.5.
+    """
+    return {
+        major_release: max(
+            (release for release in releases if get_major_release(release.id) == major_release),
+            key=lambda x: tuple(map(int, x.id.split('.'))),
+        )
+        for major_release in group_major_releases(releases)
+    }
+
+
+def generate() -> Dict[str, Dict[str, str]]:
+    """
+    Return a dictionary containing the latest url, sha1 and version for each major
+    release.
+    """
+    versions = get_versions()
+    releases = list(
+        filter(lambda version: version.type == "release", versions)
+    )  # remove snapshots and betas
+    latest_major_releases = get_latest_major_releases(releases)
+
+    servers = {
+        version: Download.schema().dump(download_info)  # Download -> dict
+        for version, download_info in {
+            version: value.get_server()
+            for version, value in latest_major_releases.items()
+        }.items()
+        if download_info is not None  # versions < 1.2 do not have a server
+    }
+    for server in servers.values():
+        del server["size"]  # don't need it
+
+    for version, server in servers.items():
+        server["version"] = latest_major_releases[version].id
+        server["javaVersion"] = latest_major_releases[version].get_java_version()
+    return servers
+
+
+if __name__ == "__main__":
+    with open(Path(__file__).parent / "versions.json", "w") as file:
+        json.dump(generate(), file, indent=2)
+        file.write("\n")
diff --git a/nixpkgs/pkgs/games/minecraft-servers/versions.json b/nixpkgs/pkgs/games/minecraft-servers/versions.json
new file mode 100644
index 000000000000..15dbc82c6d90
--- /dev/null
+++ b/nixpkgs/pkgs/games/minecraft-servers/versions.json
@@ -0,0 +1,116 @@
+{
+  "1.20": {
+    "sha1": "8dd1a28015f51b1803213892b50b7b4fc76e594d",
+    "url": "https://piston-data.mojang.com/v1/objects/8dd1a28015f51b1803213892b50b7b4fc76e594d/server.jar",
+    "version": "1.20.4",
+    "javaVersion": 17
+  },
+  "1.19": {
+    "url": "https://piston-data.mojang.com/v1/objects/8f3112a1049751cc472ec13e397eade5336ca7ae/server.jar",
+    "sha1": "8f3112a1049751cc472ec13e397eade5336ca7ae",
+    "version": "1.19.4",
+    "javaVersion": 17
+  },
+  "1.18": {
+    "url": "https://piston-data.mojang.com/v1/objects/c8f83c5655308435b3dcf03c06d9fe8740a77469/server.jar",
+    "sha1": "c8f83c5655308435b3dcf03c06d9fe8740a77469",
+    "version": "1.18.2",
+    "javaVersion": 17
+  },
+  "1.17": {
+    "url": "https://piston-data.mojang.com/v1/objects/a16d67e5807f57fc4e550299cf20226194497dc2/server.jar",
+    "sha1": "a16d67e5807f57fc4e550299cf20226194497dc2",
+    "version": "1.17.1",
+    "javaVersion": 16
+  },
+  "1.16": {
+    "url": "https://piston-data.mojang.com/v1/objects/1b557e7b033b583cd9f66746b7a9ab1ec1673ced/server.jar",
+    "sha1": "1b557e7b033b583cd9f66746b7a9ab1ec1673ced",
+    "version": "1.16.5",
+    "javaVersion": 8
+  },
+  "1.15": {
+    "url": "https://piston-data.mojang.com/v1/objects/bb2b6b1aefcd70dfd1892149ac3a215f6c636b07/server.jar",
+    "sha1": "bb2b6b1aefcd70dfd1892149ac3a215f6c636b07",
+    "version": "1.15.2",
+    "javaVersion": 8
+  },
+  "1.14": {
+    "url": "https://piston-data.mojang.com/v1/objects/3dc3d84a581f14691199cf6831b71ed1296a9fdf/server.jar",
+    "sha1": "3dc3d84a581f14691199cf6831b71ed1296a9fdf",
+    "version": "1.14.4",
+    "javaVersion": 8
+  },
+  "1.13": {
+    "url": "https://piston-data.mojang.com/v1/objects/3737db93722a9e39eeada7c27e7aca28b144ffa7/server.jar",
+    "sha1": "3737db93722a9e39eeada7c27e7aca28b144ffa7",
+    "version": "1.13.2",
+    "javaVersion": 8
+  },
+  "1.12": {
+    "url": "https://piston-data.mojang.com/v1/objects/886945bfb2b978778c3a0288fd7fab09d315b25f/server.jar",
+    "sha1": "886945bfb2b978778c3a0288fd7fab09d315b25f",
+    "version": "1.12.2",
+    "javaVersion": 8
+  },
+  "1.11": {
+    "url": "https://piston-data.mojang.com/v1/objects/f00c294a1576e03fddcac777c3cf4c7d404c4ba4/server.jar",
+    "sha1": "f00c294a1576e03fddcac777c3cf4c7d404c4ba4",
+    "version": "1.11.2",
+    "javaVersion": 8
+  },
+  "1.10": {
+    "url": "https://piston-data.mojang.com/v1/objects/3d501b23df53c548254f5e3f66492d178a48db63/server.jar",
+    "sha1": "3d501b23df53c548254f5e3f66492d178a48db63",
+    "version": "1.10.2",
+    "javaVersion": 8
+  },
+  "1.9": {
+    "url": "https://piston-data.mojang.com/v1/objects/edbb7b1758af33d365bf835eb9d13de005b1e274/server.jar",
+    "sha1": "edbb7b1758af33d365bf835eb9d13de005b1e274",
+    "version": "1.9.4",
+    "javaVersion": 8
+  },
+  "1.8": {
+    "url": "https://launcher.mojang.com/v1/objects/b58b2ceb36e01bcd8dbf49c8fb66c55a9f0676cd/server.jar",
+    "sha1": "b58b2ceb36e01bcd8dbf49c8fb66c55a9f0676cd",
+    "version": "1.8.9",
+    "javaVersion": 8
+  },
+  "1.7": {
+    "url": "https://launcher.mojang.com/v1/objects/952438ac4e01b4d115c5fc38f891710c4941df29/server.jar",
+    "sha1": "952438ac4e01b4d115c5fc38f891710c4941df29",
+    "version": "1.7.10",
+    "javaVersion": 8
+  },
+  "1.6": {
+    "url": "https://launcher.mojang.com/v1/objects/050f93c1f3fe9e2052398f7bd6aca10c63d64a87/server.jar",
+    "sha1": "050f93c1f3fe9e2052398f7bd6aca10c63d64a87",
+    "version": "1.6.4",
+    "javaVersion": null
+  },
+  "1.5": {
+    "url": "https://launcher.mojang.com/v1/objects/f9ae3f651319151ce99a0bfad6b34fa16eb6775f/server.jar",
+    "sha1": "f9ae3f651319151ce99a0bfad6b34fa16eb6775f",
+    "version": "1.5.2",
+    "javaVersion": 8
+  },
+  "1.4": {
+    "url": "https://launcher.mojang.com/v1/objects/2f0ec8efddd2f2c674c77be9ddb370b727dec676/server.jar",
+    "sha1": "2f0ec8efddd2f2c674c77be9ddb370b727dec676",
+    "version": "1.4.7",
+    "javaVersion": 8
+  },
+  "1.3": {
+    "url": "https://launcher.mojang.com/v1/objects/3de2ae6c488135596e073a9589842800c9f53bfe/server.jar",
+    "sha1": "3de2ae6c488135596e073a9589842800c9f53bfe",
+    "version": "1.3.2",
+    "javaVersion": 8
+  },
+  "1.2": {
+    "url": "https://launcher.mojang.com/v1/objects/d8321edc9470e56b8ad5c67bbd16beba25843336/server.jar",
+    "sha1": "d8321edc9470e56b8ad5c67bbd16beba25843336",
+    "version": "1.2.5",
+    "javaVersion": 8
+  }
+}
diff --git a/nixpkgs/pkgs/games/minecraft/default.nix b/nixpkgs/pkgs/games/minecraft/default.nix
new file mode 100644
index 000000000000..3009eb0b9a08
--- /dev/null
+++ b/nixpkgs/pkgs/games/minecraft/default.nix
@@ -0,0 +1,160 @@
+{ lib, stdenv
+, fetchurl
+, nixosTests
+, copyDesktopItems
+, makeDesktopItem
+, makeWrapper
+, wrapGAppsHook
+, gobject-introspection
+, jre # old or modded versions of the game may require Java 8 (https://aur.archlinux.org/packages/minecraft-launcher/#pinned-674960)
+, xorg
+, zlib
+, nss
+, nspr
+, fontconfig
+, pango
+, cairo
+, expat
+, alsa-lib
+, cups
+, dbus
+, atk
+, gtk3-x11
+, gtk2-x11
+, gdk-pixbuf
+, glib
+, curl
+, freetype
+, libpulseaudio
+, libuuid
+, systemd
+, flite ? null
+, libXxf86vm ? null
+}:
+let
+  desktopItem = makeDesktopItem {
+    name = "minecraft-launcher";
+    exec = "minecraft-launcher";
+    icon = "minecraft-launcher";
+    comment = "Official launcher for Minecraft, a sandbox-building game";
+    desktopName = "Minecraft Launcher";
+    categories = [ "Game" ];
+  };
+
+  envLibPath = lib.makeLibraryPath [
+    curl
+    libpulseaudio
+    systemd
+    alsa-lib # needed for narrator
+    flite # needed for narrator
+    libXxf86vm # needed only for versions <1.13
+  ];
+
+  libPath = lib.makeLibraryPath ([
+    alsa-lib
+    atk
+    cairo
+    cups
+    dbus
+    expat
+    fontconfig
+    freetype
+    gdk-pixbuf
+    glib
+    pango
+    gtk3-x11
+    gtk2-x11
+    nspr
+    nss
+    stdenv.cc.cc
+    zlib
+    libuuid
+  ] ++
+  (with xorg; [
+    libX11
+    libxcb
+    libXcomposite
+    libXcursor
+    libXdamage
+    libXext
+    libXfixes
+    libXi
+    libXrandr
+    libXrender
+    libXtst
+    libXScrnSaver
+  ]));
+in
+stdenv.mkDerivation rec {
+  pname = "minecraft-launcher";
+
+  version = "2.2.1441";
+
+  src = fetchurl {
+    url = "https://launcher.mojang.com/download/linux/x86_64/minecraft-launcher_${version}.tar.gz";
+    sha256 = "03q579hvxnsh7d00j6lmfh53rixdpf33xb5zlz7659pvb9j5w0cm";
+  };
+
+  icon = fetchurl {
+    url = "https://launcher.mojang.com/download/minecraft-launcher.svg";
+    sha256 = "0w8z21ml79kblv20wh5lz037g130pxkgs8ll9s3bi94zn2pbrhim";
+  };
+
+  nativeBuildInputs = [ makeWrapper wrapGAppsHook copyDesktopItems gobject-introspection ];
+
+  sourceRoot = ".";
+
+  dontWrapGApps = true;
+  dontConfigure = true;
+  dontBuild = true;
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/opt
+    mv minecraft-launcher $out/opt
+
+    install -D $icon $out/share/icons/hicolor/symbolic/apps/minecraft-launcher.svg
+
+    runHook postInstall
+  '';
+
+  preFixup = ''
+    patchelf \
+      --set-interpreter ${stdenv.cc.bintools.dynamicLinker} \
+      --set-rpath '$ORIGIN/'":${libPath}" \
+      $out/opt/minecraft-launcher/minecraft-launcher
+    patchelf \
+      --set-rpath '$ORIGIN/'":${libPath}" \
+      $out/opt/minecraft-launcher/libcef.so
+    patchelf \
+      --set-rpath '$ORIGIN/'":${libPath}" \
+      $out/opt/minecraft-launcher/liblauncher.so
+  '';
+
+  postFixup = ''
+    # 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 : ${lib.makeBinPath [ jre ]} \
+      --set JAVA_HOME ${lib.getBin jre} \
+      --chdir /tmp \
+      "''${gappsWrapperArgs[@]}"
+  '';
+
+  desktopItems = [ desktopItem ];
+
+  meta = with lib; {
+    description = "Official launcher for Minecraft, a sandbox-building game";
+    homepage = "https://minecraft.net";
+    maintainers = with maintainers; [ cpages ryantm infinisil ];
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    license = licenses.unfree;
+    platforms = [ "x86_64-linux" ];
+  };
+
+  passthru = {
+    tests = { inherit (nixosTests) minecraft; };
+    updateScript = ./update.sh;
+  };
+}
diff --git a/nixpkgs/pkgs/games/minecraft/update.sh b/nixpkgs/pkgs/games/minecraft/update.sh
new file mode 100755
index 000000000000..485fb5a560f6
--- /dev/null
+++ b/nixpkgs/pkgs/games/minecraft/update.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -i bash -p curl jq common-updater-scripts
+
+set -eu -o pipefail
+
+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/nixpkgs/pkgs/games/minesweep-rs/default.nix b/nixpkgs/pkgs/games/minesweep-rs/default.nix
new file mode 100644
index 000000000000..65b799508b7a
--- /dev/null
+++ b/nixpkgs/pkgs/games/minesweep-rs/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "minesweep-rs";
+  version = "6.0.47";
+
+  src = fetchFromGitHub {
+    owner = "cpcloud";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-6BrFWJ7YGALdKaPAX8Z1W2Eyyj0kbegybmwdnNUmOYo=";
+  };
+
+  cargoHash = "sha256-ju4tIie0Jrm9hh5Xoy4dqfPS8mqdN9Y0J1Nw4T9aN3Y=";
+
+  meta = with lib; {
+    description = "Sweep some mines for fun, and probably not for profit";
+    homepage = "https://github.com/cpcloud/minesweep-rs";
+    license = licenses.asl20;
+    mainProgram = "minesweep";
+    maintainers = with maintainers; [ aleksana ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/games/minetest/default.nix b/nixpkgs/pkgs/games/minetest/default.nix
new file mode 100644
index 000000000000..fcea007ff598
--- /dev/null
+++ b/nixpkgs/pkgs/games/minetest/default.nix
@@ -0,0 +1,138 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, irrlichtmt
+, coreutils
+, libpng
+, bzip2
+, curl
+, libogg
+, jsoncpp
+, libjpeg
+, libGLU
+, openal
+, libvorbis
+, sqlite
+, lua5_1
+, luajit
+, freetype
+, gettext
+, doxygen
+, ncurses
+, graphviz
+, xorg
+, gmp
+, libspatialindex
+, leveldb
+, postgresql
+, hiredis
+, libiconv
+, zlib
+, libXrandr
+, libX11
+, ninja
+, prometheus-cpp
+, OpenGL
+, OpenAL ? openal
+, Carbon
+, Cocoa
+, withTouchSupport ? false
+, buildClient ? true
+, buildServer ? true
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "minetest";
+  version = "5.8.0";
+
+  src = fetchFromGitHub {
+    owner = "minetest";
+    repo = "minetest";
+    rev = finalAttrs.version;
+    hash = "sha256-Oct8nQORSH8PjYs+gHU9QrKObMfapjAlGvycj+AJnOs=";
+  };
+
+  cmakeFlags = [
+    (lib.cmakeBool "BUILD_CLIENT" buildClient)
+    (lib.cmakeBool "BUILD_SERVER" buildServer)
+    (lib.cmakeBool "ENABLE_PROMETHEUS" buildServer)
+    (lib.cmakeBool "ENABLE_TOUCH" withTouchSupport)
+    # Ensure we use system libraries
+    (lib.cmakeBool "ENABLE_SYSTEM_GMP" true)
+    (lib.cmakeBool "ENABLE_SYSTEM_JSONCPP" true)
+    # Updates are handled by nix anyway
+    (lib.cmakeBool "ENABLE_UPDATE_CHECKER" false)
+    # ...but make it clear that this is a nix package
+    (lib.cmakeFeature "VERSION_EXTRA" "NixOS")
+
+    # Remove when https://github.com/NixOS/nixpkgs/issues/144170 is fixed
+    (lib.cmakeFeature "CMAKE_INSTALL_BINDIR" "bin")
+    (lib.cmakeFeature "CMAKE_INSTALL_DATADIR" "share")
+    (lib.cmakeFeature "CMAKE_INSTALL_DOCDIR" "share/doc/minetest")
+    (lib.cmakeFeature "CMAKE_INSTALL_MANDIR" "share/man")
+    (lib.cmakeFeature "CMAKE_INSTALL_LOCALEDIR" "share/locale")
+
+  ];
+
+  nativeBuildInputs = [
+    cmake
+    doxygen
+    graphviz
+    ninja
+  ];
+
+  buildInputs = [
+    irrlichtmt
+    jsoncpp
+    gettext
+    freetype
+    sqlite
+    curl
+    bzip2
+    ncurses
+    gmp
+    libspatialindex
+  ] ++ lib.optional (lib.meta.availableOn stdenv.hostPlatform luajit) luajit
+    ++ lib.optionals stdenv.isDarwin [
+    libiconv
+    OpenGL
+    OpenAL
+    Carbon
+    Cocoa
+  ] ++ lib.optionals buildClient [
+    libpng
+    libjpeg
+    libGLU
+    openal
+    libogg
+    libvorbis
+    xorg.libX11
+  ] ++ lib.optionals buildServer [
+    leveldb
+    postgresql
+    hiredis
+    prometheus-cpp
+  ];
+
+  postPatch = ''
+    substituteInPlace src/filesys.cpp --replace "/bin/rm" "${coreutils}/bin/rm"
+  '' + lib.optionalString stdenv.isDarwin ''
+    sed -i '/pagezero_size/d;/fixup_bundle/d' src/CMakeLists.txt
+  '';
+
+  postInstall = lib.optionalString stdenv.isLinux ''
+    patchShebangs $out
+  '' + lib.optionalString stdenv.isDarwin ''
+    mkdir -p $out/Applications
+    mv $out/minetest.app $out/Applications
+  '';
+
+  meta = with lib; {
+    homepage = "https://minetest.net/";
+    description = "Infinite-world block sandbox game";
+    license = licenses.lgpl21Plus;
+    platforms = platforms.linux ++ platforms.darwin;
+    maintainers = with maintainers; [ pyrolagus fpletz fgaz ];
+  };
+})
diff --git a/nixpkgs/pkgs/games/mnemosyne/default.nix b/nixpkgs/pkgs/games/mnemosyne/default.nix
new file mode 100644
index 000000000000..388aefe567b9
--- /dev/null
+++ b/nixpkgs/pkgs/games/mnemosyne/default.nix
@@ -0,0 +1,82 @@
+{ lib
+, stdenv
+, python
+, fetchurl
+, anki
+}:
+
+python.pkgs.buildPythonApplication rec {
+  pname = "mnemosyne";
+  version = "2.10.1";
+
+  src = fetchurl {
+    url    = "mirror://sourceforge/project/mnemosyne-proj/mnemosyne/mnemosyne-${version}/Mnemosyne-${version}.tar.gz";
+    sha256 = "sha256-zI79iuRXb5S0Y87KfdG+HKc0XVNQOAcBR7Zt/OdaBP4=";
+  };
+
+  nativeBuildInputs = with python.pkgs; [ pyqtwebengine.wrapQtAppsHook ];
+
+  buildInputs = [ anki ];
+
+  propagatedBuildInputs = with python.pkgs; [
+    cheroot
+    cherrypy
+    googletrans
+    gtts
+    matplotlib
+    pyopengl
+    pyqt6
+    pyqt6-webengine
+    argon2-cffi
+    webob
+  ];
+
+  prePatch = ''
+    substituteInPlace setup.py \
+      --replace '("", ["/usr/local/bin/mplayer"])' ""
+  '';
+
+  # No tests/ directory in tarball
+  doCheck = false;
+
+  postInstall = ''
+    mkdir -p $out/share/applications
+    mv mnemosyne.desktop $out/share/applications
+  '';
+
+  dontWrapQtApps = true;
+
+  makeWrapperArgs = [
+    "\${qtWrapperArgs[@]}"
+  ];
+
+  meta = {
+    homepage = "https://mnemosyne-proj.org/";
+    description = "Spaced-repetition software";
+    longDescription = ''
+      The Mnemosyne Project has two aspects:
+
+        * It's a free flash-card tool which optimizes your learning process.
+        * It's a research project into the nature of long-term memory.
+
+      We strive to provide a clear, uncluttered piece of software, easy to use
+      and to understand for newbies, but still infinitely customisable through
+      plugins and scripts for power users.
+
+      ## Efficient learning
+
+      Mnemosyne uses a sophisticated algorithm to schedule the best time for
+      a card to come up for review. Difficult cards that you tend to forget
+      quickly will be scheduled more often, while Mnemosyne won't waste your
+      time on things you remember well.
+
+      ## Memory research
+
+      If you want, anonymous statistics on your learning process can be
+      uploaded to a central server for analysis. This data will be valuable to
+      study the behaviour of our memory over a very long time period. The
+      results will be used to improve the scheduling algorithms behind the
+      software even further.
+    '';
+  };
+}
diff --git a/nixpkgs/pkgs/games/moon-buggy/default.nix b/nixpkgs/pkgs/games/moon-buggy/default.nix
new file mode 100644
index 000000000000..87e089eb9571
--- /dev/null
+++ b/nixpkgs/pkgs/games/moon-buggy/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, stdenv
+, fetchurl
+, ncurses
+}:
+stdenv.mkDerivation rec {
+  pname = "moon-buggy";
+  version = "1.0.51";
+
+  buildInputs = [
+    ncurses
+  ];
+
+  src = fetchurl {
+    url = "http://m.seehuhn.de/programs/moon-buggy-${version}.tar.gz";
+    sha256 = "0gyjwlpx0sd728dwwi7pwks4zfdy9rm1w1xbhwg6zip4r9nc2b9m";
+  };
+
+  meta = {
+    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 ++ lib.platforms.darwin;
+    homepage = "https://www.seehuhn.de/pages/moon-buggy";
+  };
+}
diff --git a/nixpkgs/pkgs/games/mrrescue/default.nix b/nixpkgs/pkgs/games/mrrescue/default.nix
new file mode 100644
index 000000000000..a020a6b34f1b
--- /dev/null
+++ b/nixpkgs/pkgs/games/mrrescue/default.nix
@@ -0,0 +1,58 @@
+{ lib, stdenv, fetchurl, love, lua, makeWrapper, makeDesktopItem }:
+
+let
+  pname = "mrrescue";
+  version = "1.02d";
+
+  icon = fetchurl {
+    url = "http://tangramgames.dk/img/thumb/mrrescue.png";
+    sha256 = "1y5ahf0m01i1ch03axhvp2kqc6lc1yvh59zgvgxw4w7y3jryw20k";
+  };
+
+  desktopItem = makeDesktopItem {
+    name = "mrrescue";
+    exec = pname;
+    icon = icon;
+    comment = "Arcade-style fire fighting game";
+    desktopName = "Mr. Rescue";
+    genericName = "mrrescue";
+    categories = [ "Game" ];
+  };
+
+in
+
+stdenv.mkDerivation {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "https://github.com/SimonLarsen/${pname}/releases/download/v${version}/${pname}-${version}.love";
+    sha256 = "0kzahxrgpb4vsk9yavy7f8nc34d62d1jqjrpsxslmy9ywax4yfpi";
+  };
+
+  nativeBuildInputs = [ lua love makeWrapper ];
+
+  dontUnpack = true;
+
+  installPhase =
+  ''
+    mkdir -p $out/bin
+    mkdir -p $out/share/games/lovegames
+
+    cp -v $src $out/share/games/lovegames/${pname}.love
+
+    makeWrapper ${love}/bin/love $out/bin/${pname} --add-flags $out/share/games/lovegames/${pname}.love
+
+    chmod +x $out/bin/${pname}
+    mkdir -p $out/share/applications
+    ln -s ${desktopItem}/share/applications/* $out/share/applications/
+  '';
+
+  meta = with lib; {
+    description = "Arcade-style fire fighting game";
+    maintainers = with maintainers; [ ];
+    platforms = platforms.linux;
+    license = licenses.zlib;
+    downloadPage = "http://tangramgames.dk/games/mrrescue";
+  };
+
+}
diff --git a/nixpkgs/pkgs/games/mudlet/default.nix b/nixpkgs/pkgs/games/mudlet/default.nix
new file mode 100644
index 000000000000..39faa5d4fb9b
--- /dev/null
+++ b/nixpkgs/pkgs/games/mudlet/default.nix
@@ -0,0 +1,135 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, git
+, pkg-config
+, qttools
+, which
+, wrapQtAppsHook
+, boost
+, hunspell
+, libGLU
+, libsForQt5
+, libsecret
+, libzip
+, lua
+, pcre
+, pugixml
+, qtbase
+, qtmultimedia
+, discord-rpc
+, yajl
+}:
+
+let
+  overrideLua =
+    let
+      packageOverrides = self: super: {
+        # luasql-sqlite3 master branch broke compatibility with lua 5.1. Pin to
+        # an earlier commit.
+        # https://github.com/lunarmodules/luasql/issues/147
+        luasql-sqlite3 = super.luaLib.overrideLuarocks super.luasql-sqlite3
+          (drv: {
+            version = "2.6.0-1-custom";
+            src = fetchFromGitHub {
+              owner = "lunarmodules";
+              repo = "luasql";
+              rev = "8c58fd6ee32faf750daf6e99af015a31402578d1";
+              hash = "sha256-XlTB5O81yWCrx56m0cXQp7EFzeOyfNeqGbuiYqMrTUk=";
+            };
+          });
+      };
+    in
+    lua.override { inherit packageOverrides; };
+
+  luaEnv = overrideLua.withPackages (ps: with ps; [
+    luazip
+    luafilesystem
+    lrexlib-pcre
+    luasql-sqlite3
+    lua-yajl
+    luautf8
+  ]);
+in
+stdenv.mkDerivation rec {
+  pname = "mudlet";
+  version = "4.17.2";
+
+  src = fetchFromGitHub {
+    owner = "Mudlet";
+    repo = "Mudlet";
+    rev = "Mudlet-${version}";
+    fetchSubmodules = true;
+    hash = "sha256-K75frptePKfHeGQNXaX4lKsLwO6Rs6AAka6hvP8MA+k=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    git
+    pkg-config
+    qttools
+    which
+    wrapQtAppsHook
+  ];
+
+  buildInputs = [
+    boost
+    hunspell
+    libGLU
+    libsForQt5.qtkeychain
+    libsecret
+    libzip
+    luaEnv
+    pcre
+    pugixml
+    qtbase
+    qtmultimedia
+    yajl
+    discord-rpc
+  ];
+
+  cmakeFlags = [
+    # RPATH of binary /nix/store/.../bin/... contains a forbidden reference to /build/
+    "-DCMAKE_SKIP_BUILD_RPATH=ON"
+  ];
+
+  WITH_FONTS = "NO";
+  WITH_UPDATER = "NO";
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -pv $out/lib
+    cp 3rdparty/edbee-lib/edbee-lib/qslog/lib/libQsLog.so $out/lib
+    mkdir -pv $out/bin
+    cp src/mudlet $out
+    mkdir -pv $out/share/mudlet
+    cp -r ../src/mudlet-lua/lua $out/share/mudlet/
+
+    mkdir -pv $out/share/applications
+    cp ../mudlet.desktop $out/share/applications/
+
+    mkdir -pv $out/share/pixmaps
+    cp -r ../mudlet.png $out/share/pixmaps/
+
+    cp -r ../translations $out/share/
+
+    makeQtWrapper $out/mudlet $out/bin/mudlet \
+      --set LUA_CPATH "${luaEnv}/lib/lua/${lua.luaversion}/?.so" \
+      --prefix LUA_PATH : "$NIX_LUA_PATH" \
+      --prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath [ libsForQt5.qtkeychain discord-rpc ]}" \
+      --chdir "$out";
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Crossplatform mud client";
+    homepage = "https://www.mudlet.org/";
+    maintainers = with maintainers; [ wyvie pstn cpu ];
+    platforms = platforms.linux;
+    license = licenses.gpl2Plus;
+    mainProgram = "mudlet";
+  };
+}
diff --git a/nixpkgs/pkgs/games/n2048/default.nix b/nixpkgs/pkgs/games/n2048/default.nix
new file mode 100644
index 000000000000..ec3a4e2bbeec
--- /dev/null
+++ b/nixpkgs/pkgs/games/n2048/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, fetchurl, ncurses }:
+
+stdenv.mkDerivation rec {
+  pname = "n2048";
+  version = "0.1";
+  src = fetchurl {
+    url = "http://www.dettus.net/n2048/n2048_v${version}.tar.gz";
+    sha256 = "184z2rr0rnj4p740qb4mzqr6kgd76ynb5gw9bj8hrfshcxdcg1kk";
+  };
+  buildInputs = [
+    ncurses
+  ];
+  makeFlags = [
+    "DESTDIR=$(out)"
+  ];
+  preInstall = ''
+    mkdir -p "$out"/{share/man,bin}
+  '';
+  meta = with lib; {
+    description = "Console implementation of 2048 game";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ raskin ];
+    platforms = platforms.linux;
+    homepage = "http://www.dettus.net/n2048/";
+  };
+}
diff --git a/nixpkgs/pkgs/games/naev/default.nix b/nixpkgs/pkgs/games/naev/default.nix
new file mode 100644
index 000000000000..fae719b736f5
--- /dev/null
+++ b/nixpkgs/pkgs/games/naev/default.nix
@@ -0,0 +1,83 @@
+{ lib
+, SDL2
+, SDL2_image
+, enet
+, fetchFromGitHub
+, freetype
+, glpk
+, intltool
+, libpng
+, libunibreak
+, libvorbis
+, libwebp
+, libxml2
+, luajit
+, meson
+, ninja
+, openal
+, openblas
+, pcre2
+, physfs
+, pkg-config
+, python3
+, stdenv
+, suitesparse
+}:
+
+stdenv.mkDerivation rec {
+  pname = "naev";
+  version = "0.11.0";
+
+  src = fetchFromGitHub {
+    owner = "naev";
+    repo = "naev";
+    rev = "v${version}";
+    sha256 = "sha256-JTXZzxjfnD3OKZq1wms9bPwIBXyu9FuZB6hvH7HwvRI=";
+    fetchSubmodules = true;
+  };
+
+  buildInputs = [
+    SDL2
+    SDL2_image
+    enet
+    freetype
+    glpk
+    libpng
+    libunibreak
+    libvorbis
+    libwebp
+    libxml2
+    luajit
+    openal
+    openblas
+    pcre2
+    physfs
+    suitesparse
+  ];
+
+  nativeBuildInputs = [
+    (python3.withPackages (ps: with ps; [ pyyaml mutagen ]))
+    meson
+    ninja
+    pkg-config
+    intltool
+  ];
+
+  mesonFlags = [
+    "-Ddocs_c=disabled"
+    "-Ddocs_lua=disabled"
+    "-Dluajit=enabled"
+  ];
+
+  postPatch = ''
+    patchShebangs --build dat/outfits/bioship/generate.py utils/build/*.py utils/*.py
+  '';
+
+  meta = {
+    description = "2D action/rpg space game";
+    homepage = "http://www.naev.org";
+    license = lib.licenses.gpl3Plus;
+    maintainers = with lib.maintainers; [ ralismark ];
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/nanosaur/default.nix b/nixpkgs/pkgs/games/nanosaur/default.nix
new file mode 100644
index 000000000000..4ec59b726ee3
--- /dev/null
+++ b/nixpkgs/pkgs/games/nanosaur/default.nix
@@ -0,0 +1,47 @@
+{ lib, stdenv, fetchFromGitHub, SDL2, cmake, makeWrapper }:
+
+stdenv.mkDerivation rec {
+  pname = "nanosaur";
+  version = "unstable-2021-12-03";
+
+  src = fetchFromGitHub {
+    owner = "jorio";
+    repo = pname;
+    rev = "b567a3e6d7fd1cbc43800cfaa1bd82f31c6d9fae";
+    sha256 = "sha256-P/o6uSwUV6O8u8XNXN9YyA8XlgEUkqGj3SC+oD2/GKQ=";
+    fetchSubmodules = true;
+  };
+
+  nativeBuildInputs = [
+    cmake
+    makeWrapper
+  ];
+  buildInputs = [
+    SDL2
+  ];
+
+  installPhase = ''
+    runHook preInstall
+    mkdir -p "$out/bin"
+    mkdir -p "$out/share/Nanosaur"
+    mv Data ReadMe.txt "$out/share/Nanosaur/"
+    install -Dm755 {.,$out/bin}/Nanosaur
+    wrapProgram $out/bin/Nanosaur --chdir "$out/share/Nanosaur"
+    install -Dm644 $src/packaging/nanosaur.desktop $out/share/applications/nanosaur.desktop
+    install -Dm644 $src/packaging/nanosaur-desktopicon.png $out/share/pixmaps/nanosaur-desktopicon.png
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "A port of Nanosaur, a 1998 Macintosh game by Pangea Software, for modern operating systems";
+    longDescription = ''
+      Nanosaur is a 1998 Macintosh game by Pangea Software.
+      In it, you’re a cybernetic dinosaur from the future who’s sent back in time 20 minutes before a giant asteroid hits the Earth.
+      And you get to shoot at T-Rexes with nukes.
+    '';
+    homepage = "https://github.com/jorio/Nanosaur";
+    license = licenses.cc-by-sa-40;
+    maintainers = with maintainers; [ lux ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/nanosaur2/default.nix b/nixpkgs/pkgs/games/nanosaur2/default.nix
new file mode 100644
index 000000000000..7ab77623e653
--- /dev/null
+++ b/nixpkgs/pkgs/games/nanosaur2/default.nix
@@ -0,0 +1,47 @@
+{ lib, stdenv, fetchFromGitHub, SDL2, cmake, makeWrapper }:
+
+stdenv.mkDerivation rec {
+  pname = "nanosaur2";
+  version = "2.1.0";
+
+  src = fetchFromGitHub {
+    owner = "jorio";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-UY+fyn8BA/HfCd2LCj5cfGmQACKUICH6CDCW4q6YDkg=";
+    fetchSubmodules = true;
+  };
+
+  nativeBuildInputs = [
+    cmake
+    makeWrapper
+  ];
+  buildInputs = [
+    SDL2
+  ];
+
+  installPhase = ''
+    runHook preInstall
+    mkdir -p "$out/bin"
+    mkdir -p "$out/share/Nanosaur2"
+    mv Data ReadMe.txt "$out/share/Nanosaur2/"
+    install -Dm755 {.,$out/bin}/Nanosaur2
+    wrapProgram $out/bin/Nanosaur2 --chdir "$out/share/Nanosaur2"
+    install -Dm644 $src/packaging/nanosaur2.desktop $out/share/applications/nanosaur2.desktop
+    install -Dm644 $src/packaging/nanosaur2-desktopicon.png $out/share/pixmaps/nanosaur2-desktopicon.png
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "A port of Nanosaur2, a 2004 Macintosh game by Pangea Software, for modern operating systems";
+    longDescription = ''
+      Nanosaur is a 2004 Macintosh game by Pangea Software.
+
+      Is a continuation of the original Nanosaur storyline, only this time you get to fly a pterodactyl who’s loaded with hi-tech weaponry.
+    '';
+    homepage = "https://github.com/jorio/Nanosaur2";
+    license = licenses.cc-by-sa-40;
+    maintainers = with maintainers; [ lux ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/nethack/default.nix b/nixpkgs/pkgs/games/nethack/default.nix
new file mode 100644
index 000000000000..46e4dc9ca20b
--- /dev/null
+++ b/nixpkgs/pkgs/games/nethack/default.nix
@@ -0,0 +1,154 @@
+{ stdenv, lib, fetchurl, coreutils, ncurses, gzip, flex, bison
+, less
+, buildPackages
+, x11Mode ? false, qtMode ? false, libXaw, libXext, libXpm, bdftopcf, mkfontdir, pkg-config, qt5
+}:
+
+let
+  platform =
+    if stdenv.hostPlatform.isUnix then "unix"
+    else throw "Unknown platform for NetHack: ${stdenv.hostPlatform.system}";
+  unixHint =
+    if x11Mode then "linux-x11"
+    else if qtMode then "linux-qt4"
+    else if stdenv.hostPlatform.isLinux  then "linux"
+    else if stdenv.hostPlatform.isDarwin then "macosx10.10"
+    # We probably want something different for Darwin
+    else "unix";
+  userDir = "~/.config/nethack";
+  binPath = lib.makeBinPath [ coreutils less ];
+
+in stdenv.mkDerivation rec {
+  version = "3.6.7";
+  pname = if x11Mode then "nethack-x11"
+         else if qtMode then "nethack-qt"
+         else "nethack";
+
+  src = fetchurl {
+    url = "https://nethack.org/download/${version}/nethack-${lib.replaceStrings ["."] [""] version}-src.tgz";
+    sha256 = "sha256-mM9n323r+WaKYXRaqEwJvKs2Ll0z9blE7FFV1E0qrLI=";
+  };
+
+  buildInputs = [ ncurses ]
+                ++ lib.optionals x11Mode [ libXaw libXext libXpm ]
+                ++ lib.optionals qtMode [ gzip qt5.qtbase.bin qt5.qtmultimedia.bin ];
+
+  nativeBuildInputs = [ flex bison ]
+                      ++ lib.optionals x11Mode [ mkfontdir bdftopcf ]
+                      ++ lib.optionals qtMode [
+                           pkg-config mkfontdir qt5.qtbase.dev
+                           qt5.qtmultimedia.dev qt5.wrapQtAppsHook
+                           bdftopcf
+                         ];
+
+  makeFlags = [ "PREFIX=$(out)" ];
+
+  postPatch = ''
+    sed -e '/^ *cd /d' -i sys/unix/nethack.sh
+    sed \
+      -e 's/^YACC *=.*/YACC = bison -y/' \
+      -e 's/^LEX *=.*/LEX = flex/' \
+      -i sys/unix/Makefile.utl
+    sed \
+      -e 's,^WINQT4LIB =.*,WINQT4LIB = `pkg-config Qt5Gui --libs` \\\
+            `pkg-config Qt5Widgets --libs` \\\
+            `pkg-config Qt5Multimedia --libs`,' \
+      -i sys/unix/Makefile.src
+    sed \
+      -e 's,^CFLAGS=-g,CFLAGS=,' \
+      -e 's,/bin/gzip,${gzip}/bin/gzip,g' \
+      -e 's,^WINTTYLIB=.*,WINTTYLIB=-lncurses,' \
+      -i sys/unix/hints/linux
+    sed \
+      -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=,' \
+      -i sys/unix/hints/macosx10.10
+    sed -e '/define CHDIR/d' -i include/config.h
+    ${lib.optionalString qtMode ''
+    sed \
+      -e 's,^QTDIR *=.*,QTDIR=${qt5.qtbase.dev},' \
+      -e 's,CFLAGS.*QtGui.*,CFLAGS += `pkg-config Qt5Gui --cflags`,' \
+      -e 's,CFLAGS+=-DCOMPRESS.*,CFLAGS+=-DCOMPRESS=\\"${gzip}/bin/gzip\\" \\\
+        -DCOMPRESS_EXTENSION=\\".gz\\",' \
+      -e 's,moc-qt4,moc,' \
+      -i sys/unix/hints/linux-qt4
+    ''}
+    ${lib.optionalString (stdenv.buildPlatform != stdenv.hostPlatform)
+    # If we're cross-compiling, replace the paths to the data generation tools
+    # with the ones from the build platform's nethack package, since we can't
+    # run the ones we've built here.
+    ''
+    ${buildPackages.perl}/bin/perl -p \
+      -e 's,[a-z./]+/(makedefs|dgn_comp|lev_comp|dlb)(?!\.),${buildPackages.nethack}/libexec/nethack/\1,g' \
+      -i sys/unix/Makefile.*
+    ''}
+    sed -i -e '/rm -f $(MAKEDEFS)/d' sys/unix/Makefile.src
+    # Fix building on darwin where otherwise __has_attribute fails with an empty parameter
+    sed -e 's/define __warn_unused_result__ .*/define __warn_unused_result__ __unused__/' -i include/tradstdc.h
+    sed -e 's/define warn_unused_result .*/define warn_unused_result __unused__/' -i include/tradstdc.h
+  '';
+
+  configurePhase = ''
+    pushd sys/${platform}
+    ${lib.optionalString (platform == "unix") ''
+      sh setup.sh hints/${unixHint}
+    ''}
+    popd
+  '';
+
+  enableParallelBuilding = true;
+
+  preFixup = lib.optionalString qtMode ''
+    wrapQtApp "$out/games/nethack"
+  '';
+
+  postInstall = ''
+    mkdir -p $out/games/lib/nethackuserdir
+    for i in xlogfile logfile perm record save; do
+      mv $out/games/lib/nethackdir/$i $out/games/lib/nethackuserdir
+    done
+
+    mkdir -p $out/bin
+    cat <<EOF >$out/bin/nethack
+    #! ${stdenv.shell} -e
+    PATH=${binPath}:\$PATH
+
+    if [ ! -d ${userDir} ]; then
+      mkdir -p ${userDir}
+      cp -r $out/games/lib/nethackuserdir/* ${userDir}
+      chmod -R +w ${userDir}
+    fi
+
+    RUNDIR=\$(mktemp -d)
+
+    cleanup() {
+      rm -rf \$RUNDIR
+    }
+    trap cleanup EXIT
+
+    cd \$RUNDIR
+    for i in ${userDir}/*; do
+      ln -s \$i \$(basename \$i)
+    done
+    for i in $out/games/lib/nethackdir/*; do
+      ln -s \$i \$(basename \$i)
+    done
+    $out/games/nethack
+    EOF
+    chmod +x $out/bin/nethack
+    ${lib.optionalString x11Mode "mv $out/bin/nethack $out/bin/nethack-x11"}
+    ${lib.optionalString qtMode "mv $out/bin/nethack $out/bin/nethack-qt"}
+    install -Dm 555 util/{makedefs,dgn_comp,lev_comp} -t $out/libexec/nethack/
+    ${lib.optionalString (!(x11Mode || qtMode)) "install -Dm 555 util/dlb -t $out/libexec/nethack/"}
+  '';
+
+  meta = with lib; {
+    description = "Rogue-like game";
+    homepage = "http://nethack.org/";
+    license = "nethack";
+    platforms = if x11Mode then platforms.linux else platforms.unix;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/netris/default.nix b/nixpkgs/pkgs/games/netris/default.nix
new file mode 100644
index 000000000000..ff898128ca06
--- /dev/null
+++ b/nixpkgs/pkgs/games/netris/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, fetchFromGitHub, ncurses }:
+
+stdenv.mkDerivation {
+  pname = "netris";
+  version = "0.52";
+
+  src = fetchFromGitHub {
+    owner = "naclander";
+    repo = "netris";
+    rev = "6773c9b2d39a70481a5d6eb5368e9ced6229ad2b";
+    sha256 = "0gmxbpn50pnffidwjchkzph9rh2jm4wfq7hj8msp5vhdq5h0z9hm";
+  };
+
+  buildInputs = [
+    ncurses
+  ];
+
+  configureScript = "./Configure";
+  dontAddPrefix = true;
+
+  installPhase = ''
+    mkdir -p $out/bin
+    cp ./netris $out/bin
+  '';
+
+  meta = with lib; {
+    description = "A free networked version of T*tris";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ patryk27 ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/neverball/default.nix b/nixpkgs/pkgs/games/neverball/default.nix
new file mode 100644
index 000000000000..5e8e3f41c784
--- /dev/null
+++ b/nixpkgs/pkgs/games/neverball/default.nix
@@ -0,0 +1,51 @@
+{ lib, stdenv, fetchurl, fetchpatch, SDL2, libGL, libpng, libjpeg, SDL2_ttf, libvorbis, gettext
+, physfs }:
+
+stdenv.mkDerivation rec {
+  pname = "neverball";
+  version = "1.6.0";
+  src = fetchurl {
+    url = "https://neverball.org/neverball-${version}.tar.gz";
+    sha256 = "184gm36c6p6vaa6gwrfzmfh86klhnb03pl40ahsjsvprlk667zkk";
+  };
+  patches = [
+    # Pull upstream fix for -fno-common toolchains
+    #   https://github.com/Neverball/neverball/pull/198
+    (fetchpatch {
+      name = "fno-common.patch";
+      url = "https://github.com/Neverball/neverball/commit/a42492b8db06934c7a794630db92e3ff6ebaadaa.patch";
+      sha256 = "0sqyxfwpl4xxra8iz87j5rxzwani16xra2xl4l5z61shvq30308h";
+    })
+  ];
+
+  buildInputs = [ libpng SDL2 libGL libjpeg SDL2_ttf libvorbis gettext physfs ];
+
+  dontPatchELF = true;
+
+  postPatch = ''
+    sed -i -e 's@\./data@'$out/share/neverball/data@ share/base_config.h Makefile
+    sed -i -e 's@\./locale@'$out/share/neverball/locale@ share/base_config.h Makefile
+    sed -i -e 's@-lvorbisfile@-lvorbisfile -lX11 -lgcc_s@' Makefile
+  '';
+
+  # The map generation code requires a writable HOME
+  preConfigure = "export HOME=$TMPDIR";
+
+  installPhase = ''
+    mkdir -p $out/bin $out/share/neverball
+    cp -R data locale $out/share/neverball
+    cp neverball $out/bin
+    cp neverputt $out/bin
+    cp mapc $out/bin
+  '';
+
+  enableParallelBuilding = true;
+
+  meta = {
+    homepage = "https://neverball.org/";
+    description = "Tilt the floor to roll a ball";
+    license = "GPL";
+    maintainers = with lib.maintainers; [viric];
+    platforms = with lib.platforms; linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/newtonwars/default.nix b/nixpkgs/pkgs/games/newtonwars/default.nix
new file mode 100644
index 000000000000..0be3d9bf7a0e
--- /dev/null
+++ b/nixpkgs/pkgs/games/newtonwars/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv, fetchFromGitHub, makeWrapper, freeglut, libGLU, libGL }:
+
+stdenv.mkDerivation {
+  pname = "newtonwars";
+  version = "20150609";
+
+  src = fetchFromGitHub {
+    owner = "Draradech";
+    repo = "NewtonWars";
+    rev = "98bb99a1797fd0073e0fd25ef9218468d3a9f7cb";
+    sha256 = "0g63fwfcdxxlnqlagj1fb8ngm385gmv8f7p8b4r1z5cny2znxdvs";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ freeglut libGL libGLU ];
+
+  patchPhase = ''
+    sed -i "s;font24.raw;$out/share/font24.raw;g" display.c
+  '';
+
+  buildPhase = "sh build-linux.sh";
+
+  installPhase = ''
+    mkdir -p $out/bin $out/share
+    cp nw $out/bin
+    cp font24.raw $out/share
+
+    wrapProgram $out/bin/nw \
+      --prefix LD_LIBRARY_PATH ":" ${freeglut}/lib \
+      --prefix LD_LIBRARY_PATH ":" ${libGLU}/lib \
+      --prefix LD_LIBRARY_PATH ":" ${libGL}/lib
+  '';
+
+  meta = with lib; {
+    description = "A space battle game with gravity as the main theme";
+    maintainers = with maintainers; [ pSub ];
+    platforms = platforms.linux;
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/games/nexuiz/default.nix b/nixpkgs/pkgs/games/nexuiz/default.nix
new file mode 100644
index 000000000000..fe3081109e9b
--- /dev/null
+++ b/nixpkgs/pkgs/games/nexuiz/default.nix
@@ -0,0 +1,76 @@
+{ lib, stdenv, fetchurl
+, # required for both
+  unzip, zlib, curl, libjpeg, libpng, libvorbis, libtheora
+, libogg, libmodplug
+, # glx
+  libX11, libGLU, libGL, libXpm, libXext, libXxf86vm, libXxf86dga, alsa-lib
+, # sdl
+  SDL
+}:
+
+let
+  version = "2.5.2";
+
+  version_short = lib.replaceStrings [ "." ] [ "" ] version;
+in stdenv.mkDerivation {
+  pname = "nexuiz";
+  inherit version;
+
+  src = fetchurl {
+    url = "mirror://sourceforge/nexuiz/nexuiz-${version_short}.zip";
+    sha256 = "0010jrxc68qqinkvdh1qn2b8z3sa5v1kcd8d1m4llp3pr6y7xqm5";
+  };
+
+  nativeBuildInputs = [ unzip ];
+  buildInputs = [
+    # glx
+    libX11 libGLU libGL libXpm libXext libXxf86vm libXxf86dga alsa-lib
+    # sdl
+    SDL
+  ];
+
+  postUnpack = ''
+    cd Nexuiz/sources/
+    unzip enginesource*.zip
+    cd ../../
+  '';
+
+  NIX_LDFLAGS = ''
+    -rpath ${zlib.out}/lib
+    -rpath ${curl.out}/lib
+    -rpath ${libjpeg.out}/lib
+    -rpath ${libpng.out}/lib
+    -rpath ${libvorbis.out}/lib
+    -rpath ${libtheora.out}/lib
+    -rpath ${libogg.out}/lib
+    -rpath ${libmodplug.out}/lib
+  '';
+
+  buildPhase = ''
+    cd sources/darkplaces/
+    DP_FS_BASEDIR="$out/share/nexuiz"
+    make DP_FS_BASEDIR=$DP_FS_BASEDIR cl-release
+    make DP_FS_BASEDIR=$DP_FS_BASEDIR sdl-release
+    make DP_FS_BASEDIR=$DP_FS_BASEDIR sv-release
+    cd ../../
+  '';
+
+  installPhase = ''
+    mkdir -pv "$out/bin/"
+    cp -v sources/darkplaces/darkplaces-glx "$out/bin/nexuiz-glx"
+    cp -v sources/darkplaces/darkplaces-sdl "$out/bin/nexuiz-sdl"
+    cp -v sources/darkplaces/darkplaces-dedicated "$out/bin/nexuiz-dedicated"
+    mkdir -pv "$out/share/nexuiz/"
+    cp -rv data/ "$out/share/nexuiz/"
+    ln -s "$out/bin/nexuiz-sdl" "$out/bin/nexuiz"
+  '';
+
+  dontPatchELF = true;
+
+  meta = {
+    description = "A free fast-paced first-person shooter";
+    homepage = "http://www.alientrap.org/games/nexuiz";
+    license = lib.licenses.gpl2;
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/nile/default.nix b/nixpkgs/pkgs/games/nile/default.nix
new file mode 100644
index 000000000000..deae40acf064
--- /dev/null
+++ b/nixpkgs/pkgs/games/nile/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, unstableGitUpdater
+, buildPythonApplication
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+, requests
+, protobuf
+, pycryptodome
+, zstandard
+, json5
+, platformdirs
+, cacert
+}:
+
+buildPythonApplication rec {
+  pname = "nile";
+  version = "unstable-2023-10-02";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "imLinguin";
+    repo = "nile";
+    rev = "8f7ab2650fc730efc8960b5fcd71421d724a4108";
+    hash = "sha256-Vhjp9JX8VX0PWsvEh5eOhz7vsIEaiCyPNPOjibE8GXo=";
+  };
+
+  disabled = pythonOlder "3.8";
+
+  propagatedBuildInputs = [
+    setuptools
+    requests
+    protobuf
+    pycryptodome
+    zstandard
+    json5
+    platformdirs
+  ];
+
+  pyprojectAppendix = ''
+    [tool.setuptools.packages.find]
+    include = ["nile*"]
+  '';
+
+  postPatch = ''
+    echo "$pyprojectAppendix" >> pyproject.toml
+  '';
+
+  pythonImportsCheck = [ "nile" ];
+
+  meta = with lib; {
+    description = "Unofficial Amazon Games client";
+    homepage = "https://github.com/imLinguin/nile";
+    license = with licenses; [ gpl3 ];
+    maintainers = with maintainers; [ aidalgol ];
+  };
+
+  passthru.updateScript = unstableGitUpdater { };
+}
diff --git a/nixpkgs/pkgs/games/ninvaders/default.nix b/nixpkgs/pkgs/games/ninvaders/default.nix
new file mode 100644
index 000000000000..c3f455b71b07
--- /dev/null
+++ b/nixpkgs/pkgs/games/ninvaders/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, fetchFromGitHub, cmake, ncurses }:
+
+stdenv.mkDerivation rec {
+  pname = "ninvaders";
+  version = "0.1.2";
+
+  src = fetchFromGitHub {
+    owner = "sf-refugees";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1wmwws1zsap4bfc2439p25vnja0hnsf57k293rdxw626gly06whi";
+  };
+
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ ncurses ];
+
+  meta = with lib; {
+    description = "Space Invaders clone based on ncurses";
+    homepage = "https://ninvaders.sourceforge.net/";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ _1000101 ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/games/njam/default.nix b/nixpkgs/pkgs/games/njam/default.nix
new file mode 100644
index 000000000000..971cd1d0726c
--- /dev/null
+++ b/nixpkgs/pkgs/games/njam/default.nix
@@ -0,0 +1,28 @@
+{lib, stdenv, fetchurl, SDL, SDL_image, SDL_mixer, SDL_net }:
+
+stdenv.mkDerivation rec {
+  pname = "njam";
+  version = "1.25";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/njam/njam-${version}-src.tar.gz";
+    sha256 = "0ysvqw017xkvddj957pdfmbmji7qi20nyr7f0zxvcvm6c7d3cc7s";
+  };
+
+  preBuild = ''
+    rm src/*.o
+  '';
+
+  buildInputs = [ SDL SDL_image SDL_mixer SDL_net ];
+
+  hardeningDisable = [ "format" ];
+
+  patches = [ ./logfile.patch ];
+
+  meta = {
+    homepage = "https://trackballs.sourceforge.net/";
+    description = "Cross-platform pacman-like game";
+    license = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/njam/logfile.patch b/nixpkgs/pkgs/games/njam/logfile.patch
new file mode 100644
index 000000000000..45fd82a0845b
--- /dev/null
+++ b/nixpkgs/pkgs/games/njam/logfile.patch
@@ -0,0 +1,22 @@
+diff --git a/src/njamedit.cpp b/src/njamedit.cpp
+index a895ca9..38477db 100644
+--- a/src/njamedit.cpp
++++ b/src/njamedit.cpp
+@@ -114,7 +114,7 @@ void NjamEngine::LevelEditor()
+ 				key = SDLK_a;
+ 			else if (CheckForSave())
+ 			{
+-				LogFile::LogFile("Saving maps");
++				LogFile("Saving maps");
+ 				m_Maps.Save(filename);
+ 				level_type_was = level_type;
+ 				changed = false;
+@@ -139,7 +139,7 @@ void NjamEngine::LevelEditor()
+ 						"levels/%s.%s",
+ #endif					
+ 						filename, types[level_type]);
+-					LogFile::LogFile("Saving maps");
++					LogFile("Saving maps");
+ 					m_Maps.Save(buf);
+ 					level_type_was = level_type;
+ 					changed = false;
diff --git a/nixpkgs/pkgs/games/npush/default.nix b/nixpkgs/pkgs/games/npush/default.nix
new file mode 100644
index 000000000000..7f4afb7b89f3
--- /dev/null
+++ b/nixpkgs/pkgs/games/npush/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, stdenv
+, fetchurl
+, ncurses
+}:
+
+stdenv.mkDerivation rec {
+  pname = "npush";
+  version = "0.7";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/project/npush/${pname}/${version}/${pname}-${version}.tgz";
+    hash = "sha256-8hbSsyeehzd4T3fUhDyebyI/oTHOHr3a8ArYAquivNk=";
+  };
+
+  outputs = [ "out" "doc" ];
+
+  buildInputs = [
+    ncurses
+  ];
+
+  dontConfigure = true;
+
+  makeFlags = [
+    "CC=${stdenv.cc.targetPrefix}c++"
+  ];
+  env.NIX_CFLAGS_COMPILE = "-Wno-error=format-security";
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/bin $out/share/npush/levels $doc/share/doc/npush
+    cp npush $out/bin/
+    cp levels/* $out/share/npush/levels
+    cp CHANGES COPYING CREDITS index.html \
+       readme.txt screenshot1.png screenshot2.png $doc/share/doc/npush/
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    homepage = "https://npush.sourceforge.net/";
+    description = "A Sokoban-like game";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ AndersonTorres ];
+    platforms = with platforms; unix;
+  };
+}
diff --git a/nixpkgs/pkgs/games/npush/run.nix b/nixpkgs/pkgs/games/npush/run.nix
new file mode 100644
index 000000000000..bc4a3b5fda3f
--- /dev/null
+++ b/nixpkgs/pkgs/games/npush/run.nix
@@ -0,0 +1,31 @@
+{ runtimeShell
+, symlinkJoin
+, writeShellScriptBin
+, npush
+}:
+
+let
+  runScript = writeShellScriptBin "run-npush" ''
+    set -euo pipefail
+    CWD=$(pwd)
+
+    if [ -d "./levels" ]; then
+      echo "Directory ./levels found; skipping levelset copy"
+    else
+      echo "Directory ./levels not found; copying the official levelset to the current directory"
+      mkdir -p ./levels
+      cp ${npush}/share/npush/levels/* levels/
+      chmod 644 levels/*
+    fi
+    echo "Now calling npush"
+    exec "${npush}/bin/npush"
+  '';
+in
+symlinkJoin {
+  name = "run-npush-${npush.version}";
+
+  paths = [
+    npush
+    runScript
+  ];
+}
diff --git a/nixpkgs/pkgs/games/nsnake/default.nix b/nixpkgs/pkgs/games/nsnake/default.nix
new file mode 100644
index 000000000000..aa3f568ec009
--- /dev/null
+++ b/nixpkgs/pkgs/games/nsnake/default.nix
@@ -0,0 +1,24 @@
+{ stdenv, fetchFromGitHub, lib, ncurses }:
+
+stdenv.mkDerivation rec {
+  pname = "nsnake";
+  version = "3.0.1";
+
+  src = fetchFromGitHub {
+    owner = "alexdantas";
+    repo = "nSnake";
+    rev = "v${version}";
+    sha256 = "sha256-MixwIhyymruruV8G8PjmR9EoZBpaDVBCKBccSFL0lS8=";
+  };
+
+  buildInputs = [ ncurses ];
+
+  makeFlags = [ "PREFIX=$(out)" ];
+
+  meta = {
+    description = "ncurses based snake game for the terminal";
+    homepage = "https://github.com/alexdantas/nSnake";
+    license = lib.licenses.gpl3Plus;
+    maintainers = with lib.maintainers; [ clerie ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/nudoku/default.nix b/nixpkgs/pkgs/games/nudoku/default.nix
new file mode 100644
index 000000000000..d3e3d039d986
--- /dev/null
+++ b/nixpkgs/pkgs/games/nudoku/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv, fetchFromGitHub, fetchpatch, autoreconfHook, pkg-config, gettext, ncurses }:
+
+stdenv.mkDerivation rec {
+  pname = "nudoku";
+  version = "2.1.0";
+
+  src = fetchFromGitHub {
+    owner = "jubalh";
+    repo = pname;
+    rev = version;
+    sha256 = "12v00z3p0ymi8f3w4b4bgl4c76irawn3kmd147r0ap6s9ssx2q6m";
+  };
+
+  patches = [
+    # Pull upstream fix for ncurses-6.3
+    (fetchpatch {
+      name = "ncurses-6.3.patch";
+      url = "https://github.com/jubalh/nudoku/commit/93899a0fd72e04b9f257e5f54af53466106b5959.patch";
+      sha256 = "1h3za0dnx8fk3vshql5mhcici8aw8j0vr7ra81p3r1rii4c479lm";
+    })
+  ];
+
+  # Allow gettext 0.20
+  postPatch = ''
+    substituteInPlace configure.ac --replace 0.19 0.20
+  '';
+
+  nativeBuildInputs = [ autoreconfHook pkg-config gettext ];
+  buildInputs = [ ncurses ];
+
+  configureFlags = lib.optional stdenv.hostPlatform.isMusl "--disable-nls";
+
+  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/nixpkgs/pkgs/games/nxengine-evo/default.nix b/nixpkgs/pkgs/games/nxengine-evo/default.nix
new file mode 100644
index 000000000000..4660423a3509
--- /dev/null
+++ b/nixpkgs/pkgs/games/nxengine-evo/default.nix
@@ -0,0 +1,68 @@
+{ lib, stdenv
+, fetchpatch
+, fetchurl
+, fetchFromGitHub
+, cmake
+, libpng
+, SDL2
+, SDL2_mixer
+}:
+
+stdenv.mkDerivation rec {
+  pname = "nxengine-evo";
+  version = "2.6.4";
+  src = fetchFromGitHub {
+    owner = "nxengine";
+    repo = "nxengine-evo";
+    rev = "v${version}";
+    sha256 = "sha256-krK2b1E5JUMxRoEWmb3HZMNSIHfUUGXSpyb4/Zdp+5A=";
+  };
+  assets = fetchurl {
+    url = "https://github.com/nxengine/nxengine-evo/releases/download/v${version}/NXEngine-v${version}-Linux.tar.xz";
+    sha256 = "1b5hkmsrrhnjjf825ri6n62kb3fldwl7v5f1cqvqyv47zv15g5gy";
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/nxengine/nxengine-evo/commit/1890127ec4b4b5f8d6cb0fb30a41868e95659840.patch";
+      sha256 = "18j22vzkikcwqd42vlhzd6rjp26dq0zslxw5yyl07flivms0hny2";
+    })
+    (fetchpatch {
+      url = "https://github.com/nxengine/nxengine-evo/commit/75b8b8e3b067fd354baa903332f2a3254d1cc017.patch";
+      sha256 = "0sjr7z63gp7nfxifxisvp2w664mxxk3xi4a3d86mm0470dj5m5bx";
+    })
+  ];
+
+  nativeBuildInputs = [ cmake ];
+
+  buildInputs = [
+    libpng
+    SDL2
+    SDL2_mixer
+  ];
+
+  # Allow finding game assets.
+  postPatch = ''
+    sed -i -e "s,/usr/share/,$out/share/," src/ResourceManager.cpp
+  '';
+
+  installPhase = ''
+    cd ..
+    unpackFile ${assets}
+    mkdir -p $out/bin/ $out/share/nxengine/
+    install bin/* $out/bin/
+    cp -r NXEngine-evo-${version}-Linux/data/ $out/share/nxengine/data
+    chmod -R a=r,a+X $out/share/nxengine/data
+  '';
+
+  meta = {
+    description = "A complete open-source clone/rewrite of the masterpiece jump-and-run platformer Doukutsu Monogatari (also known as Cave Story)";
+    license = with lib.licenses; [
+      gpl3                   # Game engine
+      unfreeRedistributable  # Game assets, freeware
+    ];
+    maintainers = [ lib.maintainers.scubed2 ];
+    homepage = "https://github.com/nxengine/nxengine-evo";
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/oh-my-git/default.nix b/nixpkgs/pkgs/games/oh-my-git/default.nix
new file mode 100644
index 000000000000..f2ac8b4289c6
--- /dev/null
+++ b/nixpkgs/pkgs/games/oh-my-git/default.nix
@@ -0,0 +1,134 @@
+{ lib
+, autoPatchelfHook
+, copyDesktopItems
+, fetchFromGitHub
+, makeDesktopItem
+, stdenv
+, alsa-lib
+, gcc-unwrapped
+, git
+, godot3-export-templates
+, godot3-headless
+, libGLU
+, libX11
+, libXcursor
+, libXext
+, libXfixes
+, libXi
+, libXinerama
+, libXrandr
+, libXrender
+, libglvnd
+, libpulseaudio
+, perl
+, zlib
+, udev # for libudev
+}:
+
+stdenv.mkDerivation rec {
+  pname = "oh-my-git";
+  version = "0.6.5";
+
+  src = fetchFromGitHub {
+    owner = "git-learning-game";
+    repo = "oh-my-git";
+    rev = version;
+    sha256 = "sha256-XqxliMVU55D5JSt7Yo5btvZnnTlagSukyhXv6Akgklo=";
+  };
+
+  nativeBuildInputs = [
+    autoPatchelfHook
+    copyDesktopItems
+    godot3-headless
+  ];
+
+  buildInputs = [
+    alsa-lib
+    gcc-unwrapped.lib
+    git
+    libGLU
+    libX11
+    libXcursor
+    libXext
+    libXfixes
+    libXi
+    libXinerama
+    libXrandr
+    libXrender
+    libglvnd
+    libpulseaudio
+    perl
+    zlib
+    udev
+  ];
+
+  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" ];
+    })
+  ];
+
+  # patch shebangs so that e.g. the fake-editor script works:
+  # error: /usr/bin/env 'perl': No such file or directory
+  # error: There was a problem with the editor
+  postPatch = ''
+    patchShebangs scripts
+  '';
+
+  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 ${godot3-export-templates}/share/godot/templates $HOME/.local/share/godot
+
+    mkdir -p $out/share/oh-my-git
+    godot3-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
+  '';
+
+  runtimeDependencies = map lib.getLib [
+    alsa-lib
+    libpulseaudio
+    udev
+  ];
+
+  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/nixpkgs/pkgs/games/oilrush/default.nix b/nixpkgs/pkgs/games/oilrush/default.nix
new file mode 100644
index 000000000000..947b7141b572
--- /dev/null
+++ b/nixpkgs/pkgs/games/oilrush/default.nix
@@ -0,0 +1,77 @@
+{ lib, stdenv, config, fetchurl, libX11, libXext, libXinerama, libXrandr
+, libXrender, fontconfig, freetype, openal, runtimeShell }:
+
+let inherit (lib) makeLibraryPath; in
+
+stdenv.mkDerivation {
+  name = "oilrush";
+  src =
+  let
+    url = config.oilrush.url or null;
+    sha256 = config.oilrush.sha256 or null;
+  in
+    assert url != null && sha256 != null;
+    fetchurl { inherit url sha256; };
+  shell = stdenv.shell;
+  arch = if stdenv.hostPlatform.system == "x86_64-linux" then "x64"
+         else lib.optionalString (stdenv.hostPlatform.system == "i686-linux") "x86";
+  unpackPhase = ''
+    mkdir oilrush
+    cd oilrush
+    "$shell" "$src" --tar xf
+  '';
+  patchPhase = ''
+    cd bin
+    for f in launcher_$arch libQtCoreUnigine_$arch.so.4 OilRush_$arch
+    do
+      patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" $f
+    done
+    patchelf --set-rpath ${stdenv.cc.cc.lib}/lib64:${makeLibraryPath [ stdenv.cc.cc libX11 libXext libXrender fontconfig freetype ]}\
+             launcher_$arch
+    patchelf --set-rpath ${stdenv.cc.cc.lib}/lib64:${stdenv.cc.cc.lib}/lib\
+             libNetwork_$arch.so
+    patchelf --set-rpath ${stdenv.cc.cc.lib}/lib64:${stdenv.cc.cc.lib}/lib\
+             libQtCoreUnigine_$arch.so.4
+    patchelf --set-rpath ${stdenv.cc.cc.lib}/lib64:${makeLibraryPath [ stdenv.cc.cc libX11 libXext libXrender fontconfig freetype ]}\
+             libQtGuiUnigine_$arch.so.4
+    patchelf --set-rpath ${stdenv.cc.cc.lib}/lib64:${stdenv.cc.cc.lib}/lib\
+             libQtNetworkUnigine_$arch.so.4
+    patchelf --set-rpath ${stdenv.cc.cc.lib}/lib64:${makeLibraryPath [ stdenv.cc.cc libX11 libXext libXrender fontconfig freetype ]}\
+             libQtWebKitUnigine_$arch.so.4
+    patchelf --set-rpath ${stdenv.cc.cc.lib}/lib64:${stdenv.cc.cc.lib}/lib\
+             libQtXmlUnigine_$arch.so.4
+    patchelf --set-rpath ${stdenv.cc.cc.lib}/lib64:${stdenv.cc.cc.lib}/lib\
+             libRakNet_$arch.so
+    patchelf --set-rpath ${stdenv.cc.cc.lib}/lib64:${makeLibraryPath [ stdenv.cc.cc libX11 libXext libXinerama libXrandr ]}\
+             libUnigine_$arch.so
+    patchelf --set-rpath ${stdenv.cc.cc.lib}/lib64:${makeLibraryPath [ stdenv.cc.cc libX11 libXext libXinerama libXrandr ]}\
+             OilRush_$arch
+  '';
+  installPhase = ''
+    cd ..
+    mkdir -p "$out/opt/oilrush"
+    cp -r * "$out/opt/oilrush"
+    mkdir -p "$out/bin"
+    cat << EOF > "$out/bin/oilrush"
+    #!${runtimeShell}
+    LD_LIBRARY_PATH=.:${makeLibraryPath [ openal ]}:\$LD_LIBRARY_PATH
+    cd "$out/opt/oilrush"
+    exec ./launcher_$arch.sh "\$@"
+    EOF
+    chmod +x "$out/bin/oilrush"
+  '';
+  meta = {
+    description = "A naval strategy game";
+    longDescription = ''
+      Oil Rush is a real-time naval strategy game based on group control. It
+      combines the strategic challenge of a classical RTS with the sheer fun
+      of Tower Defense.
+    '';
+    homepage = "http://oilrush-game.com/";
+    license = lib.licenses.unfree;
+    #maintainers = with lib.maintainers; [ astsmtl ];
+    platforms = lib.platforms.linux;
+    hydraPlatforms = [];
+  };
+
+}
diff --git a/nixpkgs/pkgs/games/onscripter-en/default.nix b/nixpkgs/pkgs/games/onscripter-en/default.nix
new file mode 100644
index 000000000000..aaa14e6b2bd0
--- /dev/null
+++ b/nixpkgs/pkgs/games/onscripter-en/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv, fetchurl
+, libpng, libjpeg, libogg, libvorbis, freetype, smpeg
+, SDL, SDL_image, SDL_mixer, SDL_ttf }:
+
+
+stdenv.mkDerivation {
+  pname = "onscripter-en";
+  version = "20111009";
+
+  src = fetchurl {
+    # The website is not available now.
+    url = "https://www.dropbox.com/s/ag21owy9poyr2oy/onscripter-en-20111009-src.tar.bz2";
+    sha256 = "sha256-pir3ExhehJ9zNygDN83S4GOs5ugDNMjngxEwklAz9c8=";
+  };
+
+  buildInputs = [ libpng libjpeg libogg libvorbis freetype smpeg
+                  SDL SDL_image SDL_mixer SDL_ttf
+                ];
+
+  configureFlags = [ "--no-werror" ];
+
+  # Without this libvorbisfile.so is not getting linked properly for some reason.
+  NIX_CFLAGS_LINK = "-lvorbisfile";
+
+  preBuild = ''
+    sed -i 's/.dll//g' Makefile
+  '';
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Japanese visual novel scripting engine";
+    homepage = "http://unclemion.com/onscripter/";
+    license = licenses.gpl2;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/openarena/Makefile.local b/nixpkgs/pkgs/games/openarena/Makefile.local
new file mode 100644
index 000000000000..2055770f14b2
--- /dev/null
+++ b/nixpkgs/pkgs/games/openarena/Makefile.local
@@ -0,0 +1,12 @@
+BUILD_CLIENT=1
+BUILD_RENDERER_OPENGL2=1
+BUILD_SERVER=1
+USE_CURL_DLOPEN=0
+USE_FREETYPE=1
+USE_INTERNAL_SPEEX=0
+USE_INTERNAL_JPEG=0
+USE_INTERNAL_OGG=0
+USE_INTERNAL_OPUS=0
+USE_INTERNAL_ZLIB=0
+USE_OPENAL_DLOPEN=0
+USE_RENDERER_DLOPEN=0
diff --git a/nixpkgs/pkgs/games/openarena/default.nix b/nixpkgs/pkgs/games/openarena/default.nix
new file mode 100644
index 000000000000..7ae0111cfe4b
--- /dev/null
+++ b/nixpkgs/pkgs/games/openarena/default.nix
@@ -0,0 +1,113 @@
+{ lib
+, fetchzip
+, fetchFromGitHub
+, stdenv
+, fetchpatch
+, copyDesktopItems
+, curl
+, makeBinaryWrapper
+, pkg-config
+, which
+, freetype
+, libglvnd
+, libjpeg
+, libogg
+, libvorbis
+, libxmp
+, openal
+, SDL2
+, speex
+, makeDesktopItem
+}:
+
+let
+  openarena-maps = fetchzip {
+    name = "openarena-maps";
+    url = "https://download.tuxfamily.org/openarena/rel/088/openarena-0.8.8.zip";
+    hash = "sha256-Rup1n14k9sKcyVFYzFqPYV+BEBCnUNwpnFsnyGrhl20=";
+  };
+in
+stdenv.mkDerivation (finalAttrs: {
+  pname = "openarena";
+  version = "unstable-2023-03-02";
+
+  src = fetchFromGitHub {
+    name = "openarena-source";
+    owner = "OpenArena";
+    repo = "engine";
+    rev = "075cb860a4d2bc43e75e5f506eba7da877708aba";
+    hash = "sha256-ofQKQyS3ti5TSN+zqwPFYuJiB9kvdER6zTWn8yrOpQU=";
+  };
+
+  patches = [
+    # Fix Makefile `copyFiles` target
+    # Related upstream issue: https://github.com/OpenArena/engine/issues/83
+    (fetchpatch {
+      url = "https://github.com/OpenArena/engine/commit/f2b424bd332e90a1e2592edd21c62bdb8cd05214.patch";
+      hash = "sha256-legiXLtZAeG2t1esiBa37qkAgxPJVM7JLhjpxGUmWCo=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    copyDesktopItems
+    curl
+    makeBinaryWrapper
+    pkg-config
+    which
+  ];
+
+  buildInputs = [
+    freetype
+    libglvnd
+    libjpeg
+    libogg
+    libvorbis
+    libxmp
+    openal
+    SDL2
+    speex
+  ];
+
+  enableParallelBuilding = true;
+
+  preConfigure = ''
+    cp ${./Makefile.local} ./Makefile.local
+  '';
+
+  installTargets = [ "copyfiles" ];
+  installFlags = [ "COPYDIR=$(out)/share/openarena" ];
+
+  preInstall = ''
+    mkdir -p $out/share/openarena
+  '';
+
+  postInstall = ''
+    install -Dm644 misc/quake3.svg $out/share/icons/hicolor/scalable/apps/openarena.svg
+
+    makeWrapper $out/share/openarena/openarena.* $out/bin/openarena
+    makeWrapper $out/share/openarena/oa_ded.* $out/bin/oa_ded
+
+    ln -s ${openarena-maps}/baseoa $out/share/openarena/baseoa
+    ln -s ${openarena-maps}/missionpack $out/share/openarena/missionpack
+  '';
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "OpenArena";
+      exec = "openarena";
+      icon = "openarena";
+      comment = "A fast-paced 3D first-person shooter, similar to id Software Inc.'s Quake III Arena";
+      desktopName = "OpenArena";
+      categories = [ "Game" "ActionGame" ];
+    })
+  ];
+
+  meta = {
+    description = "A fast-paced 3D first-person shooter, similar to id Software Inc.'s Quake III Arena";
+    homepage = "http://openarena.ws/";
+    license = lib.licenses.gpl2Plus;
+    mainProgram = "openarena";
+    maintainers = with lib.maintainers; [ drupol wyvie ];
+    platforms = lib.platforms.linux;
+  };
+})
diff --git a/nixpkgs/pkgs/games/openclonk/default.nix b/nixpkgs/pkgs/games/openclonk/default.nix
new file mode 100644
index 000000000000..2249ab213a22
--- /dev/null
+++ b/nixpkgs/pkgs/games/openclonk/default.nix
@@ -0,0 +1,61 @@
+{ lib, stdenv, fetchurl, fetchDebianPatch, fetchpatch, cmake, pkg-config
+, SDL2, libvorbis, libogg, libjpeg, libpng, freetype, glew, tinyxml, openal
+, freealut, readline, libb2, gcc-unwrapped
+, enableSoundtrack ? false # Enable the "Open Clonk Soundtrack - Explorers Journey" by David Oerther
+}:
+
+let
+  soundtrack_src = fetchurl {
+    url = "http://www.openclonk.org/download/Music.ocg";
+    sha256 = "1ckj0dlpp5zsnkbb5qxxfxpkiq76jj2fgj91fyf3ll7n0gbwcgw5";
+  };
+in stdenv.mkDerivation rec {
+  version = "8.1";
+  pname = "openclonk";
+
+  src = fetchurl {
+    url = "https://www.openclonk.org/builds/release/8.1/openclonk-${version}-src.tar.bz2";
+    sha256 = "0imkqjp8lww5p0cnqf4k4mb2v682mnsas63qmiz17rspakr7fxik";
+  };
+
+  patches = [
+    (fetchDebianPatch {
+      pname = "openclonk";
+      version = "8.1";
+      debianRevision = "3";
+      patch = "system-libb2.patch";
+      hash = "sha256-zuH6zxSQXRhnt75092Xwb6XYv8UG391E5Arbnr7ApiI=";
+    })
+    (fetchpatch {
+      name = "fix-gcc-11-build.patch";
+      url = "https://github.com/openclonk/openclonk/commit/e304efde2c8643bbc0fc1ad5e85024982744b233.patch";
+      hash = "sha256-jfVCgeZuYo4x53zhljKcnMDMIBECTRsUSxkl6JaL6HA=";
+    })
+  ];
+
+  postInstall = ''
+    mv -v $out/games/openclonk $out/bin/
+  '' + lib.optionalString enableSoundtrack ''
+    ln -sv ${soundtrack_src} $out/share/games/openclonk/Music.ocg
+  '';
+
+  nativeBuildInputs = [ cmake pkg-config ];
+
+  buildInputs = [
+    SDL2 libvorbis libogg libjpeg libpng freetype glew tinyxml openal freealut
+    readline libb2
+  ];
+
+  cmakeFlags = [ "-DCMAKE_AR=${gcc-unwrapped}/bin/gcc-ar" "-DCMAKE_RANLIB=${gcc-unwrapped}/bin/gcc-ranlib" ];
+
+  cmakeBuildType = "RelWithDebInfo";
+
+  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;
+    mainProgram = "openclonk";
+    maintainers = with maintainers; [ lheckemann ];
+    platforms = [ "x86_64-linux" "i686-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/opendune/default.nix b/nixpkgs/pkgs/games/opendune/default.nix
new file mode 100644
index 000000000000..32e1ef4fca93
--- /dev/null
+++ b/nixpkgs/pkgs/games/opendune/default.nix
@@ -0,0 +1,46 @@
+{ stdenv, lib, fetchFromGitHub, pkg-config
+, alsa-lib, libpulseaudio, SDL2, SDL2_image, SDL2_mixer }:
+
+# - set the opendune configuration at ~/.config/opendune/opendune.ini:
+#     [opendune]
+#     datadir=/path/to/opendune-data
+# - download dune2 into [datadir] http://www.bestoldgames.net/eng/old-games/dune-2.php
+
+stdenv.mkDerivation rec {
+  pname = "opendune";
+  version = "0.9";
+
+  src = fetchFromGitHub {
+    owner = "OpenDUNE";
+    repo = "OpenDUNE";
+    rev = version;
+    sha256 = "15rvrnszdy3db8s0dmb696l4isb3x2cpj7wcl4j09pdi59pc8p37";
+  };
+
+  configureFlags = [
+    "--with-alsa=${lib.getLib alsa-lib}/lib/libasound.so"
+    "--with-pulse=${lib.getLib libpulseaudio}/lib/libpulse.so"
+  ];
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [ alsa-lib libpulseaudio SDL2 SDL2_image SDL2_mixer ];
+
+  enableParallelBuilding = true;
+
+  installPhase = ''
+    runHook preInstall
+
+    install -Dm555 -t $out/bin bin/opendune
+    install -Dm444 -t $out/share/doc/opendune enhancement.txt README.txt
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Dune, Reinvented";
+    homepage = "https://github.com/OpenDUNE/OpenDUNE";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/opendungeons/cmakepaths.patch b/nixpkgs/pkgs/games/opendungeons/cmakepaths.patch
new file mode 100644
index 000000000000..a3e7ba7d6c8d
--- /dev/null
+++ b/nixpkgs/pkgs/games/opendungeons/cmakepaths.patch
@@ -0,0 +1,20 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index f8ff3c28..b57ee337 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -30,13 +30,13 @@ if(WIN32)
+     set(OD_BIN_PATH ${CMAKE_INSTALL_PREFIX})
+ else()
+     # Set binary and data install locations if we want to use the installer
+-    set(OD_BIN_PATH ${CMAKE_INSTALL_PREFIX}/games CACHE PATH "Absolute path to the game binary directory")
++    set(OD_BIN_PATH ${CMAKE_INSTALL_PREFIX}/bin CACHE PATH "Absolute path to the game binary directory")
+     set(OD_DATA_PATH ${CMAKE_INSTALL_PREFIX}/share/games/${PROJECT_NAME} CACHE PATH "Absolute path to the game data directory")
+     set(OD_SHARE_PATH ${CMAKE_INSTALL_PREFIX}/share CACHE PATH "Absolute path to the shared data directory (desktop file, icons, etc.)")
+     set(OD_MAN_PATH ${OD_SHARE_PATH}/man CACHE PATH "Absolute path to the manpages directory")
+     # Set the plugins.cfg file path to a common but architecture-dependent location.
+     # Because the plugins.cfg Ogre plugins path path may vary depending on the architecture used.
+-    set(OD_PLUGINS_CFG_PATH /etc/${PROJECT_NAME} CACHE PATH "Absolute path to the Ogre plugins.cfg file")
++    set(OD_PLUGINS_CFG_PATH ${CMAKE_INSTALL_PREFIX}/etc/${PROJECT_NAME} CACHE PATH "Absolute path to the Ogre plugins.cfg file")
+ endif()
+ 
+ if(NOT MSVC)
diff --git a/nixpkgs/pkgs/games/opendungeons/default.nix b/nixpkgs/pkgs/games/opendungeons/default.nix
new file mode 100644
index 000000000000..10bcf19a53e7
--- /dev/null
+++ b/nixpkgs/pkgs/games/opendungeons/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, pkg-config
+, ogre_13
+, cegui
+, boost
+, sfml
+, openal
+, ois
+}:
+
+let
+  ogre' = ogre_13.overrideAttrs (old: {
+    cmakeFlags = old.cmakeFlags ++ [
+      "-DOGRE_RESOURCEMANAGER_STRICT=0"
+    ];
+  });
+  cegui' = cegui.override {
+    ogre = ogre';
+  };
+in
+stdenv.mkDerivation {
+  pname = "opendungeons";
+  version = "unstable-2023-03-18";
+
+  src = fetchFromGitHub {
+    owner = "paroj";
+    repo = "OpenDungeons";
+    rev = "974378d75591214dccbe0fb26e6ec8a40c2156e0";
+    hash = "sha256-vz9cT+rNcyKT3W9I9VRKcFol2SH1FhOhOALALjgKfIE=";
+  };
+
+  patches = [
+    ./cmakepaths.patch
+    ./fix_link_date_time.patch
+  ];
+
+  # source/utils/StackTraceUnix.cpp:122:2: error: #error Unsupported architecture.
+  postPatch = lib.optionalString (!stdenv.isx86_64) ''
+    cp source/utils/StackTrace{Stub,Unix}.cpp
+  '';
+
+  strictDeps = true;
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+  ];
+
+  buildInputs = [
+    ogre'
+    cegui'
+    boost
+    sfml
+    openal
+    ois
+  ];
+
+  cmakeFlags = [
+    "-DOD_TREAT_WARNINGS_AS_ERRORS=FALSE"
+  ];
+
+  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 = with licenses; [ gpl3Plus zlib mit cc-by-sa-30 cc0 ofl cc-by-30 ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/opendungeons/fix_link_date_time.patch b/nixpkgs/pkgs/games/opendungeons/fix_link_date_time.patch
new file mode 100644
index 000000000000..884aa9901ba7
--- /dev/null
+++ b/nixpkgs/pkgs/games/opendungeons/fix_link_date_time.patch
@@ -0,0 +1,13 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index f8ff3c2..689c463 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -538,7 +538,7 @@ endif()
+ #This has to cover the versions not already known by CMake
+ set(Boost_ADDITIONAL_VERSIONS 1.47 1.47.0 1.47.1 1.55.0)
+ 
+-set(OD_BOOST_COMPONENTS system filesystem locale program_options thread)
++set(OD_BOOST_COMPONENTS system date_time filesystem locale program_options thread)
+ 
+ if(BUILD_TESTING AND OD_BUILD_TESTING)
+     set(OD_BOOST_COMPONENTS ${OD_BOOST_COMPONENTS} unit_test_framework)
diff --git a/nixpkgs/pkgs/games/openjk/default.nix b/nixpkgs/pkgs/games/openjk/default.nix
new file mode 100644
index 000000000000..092f442669a6
--- /dev/null
+++ b/nixpkgs/pkgs/games/openjk/default.nix
@@ -0,0 +1,89 @@
+{ lib, stdenv, fetchFromGitHub, makeDesktopItem, makeWrapper, cmake, libjpeg, zlib, libpng, libGL, SDL2 }:
+
+let
+  jamp = makeDesktopItem rec {
+    name = "jamp";
+    exec = name;
+    icon = "OpenJK_Icon_128";
+    comment = "Open Source Jedi Academy game released by Raven Software";
+    desktopName = "Jedi Academy (Multi Player)";
+    genericName = "Jedi Academy";
+    categories = [ "Game" ];
+  };
+  jasp = makeDesktopItem rec {
+    name = "jasp";
+    exec = name;
+    icon = "OpenJK_Icon_128";
+    comment = "Open Source Jedi Academy game released by Raven Software";
+    desktopName = "Jedi Academy (Single Player)";
+    genericName = "Jedi Academy";
+    categories = [ "Game" ];
+  };
+  josp = makeDesktopItem rec {
+    name = "josp";
+    exec = name;
+    icon = "OpenJK_Icon_128";
+    comment = "Open Source Jedi Outcast game released by Raven Software";
+    desktopName = "Jedi Outcast (Single Player)";
+    genericName = "Jedi Outcast";
+    categories = [ "Game" ];
+  };
+in stdenv.mkDerivation {
+  pname = "OpenJK";
+  version = "unstable-2022-01-30";
+
+  src = fetchFromGitHub {
+    owner = "JACoders";
+    repo = "OpenJK";
+    rev = "235fb9e1a9c4537a603b2e54e444327d20d198a3";
+    sha256 = "sha256-DqP6wnu5sE7lQJGEdsEPOc6FIaJjqxt5ANKZ5eiabC4=";
+  };
+
+  dontAddPrefix = true;
+
+  nativeBuildInputs = [ makeWrapper cmake ];
+  buildInputs = [ libjpeg zlib libpng libGL SDL2 ];
+
+  outputs = [ "out" "openjo" "openja" ];
+
+  # move from $out/JediAcademy to $out/opt/JediAcademy
+  preConfigure = ''
+    cmakeFlagsArray=("-DCMAKE_INSTALL_PREFIX=$out/opt")
+  '';
+  cmakeFlags = ["-DBuildJK2SPEngine:BOOL=ON"
+                "-DBuildJK2SPGame:BOOL=ON"
+                "-DBuildJK2SPRdVanilla:BOOL=ON"];
+
+  postInstall = ''
+    mkdir -p $out/bin $openja/bin $openjo/bin
+    mkdir -p $openja/share/applications $openjo/share/applications
+    mkdir -p $openja/share/icons/hicolor/128x128/apps $openjo/share/icons/hicolor/128x128/apps
+    mkdir -p $openja/opt $openjo/opt
+    mv $out/opt/JediAcademy $openja/opt/
+    mv $out/opt/JediOutcast $openjo/opt/
+    jaPrefix=$openja/opt/JediAcademy
+    joPrefix=$openjo/opt/JediOutcast
+
+    makeWrapper $jaPrefix/openjk.* $openja/bin/jamp --chdir "$jaPrefix"
+    makeWrapper $jaPrefix/openjk_sp.* $openja/bin/jasp --chdir "$jaPrefix"
+    makeWrapper $jaPrefix/openjkded.* $openja/bin/openjkded --chdir "$jaPrefix"
+    makeWrapper $joPrefix/openjo_sp.* $openjo/bin/josp --chdir "$joPrefix"
+
+    cp $src/shared/icons/OpenJK_Icon_128.png $openjo/share/icons/hicolor/128x128/apps
+    cp $src/shared/icons/OpenJK_Icon_128.png $openja/share/icons/hicolor/128x128/apps
+    ln -s ${jamp}/share/applications/* $openja/share/applications
+    ln -s ${jasp}/share/applications/* $openja/share/applications
+    ln -s ${josp}/share/applications/* $openjo/share/applications
+    ln -s $openja/bin/* $out/bin
+    ln -s $openjo/bin/* $out/bin
+    rm -rf $out/opt
+  '';
+
+  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; [ tgunnoe ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/openlierox/default.nix b/nixpkgs/pkgs/games/openlierox/default.nix
new file mode 100644
index 000000000000..2543d71f0a88
--- /dev/null
+++ b/nixpkgs/pkgs/games/openlierox/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv, fetchurl, libX11, xorgproto, gd, SDL, SDL_image, SDL_mixer, zlib
+, libxml2, pkg-config, curl, cmake, libzip }:
+
+stdenv.mkDerivation rec {
+  pname = "openlierox";
+  version = "0.58rc3";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/openlierox/OpenLieroX_0.58_rc3.src.tar.bz2";
+    sha256 = "1k35xppfqi3qfysv81xq3hj4qdy9j2ciinbkfdcmwclcsf3nh94z";
+  };
+
+  env.NIX_CFLAGS_COMPILE = "-I${libxml2.dev}/include/libxml2 -std=c++98 -Wno-error";
+
+  # The breakpad fails to build on x86_64, and it's only to report bugs upstream
+  cmakeFlags = [ "-DBREAKPAD=0" ];
+
+  preConfigure = ''
+    cmakeFlags="$cmakeFlags -DSYSTEM_DATA_DIR=$out/share"
+  '';
+
+  patchPhase = ''
+    sed -i s,curl/types.h,curl/curl.h, include/HTTP.h src/common/HTTP.cpp
+  '';
+
+  installPhase = ''
+    mkdir -p $out/bin $out/share/OpenLieroX
+    cp bin/* $out/bin
+    cp -R ../share/gamedir/* $out/share/OpenLieroX
+  '';
+
+  nativeBuildInputs = [ cmake pkg-config curl ];
+  buildInputs = [ libX11 xorgproto gd SDL SDL_image SDL_mixer zlib libxml2
+    libzip ];
+
+  meta = {
+    homepage = "http://openlierox.net";
+    description = "Real-time game with Worms-like shooting";
+    license = lib.licenses.lgpl2Plus;
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/openloco/default.nix b/nixpkgs/pkgs/games/openloco/default.nix
new file mode 100644
index 000000000000..c884c39dafa2
--- /dev/null
+++ b/nixpkgs/pkgs/games/openloco/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, SDL2
+, cmake
+, libpng
+, libzip
+, openal
+, pkg-config
+, span-lite
+, yaml-cpp
+}:
+
+stdenv.mkDerivation rec {
+  pname = "openloco";
+  version = "23.02";
+
+  src = fetchFromGitHub {
+    owner = "OpenLoco";
+    repo = "OpenLoco";
+    rev = "v${version}";
+    hash = "sha256-35g7tnKez4tnTdZzavfU+X8f3btFG6EbLkU+cqL6Qek=";
+  };
+
+  # the upstream build process determines the version tag from git; since we
+  # are not using a git checkout, we patch it manually
+  postPatch = ''
+    sed -i '/#define NAME "OpenLoco"/a#define OPENLOCO_VERSION_TAG "${version}"' src/OpenLoco/src/Version.cpp
+  '';
+
+  NIX_CFLAGS_COMPILE = "-Wno-error=null-dereference";
+
+  cmakeFlags = [
+    "-DOPENLOCO_BUILD_TESTS=NO"
+  ];
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+  ];
+  buildInputs = [
+    SDL2
+    libpng
+    libzip
+    openal
+    yaml-cpp
+    span-lite
+  ];
+
+  meta = {
+    description = "An open source re-implementation of Chris Sawyer's Locomotion";
+    homepage = "https://github.com/OpenLoco/OpenLoco";
+    license = lib.licenses.mit;
+    platforms = lib.platforms.linux;
+    maintainers = with lib.maintainers; [ icewind1991 ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/openmw/default.nix b/nixpkgs/pkgs/games/openmw/default.nix
new file mode 100644
index 000000000000..99c58df37244
--- /dev/null
+++ b/nixpkgs/pkgs/games/openmw/default.nix
@@ -0,0 +1,113 @@
+{ lib
+, stdenv
+, fetchFromGitLab
+, fetchpatch
+, cmake
+, pkg-config
+, wrapQtAppsHook
+, SDL2
+, CoreMedia
+, VideoToolbox
+, VideoDecodeAcceleration
+, boost
+, bullet
+, ffmpeg
+, libXt
+, luajit
+, lz4
+, mygui
+, openal
+, openscenegraph
+, recastnavigation
+, unshield
+, yaml-cpp
+}:
+
+let
+  GL = "GLVND"; # or "LEGACY";
+
+  osg' = (openscenegraph.override { colladaSupport = true; }).overrideDerivation (old: {
+    patches = [
+      (fetchpatch {
+        # Darwin: Without this patch, OSG won't build osgdb_png.so, which is required by OpenMW.
+        name = "darwin-osg-plugins-fix.patch";
+        url = "https://gitlab.com/OpenMW/openmw-dep/-/raw/0abe3c9c3858211028d881d7706813d606335f72/macos/osg.patch";
+        sha256 = "sha256-/CLRZofZHot8juH78VG1/qhTHPhy5DoPMN+oH8hC58U=";
+      })
+    ];
+    cmakeFlags = (old.cmakeFlags or [ ]) ++ [
+      "-Wno-dev"
+      "-DOpenGL_GL_PREFERENCE=${GL}"
+      "-DBUILD_OSG_PLUGINS_BY_DEFAULT=0"
+      "-DBUILD_OSG_DEPRECATED_SERIALIZERS=0"
+    ] ++ (map (e: "-DBUILD_OSG_PLUGIN_${e}=1") [ "BMP" "DAE" "DDS" "FREETYPE" "JPEG" "OSG" "PNG" "TGA" ]);
+  });
+
+  bullet' = bullet.overrideDerivation (old: {
+    cmakeFlags = (old.cmakeFlags or [ ]) ++ [
+      "-Wno-dev"
+      "-DOpenGL_GL_PREFERENCE=${GL}"
+      "-DUSE_DOUBLE_PRECISION=ON"
+      "-DBULLET2_MULTITHREADING=ON"
+    ];
+  });
+
+in
+stdenv.mkDerivation rec {
+  pname = "openmw";
+  version = "0.48.0";
+
+  src = fetchFromGitLab {
+    owner = "OpenMW";
+    repo = "openmw";
+    rev = "${pname}-${version}";
+    hash = "sha256-zkjVt3GfQZsFXl2Ht3lCuQtDMYQWxhdFO4aGSb3rsyo=";
+  };
+
+  postPatch = ''
+    sed '1i#include <memory>' -i components/myguiplatform/myguidatamanager.cpp # gcc12
+  '' + lib.optionalString stdenv.isDarwin ''
+    # Don't fix Darwin app bundle
+    sed -i '/fixup_bundle/d' CMakeLists.txt
+  '';
+
+  nativeBuildInputs = [ cmake pkg-config wrapQtAppsHook ];
+
+  # If not set, OSG plugin .so files become shell scripts on Darwin.
+  dontWrapQtApps = stdenv.isDarwin;
+
+  buildInputs = [
+    SDL2
+    boost
+    bullet'
+    ffmpeg
+    libXt
+    luajit
+    lz4
+    mygui
+    openal
+    osg'
+    recastnavigation
+    unshield
+    yaml-cpp
+  ] ++ lib.optionals stdenv.isDarwin [
+    CoreMedia
+    VideoDecodeAcceleration
+    VideoToolbox
+  ];
+
+  cmakeFlags = [
+    "-DOpenGL_GL_PREFERENCE=${GL}"
+    "-DOPENMW_USE_SYSTEM_RECASTNAVIGATION=1"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "-DOPENMW_OSX_DEPLOYMENT=ON"
+  ];
+
+  meta = with lib; {
+    description = "An unofficial open source engine reimplementation of the game Morrowind";
+    homepage = "https://openmw.org";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ abbradar marius851000 ];
+    platforms = platforms.linux ++ platforms.darwin;
+  };
+}
diff --git a/nixpkgs/pkgs/games/openmw/tes3mp.nix b/nixpkgs/pkgs/games/openmw/tes3mp.nix
new file mode 100644
index 000000000000..48454b42df29
--- /dev/null
+++ b/nixpkgs/pkgs/games/openmw/tes3mp.nix
@@ -0,0 +1,153 @@
+{ lib
+, stdenv
+, cmake
+, openmw
+, fetchFromGitHub
+, fetchpatch
+, luajit
+, makeWrapper
+, symlinkJoin
+}:
+
+# revisions are taken from https://github.com/GrimKriegor/TES3MP-deploy
+
+let
+  # raknet could also be split into dev and lib outputs
+  raknet = stdenv.mkDerivation {
+    pname = "raknet";
+    version = "unstable-2020-01-19";
+
+    src = fetchFromGitHub {
+      owner = "TES3MP";
+      repo = "CrabNet";
+      # usually fixed:
+      # https://github.com/GrimKriegor/TES3MP-deploy/blob/d2a4a5d3acb64b16d9b8ca85906780aeea8d311b/tes3mp-deploy.sh#L589
+      rev = "19e66190e83f53bcdcbcd6513238ed2e54878a21";
+      sha256 = "WIaJkSQnoOm9T7GoAwmWl7fNg79coIo/ILUsWcbH+lA=";
+    };
+
+    cmakeFlags = [
+      "-DCRABNET_ENABLE_DLL=OFF"
+    ];
+
+    nativeBuildInputs = [ cmake ];
+
+    installPhase = ''
+      install -Dm555 lib/libRakNetLibStatic.a $out/lib/libRakNetLibStatic.a
+    '';
+  };
+
+  coreScripts = stdenv.mkDerivation {
+    pname = "corescripts";
+    version = "0.8.1";
+
+    src = fetchFromGitHub {
+      owner = "TES3MP";
+      repo = "CoreScripts";
+      # usually latest in stable branch (e.g. 0.7.1)
+      rev = "6ae0a2a5d16171de3764817a7f8b1067ecde3def";
+      sha256 = "8j/Sr9IRMNFPEVfFzdb42PckHS3KW7FH7x7rRxIh5gY=";
+    };
+
+    buildCommand = ''
+      dir=$out/share/openmw-tes3mp
+      mkdir -p $dir
+      cp -r $src $dir/CoreScripts
+    '';
+  };
+
+  # 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 = "0.8.1";
+
+    src = fetchFromGitHub {
+      owner = "TES3MP";
+      repo = "TES3MP";
+      # usually latest in stable branch (e.g. 0.7.1)
+      rev = "68954091c54d0596037c4fb54d2812313b7582a1";
+      sha256 = "8/bV4sw7Q8l8bDTHGQ0t4owf6J6h9q468JFx4KegY5o=";
+    };
+
+    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"
+    ];
+
+    prePatch = ''
+      substituteInPlace components/process/processinvoker.cpp \
+        --replace "\"./\"" "\"$out/bin/\""
+    '';
+
+    patches = [
+      (fetchpatch {
+        url = "https://gitlab.com/OpenMW/openmw/-/commit/98a7d90ee258ceef9c70b0b2955d0458ec46f048.patch";
+        sha256 = "sha256-RhbIGeE6GyqnipisiMTwWjcFnIiR055hUPL8IkjPgZw=";
+      })
+
+      # https://github.com/TES3MP/openmw-tes3mp/issues/552
+      ./tes3mp.patch
+    ];
+
+    env.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" ];
+    };
+  });
+
+  tes3mp-server-run = ''
+    config="''${XDG_CONFIG_HOME:-''$HOME/.config}"/openmw
+    data="''${XDG_DATA_HOME:-''$HOME/.local/share}"/openmw
+    if [[ ! -f "$config"/tes3mp-server.cfg && ! -d "$data"/server ]]; then
+      mkdir -p "$config"
+      echo [Plugins] > "$config"/tes3mp-server.cfg
+      echo "home = $data/server" >> "$config"/tes3mp-server.cfg
+      mkdir -p "$data"
+      cp -r ${coreScripts}/share/openmw-tes3mp/CoreScripts "$data"/server
+      chmod -R u+w "$data"/server
+    fi
+  '';
+
+in
+symlinkJoin {
+  name = "openmw-tes3mp-${unwrapped.version}";
+  inherit (unwrapped) version meta;
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  paths = [ unwrapped ];
+
+  postBuild = ''
+    mkdir -p $out/bin
+
+    makeWrapper ${unwrapped}/libexec/tes3mp-browser $out/bin/tes3mp-browser \
+      --chdir "$out/bin"
+
+    makeWrapper ${unwrapped}/libexec/tes3mp-server $out/bin/tes3mp-server \
+      --run '${tes3mp-server-run}' \
+      --chdir "$out/bin"
+  '';
+}
diff --git a/nixpkgs/pkgs/games/openmw/tes3mp.patch b/nixpkgs/pkgs/games/openmw/tes3mp.patch
new file mode 100644
index 000000000000..c2a78f9db9b0
--- /dev/null
+++ b/nixpkgs/pkgs/games/openmw/tes3mp.patch
@@ -0,0 +1,13 @@
+diff --git a/apps/openmw-mp/Script/Types.hpp b/apps/openmw-mp/Script/Types.hpp
+index be365cfb8..204dcdc7b 100644
+--- a/apps/openmw-mp/Script/Types.hpp
++++ b/apps/openmw-mp/Script/Types.hpp
+@@ -105,7 +105,7 @@ struct ScriptFunctionPointer : public ScriptIdentity
+     void *addr;
+ #if (!defined(__clang__) && defined(__GNUC__))
+     template<typename R, typename... Types>
+-    constexpr ScriptFunctionPointer(Function<R, Types...> addr) : ScriptIdentity(addr), addr((void*)(addr)) {}
++    constexpr ScriptFunctionPointer(Function<R, Types...> addr) : ScriptIdentity(addr), addr(addr) {}
+ #else
+     template<typename R, typename... Types>
+     constexpr ScriptFunctionPointer(Function<R, Types...> addr) : ScriptIdentity(addr), addr(addr) {}
diff --git a/nixpkgs/pkgs/games/openra/build-engine.nix b/nixpkgs/pkgs/games/openra/build-engine.nix
new file mode 100644
index 000000000000..10e8b4939215
--- /dev/null
+++ b/nixpkgs/pkgs/games/openra/build-engine.nix
@@ -0,0 +1,82 @@
+{ lib, buildDotnetModule, dotnetCorePackages
+, fetchFromGitHub
+, SDL2, freetype, openal, lua51Packages
+}:
+engine:
+
+buildDotnetModule rec {
+  pname = "openra-${engine.build}";
+  inherit (engine) version;
+
+  src = if engine ? src then engine.src else fetchFromGitHub {
+    owner = "OpenRA";
+    repo = "OpenRA";
+    rev = "${engine.build}-${engine.version}";
+    sha256 = engine.sha256;
+  };
+
+  nugetDeps = engine.deps;
+
+  dotnet-sdk = dotnetCorePackages.sdk_6_0;
+  dotnet-runtime = dotnetCorePackages.runtime_6_0;
+
+  useAppHost = false;
+
+  dotnetFlags = [ "-p:Version=0.0.0.0" ]; # otherwise dotnet build complains, version is saved in VERSION file anyway
+
+  dotnetBuildFlags = [ "-p:TargetPlaform=unix-generic" ];
+  dotnetInstallFlags = [
+    "-p:TargetPlaform=unix-generic"
+    "-p:CopyGenericLauncher=True"
+    "-p:CopyCncDll=True"
+    "-p:CopyD2kDll=True"
+    "-p:UseAppHost=False"
+  ];
+
+  dontDotnetFixup = true;
+
+  preBuild = ''
+    make VERSION=${engine.build}-${version} version
+  '';
+
+  postInstall = ''
+    # Create the file so that the install_data script will not attempt to download it.
+    # TODO: fetch the file and include it
+    touch './IP2LOCATION-LITE-DB1.IPV6.BIN.ZIP'
+
+    # Install all the asset data
+    (
+      . ./packaging/functions.sh
+      install_data . "$out/lib/${pname}" cnc d2k ra
+    )
+
+    # Replace precompiled libraries with links to native one.
+    # This is similar to configure-system-libraries.sh in the source repository
+    ln -s -f ${lua51Packages.lua}/lib/liblua.so $out/lib/${pname}/lua51.so
+    ln -s -f ${SDL2}/lib/libSDL2.so             $out/lib/${pname}/SDL2.so
+    ln -s -f ${openal}/lib/libopenal.so         $out/lib/${pname}/soft_oal.so
+    ln -s -f ${freetype}/lib/libfreetype.so     $out/lib/${pname}/freetype6.so
+  '';
+
+  postFixup = ''
+    (
+      . ./packaging/functions.sh
+      install_linux_shortcuts . "" "$out/lib/${pname}" "$out/.bin-unwrapped" "$out/share" "${version}" cnc d2k ra
+    )
+
+    # Create Nix wrappers to the application scripts which setup the needed environment
+    for bin in $(find $out/.bin-unwrapped -type f); do
+      makeWrapper "$bin" "$out/bin/$(basename "$bin")" \
+        --prefix "PATH" : "${lib.makeBinPath [ dotnet-runtime ]}"
+    done
+  '';
+
+  meta = with lib; {
+    description = "Open Source real-time strategy game engine for early Westwood games such as Command & Conquer: Red Alert. ${engine.build} version.";
+    homepage = "https://www.openra.net/";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ mdarocha ];
+    platforms = [ "x86_64-linux" ];
+    mainProgram = "openra-ra";
+  };
+}
diff --git a/nixpkgs/pkgs/games/openra/default.nix b/nixpkgs/pkgs/games/openra/default.nix
new file mode 100644
index 000000000000..19913a224f46
--- /dev/null
+++ b/nixpkgs/pkgs/games/openra/default.nix
@@ -0,0 +1,12 @@
+{ callPackage }:
+
+let
+  buildOpenRAEngine = callPackage ./build-engine.nix {};
+  callPackage' = path: callPackage path { inherit buildOpenRAEngine; };
+in
+{
+  engines = {
+    release = callPackage' ./engines/release;
+    devtest = callPackage' ./engines/devtest;
+  };
+}
diff --git a/nixpkgs/pkgs/games/openra/engines/devtest/default.nix b/nixpkgs/pkgs/games/openra/engines/devtest/default.nix
new file mode 100644
index 000000000000..7c10b6341b2d
--- /dev/null
+++ b/nixpkgs/pkgs/games/openra/engines/devtest/default.nix
@@ -0,0 +1,8 @@
+{ buildOpenRAEngine }:
+
+buildOpenRAEngine {
+  build = "devtest";
+  version = "20230414";
+  sha256 = "sha256-NU7NEINyrXSkEI5f3q0FLDve1NkNtr0Gww8E8WF9f5A=";
+  deps = ./deps.nix;
+}
diff --git a/nixpkgs/pkgs/games/openra/engines/devtest/deps.nix b/nixpkgs/pkgs/games/openra/engines/devtest/deps.nix
new file mode 100644
index 000000000000..81e72b23038c
--- /dev/null
+++ b/nixpkgs/pkgs/games/openra/engines/devtest/deps.nix
@@ -0,0 +1,113 @@
+# This file was automatically generated by passthru.fetch-deps.
+# Please dont edit it manually, your changes might get overwritten!
+
+{ fetchNuGet }: [
+  (fetchNuGet { pname = "DiscordRichPresence"; version = "1.1.3.18"; sha256 = "0p4bhaggjjfd4gl06yiphqgncxgcq2bws4sjkrw0n2ldf3hgrps3"; })
+  (fetchNuGet { pname = "Linguini.Bundle"; version = "0.4.0"; sha256 = "0zf46vfhkhpirw6zls9y7v5zwgckscy7dk8ns77qvxxw7ir6r6v5"; })
+  (fetchNuGet { pname = "Linguini.Shared"; version = "0.4.0"; sha256 = "1cxjz4rv1jvxqhlyc1ighy16c5vsah3n0mpx7988cf77kqzm3pzs"; })
+  (fetchNuGet { pname = "Linguini.Syntax"; version = "0.3.0"; sha256 = "1qgj6vbdjjl30cqcyn8df30jj15c2ahj7clgb5fwcja47mnw3jd8"; })
+  (fetchNuGet { pname = "Microsoft.Extensions.DependencyModel"; version = "6.0.0"; sha256 = "08c4fh1n8vsish1vh7h73mva34g0as4ph29s4lvps7kmjb4z64nl"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Platforms"; version = "1.1.0"; sha256 = "08vh1r12g6ykjygq5d3vq09zylgb84l63k49jc4v8faw9g93iqqm"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Platforms"; version = "1.1.1"; sha256 = "164wycgng4mi9zqi2pnsf1pq6gccbqvw6ib916mqizgjmd8f44pj"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Platforms"; version = "5.0.0"; sha256 = "0mwpwdflidzgzfx2dlpkvvnkgkr2ayaf0s80737h4wa35gaj11rc"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Targets"; version = "1.1.0"; sha256 = "193xwf33fbm0ni3idxzbr5fdq3i2dlfgihsac9jj7whj0gd902nh"; })
+  (fetchNuGet { pname = "Microsoft.Win32.Primitives"; version = "4.3.0"; sha256 = "0j0c1wj4ndj21zsgivsc24whiya605603kxrbiw6wkfdync464wq"; })
+  (fetchNuGet { pname = "Microsoft.Win32.Registry"; version = "5.0.0"; sha256 = "102hvhq2gmlcbq8y2cb7hdr2dnmjzfp2k3asr1ycwrfacwyaak7n"; })
+  (fetchNuGet { pname = "Mono.Nat"; version = "3.0.4"; sha256 = "10zvyq60wy02q21dszrk1h3ww23b7bkgjxaapx1ans4d9nwsmlrm"; })
+  (fetchNuGet { pname = "MP3Sharp"; version = "1.0.5"; sha256 = "14h506d27g5j5c374dvw7iwn9sl0p7xp58kk95dacnpkzk0hv8yv"; })
+  (fetchNuGet { pname = "Newtonsoft.Json"; version = "13.0.1"; sha256 = "0fijg0w6iwap8gvzyjnndds0q4b8anwxxvik7y8vgq97dram4srb"; })
+  (fetchNuGet { pname = "NuGet.CommandLine"; version = "4.4.1"; sha256 = "1szk5hbw22c1k5747dk95mzsy5vjw7qmvwv1wc9h080h9xzj9aab"; })
+  (fetchNuGet { pname = "NVorbis"; version = "0.10.4"; sha256 = "0l4f3vhqc6ly7s8mszwarszgirz6ywx1rjsr1jx0fdlsjl02x6p9"; })
+  (fetchNuGet { pname = "OpenRA-Eluant"; version = "1.0.20"; sha256 = "0nq52kdpwsvmhxgcv26wajvn3yxd5l89918rnrzxa463hmyb2rmv"; })
+  (fetchNuGet { pname = "OpenRA-Freetype6"; version = "1.0.9"; sha256 = "1i5clsxszmdkhjcdkp9324zidhzp0dsvn7cbcgrnafs18yabjmzq"; })
+  (fetchNuGet { pname = "OpenRA-FuzzyLogicLibrary"; version = "1.0.1"; sha256 = "0kn0b8491srbllkpqvvkml02dkixs18y5hgcalnpbw8l5kkmwvim"; })
+  (fetchNuGet { pname = "OpenRA-OpenAL-CS"; version = "1.0.19"; sha256 = "1ywm3b15qywrxby3s9wjs9flfjq7vld0gqz0xw4psgvz38gdgh7p"; })
+  (fetchNuGet { pname = "OpenRA-SDL2-CS"; version = "1.0.36"; sha256 = "1vywf2bfqkq0mr58gfd5kafv12rri2bzfajajcj8ha9fmhdibj3s"; })
+  (fetchNuGet { pname = "Pfim"; version = "0.10.3"; sha256 = "1myjs99g14q1yj3j5hzhx8ic7i3rqh2mi3qy9gdfzi6n9dlz1b3d"; })
+  (fetchNuGet { pname = "rix0rrr.BeaconLib"; version = "1.0.2"; sha256 = "0f0yi7hp8v6jvhhv7k4whv8hqqxnx15nvbkll4f1ykaa1w2pr754"; })
+  (fetchNuGet { pname = "runtime.any.System.Collections"; version = "4.3.0"; sha256 = "0bv5qgm6vr47ynxqbnkc7i797fdi8gbjjxii173syrx14nmrkwg0"; })
+  (fetchNuGet { pname = "runtime.any.System.Diagnostics.Tracing"; version = "4.3.0"; sha256 = "00j6nv2xgmd3bi347k00m7wr542wjlig53rmj28pmw7ddcn97jbn"; })
+  (fetchNuGet { pname = "runtime.any.System.Globalization"; version = "4.3.0"; sha256 = "1daqf33hssad94lamzg01y49xwndy2q97i2lrb7mgn28656qia1x"; })
+  (fetchNuGet { pname = "runtime.any.System.Globalization.Calendars"; version = "4.3.0"; sha256 = "1ghhhk5psqxcg6w88sxkqrc35bxcz27zbqm2y5p5298pv3v7g201"; })
+  (fetchNuGet { pname = "runtime.any.System.IO"; version = "4.3.0"; sha256 = "0l8xz8zn46w4d10bcn3l4yyn4vhb3lrj2zw8llvz7jk14k4zps5x"; })
+  (fetchNuGet { pname = "runtime.any.System.Reflection"; version = "4.3.0"; sha256 = "02c9h3y35pylc0zfq3wcsvc5nqci95nrkq0mszifc0sjx7xrzkly"; })
+  (fetchNuGet { pname = "runtime.any.System.Reflection.Primitives"; version = "4.3.0"; sha256 = "0x1mm8c6iy8rlxm8w9vqw7gb7s1ljadrn049fmf70cyh42vdfhrf"; })
+  (fetchNuGet { pname = "runtime.any.System.Resources.ResourceManager"; version = "4.3.0"; sha256 = "03kickal0iiby82wa5flar18kyv82s9s6d4xhk5h4bi5kfcyfjzl"; })
+  (fetchNuGet { pname = "runtime.any.System.Runtime"; version = "4.3.0"; sha256 = "1cqh1sv3h5j7ixyb7axxbdkqx6cxy00p4np4j91kpm492rf4s25b"; })
+  (fetchNuGet { pname = "runtime.any.System.Runtime.Handles"; version = "4.3.0"; sha256 = "0bh5bi25nk9w9xi8z23ws45q5yia6k7dg3i4axhfqlnj145l011x"; })
+  (fetchNuGet { pname = "runtime.any.System.Runtime.InteropServices"; version = "4.3.0"; sha256 = "0c3g3g3jmhlhw4klrc86ka9fjbl7i59ds1fadsb2l8nqf8z3kb19"; })
+  (fetchNuGet { pname = "runtime.any.System.Text.Encoding"; version = "4.3.0"; sha256 = "0aqqi1v4wx51h51mk956y783wzags13wa7mgqyclacmsmpv02ps3"; })
+  (fetchNuGet { pname = "runtime.any.System.Text.Encoding.Extensions"; version = "4.3.0"; sha256 = "0lqhgqi0i8194ryqq6v2gqx0fb86db2gqknbm0aq31wb378j7ip8"; })
+  (fetchNuGet { pname = "runtime.any.System.Threading.Tasks"; version = "4.3.0"; sha256 = "03mnvkhskbzxddz4hm113zsch1jyzh2cs450dk3rgfjp8crlw1va"; })
+  (fetchNuGet { pname = "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.2"; sha256 = "0rwpqngkqiapqc5c2cpkj7idhngrgss5qpnqg0yh40mbyflcxf8i"; })
+  (fetchNuGet { pname = "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.2"; sha256 = "1n06gxwlinhs0w7s8a94r1q3lwqzvynxwd3mp10ws9bg6gck8n4r"; })
+  (fetchNuGet { pname = "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.2"; sha256 = "0404wqrc7f2yc0wxv71y3nnybvqx8v4j9d47hlscxy759a525mc3"; })
+  (fetchNuGet { pname = "runtime.native.System"; version = "4.3.0"; sha256 = "15hgf6zaq9b8br2wi1i3x0zvmk410nlmsmva9p0bbg73v6hml5k4"; })
+  (fetchNuGet { pname = "runtime.native.System.Net.Http"; version = "4.3.0"; sha256 = "1n6rgz5132lcibbch1qlf0g9jk60r0kqv087hxc0lisy50zpm7kk"; })
+  (fetchNuGet { pname = "runtime.native.System.Security.Cryptography.Apple"; version = "4.3.0"; sha256 = "1b61p6gw1m02cc1ry996fl49liiwky6181dzr873g9ds92zl326q"; })
+  (fetchNuGet { pname = "runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.2"; sha256 = "0zy5r25jppz48i2bkg8b9lfig24xixg6nm3xyr1379zdnqnpm8f6"; })
+  (fetchNuGet { pname = "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.2"; sha256 = "096ch4n4s8k82xga80lfmpimpzahd2ip1mgwdqgar0ywbbl6x438"; })
+  (fetchNuGet { pname = "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.2"; sha256 = "1dm8fifl7rf1gy7lnwln78ch4rw54g0pl5g1c189vawavll7p6rj"; })
+  (fetchNuGet { pname = "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple"; version = "4.3.0"; sha256 = "10yc8jdrwgcl44b4g93f1ds76b176bajd3zqi2faf5rvh1vy9smi"; })
+  (fetchNuGet { pname = "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.2"; sha256 = "1m9z1k9kzva9n9kwinqxl97x2vgl79qhqjlv17k9s2ymcyv2bwr6"; })
+  (fetchNuGet { pname = "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.2"; sha256 = "1cpx56mcfxz7cpn57wvj18sjisvzq8b5vd9rw16ihd2i6mcp3wa1"; })
+  (fetchNuGet { pname = "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.2"; sha256 = "15gsm1a8jdmgmf8j5v1slfz8ks124nfdhk2vxs2rw3asrxalg8hi"; })
+  (fetchNuGet { pname = "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.2"; sha256 = "0q0n5q1r1wnqmr5i5idsrd9ywl33k0js4pngkwq9p368mbxp8x1w"; })
+  (fetchNuGet { pname = "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.2"; sha256 = "1x0g58pbpjrmj2x2qw17rdwwnrcl0wvim2hdwz48lixvwvp22n9c"; })
+  (fetchNuGet { pname = "runtime.unix.Microsoft.Win32.Primitives"; version = "4.3.0"; sha256 = "0y61k9zbxhdi0glg154v30kkq7f8646nif8lnnxbvkjpakggd5id"; })
+  (fetchNuGet { pname = "runtime.unix.System.Diagnostics.Debug"; version = "4.3.0"; sha256 = "1lps7fbnw34bnh3lm31gs5c0g0dh7548wfmb8zz62v0zqz71msj5"; })
+  (fetchNuGet { pname = "runtime.unix.System.IO.FileSystem"; version = "4.3.0"; sha256 = "14nbkhvs7sji5r1saj2x8daz82rnf9kx28d3v2qss34qbr32dzix"; })
+  (fetchNuGet { pname = "runtime.unix.System.Net.Primitives"; version = "4.3.0"; sha256 = "0bdnglg59pzx9394sy4ic66kmxhqp8q8bvmykdxcbs5mm0ipwwm4"; })
+  (fetchNuGet { pname = "runtime.unix.System.Private.Uri"; version = "4.3.0"; sha256 = "1jx02q6kiwlvfksq1q9qr17fj78y5v6mwsszav4qcz9z25d5g6vk"; })
+  (fetchNuGet { pname = "runtime.unix.System.Runtime.Extensions"; version = "4.3.0"; sha256 = "0pnxxmm8whx38dp6yvwgmh22smknxmqs5n513fc7m4wxvs1bvi4p"; })
+  (fetchNuGet { pname = "SharpZipLib"; version = "1.4.2"; sha256 = "0ijrzz2szxjmv2cipk7rpmg14dfaigdkg7xabjvb38ih56m9a27y"; })
+  (fetchNuGet { pname = "StyleCop.Analyzers"; version = "1.2.0-beta.435"; sha256 = "0dirz0av24ds2k7hgpss15y4wlhwlzz22qdjvkq0n3g3sxcckrsy"; })
+  (fetchNuGet { pname = "StyleCop.Analyzers.Unstable"; version = "1.2.0.435"; sha256 = "1jv4ha4y2c9922n21yf2dvfkmi8qfa8z28gk5zsqdyck08izp9mh"; })
+  (fetchNuGet { pname = "System.Buffers"; version = "4.3.0"; sha256 = "0fgns20ispwrfqll4q1zc1waqcmylb3zc50ys9x8zlwxh9pmd9jy"; })
+  (fetchNuGet { pname = "System.Buffers"; version = "4.5.1"; sha256 = "04kb1mdrlcixj9zh1xdi5as0k0qi8byr5mi3p3jcxx72qz93s2y3"; })
+  (fetchNuGet { pname = "System.Collections"; version = "4.3.0"; sha256 = "19r4y64dqyrq6k4706dnyhhw7fs24kpp3awak7whzss39dakpxk9"; })
+  (fetchNuGet { pname = "System.Collections.Concurrent"; version = "4.3.0"; sha256 = "0wi10md9aq33jrkh2c24wr2n9hrpyamsdhsxdcnf43b7y86kkii8"; })
+  (fetchNuGet { pname = "System.Diagnostics.Debug"; version = "4.3.0"; sha256 = "00yjlf19wjydyr6cfviaph3vsjzg3d5nvnya26i2fvfg53sknh3y"; })
+  (fetchNuGet { pname = "System.Diagnostics.DiagnosticSource"; version = "4.3.0"; sha256 = "0z6m3pbiy0qw6rn3n209rrzf9x1k4002zh90vwcrsym09ipm2liq"; })
+  (fetchNuGet { pname = "System.Diagnostics.Tracing"; version = "4.3.0"; sha256 = "1m3bx6c2s958qligl67q7grkwfz3w53hpy7nc97mh6f7j5k168c4"; })
+  (fetchNuGet { pname = "System.Globalization"; version = "4.3.0"; sha256 = "1cp68vv683n6ic2zqh2s1fn4c2sd87g5hpp6l4d4nj4536jz98ki"; })
+  (fetchNuGet { pname = "System.Globalization.Calendars"; version = "4.3.0"; sha256 = "1xwl230bkakzzkrggy1l1lxmm3xlhk4bq2pkv790j5lm8g887lxq"; })
+  (fetchNuGet { pname = "System.Globalization.Extensions"; version = "4.3.0"; sha256 = "02a5zfxavhv3jd437bsncbhd2fp1zv4gxzakp1an9l6kdq1mcqls"; })
+  (fetchNuGet { pname = "System.IO"; version = "4.3.0"; sha256 = "05l9qdrzhm4s5dixmx68kxwif4l99ll5gqmh7rqgw554fx0agv5f"; })
+  (fetchNuGet { pname = "System.IO.FileSystem"; version = "4.3.0"; sha256 = "0z2dfrbra9i6y16mm9v1v6k47f0fm617vlb7s5iybjjsz6g1ilmw"; })
+  (fetchNuGet { pname = "System.IO.FileSystem.Primitives"; version = "4.3.0"; sha256 = "0j6ndgglcf4brg2lz4wzsh1av1gh8xrzdsn9f0yznskhqn1xzj9c"; })
+  (fetchNuGet { pname = "System.Linq"; version = "4.3.0"; sha256 = "1w0gmba695rbr80l1k2h4mrwzbzsyfl2z4klmpbsvsg5pm4a56s7"; })
+  (fetchNuGet { pname = "System.Memory"; version = "4.5.3"; sha256 = "0naqahm3wljxb5a911d37mwjqjdxv9l0b49p5dmfyijvni2ppy8a"; })
+  (fetchNuGet { pname = "System.Memory"; version = "4.5.4"; sha256 = "14gbbs22mcxwggn0fcfs1b062521azb9fbb7c113x0mq6dzq9h6y"; })
+  (fetchNuGet { pname = "System.Net.Http"; version = "4.3.4"; sha256 = "0kdp31b8819v88l719j6my0yas6myv9d1viql3qz5577mv819jhl"; })
+  (fetchNuGet { pname = "System.Net.Primitives"; version = "4.3.0"; sha256 = "0c87k50rmdgmxx7df2khd9qj7q35j9rzdmm2572cc55dygmdk3ii"; })
+  (fetchNuGet { pname = "System.Private.Uri"; version = "4.3.0"; sha256 = "04r1lkdnsznin0fj4ya1zikxiqr0h6r6a1ww2dsm60gqhdrf0mvx"; })
+  (fetchNuGet { pname = "System.Reflection"; version = "4.3.0"; sha256 = "0xl55k0mw8cd8ra6dxzh974nxif58s3k1rjv1vbd7gjbjr39j11m"; })
+  (fetchNuGet { pname = "System.Reflection.Primitives"; version = "4.3.0"; sha256 = "04xqa33bld78yv5r93a8n76shvc8wwcdgr1qvvjh959g3rc31276"; })
+  (fetchNuGet { pname = "System.Resources.ResourceManager"; version = "4.3.0"; sha256 = "0sjqlzsryb0mg4y4xzf35xi523s4is4hz9q4qgdvlvgivl7qxn49"; })
+  (fetchNuGet { pname = "System.Runtime"; version = "4.3.0"; sha256 = "066ixvgbf2c929kgknshcxqj6539ax7b9m570cp8n179cpfkapz7"; })
+  (fetchNuGet { pname = "System.Runtime.CompilerServices.Unsafe"; version = "6.0.0"; sha256 = "0qm741kh4rh57wky16sq4m0v05fxmkjjr87krycf5vp9f0zbahbc"; })
+  (fetchNuGet { pname = "System.Runtime.Extensions"; version = "4.3.0"; sha256 = "1ykp3dnhwvm48nap8q23893hagf665k0kn3cbgsqpwzbijdcgc60"; })
+  (fetchNuGet { pname = "System.Runtime.Handles"; version = "4.3.0"; sha256 = "0sw2gfj2xr7sw9qjn0j3l9yw07x73lcs97p8xfc9w1x9h5g5m7i8"; })
+  (fetchNuGet { pname = "System.Runtime.InteropServices"; version = "4.3.0"; sha256 = "00hywrn4g7hva1b2qri2s6rabzwgxnbpw9zfxmz28z09cpwwgh7j"; })
+  (fetchNuGet { pname = "System.Runtime.Loader"; version = "4.3.0"; sha256 = "07fgipa93g1xxgf7193a6vw677mpzgr0z0cfswbvqqb364cva8dk"; })
+  (fetchNuGet { pname = "System.Runtime.Numerics"; version = "4.3.0"; sha256 = "19rav39sr5dky7afygh309qamqqmi9kcwvz3i0c5700v0c5cg61z"; })
+  (fetchNuGet { pname = "System.Security.AccessControl"; version = "5.0.0"; sha256 = "17n3lrrl6vahkqmhlpn3w20afgz09n7i6rv0r3qypngwi7wqdr5r"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.Algorithms"; version = "4.3.0"; sha256 = "03sq183pfl5kp7gkvq77myv7kbpdnq3y0xj7vi4q1kaw54sny0ml"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.Cng"; version = "4.3.0"; sha256 = "1k468aswafdgf56ab6yrn7649kfqx2wm9aslywjam1hdmk5yypmv"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.Csp"; version = "4.3.0"; sha256 = "1x5wcrddf2s3hb8j78cry7yalca4lb5vfnkrysagbn6r9x6xvrx1"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.Encoding"; version = "4.3.0"; sha256 = "1jr6w70igqn07k5zs1ph6xja97hxnb3mqbspdrff6cvssgrixs32"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "0givpvvj8yc7gv4lhb6s1prq6p2c4147204a0wib89inqzd87gqc"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.Primitives"; version = "4.3.0"; sha256 = "0pyzncsv48zwly3lw4f2dayqswcfvdwq2nz0dgwmi7fj3pn64wby"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.X509Certificates"; version = "4.3.0"; sha256 = "0valjcz5wksbvijylxijjxb1mp38mdhv03r533vnx1q3ikzdav9h"; })
+  (fetchNuGet { pname = "System.Security.Principal.Windows"; version = "5.0.0"; sha256 = "1mpk7xj76lxgz97a5yg93wi8lj0l8p157a5d50mmjy3gbz1904q8"; })
+  (fetchNuGet { pname = "System.Text.Encoding"; version = "4.3.0"; sha256 = "1f04lkir4iladpp51sdgmis9dj4y8v08cka0mbmsy0frc9a4gjqr"; })
+  (fetchNuGet { pname = "System.Text.Encoding.Extensions"; version = "4.3.0"; sha256 = "11q1y8hh5hrp5a3kw25cb6l00v5l5dvirkz8jr3sq00h1xgcgrxy"; })
+  (fetchNuGet { pname = "System.Text.Encodings.Web"; version = "6.0.0"; sha256 = "06n9ql3fmhpjl32g3492sj181zjml5dlcc5l76xq2h38c4f87sai"; })
+  (fetchNuGet { pname = "System.Text.Json"; version = "6.0.0"; sha256 = "1si2my1g0q0qv1hiqnji4xh9wd05qavxnzj9dwgs23iqvgjky0gl"; })
+  (fetchNuGet { pname = "System.Threading"; version = "4.3.0"; sha256 = "0rw9wfamvhayp5zh3j7p1yfmx9b5khbf4q50d8k5rk993rskfd34"; })
+  (fetchNuGet { pname = "System.Threading.Channels"; version = "6.0.0"; sha256 = "1qbyi7yymqc56frqy7awvcqc1m7x3xrpx87a37dgb3mbrjg9hlcj"; })
+  (fetchNuGet { pname = "System.Threading.Tasks"; version = "4.3.0"; sha256 = "134z3v9abw3a6jsw17xl3f6hqjpak5l682k2vz39spj4kmydg6k7"; })
+  (fetchNuGet { pname = "System.ValueTuple"; version = "4.5.0"; sha256 = "00k8ja51d0f9wrq4vv5z2jhq8hy31kac2rg0rv06prylcybzl8cy"; })
+  (fetchNuGet { pname = "TagLibSharp"; version = "2.2.0"; sha256 = "0jb0f84p4jd59ha36spyk9q08g6fjap3xywq32rcs2xwzhhqiq0y"; })
+]
diff --git a/nixpkgs/pkgs/games/openra/engines/release/default.nix b/nixpkgs/pkgs/games/openra/engines/release/default.nix
new file mode 100644
index 000000000000..3b1715aca5dd
--- /dev/null
+++ b/nixpkgs/pkgs/games/openra/engines/release/default.nix
@@ -0,0 +1,8 @@
+{ buildOpenRAEngine }:
+
+buildOpenRAEngine {
+  build = "release";
+  version = "20231010";
+  sha256 = "sha256-klJkRoDLTcU7j2iwo4yT9CaKy8QXWDkYw7ApkopSDNM=";
+  deps = ./deps.nix;
+}
diff --git a/nixpkgs/pkgs/games/openra/engines/release/deps.nix b/nixpkgs/pkgs/games/openra/engines/release/deps.nix
new file mode 100644
index 000000000000..877e93c60863
--- /dev/null
+++ b/nixpkgs/pkgs/games/openra/engines/release/deps.nix
@@ -0,0 +1,113 @@
+# This file was automatically generated by passthru.fetch-deps.
+# Please dont edit it manually, your changes might get overwritten!
+
+{ fetchNuGet }: [
+  (fetchNuGet { pname = "DiscordRichPresence"; version = "1.1.3.18"; sha256 = "0p4bhaggjjfd4gl06yiphqgncxgcq2bws4sjkrw0n2ldf3hgrps3"; })
+  (fetchNuGet { pname = "Linguini.Bundle"; version = "0.5.0"; sha256 = "0515ifvvqhmhwdf7kw1wpamxn588hi150v6b8p4jfmr07y1dc4ml"; })
+  (fetchNuGet { pname = "Linguini.Shared"; version = "0.5.0"; sha256 = "1y45lf6ipa53469sdz110d16rxfyrkdr2xscgagwg07lr2833nbb"; })
+  (fetchNuGet { pname = "Linguini.Syntax"; version = "0.5.0"; sha256 = "06438fc5mizi702n8d7pqa21n5i7kwl1bwzxfy1l883j9gh64gjp"; })
+  (fetchNuGet { pname = "Microsoft.Extensions.DependencyModel"; version = "6.0.0"; sha256 = "08c4fh1n8vsish1vh7h73mva34g0as4ph29s4lvps7kmjb4z64nl"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Platforms"; version = "1.1.0"; sha256 = "08vh1r12g6ykjygq5d3vq09zylgb84l63k49jc4v8faw9g93iqqm"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Platforms"; version = "1.1.1"; sha256 = "164wycgng4mi9zqi2pnsf1pq6gccbqvw6ib916mqizgjmd8f44pj"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Platforms"; version = "5.0.0"; sha256 = "0mwpwdflidzgzfx2dlpkvvnkgkr2ayaf0s80737h4wa35gaj11rc"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Targets"; version = "1.1.0"; sha256 = "193xwf33fbm0ni3idxzbr5fdq3i2dlfgihsac9jj7whj0gd902nh"; })
+  (fetchNuGet { pname = "Microsoft.Win32.Primitives"; version = "4.3.0"; sha256 = "0j0c1wj4ndj21zsgivsc24whiya605603kxrbiw6wkfdync464wq"; })
+  (fetchNuGet { pname = "Microsoft.Win32.Registry"; version = "5.0.0"; sha256 = "102hvhq2gmlcbq8y2cb7hdr2dnmjzfp2k3asr1ycwrfacwyaak7n"; })
+  (fetchNuGet { pname = "Mono.Nat"; version = "3.0.4"; sha256 = "10zvyq60wy02q21dszrk1h3ww23b7bkgjxaapx1ans4d9nwsmlrm"; })
+  (fetchNuGet { pname = "MP3Sharp"; version = "1.0.5"; sha256 = "14h506d27g5j5c374dvw7iwn9sl0p7xp58kk95dacnpkzk0hv8yv"; })
+  (fetchNuGet { pname = "Newtonsoft.Json"; version = "13.0.1"; sha256 = "0fijg0w6iwap8gvzyjnndds0q4b8anwxxvik7y8vgq97dram4srb"; })
+  (fetchNuGet { pname = "NuGet.CommandLine"; version = "4.4.1"; sha256 = "1szk5hbw22c1k5747dk95mzsy5vjw7qmvwv1wc9h080h9xzj9aab"; })
+  (fetchNuGet { pname = "NVorbis"; version = "0.10.5"; sha256 = "0yiqqlb8mmnz04yq4iykkxq9np4m29z29bjwm5ic0adyq8fr4cnl"; })
+  (fetchNuGet { pname = "OpenRA-Eluant"; version = "1.0.22"; sha256 = "134ar57v7k5i4zb7xl9j2f6abwjjhl5kwx3cap5zrb5jdfb1x42p"; })
+  (fetchNuGet { pname = "OpenRA-Freetype6"; version = "1.0.11"; sha256 = "1gb1mpckj2ji64fyca6cd1lbl7adyfjl5czgvhllhgv5h2jfwir1"; })
+  (fetchNuGet { pname = "OpenRA-FuzzyLogicLibrary"; version = "1.0.1"; sha256 = "0kn0b8491srbllkpqvvkml02dkixs18y5hgcalnpbw8l5kkmwvim"; })
+  (fetchNuGet { pname = "OpenRA-OpenAL-CS"; version = "1.0.22"; sha256 = "05bxqdams1s4la5fqlsijzmja1wf59gcy5y04jh91996q9glkq1d"; })
+  (fetchNuGet { pname = "OpenRA-SDL2-CS"; version = "1.0.40"; sha256 = "0ysrryn63akysiv92mh0mra87pd8l8zvahp8pbxsliapdfq2n2qk"; })
+  (fetchNuGet { pname = "Pfim"; version = "0.11.2"; sha256 = "1mf91sfxa4c5xp5qmgyc85v84aprhgdy951f1f41xmygvmkk94mp"; })
+  (fetchNuGet { pname = "rix0rrr.BeaconLib"; version = "1.0.2"; sha256 = "0f0yi7hp8v6jvhhv7k4whv8hqqxnx15nvbkll4f1ykaa1w2pr754"; })
+  (fetchNuGet { pname = "runtime.any.System.Collections"; version = "4.3.0"; sha256 = "0bv5qgm6vr47ynxqbnkc7i797fdi8gbjjxii173syrx14nmrkwg0"; })
+  (fetchNuGet { pname = "runtime.any.System.Diagnostics.Tracing"; version = "4.3.0"; sha256 = "00j6nv2xgmd3bi347k00m7wr542wjlig53rmj28pmw7ddcn97jbn"; })
+  (fetchNuGet { pname = "runtime.any.System.Globalization"; version = "4.3.0"; sha256 = "1daqf33hssad94lamzg01y49xwndy2q97i2lrb7mgn28656qia1x"; })
+  (fetchNuGet { pname = "runtime.any.System.Globalization.Calendars"; version = "4.3.0"; sha256 = "1ghhhk5psqxcg6w88sxkqrc35bxcz27zbqm2y5p5298pv3v7g201"; })
+  (fetchNuGet { pname = "runtime.any.System.IO"; version = "4.3.0"; sha256 = "0l8xz8zn46w4d10bcn3l4yyn4vhb3lrj2zw8llvz7jk14k4zps5x"; })
+  (fetchNuGet { pname = "runtime.any.System.Reflection"; version = "4.3.0"; sha256 = "02c9h3y35pylc0zfq3wcsvc5nqci95nrkq0mszifc0sjx7xrzkly"; })
+  (fetchNuGet { pname = "runtime.any.System.Reflection.Primitives"; version = "4.3.0"; sha256 = "0x1mm8c6iy8rlxm8w9vqw7gb7s1ljadrn049fmf70cyh42vdfhrf"; })
+  (fetchNuGet { pname = "runtime.any.System.Resources.ResourceManager"; version = "4.3.0"; sha256 = "03kickal0iiby82wa5flar18kyv82s9s6d4xhk5h4bi5kfcyfjzl"; })
+  (fetchNuGet { pname = "runtime.any.System.Runtime"; version = "4.3.0"; sha256 = "1cqh1sv3h5j7ixyb7axxbdkqx6cxy00p4np4j91kpm492rf4s25b"; })
+  (fetchNuGet { pname = "runtime.any.System.Runtime.Handles"; version = "4.3.0"; sha256 = "0bh5bi25nk9w9xi8z23ws45q5yia6k7dg3i4axhfqlnj145l011x"; })
+  (fetchNuGet { pname = "runtime.any.System.Runtime.InteropServices"; version = "4.3.0"; sha256 = "0c3g3g3jmhlhw4klrc86ka9fjbl7i59ds1fadsb2l8nqf8z3kb19"; })
+  (fetchNuGet { pname = "runtime.any.System.Text.Encoding"; version = "4.3.0"; sha256 = "0aqqi1v4wx51h51mk956y783wzags13wa7mgqyclacmsmpv02ps3"; })
+  (fetchNuGet { pname = "runtime.any.System.Text.Encoding.Extensions"; version = "4.3.0"; sha256 = "0lqhgqi0i8194ryqq6v2gqx0fb86db2gqknbm0aq31wb378j7ip8"; })
+  (fetchNuGet { pname = "runtime.any.System.Threading.Tasks"; version = "4.3.0"; sha256 = "03mnvkhskbzxddz4hm113zsch1jyzh2cs450dk3rgfjp8crlw1va"; })
+  (fetchNuGet { pname = "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.2"; sha256 = "0rwpqngkqiapqc5c2cpkj7idhngrgss5qpnqg0yh40mbyflcxf8i"; })
+  (fetchNuGet { pname = "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.2"; sha256 = "1n06gxwlinhs0w7s8a94r1q3lwqzvynxwd3mp10ws9bg6gck8n4r"; })
+  (fetchNuGet { pname = "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.2"; sha256 = "0404wqrc7f2yc0wxv71y3nnybvqx8v4j9d47hlscxy759a525mc3"; })
+  (fetchNuGet { pname = "runtime.native.System"; version = "4.3.0"; sha256 = "15hgf6zaq9b8br2wi1i3x0zvmk410nlmsmva9p0bbg73v6hml5k4"; })
+  (fetchNuGet { pname = "runtime.native.System.Net.Http"; version = "4.3.0"; sha256 = "1n6rgz5132lcibbch1qlf0g9jk60r0kqv087hxc0lisy50zpm7kk"; })
+  (fetchNuGet { pname = "runtime.native.System.Security.Cryptography.Apple"; version = "4.3.0"; sha256 = "1b61p6gw1m02cc1ry996fl49liiwky6181dzr873g9ds92zl326q"; })
+  (fetchNuGet { pname = "runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.2"; sha256 = "0zy5r25jppz48i2bkg8b9lfig24xixg6nm3xyr1379zdnqnpm8f6"; })
+  (fetchNuGet { pname = "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.2"; sha256 = "096ch4n4s8k82xga80lfmpimpzahd2ip1mgwdqgar0ywbbl6x438"; })
+  (fetchNuGet { pname = "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.2"; sha256 = "1dm8fifl7rf1gy7lnwln78ch4rw54g0pl5g1c189vawavll7p6rj"; })
+  (fetchNuGet { pname = "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple"; version = "4.3.0"; sha256 = "10yc8jdrwgcl44b4g93f1ds76b176bajd3zqi2faf5rvh1vy9smi"; })
+  (fetchNuGet { pname = "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.2"; sha256 = "1m9z1k9kzva9n9kwinqxl97x2vgl79qhqjlv17k9s2ymcyv2bwr6"; })
+  (fetchNuGet { pname = "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.2"; sha256 = "1cpx56mcfxz7cpn57wvj18sjisvzq8b5vd9rw16ihd2i6mcp3wa1"; })
+  (fetchNuGet { pname = "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.2"; sha256 = "15gsm1a8jdmgmf8j5v1slfz8ks124nfdhk2vxs2rw3asrxalg8hi"; })
+  (fetchNuGet { pname = "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.2"; sha256 = "0q0n5q1r1wnqmr5i5idsrd9ywl33k0js4pngkwq9p368mbxp8x1w"; })
+  (fetchNuGet { pname = "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.2"; sha256 = "1x0g58pbpjrmj2x2qw17rdwwnrcl0wvim2hdwz48lixvwvp22n9c"; })
+  (fetchNuGet { pname = "runtime.unix.Microsoft.Win32.Primitives"; version = "4.3.0"; sha256 = "0y61k9zbxhdi0glg154v30kkq7f8646nif8lnnxbvkjpakggd5id"; })
+  (fetchNuGet { pname = "runtime.unix.System.Diagnostics.Debug"; version = "4.3.0"; sha256 = "1lps7fbnw34bnh3lm31gs5c0g0dh7548wfmb8zz62v0zqz71msj5"; })
+  (fetchNuGet { pname = "runtime.unix.System.IO.FileSystem"; version = "4.3.0"; sha256 = "14nbkhvs7sji5r1saj2x8daz82rnf9kx28d3v2qss34qbr32dzix"; })
+  (fetchNuGet { pname = "runtime.unix.System.Net.Primitives"; version = "4.3.0"; sha256 = "0bdnglg59pzx9394sy4ic66kmxhqp8q8bvmykdxcbs5mm0ipwwm4"; })
+  (fetchNuGet { pname = "runtime.unix.System.Private.Uri"; version = "4.3.0"; sha256 = "1jx02q6kiwlvfksq1q9qr17fj78y5v6mwsszav4qcz9z25d5g6vk"; })
+  (fetchNuGet { pname = "runtime.unix.System.Runtime.Extensions"; version = "4.3.0"; sha256 = "0pnxxmm8whx38dp6yvwgmh22smknxmqs5n513fc7m4wxvs1bvi4p"; })
+  (fetchNuGet { pname = "SharpZipLib"; version = "1.4.2"; sha256 = "0ijrzz2szxjmv2cipk7rpmg14dfaigdkg7xabjvb38ih56m9a27y"; })
+  (fetchNuGet { pname = "StyleCop.Analyzers"; version = "1.2.0-beta.435"; sha256 = "0dirz0av24ds2k7hgpss15y4wlhwlzz22qdjvkq0n3g3sxcckrsy"; })
+  (fetchNuGet { pname = "StyleCop.Analyzers.Unstable"; version = "1.2.0.435"; sha256 = "1jv4ha4y2c9922n21yf2dvfkmi8qfa8z28gk5zsqdyck08izp9mh"; })
+  (fetchNuGet { pname = "System.Buffers"; version = "4.3.0"; sha256 = "0fgns20ispwrfqll4q1zc1waqcmylb3zc50ys9x8zlwxh9pmd9jy"; })
+  (fetchNuGet { pname = "System.Buffers"; version = "4.5.1"; sha256 = "04kb1mdrlcixj9zh1xdi5as0k0qi8byr5mi3p3jcxx72qz93s2y3"; })
+  (fetchNuGet { pname = "System.Collections"; version = "4.3.0"; sha256 = "19r4y64dqyrq6k4706dnyhhw7fs24kpp3awak7whzss39dakpxk9"; })
+  (fetchNuGet { pname = "System.Collections.Concurrent"; version = "4.3.0"; sha256 = "0wi10md9aq33jrkh2c24wr2n9hrpyamsdhsxdcnf43b7y86kkii8"; })
+  (fetchNuGet { pname = "System.Diagnostics.Debug"; version = "4.3.0"; sha256 = "00yjlf19wjydyr6cfviaph3vsjzg3d5nvnya26i2fvfg53sknh3y"; })
+  (fetchNuGet { pname = "System.Diagnostics.DiagnosticSource"; version = "4.3.0"; sha256 = "0z6m3pbiy0qw6rn3n209rrzf9x1k4002zh90vwcrsym09ipm2liq"; })
+  (fetchNuGet { pname = "System.Diagnostics.Tracing"; version = "4.3.0"; sha256 = "1m3bx6c2s958qligl67q7grkwfz3w53hpy7nc97mh6f7j5k168c4"; })
+  (fetchNuGet { pname = "System.Globalization"; version = "4.3.0"; sha256 = "1cp68vv683n6ic2zqh2s1fn4c2sd87g5hpp6l4d4nj4536jz98ki"; })
+  (fetchNuGet { pname = "System.Globalization.Calendars"; version = "4.3.0"; sha256 = "1xwl230bkakzzkrggy1l1lxmm3xlhk4bq2pkv790j5lm8g887lxq"; })
+  (fetchNuGet { pname = "System.Globalization.Extensions"; version = "4.3.0"; sha256 = "02a5zfxavhv3jd437bsncbhd2fp1zv4gxzakp1an9l6kdq1mcqls"; })
+  (fetchNuGet { pname = "System.IO"; version = "4.3.0"; sha256 = "05l9qdrzhm4s5dixmx68kxwif4l99ll5gqmh7rqgw554fx0agv5f"; })
+  (fetchNuGet { pname = "System.IO.FileSystem"; version = "4.3.0"; sha256 = "0z2dfrbra9i6y16mm9v1v6k47f0fm617vlb7s5iybjjsz6g1ilmw"; })
+  (fetchNuGet { pname = "System.IO.FileSystem.Primitives"; version = "4.3.0"; sha256 = "0j6ndgglcf4brg2lz4wzsh1av1gh8xrzdsn9f0yznskhqn1xzj9c"; })
+  (fetchNuGet { pname = "System.Linq"; version = "4.3.0"; sha256 = "1w0gmba695rbr80l1k2h4mrwzbzsyfl2z4klmpbsvsg5pm4a56s7"; })
+  (fetchNuGet { pname = "System.Memory"; version = "4.5.3"; sha256 = "0naqahm3wljxb5a911d37mwjqjdxv9l0b49p5dmfyijvni2ppy8a"; })
+  (fetchNuGet { pname = "System.Memory"; version = "4.5.4"; sha256 = "14gbbs22mcxwggn0fcfs1b062521azb9fbb7c113x0mq6dzq9h6y"; })
+  (fetchNuGet { pname = "System.Net.Http"; version = "4.3.4"; sha256 = "0kdp31b8819v88l719j6my0yas6myv9d1viql3qz5577mv819jhl"; })
+  (fetchNuGet { pname = "System.Net.Primitives"; version = "4.3.0"; sha256 = "0c87k50rmdgmxx7df2khd9qj7q35j9rzdmm2572cc55dygmdk3ii"; })
+  (fetchNuGet { pname = "System.Private.Uri"; version = "4.3.0"; sha256 = "04r1lkdnsznin0fj4ya1zikxiqr0h6r6a1ww2dsm60gqhdrf0mvx"; })
+  (fetchNuGet { pname = "System.Reflection"; version = "4.3.0"; sha256 = "0xl55k0mw8cd8ra6dxzh974nxif58s3k1rjv1vbd7gjbjr39j11m"; })
+  (fetchNuGet { pname = "System.Reflection.Primitives"; version = "4.3.0"; sha256 = "04xqa33bld78yv5r93a8n76shvc8wwcdgr1qvvjh959g3rc31276"; })
+  (fetchNuGet { pname = "System.Resources.ResourceManager"; version = "4.3.0"; sha256 = "0sjqlzsryb0mg4y4xzf35xi523s4is4hz9q4qgdvlvgivl7qxn49"; })
+  (fetchNuGet { pname = "System.Runtime"; version = "4.3.0"; sha256 = "066ixvgbf2c929kgknshcxqj6539ax7b9m570cp8n179cpfkapz7"; })
+  (fetchNuGet { pname = "System.Runtime.CompilerServices.Unsafe"; version = "6.0.0"; sha256 = "0qm741kh4rh57wky16sq4m0v05fxmkjjr87krycf5vp9f0zbahbc"; })
+  (fetchNuGet { pname = "System.Runtime.Extensions"; version = "4.3.0"; sha256 = "1ykp3dnhwvm48nap8q23893hagf665k0kn3cbgsqpwzbijdcgc60"; })
+  (fetchNuGet { pname = "System.Runtime.Handles"; version = "4.3.0"; sha256 = "0sw2gfj2xr7sw9qjn0j3l9yw07x73lcs97p8xfc9w1x9h5g5m7i8"; })
+  (fetchNuGet { pname = "System.Runtime.InteropServices"; version = "4.3.0"; sha256 = "00hywrn4g7hva1b2qri2s6rabzwgxnbpw9zfxmz28z09cpwwgh7j"; })
+  (fetchNuGet { pname = "System.Runtime.Loader"; version = "4.3.0"; sha256 = "07fgipa93g1xxgf7193a6vw677mpzgr0z0cfswbvqqb364cva8dk"; })
+  (fetchNuGet { pname = "System.Runtime.Numerics"; version = "4.3.0"; sha256 = "19rav39sr5dky7afygh309qamqqmi9kcwvz3i0c5700v0c5cg61z"; })
+  (fetchNuGet { pname = "System.Security.AccessControl"; version = "5.0.0"; sha256 = "17n3lrrl6vahkqmhlpn3w20afgz09n7i6rv0r3qypngwi7wqdr5r"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.Algorithms"; version = "4.3.0"; sha256 = "03sq183pfl5kp7gkvq77myv7kbpdnq3y0xj7vi4q1kaw54sny0ml"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.Cng"; version = "4.3.0"; sha256 = "1k468aswafdgf56ab6yrn7649kfqx2wm9aslywjam1hdmk5yypmv"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.Csp"; version = "4.3.0"; sha256 = "1x5wcrddf2s3hb8j78cry7yalca4lb5vfnkrysagbn6r9x6xvrx1"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.Encoding"; version = "4.3.0"; sha256 = "1jr6w70igqn07k5zs1ph6xja97hxnb3mqbspdrff6cvssgrixs32"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "0givpvvj8yc7gv4lhb6s1prq6p2c4147204a0wib89inqzd87gqc"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.Primitives"; version = "4.3.0"; sha256 = "0pyzncsv48zwly3lw4f2dayqswcfvdwq2nz0dgwmi7fj3pn64wby"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.X509Certificates"; version = "4.3.0"; sha256 = "0valjcz5wksbvijylxijjxb1mp38mdhv03r533vnx1q3ikzdav9h"; })
+  (fetchNuGet { pname = "System.Security.Principal.Windows"; version = "5.0.0"; sha256 = "1mpk7xj76lxgz97a5yg93wi8lj0l8p157a5d50mmjy3gbz1904q8"; })
+  (fetchNuGet { pname = "System.Text.Encoding"; version = "4.3.0"; sha256 = "1f04lkir4iladpp51sdgmis9dj4y8v08cka0mbmsy0frc9a4gjqr"; })
+  (fetchNuGet { pname = "System.Text.Encoding.Extensions"; version = "4.3.0"; sha256 = "11q1y8hh5hrp5a3kw25cb6l00v5l5dvirkz8jr3sq00h1xgcgrxy"; })
+  (fetchNuGet { pname = "System.Text.Encodings.Web"; version = "6.0.0"; sha256 = "06n9ql3fmhpjl32g3492sj181zjml5dlcc5l76xq2h38c4f87sai"; })
+  (fetchNuGet { pname = "System.Text.Json"; version = "6.0.0"; sha256 = "1si2my1g0q0qv1hiqnji4xh9wd05qavxnzj9dwgs23iqvgjky0gl"; })
+  (fetchNuGet { pname = "System.Threading"; version = "4.3.0"; sha256 = "0rw9wfamvhayp5zh3j7p1yfmx9b5khbf4q50d8k5rk993rskfd34"; })
+  (fetchNuGet { pname = "System.Threading.Channels"; version = "6.0.0"; sha256 = "1qbyi7yymqc56frqy7awvcqc1m7x3xrpx87a37dgb3mbrjg9hlcj"; })
+  (fetchNuGet { pname = "System.Threading.Tasks"; version = "4.3.0"; sha256 = "134z3v9abw3a6jsw17xl3f6hqjpak5l682k2vz39spj4kmydg6k7"; })
+  (fetchNuGet { pname = "System.ValueTuple"; version = "4.5.0"; sha256 = "00k8ja51d0f9wrq4vv5z2jhq8hy31kac2rg0rv06prylcybzl8cy"; })
+  (fetchNuGet { pname = "TagLibSharp"; version = "2.3.0"; sha256 = "1z7v9lrkss1f8s42sclsq3az9zjihgmhyxnwhjyf0scgk1amngrw"; })
+]
diff --git a/nixpkgs/pkgs/games/openra_2019/common.nix b/nixpkgs/pkgs/games/openra_2019/common.nix
new file mode 100644
index 000000000000..5932eeb6e6d0
--- /dev/null
+++ b/nixpkgs/pkgs/games/openra_2019/common.nix
@@ -0,0 +1,69 @@
+/*  The reusable code, and package attributes, between OpenRA engine packages (engine.nix)
+    and out-of-tree mod packages (mod.nix).
+*/
+{ lib, makeSetupHook, curl, unzip, dos2unix, pkg-config, makeWrapper
+, lua, mono, python3
+, libGL, freetype, openal, SDL2
+, zenity
+}:
+
+with lib;
+
+let
+  path = makeBinPath ([ mono python3 ] ++ optional (zenity != null) zenity);
+  rpath = makeLibraryPath [ lua freetype openal SDL2 ];
+  mkdirp = makeSetupHook {
+    name = "openra-mkdirp-hook";
+  } ./mkdirp.sh;
+
+in {
+  patchEngine = dir: version: ''
+    sed -i \
+      -e 's/^VERSION.*/VERSION = ${version}/g' \
+      -e '/fetch-geoip-db/d' \
+      -e '/GeoLite2-Country.mmdb.gz/d' \
+      ${dir}/Makefile
+
+    sed -i 's|locations=.*|locations=${lua}/lib|' ${dir}/thirdparty/configure-native-deps.sh
+  '';
+
+  wrapLaunchGame = openraSuffix: binaryName: ''
+    # Setting TERM=xterm fixes an issue with terminfo in mono: System.Exception: Magic number is wrong: 542
+    # https://github.com/mono/mono/issues/6752#issuecomment-365212655
+    wrapProgram $out/lib/openra${openraSuffix}/launch-game.sh \
+      --prefix PATH : "${path}" \
+      --prefix LD_LIBRARY_PATH : "${rpath}" \
+      --set TERM xterm
+
+    makeWrapper $out/lib/openra${openraSuffix}/launch-game.sh $(mkdirp $out/bin)/${binaryName} \
+      --chdir "$out/lib/openra${openraSuffix}"
+  '';
+
+  packageAttrs = {
+    buildInputs = [ libGL ];
+
+    # TODO: Test if this is correct.
+    nativeBuildInputs = [
+      curl
+      unzip
+      dos2unix
+      pkg-config
+      makeWrapper
+      mkdirp
+      mono
+      python3
+    ];
+
+    makeFlags = [ "prefix=$(out)" ];
+
+    doCheck = true;
+
+    dontStrip = true;
+
+    meta = {
+      maintainers = with maintainers; [ fusion809 msteen ];
+      license = licenses.gpl3;
+      platforms = platforms.linux;
+    };
+  };
+}
diff --git a/nixpkgs/pkgs/games/openra_2019/default.nix b/nixpkgs/pkgs/games/openra_2019/default.nix
new file mode 100644
index 000000000000..0bcf71cd87f1
--- /dev/null
+++ b/nixpkgs/pkgs/games/openra_2019/default.nix
@@ -0,0 +1,74 @@
+/*  This file defines all OpenRA packages under `openraPackages`,
+    e.g. the OpenRA release engine can be found at `openraPackages.engines.release` (see `engines.nix`),
+    or the out-of-tree mod "Combined Arms" can be found at `openraPackages.mods.ca` (see `mods.nix`).
+    The `openra` package is just an alias to `openraPackages.engines.release`,
+    and just provides the mods included in the source code of the engine.
+    Additional engines or mods can be added with `openraPackages.buildOpenRAEngine` (function around `engine.nix`)
+    and `openraPackages.buildOpenRAMod` (function around `mod.nix`), respectively.
+*/
+{ pkgs, lib }:
+
+let
+  /*  Building an engine or out-of-tree mod is very similar,
+      but different enough not to be able to build them with the same package definition,
+      so instaed we define what is common between them in a separate file.
+
+      Although `callPackage` could be used, it would require undoing `makeOverridable`,
+      because `common.nix` does not define a package, but just an attribute set,
+      which is directly passed as part of the argument to the engines and mods `callPackage`,
+      so either the attributes added by `makeOverridable` have to be removed
+      or the engine and mod package definitions will need to add `...` to the argument list.
+  */
+  common = let
+    f = import ./common.nix;
+    fArgs = lib.functionArgs f;
+  in f (builtins.intersectAttrs fArgs pkgs // {
+    lua = pkgs.lua5_1;
+    # It is not necessary to run the game, but it is nicer to be given an error dialog in the case of failure,
+    # rather than having to look to the logs why it is not starting.
+    inherit (pkgs.gnome) zenity;
+  });
+
+  /*  Building a set of engines or mods requires some dependencies as well,
+      so the sets will actually be defined as a function instead,
+      requiring the dependencies and returning the actual set.
+
+      Not all dependencies for defining a engine or mod set are shared,
+      so additional arguments can be passed as well.
+
+      The builders for engines and mods allow to delay specifying the name,
+      by returning a function that expects a name, which we use, in this case,
+      to base the name on the attribute name instead, preventing the need to specify the name twice
+      if the attribute name and engine/mod name are equal.
+  */
+  callWithName = name: value: if lib.isFunction value then value name else value;
+  buildOpenRASet = f: args: pkgs.recurseIntoAttrs (lib.mapAttrs callWithName (f ({
+    inherit (pkgs) fetchFromGitHub;
+    postFetch = ''
+      sed -i 's/curl/curl --insecure/g' $out/thirdparty/{fetch-thirdparty-deps,noget}.sh
+      $out/thirdparty/fetch-thirdparty-deps.sh
+    '';
+  } // args)));
+
+in pkgs.recurseIntoAttrs rec {
+  # The whole attribute set is destructered to ensure those (and only those) attributes are given
+  # and to provide defaults for those that are optional.
+  buildOpenRAEngine = { name ? null, version, description, homepage, mods, src }@engine:
+    # Allow specifying the name at a later point if no name has been given.
+    let builder = name: pkgs.callPackage ./engine.nix (common // {
+      engine = engine // { inherit name; };
+    });
+    in if name == null then builder else builder name;
+
+  # See `buildOpenRAEngine`.
+  buildOpenRAMod = { name ? null, version, title, description, homepage, src, engine, assetsError ? "" }@mod: ({ version, mods ? [], src }@engine:
+    let builder = name: pkgs.callPackage ./mod.nix (common // {
+      mod = mod // { inherit name assetsError; };
+      engine = engine // { inherit mods; };
+    });
+    in if name == null then builder else builder name) engine;
+
+  # See `buildOpenRASet`.
+  engines = buildOpenRASet (import ./engines.nix) { inherit buildOpenRAEngine; };
+  mods = buildOpenRASet (import ./mods.nix) { inherit buildOpenRAMod; };
+}
diff --git a/nixpkgs/pkgs/games/openra_2019/engine.nix b/nixpkgs/pkgs/games/openra_2019/engine.nix
new file mode 100644
index 000000000000..d63800be1e29
--- /dev/null
+++ b/nixpkgs/pkgs/games/openra_2019/engine.nix
@@ -0,0 +1,57 @@
+/*  The package defintion for an OpenRA engine.
+    It shares code with `mod.nix` by what is defined in `common.nix`.
+    Similar to `mod.nix` it is a generic package definition,
+    in order to make it easy to define multiple variants of the OpenRA engine.
+    For each mod provided by the engine, a wrapper script is created,
+    matching the naming convention used by `mod.nix`.
+    This package could be seen as providing a set of in-tree mods,
+    while the `mod.nix` pacakges provide a single out-of-tree mod.
+*/
+{ lib, stdenv
+, packageAttrs
+, patchEngine
+, wrapLaunchGame
+, engine
+}:
+
+stdenv.mkDerivation (lib.recursiveUpdate packageAttrs rec {
+  pname = "openra_2019";
+  version = "${engine.name}-${engine.version}";
+
+  src = engine.src;
+
+  postPatch = patchEngine "." version;
+
+  configurePhase = ''
+    runHook preConfigure
+
+    make version VERSION=${lib.escapeShellArg version}
+
+    runHook postConfigure
+  '';
+
+  buildFlags = [ "DEBUG=false" "default" "man-page" ];
+
+  checkTarget = "nunit test";
+
+  installTargets = [
+    "install"
+    "install-linux-icons"
+    "install-linux-desktop"
+    "install-linux-appdata"
+    "install-linux-mime"
+    "install-man-page"
+  ];
+
+  postInstall = ''
+    ${wrapLaunchGame "" "openra"}
+
+    ${lib.concatStrings (map (mod: ''
+      makeWrapper $out/bin/openra $out/bin/openra-${mod} --add-flags Game.Mod=${mod}
+    '') engine.mods)}
+  '';
+
+  meta = {
+    inherit (engine) description homepage;
+  };
+})
diff --git a/nixpkgs/pkgs/games/openra_2019/engines.nix b/nixpkgs/pkgs/games/openra_2019/engines.nix
new file mode 100644
index 000000000000..bbb4947acd23
--- /dev/null
+++ b/nixpkgs/pkgs/games/openra_2019/engines.nix
@@ -0,0 +1,41 @@
+{ buildOpenRAEngine, fetchFromGitHub, postFetch }:
+
+let
+  buildUpstreamOpenRAEngine = { version, rev, sha256 }: name: (buildOpenRAEngine {
+    inherit version;
+    description = "Open-source re-implementation of Westwood Studios' 2D Command and Conquer games";
+    homepage = "https://www.openra.net/";
+    mods = [ "cnc" "d2k" "ra" "ts" ];
+    src = fetchFromGitHub {
+      owner = "OpenRA";
+      repo = "OpenRA" ;
+      inherit rev sha256 postFetch;
+    };
+  } name).overrideAttrs (origAttrs: {
+    postInstall = ''
+      ${origAttrs.postInstall}
+      cp -r mods/ts $out/lib/openra/mods/
+      cp mods/ts/icon.png $(mkdirp $out/share/pixmaps)/openra-ts.png
+      ( cd $out/share/applications; sed -e 's/Dawn/Sun/g' -e 's/cnc/ts/g' openra-cnc.desktop > openra-ts.desktop )
+    '';
+  });
+
+in {
+  release = name: (buildUpstreamOpenRAEngine rec {
+    version = "20190314";
+    rev = "${name}-${version}";
+    sha256 = "15pvn5cx3g0nzbrgpsfz8dngad5wkzp5dz25ydzn8bmxafiijvcr";
+  } name);
+
+  playtest = name: (buildUpstreamOpenRAEngine rec {
+    version = "20190302";
+    rev = "${name}-${version}";
+    sha256 = "1vqvfk2p2lpk3m0d3rpvj34i8cmk3mfc7w4cn4llqd9zp4kk9pya";
+  } name);
+
+  bleed = buildUpstreamOpenRAEngine {
+    version = "8ee1102";
+    rev = "8ee11028d72cde7556b31d45f556b40be65b4b70";
+    sha256 = "0f1fpf37ms8d7fhlh3rjzsxsk9w23iyi3phs2i7g561292d5rk3l";
+  };
+}
diff --git a/nixpkgs/pkgs/games/openra_2019/mkdirp.sh b/nixpkgs/pkgs/games/openra_2019/mkdirp.sh
new file mode 100644
index 000000000000..7b2cf0b89c0e
--- /dev/null
+++ b/nixpkgs/pkgs/games/openra_2019/mkdirp.sh
@@ -0,0 +1,4 @@
+mkdirp() {
+  mkdir -p "$@"
+  echo "$@"
+}
diff --git a/nixpkgs/pkgs/games/openra_2019/mod-launch-game.sh b/nixpkgs/pkgs/games/openra_2019/mod-launch-game.sh
new file mode 100644
index 000000000000..16fb14c24d65
--- /dev/null
+++ b/nixpkgs/pkgs/games/openra_2019/mod-launch-game.sh
@@ -0,0 +1,25 @@
+#!/usr/bin/env bash
+show_error() {
+  if command -v zenity > /dev/null; then
+    zenity --no-wrap --no-markup --error --title "OpenRA - @title@" --text "$1" 2>/dev/null
+  else
+    printf "$1\n" >&2
+  fi
+  exit 1
+}
+
+pushd "@out@/lib/openra_2019-@name@" > /dev/null
+
+# Check for missing assets
+assetsError='@assetsError@'
+if [[ -n "$assetsError" && ! -d "$HOME/.openra/Content/@name@" ]]; then
+  show_error "$assetsError"
+fi
+
+# Run the game
+mono --debug OpenRA.Game.exe Game.Mod=@name@ Engine.LaunchPath="@out@/bin/openra-@name@" Engine.ModSearchPaths="@out@/lib/openra_2019-@name@/mods" "$@"
+
+# Show a crash dialog if something went wrong
+if (( $? != 0 && $? != 1 )); then
+  show_error $'OpenRA - @title@ has encountered a fatal error.\nPlease refer to the crash logs for more information.\n\nLog files are located in ~/.openra/Logs'
+fi
diff --git a/nixpkgs/pkgs/games/openra_2019/mod-update.sh b/nixpkgs/pkgs/games/openra_2019/mod-update.sh
new file mode 100755
index 000000000000..8489d5a97a7c
--- /dev/null
+++ b/nixpkgs/pkgs/games/openra_2019/mod-update.sh
@@ -0,0 +1,160 @@
+#!/usr/bin/env bash
+# shellcheck disable=SC2034
+
+# for mod in $(nix eval --raw '(
+#   with import <nixpkgs> { };
+#   with lib;
+#   let mods = attrNames (removeAttrs openraPackages.mods [ "recurseForDerivations" ]);
+#   in concatStringsSep " " mods
+# )'); do
+#   ./mod-update.sh "$mod"
+# done
+
+# Uses: https://github.com/msteen/nix-upfetch
+
+mod=$1
+commit_count=$2
+token=
+nixpkgs='<nixpkgs>'
+
+die() {
+  local ret=$?
+  echo "$*" >&2
+  exit $ret
+}
+
+curl() {
+  command curl --silent --show-error "$@"
+}
+
+get_sha1() {
+  local owner=$1 repo=$2 ref=$3
+  # https://developer.github.com/v3/#authentication
+  curl -H "Authorization: token $token" -H 'Accept: application/vnd.github.VERSION.sha' "https://api.github.com/repos/$owner/$repo/commits/$ref"
+}
+
+[[ -n $mod ]] || die "The first argument of this script has to be a mod identifier."
+
+[[ -n $token ]] || die "Please edit this script to include a GitHub API access token, which is required for API v4:
+https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/"
+
+# Get current mod_owner and mod_repo.
+vars=$(nix-prefetch --file "$nixpkgs" "openraPackages.mods.$mod" --index 0 --quiet --output json --no-compute-hash > >(
+  jq --raw-output 'with_entries(select(.value | contains("\n") | not)) | to_entries | .[] | .key + "=" + .value')) || exit
+
+mod_owner=; mod_repo=; mod_rev=
+while IFS='=' read -r key val; do
+  declare "mod_${key}=${val}"
+done <<< "$vars"
+
+if [[ -n $commit_count ]]; then
+  query_on_commit='{
+  history(first: 10) {
+    nodes {
+      abbreviatedOid
+      oid
+    }
+    totalCount
+  }
+}'
+else
+  query_on_commit='{
+  history(first: 0) {
+    totalCount
+  }
+  abbreviatedOid
+  oid
+}'
+fi
+
+# shellcheck disable=SC2089
+query='{
+  repository(owner: "'$mod_owner'", name: "'$mod_repo'") {
+    defaultBranchRef {
+      target {
+        ... on Commit '$query_on_commit'
+      }
+    }
+    licenseInfo {
+      key
+    }
+  }
+}'
+
+# Newlines are not allowed in a query.
+# https://developer.github.com/v4/guides/forming-calls/#communicating-with-graphql
+# shellcheck disable=SC2086 disable=SC2090 disable=SC2116
+query=$(echo $query)
+query=${query//\"/\\\"}
+
+# https://developer.github.com/v4/guides/using-the-explorer/#configuring-graphiql
+json=$(curl -H "Authorization: bearer $token" -X POST -d '{ "query": "'"$query"'" }' https://api.github.com/graphql) || exit
+
+if [[ -n $commit_count ]]; then
+  json=$(jq "$commit_count"' as $commit_count
+    | .data.repository.defaultBranchRef.target
+    |= (.history |= (. | del(.nodes) | .totalCount = $commit_count))
+    + (.history | .nodes[.totalCount - $commit_count])' <<< "$json") || exit
+fi
+
+vars=$(jq --raw-output '.data.repository | {
+  license_key: .licenseInfo.key,
+} + (.defaultBranchRef.target | {
+  version: ((.history.totalCount | tostring) + ".git." + .abbreviatedOid),
+  rev: .oid,
+}) | to_entries | .[] | .key + "=" + (.value | tostring)' <<< "$json") || exit
+
+mod_license_key=; mod_version=; mod_rev=
+while IFS='=' read -r key val; do
+  declare "mod_${key}=${val}"
+done <<< "$vars"
+
+mod_config=$(curl "https://raw.githubusercontent.com/$mod_owner/$mod_repo/$mod_rev/mod.config") || exit
+
+mod_id=; engine_version=; automatic_engine_management=; automatic_engine_source=
+while IFS='=' read -r key val; do
+  declare "${key,,}=$(jq --raw-output . <<< "$val")"
+done < <(grep '^\(MOD_ID\|ENGINE_VERSION\|AUTOMATIC_ENGINE_MANAGEMENT\|AUTOMATIC_ENGINE_SOURCE\)=' <<< "$mod_config")
+
+for var in mod_id engine_version automatic_engine_management automatic_engine_source; do
+  echo "$var=${!var}" >&2
+done
+echo >&2
+
+[[ $mod_id == "$mod" ]] ||
+  die "The mod '$mod' reports being mod '$mod_id' instead."
+# shellcheck disable=SC2005 disable=SC2046
+[[ $mod_license_key == gpl-3.0 ]] ||
+[[ $(echo $(head -2 <(curl "https://raw.githubusercontent.com/$mod_owner/$mod_repo/$mod_rev/COPYING"))) == 'GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007' ]] ||
+  die "The mod '$mod' is licensed under '$mod_license_key' while expecting 'gpl-3.0'."
+[[ $automatic_engine_management == True ]] ||
+  die "The mod '$mod' engine is not managed as a read-only dependency."
+[[ $automatic_engine_source =~ https://github.com/([a-zA-Z0-9_\-]+)/([a-zA-Z0-9_\-]+)/archive/([a-zA-Z0-9_\-\$\{\}]+).zip ]] ||
+  die "The mod '$mod' engine is not hosted on GitHub as an archive."
+
+engine_owner=${BASH_REMATCH[1]}
+engine_repo=${BASH_REMATCH[2]}
+# shellcheck disable=SC2016
+[[ ${BASH_REMATCH[3]} == '${ENGINE_VERSION}' ]] || engine_version=${BASH_REMATCH[3]}
+engine_rev=$(get_sha1 "$engine_owner" "$engine_repo" "$engine_version")
+
+for type in mod engine; do
+  for name in version owner repo rev; do
+    var="${type}_${name}"
+    echo "$var=${!var}" >&2
+  done
+  echo >&2
+done
+
+i=0
+for type in mod engine; do
+  fetcher_args=()
+  for name in owner repo rev; do
+    var="${type}_${name}"
+    fetcher_args+=( "--$name" "${!var}" )
+  done
+  var="${type}_version"
+  version=${!var}
+  nix-upfetch --yes --version "$version" "$(nix-preupfetch --file "$nixpkgs" "openraPackages.mods.$mod" --index $i -- "${fetcher_args[@]}")"
+  (( i++ ))
+done
diff --git a/nixpkgs/pkgs/games/openra_2019/mod.nix b/nixpkgs/pkgs/games/openra_2019/mod.nix
new file mode 100644
index 000000000000..2f945b4b4ddc
--- /dev/null
+++ b/nixpkgs/pkgs/games/openra_2019/mod.nix
@@ -0,0 +1,103 @@
+/*  The package defintion for an OpenRA out-of-tree mod.
+    It shares code with `engine.nix` by what is defined in `common.nix`.
+    To build an out-of-tree mod it needs the source code of the engine available,
+    and they each need to be build with a specific version or fork of the engine,
+    so the engine needs to be supplied as an argument as well.
+    The engine is relatively small and quick to build, so this is not much of a problem.
+    Building a mod will result in a wrapper script that starts the mod inside the specified engine.
+*/
+{ lib, stdenv
+, packageAttrs
+, patchEngine
+, wrapLaunchGame
+, mod
+, engine
+}:
+
+let
+  engineSourceName = engine.src.name or "engine";
+  modSourceName = mod.src.name or "mod";
+
+# Based on: https://build.opensuse.org/package/show/home:fusion809/openra-ura
+in stdenv.mkDerivation (lib.recursiveUpdate packageAttrs rec {
+  name = "${pname}-${version}";
+  pname = "openra_2019-${mod.name}";
+  inherit (mod) version;
+
+  srcs = [
+    mod.src
+    engine.src
+  ];
+
+  sourceRoot = ".";
+
+  postUnpack = ''
+    mv ${engineSourceName} ${modSourceName}
+    cd ${modSourceName}
+  '';
+
+  postPatch = ''
+    cat <<'EOF' > fetch-engine.sh
+    #!/bin/sh
+    exit 0
+    EOF
+
+    sed -i 's/^VERSION.*/VERSION = ${version}/g' Makefile
+
+    dos2unix *.md
+
+    ${patchEngine engineSourceName engine.version}
+  '';
+
+  configurePhase = ''
+    runHook preConfigure
+
+    make version VERSION=${lib.escapeShellArg version}
+    make -C ${engineSourceName} version VERSION=${lib.escapeShellArg engine.version}
+
+    runHook postConfigure
+  '';
+
+  checkTarget = "test";
+
+  installPhase = ''
+    runHook preInstall
+
+    make -C ${engineSourceName} install-engine install-common-mod-files DATA_INSTALL_DIR=$out/lib/${pname}
+
+    cp -r ${engineSourceName}/mods/{${lib.concatStringsSep "," ([ "common" "modcontent" ] ++ engine.mods)}} mods/* \
+      $out/lib/${pname}/mods/
+
+    substitute ${./mod-launch-game.sh} $out/lib/openra_2019-${mod.name}/launch-game.sh \
+      --subst-var out \
+      --subst-var-by name ${lib.escapeShellArg mod.name} \
+      --subst-var-by title ${lib.escapeShellArg mod.title} \
+      --subst-var-by assetsError ${lib.escapeShellArg mod.assetsError}
+    chmod +x $out/lib/openra_2019-${mod.name}/launch-game.sh
+
+    ${wrapLaunchGame "_2019-${mod.name}" "openra-${mod.name}"}
+
+    substitute ${./openra-mod.desktop} $(mkdirp $out/share/applications)/${pname}.desktop \
+      --subst-var-by name ${lib.escapeShellArg mod.name} \
+      --subst-var-by title ${lib.escapeShellArg mod.title} \
+      --subst-var-by description ${lib.escapeShellArg mod.description}
+
+    cp README.md $(mkdirp $out/share/doc/packages/${pname})/README.md
+
+    [[ -e mods/${mod.name}/icon.png ]] && mod_icon=mods/${mod.name}/icon.png || {
+      [[ -e mods/${mod.name}/logo.png ]] && mod_icon=mods/${mod.name}/logo.png || mod_icon=packaging/linux/mod_256x256.png
+    }
+    cp "$mod_icon" $(mkdirp $out/share/pixmaps)/${pname}.png
+
+    for size in 16 32 48 64 128 256; do
+      size=''${size}x''${size}
+      cp packaging/linux/mod_''${size}.png $(mkdirp $out/share/icons/hicolor/''${size}/apps)/${pname}.png
+    done
+
+    runHook postInstall
+  '';
+
+  meta = {
+    inherit (mod) description homepage;
+  };
+})
diff --git a/nixpkgs/pkgs/games/openra_2019/mods.nix b/nixpkgs/pkgs/games/openra_2019/mods.nix
new file mode 100644
index 000000000000..47e86fd09a7d
--- /dev/null
+++ b/nixpkgs/pkgs/games/openra_2019/mods.nix
@@ -0,0 +1,345 @@
+{ buildOpenRAMod, fetchFromGitHub, postFetch }:
+
+let
+  unsafeBuildOpenRAMod = attrs: name: (buildOpenRAMod attrs name).overrideAttrs (_: {
+    doCheck = false;
+  });
+
+in {
+  ca = buildOpenRAMod {
+    version = "96.git.fc3cf0b";
+    title = "Combined Arms";
+    description = "A game that combines units from the official OpenRA Red Alert and Tiberian Dawn mods";
+    homepage = "https://github.com/Inq8/CAmod";
+    src = fetchFromGitHub {
+      owner = "Inq8";
+      repo = "CAmod";
+      rev = "fc3cf0baf2b827650eaae9e1d2335a3eed24bac9";
+      sha256 = "15w91xs253gyrlzsgid6ixxjazx0fbzick6vlkiay0znb58n883m";
+    };
+    engine = {
+      version = "b8a7dd5";
+      src = fetchFromGitHub {
+        owner = "Inq8";
+        repo = "CAengine" ;
+        rev = "b8a7dd52ff893ed8225726d4ed4e14ecad748404";
+        sha256 = "0dyk861qagibx8ldshz7d2nrki9q550f6f0wy8pvayvf1gv1dbxj";
+        name = "engine";
+        inherit postFetch;
+      };
+    };
+  };
+
+  d2 = unsafeBuildOpenRAMod rec {
+    version = "134.git.69a4aa7";
+    title = "Dune II";
+    description = "A modernization of the original ${title} game";
+    homepage = "https://github.com/OpenRA/d2";
+    src = fetchFromGitHub {
+      owner = "OpenRA";
+      repo = "d2";
+      rev = "69a4aa708e2c26376469c0048fac13592aa452ca";
+      sha256 = "1mfch4s6c05slyqvxllklbxpqq8dqcbx3515n3gyylyq43gq481r";
+    };
+    engine = rec {
+      version = "release-20181215";
+      mods = [ "cnc" "d2k" "ra" ];
+      src = fetchFromGitHub {
+        owner = "OpenRA";
+        repo = "OpenRA" ;
+        rev = version;
+        sha256 = "0p0izykjnz7pz02g2khp7msqa00jhjsrzk9y0g29dirmdv75qa4r";
+        name = "engine";
+        inherit postFetch;
+      };
+    };
+    assetsError = ''
+      The mod expects the original ${title} game assets in place:
+      https://github.com/OpenRA/d2/wiki
+    '';
+  };
+
+  dr = buildOpenRAMod rec {
+    version = "324.git.ffcd6ba";
+    title = "Dark Reign";
+    description = "A re-imagination of the original Command & Conquer: ${title} game";
+    homepage = "https://github.com/drogoganor/DarkReign";
+    src = fetchFromGitHub {
+      owner = "drogoganor";
+      repo = "DarkReign";
+      rev = "ffcd6ba72979e5f77508136ed7b0efc13e4b100e";
+      sha256 = "07g4qw909649s3i1yhw75613mpwfka05jana5mpp5smhnf0pkack";
+    };
+    engine = {
+      version = "DarkReign";
+      src = fetchFromGitHub {
+        owner = "drogoganor";
+        repo = "OpenRA" ;
+        rev = "f91d3f2603bbf51afaa89357e4defcdc36138102";
+        sha256 = "05g900ri6q0zrkrk8rmjaz576vjggmi2y6jm0xz3cwli54prn11w";
+        name = "engine";
+        inherit postFetch;
+      };
+    };
+  };
+
+  gen = buildOpenRAMod {
+    version = "1157.git.4f5e11d";
+    title = "Generals Alpha";
+    description = "Re-imagination of the original Command & Conquer: Generals game";
+    homepage = "https://github.com/MustaphaTR/Generals-Alpha";
+    src = fetchFromGitHub {
+      owner = "MustaphaTR";
+      repo = "Generals-Alpha";
+      rev = "4f5e11d916e4a03d8cf1c97eef484ce2d77d7df2";
+      sha256 = "1wnl4qrlhynnlahgdlxwhgsdba5wgdg9yrv9f8hkgi69j60szypd";
+    };
+    engine = rec {
+      version = "gen-20190128_3";
+      src = fetchFromGitHub {
+        owner = "MustaphaTR";
+        repo = "OpenRA" ;
+        rev = version;
+        sha256 = "1x6byz37s8qcpqj902zvkvbv95rv2mv2kj35c12gbpyc92xkqkq0";
+        name = "generals-alpha-engine";
+        inherit postFetch;
+      };
+    };
+  };
+
+  kknd = let version = "145.git.5530bab"; in name: (buildOpenRAMod rec {
+    inherit version;
+    title = "Krush, Kill 'n' Destroy";
+    description = "Re-imagination of the original ${title} game";
+    homepage = "https://kknd-game.com/";
+    src = fetchFromGitHub {
+      owner = "IceReaper";
+      repo = "KKnD";
+      rev = "5530babcb05170e0959e4cf2b079161e9fedde4f";
+      sha256 = "07jczrarmgm6zdk0myzwgq200x19yvpjyxrnhdac08mjgyz75zk1";
+    };
+    engine = {
+      version = "4e8eab4ca00d1910203c8a103dfd2c002714daa8";
+      src = fetchFromGitHub {
+        owner = "IceReaper";
+        repo = "OpenRA" ;
+        # commit does not exist on any branch on the target repository
+        rev = "4e8eab4ca00d1910203c8a103dfd2c002714daa8";
+        sha256 = "1yyqparf93x8yzy1f46gsymgkj5jls25v2yc7ighr3f7mi3igdvq";
+        name = "engine";
+        inherit postFetch;
+      };
+    };
+  } name).overrideAttrs (origAttrs: {
+    postPatch = ''
+      ${origAttrs.postPatch}
+      sed -i 's/{DEV_VERSION}/${version}/' mods/*/mod.yaml
+    '';
+  });
+
+  mw = buildOpenRAMod rec {
+    version = "257.git.c9be8f2";
+    title = "Medieval Warfare";
+    description = "A re-imagination of the original Command & Conquer: ${title} game";
+    homepage = "https://github.com/CombinE88/Medieval-Warfare";
+    src = fetchFromGitHub {
+      owner = "CombinE88";
+      repo = "Medieval-Warfare";
+      rev = "c9be8f2a6f1dd710b1aedd9d5b00b4cf5020e2fe";
+      sha256 = "09fp7k95jd6hjqdasbspbd43z5670wkyzbbgqkll9dfsrv0sky0v";
+    };
+    engine = {
+      version = "MedievalWarfareEngine";
+      src = fetchFromGitHub {
+        owner = "CombinE88";
+        repo = "OpenRA" ;
+        rev = "52109c0910f479753704c46fb19e8afaab353c83";
+        sha256 = "0ga3855j6bc7h81q03cw6laiaiz12915zg8aqah1idvxbzicfy7l";
+        name = "engine";
+        inherit postFetch;
+      };
+    };
+  };
+
+  ra2 = buildOpenRAMod rec {
+    version = "903.git.2f7c700";
+    title = "Red Alert 2";
+    description = "Re-imagination of the original Command & Conquer: ${title} game";
+    homepage = "https://github.com/OpenRA/ra2";
+    src = fetchFromGitHub {
+      owner = "OpenRA";
+      repo = "ra2";
+      rev = "2f7c700d6d63c0625e7158ef3098221fa6741569";
+      sha256 = "11vnzwczn47wjfrq6y7z9q234p27ihdrcl5p87i6h2xnrpwi8b6m";
+    };
+    engine = rec {
+      version = "release-20180923";
+      src = fetchFromGitHub {
+        owner = "OpenRA";
+        repo = "OpenRA" ;
+        rev = version;
+        sha256 = "1pgi3zaq9fwwdq6yh19bwxscslqgabjxkvl9bcn1a5agy4bfbqk5";
+        name = "engine";
+        inherit postFetch;
+      };
+    };
+    assetsError = ''
+      The mod expects the original ${title} game assets in place:
+      https://github.com/OpenRA/ra2/wiki
+    '';
+  };
+
+  raclassic = buildOpenRAMod {
+    version = "183.git.c76c13e";
+    title = "Red Alert Classic";
+    description = "A modernization of the original Command & Conquer: Red Alert game";
+    homepage = "https://github.com/OpenRA/raclassic";
+    src = fetchFromGitHub {
+      owner = "OpenRA";
+      repo = "raclassic";
+      rev = "c76c13e9f0912a66ddebae8d05573632b19736b2";
+      sha256 = "1cnr3ccvrkjlv8kkdcglcfh133yy0fkva9agwgvc7wlj9n5ydl4g";
+    };
+    engine = rec {
+      version = "release-20190314";
+      src = fetchFromGitHub {
+        owner = "OpenRA";
+        repo = "OpenRA" ;
+        rev = version;
+        sha256 = "15pvn5cx3g0nzbrgpsfz8dngad5wkzp5dz25ydzn8bmxafiijvcr";
+        name = "engine";
+        inherit postFetch;
+      };
+    };
+  };
+
+  rv = unsafeBuildOpenRAMod {
+    version = "1330.git.9230e6f";
+    title = "Romanov's Vengeance";
+    description = "Re-imagination of the original Command & Conquer: Red Alert 2 game";
+    homepage = "https://github.com/MustaphaTR/Romanovs-Vengeance";
+    src = fetchFromGitHub {
+      owner = "MustaphaTR";
+      repo = "Romanovs-Vengeance";
+      rev = "9230e6f1dd9758467832aee4eda115e18f0e635f";
+      sha256 = "0bwbmmlhp1kh8rgk2nx1ca9vqssj849amndacf318d61gksc1w9n";
+    };
+    engine = {
+      version = "f3873ae";
+      mods = [ "as" ];
+      src = fetchFromGitHub {
+        owner = "AttacqueSuperior";
+        repo = "Engine";
+        rev = "f3873ae242803051285994d77eb26f4b951594b5";
+        sha256 = "02rv29wja0p5d083pd087daz7x7pp5b9ym7sci2fhg3mrnaqgwkp";
+        name = "engine";
+        inherit postFetch;
+      };
+    };
+    assetsError = ''
+      The mod expects the Command & Conquer: The Ultimate Collection assets in place:
+      https://github.com/OpenRA/ra2/wiki
+    '';
+  };
+
+  sp = unsafeBuildOpenRAMod {
+    version = "221.git.ac000cc";
+    title = "Shattered Paradise";
+    description = "Re-imagination of the original Command & Conquer: Tiberian Sun game";
+    homepage = "https://github.com/ABrandau/OpenRAModSDK";
+    src = fetchFromGitHub {
+      owner = "ABrandau";
+      repo = "OpenRAModSDK";
+      rev = "ac000cc15377cdf6d3c2b72c737d692aa0ed8bcd";
+      sha256 = "16mzs5wcxj9nlpcyx2c87idsqpbm40lx0rznsccclnlb3hiwqas9";
+    };
+    engine = {
+      version = "SP-22-04-19";
+      mods = [ "as" "ts" ];
+      src = fetchFromGitHub {
+        owner = "ABrandau";
+        repo = "OpenRA" ;
+        rev = "bb0930008a57c07f3002421023f6b446e3e3af69";
+        sha256 = "1jvgpbf56hd02ikhklv49br4d1jiv5hphc5kl79qnjlaacnj222x";
+        name = "engine";
+        inherit postFetch;
+      };
+    };
+  };
+
+  ss = buildOpenRAMod rec {
+    version = "77.git.23e1f3e";
+    title = "Sole Survivor";
+    description = "A re-imagination of the original Command & Conquer: ${title} game";
+    homepage = "https://github.com/MustaphaTR/sole-survivor";
+    src = fetchFromGitHub {
+      owner = "MustaphaTR";
+      repo = "sole-survivor";
+      rev = "23e1f3e5d8b98c936797b6680d95d56a69a9e2ab";
+      sha256 = "104clmxphchs7r8y7hpmw103bychayz80bqj98bp89i64nv9d89x";
+    };
+    engine = {
+      version = "6de92de";
+      src = fetchFromGitHub {
+        owner = "OpenRA";
+        repo = "OpenRA" ;
+        rev = "6de92de8d982094a766eab97a92225c240d85493";
+        sha256 = "0ps9x379plrrj1hnj4fpr26lc46mzgxknv5imxi0bmrh5y4781ql";
+        name = "engine";
+        inherit postFetch;
+      };
+    };
+  };
+
+  ura = buildOpenRAMod {
+    version = "431.git.128dc53";
+    title = "Red Alert Unplugged";
+    description = "Re-imagination of the original Command & Conquer: Red Alert game";
+    homepage = "http://redalertunplugged.com/";
+    src = fetchFromGitHub {
+      owner = "RAunplugged";
+      repo = "uRA";
+      rev = "128dc53741fae923f4af556f2293ceaa0cf571f0";
+      sha256 = "1mhr8kyh313z52gdrqv31d6z7jvdldiajalca5mcr8gzg6mph66p";
+    };
+    engine = rec {
+      version = "unplugged-cd82382";
+      src = fetchFromGitHub {
+        owner = "RAunplugged";
+        repo = "OpenRA" ;
+        rev = version;
+        sha256 = "1p5hgxxvxlz8480vj0qkmnxjh7zj3hahk312m0zljxfdb40652w1";
+        name = "engine";
+        inherit postFetch;
+      };
+    };
+  };
+
+  yr = unsafeBuildOpenRAMod rec {
+    version = "199.git.5b8b952";
+    homepage = "https://github.com/cookgreen/yr";
+    title = "Yuri's Revenge";
+    description = "Re-imagination of the original Command & Conquer: ${title} game";
+    src = fetchFromGitHub {
+      owner = "cookgreen";
+      repo = "yr";
+      rev = "5b8b952dbe21f194a6d00485f20e215ce8362712";
+      sha256 = "0hxzrqnz5d7qj1jjr20imiyih62x1cnmndf75nnil4c4sj82f9a6";
+    };
+    engine = rec {
+      version = "release-20190314";
+      src = fetchFromGitHub {
+        owner = "OpenRA";
+        repo = "OpenRA" ;
+        rev = version;
+        sha256 = "15pvn5cx3g0nzbrgpsfz8dngad5wkzp5dz25ydzn8bmxafiijvcr";
+        name = "engine";
+        inherit postFetch;
+      };
+    };
+    assetsError = ''
+      The mod expects the Command & Conquer: The Ultimate Collection assets in place:
+      https://github.com/OpenRA/ra2/wiki
+    '';
+  };
+}
diff --git a/nixpkgs/pkgs/games/openra_2019/openra-mod.desktop b/nixpkgs/pkgs/games/openra_2019/openra-mod.desktop
new file mode 100644
index 000000000000..090b6c1325d1
--- /dev/null
+++ b/nixpkgs/pkgs/games/openra_2019/openra-mod.desktop
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Type=Application
+Version=1.0
+Name=OpenRA - @title@
+GenericName=Real Time Strategy Game
+GenericName[de]=Echtzeit-Strategiespiel
+Comment=@description@
+Icon=openra-@name@
+Exec=openra-@name@
+Terminal=false
+Categories=Game;StrategyGame;X-RTS;X-RealTimeStrategy;X-RealTimeStrategyGame;
diff --git a/nixpkgs/pkgs/games/openra_2019/packages.nix b/nixpkgs/pkgs/games/openra_2019/packages.nix
new file mode 100644
index 000000000000..5ee78fe2b8ff
--- /dev/null
+++ b/nixpkgs/pkgs/games/openra_2019/packages.nix
@@ -0,0 +1,60 @@
+pkgs:
+
+let
+  /*  Building an engine or out-of-tree mod is very similar,
+      but different enough not to be able to build them with the same package definition,
+      so instaed we define what is common between them in a separate file.
+
+      Although `callPackage` could be used, it would require undoing `makeOverridable`,
+      because `common.nix` does not define a package, but just an attribute set,
+      which is directly passed as part of the argument to the engines and mods `callPackage`,
+      so either the attributes added by `makeOverridable` have to be removed
+      or the engine and mod package definitions will need to add `...` to the argument list.
+  */
+  common = let f = import ./common.nix; in f (builtins.intersectAttrs (builtins.functionArgs f) pkgs // {
+    lua = pkgs.lua5_1;
+    # It is not necessary to run the game, but it is nicer to be given an error dialog in the case of failure,
+    # rather than having to look to the logs why it is not starting.
+    inherit (pkgs.gnome) zenity;
+  });
+
+  /*  Building a set of engines or mods requires some dependencies as well,
+      so the sets will actually be defined as a function instead,
+      requiring the dependencies and returning the actual set.
+
+      Not all dependencies for defining a engine or mod set are shared,
+      so additional arguments can be passed as well.
+
+      The builders for engines and mods allow to delay specifying the name,
+      by returning a function that expects a name, which we use, in this case,
+      to base the name on the attribute name instead, preventing the need to specify the name twice
+      if the attribute name and engine/mod name are equal.
+  */
+  buildOpenRASet = f: args: builtins.mapAttrs (name: value: if builtins.isFunction value then value name else value) (f ({
+    inherit (pkgs) fetchFromGitHub;
+    postFetch = ''
+      sed -i 's/curl/curl --insecure/g' $out/thirdparty/{fetch-thirdparty-deps,noget}.sh
+      $out/thirdparty/fetch-thirdparty-deps.sh
+    '';
+  } // args));
+
+in rec {
+  # The whole attribute set is destructered to ensure those (and only those) attributes are given
+  # and to provide defaults for those that are optional.
+  buildOpenRAEngine = { name ? null, version, description, homepage, mods, src, installExperimental ? "" }@engine:
+    # Allow specifying the name at a later point if no name has been given.
+    let builder = name: pkgs.callPackage ./engine.nix (common // {
+      engine = engine // { inherit name installExperimental; };
+    }); in if name == null then builder else builder name;
+
+  # See `buildOpenRAEngine`.
+  buildOpenRAMod = { name ? null, version, title, description, homepage, src, engine }@mod: ({ version, mods ? [], src }@engine:
+    let builder = name: pkgs.callPackage ./mod.nix (common // {
+      mod = mod // { inherit name; };
+      engine = engine // { inherit mods; };
+    }); in if name == null then builder else builder name) engine;
+
+  # See `buildOpenRASet`.
+  engines = buildOpenRASet (import ./engines.nix) { inherit buildOpenRAEngine; };
+  mods = buildOpenRASet (import ./mods.nix) { inherit buildOpenRAMod; };
+}
diff --git a/nixpkgs/pkgs/games/openrct2/default.nix b/nixpkgs/pkgs/games/openrct2/default.nix
new file mode 100644
index 000000000000..e056164e279a
--- /dev/null
+++ b/nixpkgs/pkgs/games/openrct2/default.nix
@@ -0,0 +1,154 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+
+, SDL2
+, cmake
+, curl
+, discord-rpc
+, duktape
+, flac
+, fontconfig
+, freetype
+, gbenchmark
+, icu
+, jansson
+, libGLU
+, libiconv
+, libogg
+, libpng
+, libpthreadstubs
+, libvorbis
+, libzip
+, nlohmann_json
+, openssl
+, pkg-config
+, speexdsp
+, zlib
+}:
+
+let
+  openrct2-version = "0.4.5";
+
+  # Those versions MUST match the pinned versions within the CMakeLists.txt
+  # file. The REPLAYS repository from the CMakeLists.txt is not necessary.
+  objects-version = "1.3.11";
+  openmsx-version = "1.3.0";
+  opensfx-version = "1.0.3";
+  title-sequences-version = "0.4.0";
+
+  openrct2-src = fetchFromGitHub {
+    owner = "OpenRCT2";
+    repo = "OpenRCT2";
+    rev = "v${openrct2-version}";
+    sha256 = "sha256-TMtaEqui3gUd+j3LwF7VsHiBtbYZMu6Rvo1aMkkU9LY=";
+  };
+
+  objects-src = fetchFromGitHub {
+    owner = "OpenRCT2";
+    repo = "objects";
+    rev = "v${objects-version}";
+    sha256 = "sha256-fA2Kz4GALu6IP7ulbwpAFt3dz6NCPgyB0CWy5uOLBQY=";
+  };
+
+  openmsx-src = fetchFromGitHub {
+    owner = "OpenRCT2";
+    repo = "OpenMusic";
+    rev = "v${openmsx-version}";
+    sha256 = "sha256-bp+uwTy2ZFMCK8Dq4YVACpQSwo8v1te+NQGwdqViIjU=";
+  };
+
+  opensfx-src = fetchFromGitHub {
+    owner = "OpenRCT2";
+    repo = "OpenSoundEffects";
+    rev = "v${opensfx-version}";
+    sha256 = "sha256-AMuCpq1Hszi2Vikto/cX9g81LwBDskaRMTLxNzU0/Gk=";
+  };
+
+  title-sequences-src = fetchFromGitHub {
+    owner = "OpenRCT2";
+    repo = "title-sequences";
+    rev = "v${title-sequences-version}";
+    sha256 = "sha256-anqCZkhYoaxPu3MYCYSsFFngOmPp2wnx2MGb0hj6W5U=";
+  };
+in
+stdenv.mkDerivation {
+  pname = "openrct2";
+  version = openrct2-version;
+
+  src = openrct2-src;
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+  ];
+
+  buildInputs = [
+    SDL2
+    curl
+    discord-rpc
+    duktape
+    flac
+    fontconfig
+    freetype
+    gbenchmark
+    icu
+    jansson
+    libGLU
+    libiconv
+    libogg
+    libpng
+    libpthreadstubs
+    libvorbis
+    libzip
+    nlohmann_json
+    openssl
+    speexdsp
+    zlib
+  ];
+
+  cmakeFlags = [
+    "-DDOWNLOAD_OBJECTS=OFF"
+    "-DDOWNLOAD_OPENMSX=OFF"
+    "-DDOWNLOAD_OPENSFX=OFF"
+    "-DDOWNLOAD_TITLE_SEQUENCES=OFF"
+  ];
+
+  env.NIX_CFLAGS_COMPILE = toString [
+    # Needed with GCC 12
+    "-Wno-error=maybe-uninitialized"
+  ];
+
+  postUnpack = ''
+    mkdir -p $sourceRoot/data/assetpack
+
+    cp -r ${objects-src}         $sourceRoot/data/object
+    cp -r ${openmsx-src}         $sourceRoot/data/assetpack/openrct2.music.alternative.parkap
+    cp -r ${opensfx-src}         $sourceRoot/data/assetpack/openrct2.sound.parkap
+    cp -r ${title-sequences-src} $sourceRoot/data/sequence
+  '';
+
+  preConfigure =
+    # Verify that the correct version of each third party repository is used.
+    (let
+      versionCheck = cmakeKey: version: ''
+        grep -q '^set(${cmakeKey}_VERSION "${version}")$' CMakeLists.txt \
+          || (echo "${cmakeKey} differs from expected version!"; exit 1)
+      '';
+    in
+    (versionCheck "OBJECTS" objects-version) +
+    (versionCheck "OPENMSX" openmsx-version) +
+    (versionCheck "OPENSFX" opensfx-version) +
+    (versionCheck "TITLE_SEQUENCE" title-sequences-version));
+
+  preFixup = "ln -s $out/share/openrct2 $out/bin/data";
+
+  meta = with lib; {
+    description = "Open source re-implementation of RollerCoaster Tycoon 2 (original game required)";
+    homepage = "https://openrct2.io/";
+    downloadPage = "https://github.com/OpenRCT2/OpenRCT2/releases";
+    license = licenses.gpl3Only;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ oxzi ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/openrw/default.nix b/nixpkgs/pkgs/games/openrw/default.nix
new file mode 100644
index 000000000000..6af74f264a12
--- /dev/null
+++ b/nixpkgs/pkgs/games/openrw/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, sfml
+, libGLU
+, libGL
+, bullet
+, glm
+, libmad
+, openal
+, SDL2
+, boost
+, ffmpeg_4
+, Cocoa
+, OpenAL }:
+
+stdenv.mkDerivation {
+  version = "unstable-2021-10-14";
+  pname = "openrw";
+
+  src = fetchFromGitHub {
+    owner = "rwengine";
+    repo = "openrw";
+    rev = "0f83c16f6518c427a4f156497c3edc843610c402";
+    sha256 = "0i6nx9g0xb8sziak5swi8636fszcjjx8n2jwgz570izw2fl698ff";
+    fetchSubmodules = true;
+  };
+
+  postPatch = lib.optional (stdenv.cc.isClang && (lib.versionAtLeast stdenv.cc.version "9"))''
+    substituteInPlace cmake_configure.cmake \
+      --replace 'target_link_libraries(rw_interface INTERFACE "stdc++fs")' ""
+  '';
+
+  nativeBuildInputs = [ cmake ];
+
+  buildInputs = [
+    sfml libGLU libGL bullet glm libmad openal SDL2 boost ffmpeg_4
+  ] ++ lib.optionals stdenv.isDarwin [ OpenAL Cocoa ];
+
+  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;
+    longDescription = ''
+      OpenRW is an open source re-implementation of Rockstar Games' Grand Theft
+      Auto III, a classic 3D action game first published in 2001.
+    '';
+    maintainers = with maintainers; [ kragniz ];
+    platforms = platforms.all;
+    mainProgram = "rwgame";
+  };
+}
diff --git a/nixpkgs/pkgs/games/opensoldat/default.nix b/nixpkgs/pkgs/games/opensoldat/default.nix
new file mode 100644
index 000000000000..625fc0dce5ae
--- /dev/null
+++ b/nixpkgs/pkgs/games/opensoldat/default.nix
@@ -0,0 +1,91 @@
+{ lib, stdenv, fetchFromGitHub, fpc, zip, makeWrapper
+, SDL2, freetype, physfs, openal, gamenetworkingsockets
+, xorg, autoPatchelfHook, cmake
+}:
+
+let
+  base = stdenv.mkDerivation rec {
+    pname = "opensoldat-base";
+    version = "unstable-2021-09-05";
+
+    src = fetchFromGitHub {
+      name = "base";
+      owner = "opensoldat";
+      repo = "base";
+      rev = "6c74d768d511663e026e015dde788006c74406b5";
+      sha256 = "175gmkdccy8rnkd95h2zqldqfydyji1hfby8b1qbnl8wz4dh08mz";
+    };
+
+    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 = "Opensoldat's base game content";
+      license = licenses.cc-by-40;
+      platforms = platforms.all;
+      inherit (src.meta) homepage;
+    };
+  };
+
+in
+
+stdenv.mkDerivation rec {
+  pname = "opensoldat";
+  version = "unstable-2022-07-02";
+
+  src = fetchFromGitHub {
+    name = "opensoldat";
+    owner = "opensoldat";
+    repo = "opensoldat";
+    rev = "9574f5791b7993067f03d2df03d625908bc3762f";
+    sha256 = "0kyxzikd4ngx3nshjw0411x61zqq1b7l01lxw41rlcy4nad3r0vi";
+  };
+
+  nativeBuildInputs = [ fpc makeWrapper autoPatchelfHook cmake ];
+
+  cmakeFlags = [
+    "-DADD_ASSETS=OFF" # We provide base's smods via nix
+    "-DBUILD_GNS=OFF" # Don't build GameNetworkingSockets as an ExternalProject
+  ];
+
+  buildInputs = [ SDL2 freetype physfs openal gamenetworkingsockets ];
+  # TODO(@sternenseemann): set proper rpath via cmake, so we don't need autoPatchelfHook
+  runtimeDependencies = [ xorg.libX11 ];
+
+  # 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.
+  # TODO(@sternenseemann): rename config dir to opensoldat
+  postInstall = ''
+    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
+  '';
+
+  meta = with lib; {
+    description = "Opensoldat is a unique 2D (side-view) multiplayer action game";
+    license = [ licenses.mit base.meta.license ];
+    inherit (src.meta) homepage;
+    maintainers = [ maintainers.sternenseemann ];
+    platforms = [ "x86_64-linux" "i686-linux" ];
+    # portability currently mainly limited by fpc
+    # in nixpkgs which doesn't work on darwin,
+    # aarch64 and arm support should be possible:
+    # https://github.com/opensoldat/opensoldat/issues/45
+  };
+}
diff --git a/nixpkgs/pkgs/games/openspades/default.nix b/nixpkgs/pkgs/games/openspades/default.nix
new file mode 100644
index 000000000000..b72f3877a461
--- /dev/null
+++ b/nixpkgs/pkgs/games/openspades/default.nix
@@ -0,0 +1,69 @@
+{ lib, stdenv, fetchurl, fetchFromGitHub, fetchpatch, cmake, unzip, zip, file
+, curl, glew , libGL, SDL2, SDL2_image, zlib, freetype, imagemagick
+, openal , opusfile, libogg
+, Cocoa, libXext
+}:
+
+stdenv.mkDerivation rec {
+  pname = "openspades";
+  version = "0.1.3";
+  devPakVersion = "33";
+
+  src = fetchFromGitHub {
+    owner = "yvt";
+    repo = "openspades";
+    rev = "v${version}";
+    sha256 = "1fvmqbif9fbipd0vphp57pk6blb4yp8xvqlc2ppipk5pjv6a3d2h";
+  };
+
+  nativeBuildInputs = [ cmake imagemagick unzip zip file ];
+
+  buildInputs = [
+    freetype SDL2 SDL2_image libGL zlib curl glew opusfile openal libogg libXext
+  ] ++ lib.optionals stdenv.hostPlatform.isDarwin [
+    Cocoa
+  ];
+
+  patches = [
+    # https://github.com/yvt/openspades/pull/793 fix Darwin build
+    (fetchpatch {
+      url = "https://github.com/yvt/openspades/commit/2d13704fefc475b279337e89057b117f711a35d4.diff";
+      sha256 = "1i7rcpjzkjhbv5pp6byzrxv7sb1iamqq5k1vyqlvkbr38k2dz0rv";
+    })
+  ];
+
+  cmakeFlags = [
+    "-DOPENSPADES_INSTALL_BINARY=bin"
+  ];
+
+  devPak = fetchurl {
+    url = "https://github.com/yvt/openspades-paks/releases/download/r${devPakVersion}/OpenSpadesDevPackage-r${devPakVersion}.zip";
+    sha256 = "1bd2fyn7mlxa3xnsvzj08xjzw02baimqvmnix07blfhb78rdq9q9";
+  };
+
+  notoFont = fetchurl {
+    url = "https://github.com/yvt/openspades/releases/download/v0.1.1b/NotoFonts.pak";
+    sha256 = "0kaz8j85wjjnf18z0lz69xr1z8makg30jn2dzdyicd1asrj0q1jm";
+  };
+
+  postPatch = ''
+    sed -i 's,^wget .*,cp $devPak "$PAK_NAME",' Resources/downloadpak.sh
+    patchShebangs Resources
+  '';
+
+  postInstall = ''
+    cp $notoFont $out/share/games/openspades/Resources/
+  '';
+
+  NIX_CFLAGS_LINK = "-lopenal";
+
+  meta = with lib; {
+    description = "A compatible client of Ace of Spades 0.75";
+    homepage    = "https://github.com/yvt/openspades/";
+    license     = licenses.gpl3;
+    platforms   = platforms.all;
+    maintainers = with maintainers; [ abbradar azahi ];
+    # never built on aarch64-linux since first introduction in nixpkgs
+    broken = stdenv.isDarwin || (stdenv.isLinux && stdenv.isAarch64);
+  };
+}
diff --git a/nixpkgs/pkgs/games/opensupaplex/default.nix b/nixpkgs/pkgs/games/opensupaplex/default.nix
new file mode 100644
index 000000000000..83c7f8b5c9b0
--- /dev/null
+++ b/nixpkgs/pkgs/games/opensupaplex/default.nix
@@ -0,0 +1,89 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, fetchurl
+, makeDesktopItem
+, copyDesktopItems
+, testers
+, opensupaplex
+, SDL2
+, SDL2_mixer
+}:
+
+let
+  # Doesn't seem to be included in tagged releases, but does exist on master.
+  icon = fetchurl {
+    url = "https://raw.githubusercontent.com/sergiou87/open-supaplex/b102548699cf16910b59559f689ecfad88d2a7d2/open-supaplex.svg";
+    sha256 = "sha256-nKeSBUGjSulbEP7xxc6smsfCRjyc/xsLykH0o3Rq5wo=";
+  };
+in
+stdenv.mkDerivation rec {
+  pname = "opensupaplex";
+  version = "7.1.2";
+
+  src = fetchFromGitHub {
+    owner = "sergiou87";
+    repo = "open-supaplex";
+    rev = "v${version}";
+    sha256 = "sha256-hP8dJlLXE5J/oxPhRkrrBl1Y5e9MYbJKi8OApFM3+GU=";
+  };
+
+  nativeBuildInputs = [
+    SDL2 # For "sdl2-config"
+    copyDesktopItems
+  ];
+  buildInputs = [ SDL2_mixer ];
+
+  enableParallelBuilding = true;
+
+  env.NIX_CFLAGS_COMPILE = toString [
+    "-DFILE_DATA_PATH=${placeholder "out"}/lib/opensupaplex"
+    "-DFILE_FHS_XDG_DIRS"
+  ];
+
+  preBuild = ''
+    # Makefile is located in this directory
+    pushd linux
+  '';
+
+  postBuild = ''
+    popd
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/{bin,lib,share/icons/hicolor/scalable/apps}
+
+    install -D ./linux/opensupaplex $out/bin/opensupaplex
+    cp -R ./resources $out/lib/opensupaplex
+    cp ${icon} $out/share/icons/hicolor/scalable/apps/open-supaplex.svg
+
+    runHook postInstall
+  '';
+
+  passthru.tests.version = testers.testVersion {
+    package = opensupaplex;
+    command = "opensupaplex --help";
+    version = "v${version}";
+  };
+
+  desktopItems = [(makeDesktopItem {
+    name = "opensupaplex";
+    exec = meta.mainProgram;
+    icon = "open-supaplex";
+    desktopName = "OpenSupaplex";
+    comment = meta.description;
+    categories = [ "Application" "Game" ];
+  })];
+
+  meta = with lib; {
+    description = "A decompilation of Supaplex in C and SDL";
+    homepage = "https://github.com/sergiou87/open-supaplex";
+    changelog = "https://github.com/sergiou87/open-supaplex/blob/master/changelog/v${version}.txt";
+    license = licenses.gpl3Only;
+    maintainers = [ maintainers.ivar ];
+    platforms = platforms.linux; # Many more are supported upstream, but only linux is tested.
+    mainProgram = "opensupaplex";
+  };
+}
diff --git a/nixpkgs/pkgs/games/openttd/default.nix b/nixpkgs/pkgs/games/openttd/default.nix
new file mode 100644
index 000000000000..6122b586770e
--- /dev/null
+++ b/nixpkgs/pkgs/games/openttd/default.nix
@@ -0,0 +1,99 @@
+{ lib, stdenv, fetchurl, fetchzip, cmake, pkg-config
+, SDL2, libpng, zlib, xz, freetype, fontconfig
+, nlohmann_json, curl, icu, harfbuzz, expat, glib, pcre2
+, withOpenGFX ? true, withOpenSFX ? true, withOpenMSX ? true
+, withFluidSynth ? true, audioDriver ? "alsa"
+, fluidsynth, soundfont-fluid, libsndfile
+, flac, libogg, libvorbis, libopus, libmpg123, pulseaudio, alsa-lib, libjack2
+, procps, writeScriptBin, makeWrapper, runtimeShell }:
+
+let
+  opengfx = fetchzip {
+    url = "https://cdn.openttd.org/opengfx-releases/7.1/opengfx-7.1-all.zip";
+    sha256 = "sha256-daJ/Qwg/okpmLQkXcCjruIiP8GEwyyp02YWcGQepxzs=";
+  };
+
+  opensfx = fetchzip {
+    url = "https://cdn.openttd.org/opensfx-releases/1.0.3/opensfx-1.0.3-all.zip";
+    sha256 = "sha256-QmfXizrRTu/fUcVOY7tCndv4t4BVW+fb0yUi8LgSYzM=";
+  };
+
+  openmsx = fetchzip {
+    url = "https://cdn.openttd.org/openmsx-releases/0.4.2/openmsx-0.4.2-all.zip";
+    sha256 = "sha256-Cgrg2m+uTODFg39mKgX+hE8atV7v5bVyZd716vSZB8M=";
+  };
+
+  playmidi = writeScriptBin "playmidi" ''
+    #!${runtimeShell}
+    trap "${procps}/bin/pkill fluidsynth" EXIT
+    ${fluidsynth}/bin/fluidsynth -a ${audioDriver} -i ${soundfont-fluid}/share/soundfonts/FluidR3_GM2-2.sf2 $*
+  '';
+
+in
+stdenv.mkDerivation rec {
+  pname = "openttd";
+  version = "13.4";
+
+  src = fetchurl {
+    url = "https://cdn.openttd.org/openttd-releases/${version}/${pname}-${version}-source.tar.xz";
+    hash = "sha256-Kh3roBv+WOIYiHn0UMP6TzgZJxq0m/NI3WZUXwQNFG8=";
+  };
+
+  nativeBuildInputs = [ cmake pkg-config makeWrapper ];
+  buildInputs = [
+    SDL2 libpng xz zlib freetype fontconfig
+    nlohmann_json curl icu harfbuzz expat glib pcre2
+  ] ++ lib.optionals withFluidSynth [
+    fluidsynth soundfont-fluid libsndfile
+    flac libogg libvorbis libopus libmpg123 pulseaudio alsa-lib libjack2
+  ];
+
+  prefixKey = "--prefix-dir=";
+
+  configureFlags = [
+    "--without-liblzo2"
+  ];
+
+  postInstall = ''
+    ${lib.optionalString withOpenGFX ''
+      cp ${opengfx}/*.tar $out/share/games/openttd/baseset
+    ''}
+
+    mkdir -p $out/share/games/openttd/data
+
+    ${lib.optionalString withOpenSFX ''
+      cp ${opensfx}/*.tar $out/share/games/openttd/data
+    ''}
+
+    mkdir $out/share/games/openttd/baseset/openmsx
+
+    ${lib.optionalString withOpenMSX ''
+      cp ${openmsx}/*.tar $out/share/games/openttd/baseset/openmsx
+    ''}
+
+    ${lib.optionalString withFluidSynth ''
+      wrapProgram $out/bin/openttd \
+        --add-flags -m \
+        --add-flags extmidi:cmd=${playmidi}/bin/playmidi
+    ''}
+  '';
+
+  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,
+      players control a transportation business, and use rail, road, sea, and air
+      transport to move goods and people around the simulated world.
+
+      In multiplayer networked mode, players may:
+        - play competitively as different businesses
+        - play cooperatively controlling the same business
+        - observe as spectators
+    '';
+    homepage = "https://www.openttd.org/";
+    changelog = "https://cdn.openttd.org/openttd-releases/${version}/changelog.txt";
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ jcumming fpletz ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/openttd/grfcodec.nix b/nixpkgs/pkgs/games/openttd/grfcodec.nix
new file mode 100644
index 000000000000..544cf4f06c43
--- /dev/null
+++ b/nixpkgs/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/nixpkgs/pkgs/games/openttd/jgrpp.nix b/nixpkgs/pkgs/games/openttd/jgrpp.nix
new file mode 100644
index 000000000000..6a2e9a358d7e
--- /dev/null
+++ b/nixpkgs/pkgs/games/openttd/jgrpp.nix
@@ -0,0 +1,21 @@
+{ fetchFromGitHub, openttd, zstd, ... }:
+
+openttd.overrideAttrs (oldAttrs: rec {
+  pname = "openttd-jgrpp";
+  version = "0.56.2";
+
+  src = fetchFromGitHub rec {
+    owner = "JGRennison";
+    repo = "OpenTTD-patches";
+    rev = "jgrpp-${version}";
+    hash = "sha256-87MquPFoFz6LFlwBTDrFNO11UYCtZUzdZYR1YttkDF8=";
+  };
+
+  buildInputs = oldAttrs.buildInputs ++ [ zstd ];
+
+  meta = {
+    homepage = "https://github.com/JGRennison/OpenTTD-patches";
+    changelog = "https://github.com/JGRennison/OpenTTD-patches/blob/jgrpp-${version}/jgrpp-changelog.md";
+  };
+
+})
diff --git a/nixpkgs/pkgs/games/openttd/nml.nix b/nixpkgs/pkgs/games/openttd/nml.nix
new file mode 100644
index 000000000000..5859f5132849
--- /dev/null
+++ b/nixpkgs/pkgs/games/openttd/nml.nix
@@ -0,0 +1,29 @@
+{ stdenv
+, lib
+, fetchFromGitHub
+, python3
+}:
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "openttd-nml";
+  version = "0.7.1";
+
+  src = fetchFromGitHub {
+    owner = "OpenTTD";
+    repo = "nml";
+    rev = "refs/tags/${version}";
+    hash = "sha256-+TJZ6/JazxzXyKawFE4GVh0De1LTUI95vXQwryJ2NDk=";
+  };
+
+  propagatedBuildInputs = with python3.pkgs; [
+    pillow
+    ply
+  ];
+
+  meta = with lib; {
+    homepage = "http://openttdcoop.org/";
+    description = "Compiler for OpenTTD NML files";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ ToxicFrog ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/opentyrian/default.nix b/nixpkgs/pkgs/games/opentyrian/default.nix
new file mode 100644
index 000000000000..f01874ce9435
--- /dev/null
+++ b/nixpkgs/pkgs/games/opentyrian/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, fetchzip
+, SDL2
+, SDL2_net
+, pkg-config
+}:
+
+stdenv.mkDerivation rec {
+  pname = "opentyrian";
+  version = "2.1.20221123";
+
+  src = fetchFromGitHub {
+    owner = "opentyrian";
+    repo = "opentyrian";
+    rev = "v${version}";
+    sha256 = "sha256-fVcc8v1c9uU72X6afEo4VoMo6YuDECQSwDQ/TQjgwUY=";
+  };
+
+  data = fetchzip {
+    url = "https://camanis.net/tyrian/tyrian21.zip";
+    sha256 = "1biz6hf6s7qrwn8ky0g6p8w7yg715w7yklpn6258bkks1s15hpdb";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ SDL2 SDL2_net ];
+
+  enableParallelBuilding = true;
+
+  makeFlags = [ "prefix=${placeholder "out"}" ];
+
+  postInstall = ''
+    mkdir -p $out/share/games/tyrian
+    cp -r $data/* $out/share/games/tyrian/
+  '';
+
+  meta = {
+    description = ''Open source port of the game "Tyrian"'';
+    homepage = "https://github.com/opentyrian/opentyrian";
+    # This does not account of Tyrian data.
+    # license = lib.licenses.gpl2;
+  };
+}
diff --git a/nixpkgs/pkgs/games/openxcom/default.nix b/nixpkgs/pkgs/games/openxcom/default.nix
new file mode 100644
index 000000000000..c09bd5c28f2f
--- /dev/null
+++ b/nixpkgs/pkgs/games/openxcom/default.nix
@@ -0,0 +1,54 @@
+{ boost
+, cmake
+, fetchFromGitHub
+, lib
+, libGLU
+, libGL
+, openssl
+, pkg-config
+, SDL
+, SDL_image
+, SDL_mixer
+, SDL_gfx
+, stdenv
+, yaml-cpp
+, zlib
+}:
+
+stdenv.mkDerivation {
+  pname = "openxcom";
+  version = "1.0.0.2023.08.12";
+
+  src = fetchFromGitHub {
+    owner = "OpenXcom";
+    repo = "OpenXcom";
+    rev = "bd632cc8569a57fdc3b68ce53f6ea850422ec5ac";
+    hash = "sha256-ouYZ4rAEluqeP+ZUrbEZwCpXCw0cZLWsf1GbIE3jaTc=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+  ];
+
+  buildInputs = [
+    boost
+    libGL
+    libGLU
+    SDL
+    SDL_gfx
+    SDL_image
+    SDL_mixer
+    yaml-cpp
+    openssl
+    zlib
+  ];
+
+  meta = {
+    description = "Open source clone of UFO: Enemy Unknown";
+    homepage = "https://openxcom.org";
+    license = lib.licenses.gpl3;
+    maintainers = with lib.maintainers; [ cpages ];
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/openxray/default.nix b/nixpkgs/pkgs/games/openxray/default.nix
new file mode 100644
index 000000000000..aef6c0c2e92a
--- /dev/null
+++ b/nixpkgs/pkgs/games/openxray/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, glew
+, freeimage
+, liblockfile
+, openal
+, libtheora
+, SDL2
+, lzo
+, libjpeg
+, libogg
+, pcre
+, makeWrapper
+}:
+
+stdenv.mkDerivation rec {
+  pname = "openxray";
+  version = "1144-december-2021-rc1";
+
+  src = fetchFromGitHub {
+    owner = "OpenXRay";
+    repo = "xray-16";
+    rev = version;
+    fetchSubmodules = true;
+    sha256 = "07qj1lpp21g4p583gvz5h66y2q71ymbsz4g5nr6dcys0vm7ph88v";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    makeWrapper
+  ];
+
+  buildInputs = [
+    glew
+    freeimage
+    liblockfile
+    openal
+    libtheora
+    SDL2
+    lzo
+    libjpeg
+    libogg
+    pcre
+  ];
+
+  # Crashes can happen, we'd like them to be reasonably debuggable
+  cmakeBuildType = "RelWithDebInfo";
+  dontStrip = true;
+
+  postInstall = ''
+    # needed because of SDL_LoadObject library loading code
+    wrapProgram $out/bin/xr_3da \
+      --prefix LD_LIBRARY_PATH : $out/lib
+  '';
+
+  meta = with lib; {
+    mainProgram = "xray-16";
+    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 = "https://github.com/OpenXRay/xray-16/";
+    license = licenses.unfree // {
+      url = "https://github.com/OpenXRay/xray-16/blob/${version}/License.txt";
+    };
+    maintainers = with maintainers; [ OPNA2608 ];
+    platforms = [ "x86_64-linux" "i686-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/orthorobot/default.nix b/nixpkgs/pkgs/games/orthorobot/default.nix
new file mode 100644
index 000000000000..10bf3f9268e6
--- /dev/null
+++ b/nixpkgs/pkgs/games/orthorobot/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, copyDesktopItems
+, fetchFromGitHub
+, fetchpatch
+, fetchurl
+, love
+, makeDesktopItem
+, makeWrapper
+, stdenv
+, strip-nondeterminism
+, zip
+}:
+
+stdenv.mkDerivation rec {
+  pname = "orthorobot";
+  version = "1.1.1";
+
+  src = fetchFromGitHub {
+    owner = "Stabyourself";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1ca6hvd890kxmamsmsfiqzw15ngsvb4lkihjb6kabgmss61a6s5p";
+  };
+
+  icon = fetchurl {
+    url = "https://stabyourself.net/images/screenshots/orthorobot-5.png";
+    sha256 = "13fa4divdqz4vpdij1lcs5kf6w2c4jm3cc9q6bz5h7lkng31jzi6";
+  };
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "orthorobot";
+      exec = pname;
+      icon = icon;
+      comment = "Robot game";
+      desktopName = "Orthorobot";
+      genericName = "orthorobot";
+      categories = [ "Game" ];
+    })
+  ];
+
+  nativeBuildInputs = [
+    copyDesktopItems
+    makeWrapper
+    strip-nondeterminism
+    zip
+  ];
+
+  patches = [
+    # support for love11
+    # https://github.com/Stabyourself/orthorobot/pull/3
+    (fetchpatch {
+      name = "Stabyourself-orthorobot-pull-3.patch";
+      url = "https://github.com/Stabyourself/orthorobot/compare/48f07423950b29a94b04aefe268f2f951f55b62e...05856ba7dbf1bb86d0f16a5f511d8ee9f2176015.patch";
+      sha256 = "sha256-WHHP6QM7R5eEkVF+J2pGNnds/OKRIRXyon85wjd3GXI=";
+    })
+  ];
+
+  installPhase = ''
+    runHook preInstall
+    zip -9 -r orthorobot.love ./*
+    strip-nondeterminism --type zip orthorobot.love
+    install -Dm444 -t $out/share/games/lovegames/ orthorobot.love
+    makeWrapper ${love}/bin/love $out/bin/orthorobot \
+                --add-flags $out/share/games/lovegames/orthorobot.love
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Recharge the robot";
+    maintainers = with maintainers; [ leenaars ];
+    platforms = platforms.linux;
+    license = licenses.free;
+    downloadPage = "https://stabyourself.net/orthorobot/";
+  };
+}
diff --git a/nixpkgs/pkgs/games/osu-lazer/bin.nix b/nixpkgs/pkgs/games/osu-lazer/bin.nix
new file mode 100644
index 000000000000..e042e9d295eb
--- /dev/null
+++ b/nixpkgs/pkgs/games/osu-lazer/bin.nix
@@ -0,0 +1,73 @@
+{ lib
+, stdenv
+, fetchurl
+, fetchzip
+, appimageTools
+}:
+
+let
+  pname = "osu-lazer-bin";
+  version = "2023.1229.0";
+
+  src = {
+    aarch64-darwin = fetchzip {
+      url = "https://github.com/ppy/osu/releases/download/${version}/osu.app.Apple.Silicon.zip";
+      hash = "sha256-aZp8pVeCxmaAyWYnBg7w8sPMXy+L2UGRk3NvG/VsxYI=";
+      stripRoot = false;
+    };
+    x86_64-darwin = fetchzip {
+      url = "https://github.com/ppy/osu/releases/download/${version}/osu.app.Intel.zip";
+      hash = "sha256-Xle/WcWg+lYA+DxQmE4Kzn1pJTa+HrM13utXqdK8ZZY=";
+      stripRoot = false;
+    };
+    x86_64-linux = fetchurl {
+      url = "https://github.com/ppy/osu/releases/download/${version}/osu.AppImage";
+      hash = "sha256-lRdRPwa6xix5Nvt3szPeposmqU8D826iFmE6S1uPBF8=";
+    };
+  }.${stdenv.system} or (throw "${pname}-${version}: ${stdenv.system} is unsupported.");
+
+  meta = {
+    description = "Rhythm is just a *click* away (AppImage version for score submission and multiplayer, and binary distribution for Darwin systems)";
+    homepage = "https://osu.ppy.sh";
+    license = with lib.licenses; [
+      mit
+      cc-by-nc-40
+      unfreeRedistributable # osu-framework contains libbass.so in repository
+    ];
+    sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
+    maintainers = with lib.maintainers; [ delan gepbird spacefault stepbrobd ];
+    mainProgram = "osu!";
+    platforms = [ "aarch64-darwin" "x86_64-darwin" "x86_64-linux" ];
+  };
+
+  passthru.updateScript = ./update-bin.sh;
+in
+if stdenv.isDarwin
+then stdenv.mkDerivation {
+  inherit pname version src meta passthru;
+
+  installPhase = ''
+    runHook preInstall
+    APP_DIR="$out/Applications"
+    mkdir -p "$APP_DIR"
+    cp -r . "$APP_DIR"
+    runHook postInstall
+  '';
+}
+else appimageTools.wrapType2 {
+  inherit pname version src meta passthru;
+
+  extraPkgs = pkgs: with pkgs; [ icu ];
+
+  extraInstallCommands =
+    let
+      contents = appimageTools.extract { inherit pname version src; };
+    in
+    ''
+      mv -v $out/bin/${pname}-${version} $out/bin/osu\!
+      install -m 444 -D ${contents}/osu\!.desktop -t $out/share/applications
+      for i in 16 32 48 64 96 128 256 512 1024; do
+        install -D ${contents}/osu\!.png $out/share/icons/hicolor/''${i}x$i/apps/osu\!.png
+      done
+    '';
+}
diff --git a/nixpkgs/pkgs/games/osu-lazer/default.nix b/nixpkgs/pkgs/games/osu-lazer/default.nix
new file mode 100644
index 000000000000..9949a2ee9f0f
--- /dev/null
+++ b/nixpkgs/pkgs/games/osu-lazer/default.nix
@@ -0,0 +1,91 @@
+{ lib
+, stdenvNoCC
+, buildDotnetModule
+, fetchFromGitHub
+, makeDesktopItem
+, copyDesktopItems
+, ffmpeg
+, alsa-lib
+, SDL2
+, lttng-ust
+, numactl
+, libglvnd
+, xorg
+, udev
+}:
+
+buildDotnetModule rec {
+  pname = "osu-lazer";
+  version = "2023.1229.0";
+
+  src = fetchFromGitHub {
+    owner = "ppy";
+    repo = "osu";
+    rev = version;
+    hash = "sha256-2GcPV6UHnNdToXfLs2+i3XNwE6Ymaj2bqNb5EePE3kM=";
+  };
+
+  projectFile = "osu.Desktop/osu.Desktop.csproj";
+  nugetDeps = ./deps.nix;
+
+  nativeBuildInputs = [ copyDesktopItems ];
+
+  runtimeDeps = [
+    ffmpeg
+    alsa-lib
+    SDL2
+    lttng-ust
+    numactl
+
+    # needed to avoid:
+    # Failed to create SDL window. SDL Error: Could not initialize OpenGL / GLES library
+    libglvnd
+
+    # needed for the window to actually appear
+    xorg.libXi
+
+    # needed to avoid in runtime.log:
+    # [verbose]: SDL error log [debug]: Failed loading udev_device_get_action: /nix/store/*-osu-lazer-*/lib/osu-lazer/runtimes/linux-x64/native/libSDL2.so: undefined symbol: _udev_device_get_action
+    # [verbose]: SDL error log [debug]: Failed loading libudev.so.1: libudev.so.1: cannot open shared object file: No such file or directory
+    udev
+  ];
+
+  executables = [ "osu!" ];
+
+  fixupPhase = ''
+    runHook preFixup
+
+    for i in 16 32 48 64 96 128 256 512 1024; do
+      install -D ./assets/lazer.png $out/share/icons/hicolor/''${i}x$i/apps/osu\!.png
+    done
+
+    ln -sft $out/lib/${pname} ${SDL2}/lib/libSDL2${stdenvNoCC.hostPlatform.extensions.sharedLibrary}
+    cp -f ${./osu.runtimeconfig.json} "$out/lib/${pname}/osu!.runtimeconfig.json"
+
+    runHook postFixup
+  '';
+
+  desktopItems = [(makeDesktopItem {
+    desktopName = "osu!";
+    name = "osu";
+    exec = "osu!";
+    icon = "osu!";
+    comment = meta.description;
+    type = "Application";
+    categories = [ "Game" ];
+  })];
+
+  meta = with lib; {
+    description = "Rhythm is just a *click* away (no score submission or multiplayer, see osu-lazer-bin)";
+    homepage = "https://osu.ppy.sh";
+    license = with licenses; [
+      mit
+      cc-by-nc-40
+      unfreeRedistributable # osu-framework contains libbass.so in repository
+    ];
+    maintainers = with maintainers; [ gepbird thiagokokada ];
+    platforms = [ "x86_64-linux" ];
+    mainProgram = "osu!";
+  };
+  passthru.updateScript = ./update.sh;
+}
diff --git a/nixpkgs/pkgs/games/osu-lazer/deps.nix b/nixpkgs/pkgs/games/osu-lazer/deps.nix
new file mode 100644
index 000000000000..8a67a1d16171
--- /dev/null
+++ b/nixpkgs/pkgs/games/osu-lazer/deps.nix
@@ -0,0 +1,333 @@
+# This file was automatically generated by passthru.fetch-deps.
+# Please dont edit it manually, your changes might get overwritten!
+
+{ fetchNuGet }: [
+  (fetchNuGet { pname = "AutoMapper"; version = "12.0.1"; sha256 = "0s0wjl4ck3sal8a50x786wxs9mbca7bxaqk3558yx5wpld4h4z3b"; })
+  (fetchNuGet { pname = "Clowd.Squirrel"; version = "2.10.2"; sha256 = "1kkvpflwmsr65blw22i8gn0bjzq7vvlndm4qa3qdiimckjsifa35"; })
+  (fetchNuGet { pname = "CodeFileSanity"; version = "0.0.37"; sha256 = "03ja3g66lb0smjmkr3yf28h7fy52wwbdnf6p268zfla3azh006pq"; })
+  (fetchNuGet { pname = "DiffPlex"; version = "1.7.1"; sha256 = "1q78r70pirgb7j5wkh454ws237lihh0fig212cpbj02cz53c2h6j"; })
+  (fetchNuGet { pname = "DiscordRichPresence"; version = "1.2.1.24"; sha256 = "0maw0yd6xgwy0cgk593z3zva0r5j267zpdmmpq8avj3zbna6n4x1"; })
+  (fetchNuGet { pname = "FFmpeg.AutoGen"; version = "4.3.0.1"; sha256 = "0n6x57mnnvcjnrs8zyvy07h5zm4bcfy9gh4n4bvd9fx5ys4pxkvv"; })
+  (fetchNuGet { pname = "Fody"; version = "6.8.0"; sha256 = "1y159433n5wzlvc8hjjrhjarf7mjvngbmh34jkd452zlrjqrhmns"; })
+  (fetchNuGet { pname = "HidSharpCore"; version = "1.2.1.1"; sha256 = "1zkndglmz0s8rblfhnqcvv90rkq2i7lf4bc380g7z8h1avf2ikll"; })
+  (fetchNuGet { pname = "HtmlAgilityPack"; version = "1.11.54"; sha256 = "178sd0ym900knjz7dmy2bvggijbqfp4zbmscgkxfjq3agvjfap8a"; })
+  (fetchNuGet { pname = "Humanizer"; version = "2.14.1"; sha256 = "18cycx9gvbc3735chdi2r583x73m2fkz1ws03yi3g640j9zv00fp"; })
+  (fetchNuGet { pname = "Humanizer.Core"; version = "2.14.1"; sha256 = "1ai7hgr0qwd7xlqfd92immddyi41j3ag91h3594yzfsgsy6yhyqi"; })
+  (fetchNuGet { pname = "Humanizer.Core.af"; version = "2.14.1"; sha256 = "197lsky6chbmrixgsg6dvxbdbbpis0an8mn6vnwjcydhncis087h"; })
+  (fetchNuGet { pname = "Humanizer.Core.ar"; version = "2.14.1"; sha256 = "03rz12mxrjv5afm1hn4rrpimkkb8wdzp17634dcq10fhpbwhy6i5"; })
+  (fetchNuGet { pname = "Humanizer.Core.az"; version = "2.14.1"; sha256 = "138kdhy86afy5n72wy12qlb25q4034z73lz5nbibmkixxdnj9g5r"; })
+  (fetchNuGet { pname = "Humanizer.Core.bg"; version = "2.14.1"; sha256 = "0scwzrvv8332prijkbp4y11n172smjb4sf7ygia6bi3ibhzq7zjy"; })
+  (fetchNuGet { pname = "Humanizer.Core.bn-BD"; version = "2.14.1"; sha256 = "1322kn7ym46mslh32sgwkv07l3jkkx7cw5wjphql2ziphxw536p8"; })
+  (fetchNuGet { pname = "Humanizer.Core.cs"; version = "2.14.1"; sha256 = "1zl3vsdd2pw3nm05qpnr6c75y7gacgaghg9sj07ksvsjmklgqqih"; })
+  (fetchNuGet { pname = "Humanizer.Core.da"; version = "2.14.1"; sha256 = "10rmrvzwp212fpxv0sdq8f0sjymccsdn71k99f845kz0js83r70s"; })
+  (fetchNuGet { pname = "Humanizer.Core.de"; version = "2.14.1"; sha256 = "0j7kld0jdiqwin83arais9gzjj85mpshmxls64yi58qhl7qjzk0j"; })
+  (fetchNuGet { pname = "Humanizer.Core.el"; version = "2.14.1"; sha256 = "143q1321qh5506wwvcpy0fj7hpbd9i1k75247mqs2my05x9vc8n0"; })
+  (fetchNuGet { pname = "Humanizer.Core.es"; version = "2.14.1"; sha256 = "011kscy671mgyx412h55b0x9a1ngmdsgqzqq1w0l10xhf90y4hc8"; })
+  (fetchNuGet { pname = "Humanizer.Core.fa"; version = "2.14.1"; sha256 = "184dxwkf251c27h7gg9y5zciixgcwy1cmdrs0bqrph7gg69kp6yq"; })
+  (fetchNuGet { pname = "Humanizer.Core.fi-FI"; version = "2.14.1"; sha256 = "144jlnlipr3pnbcyhbgrd2lxibx8vy00lp2zn60ihxppgbisircc"; })
+  (fetchNuGet { pname = "Humanizer.Core.fr"; version = "2.14.1"; sha256 = "0klnfy8n659sp8zngd87gy7qakd56dwr1axjjzk0zph1zvww09jq"; })
+  (fetchNuGet { pname = "Humanizer.Core.fr-BE"; version = "2.14.1"; sha256 = "0b70illi4m58xvlqwcvar0smh6292zadzk2r8c25ryijh6d5a9qv"; })
+  (fetchNuGet { pname = "Humanizer.Core.he"; version = "2.14.1"; sha256 = "08xkiv88qqd1b0frpalb2npq9rvz2q1yz48k6dikrjvy6amggirh"; })
+  (fetchNuGet { pname = "Humanizer.Core.hr"; version = "2.14.1"; sha256 = "12djmwxfg03018j2bqq5ikwkllyma8k7zmvpw61vxs7cv4izc6wh"; })
+  (fetchNuGet { pname = "Humanizer.Core.hu"; version = "2.14.1"; sha256 = "0lw13p9b2kbqf96lif5kx59axxiahd617h154iswjfka9kxdw65x"; })
+  (fetchNuGet { pname = "Humanizer.Core.hy"; version = "2.14.1"; sha256 = "1bgm0yabhvsv70amzmkvf3mls32lvd7yyr59yxf3xc96msqczgjh"; })
+  (fetchNuGet { pname = "Humanizer.Core.id"; version = "2.14.1"; sha256 = "1w0bnyac46f2321l09ckb6vz66s1bxl27skfww1iwrmf03i7m2cw"; })
+  (fetchNuGet { pname = "Humanizer.Core.is"; version = "2.14.1"; sha256 = "10w1fprlhxm1qy3rh0qf6z86ahrv8fcza3wrsx55idlmar1x9jyz"; })
+  (fetchNuGet { pname = "Humanizer.Core.it"; version = "2.14.1"; sha256 = "1msrmih8cp7r4yj7r85kr0l5h4yln80450mivliy1x322dav8xz2"; })
+  (fetchNuGet { pname = "Humanizer.Core.ja"; version = "2.14.1"; sha256 = "04ry6z0v85y4y5vzbqlbxppfdm04i02dxbxaaykbps09rwqaa250"; })
+  (fetchNuGet { pname = "Humanizer.Core.ko-KR"; version = "2.14.1"; sha256 = "156641v0ilrpbzprscvbzfha57pri4y1i66n9v056nc8bm10ggbg"; })
+  (fetchNuGet { pname = "Humanizer.Core.ku"; version = "2.14.1"; sha256 = "1scz21vgclbm1xhaw89f0v8s0vx46yv8yk3ij0nr6shsncgq9f7h"; })
+  (fetchNuGet { pname = "Humanizer.Core.lv"; version = "2.14.1"; sha256 = "1909dsbxiv2sgj6myfhn8lbbmvkp2hjahj0knawypyq3jw9sq86g"; })
+  (fetchNuGet { pname = "Humanizer.Core.ms-MY"; version = "2.14.1"; sha256 = "1dmjrxb0kb297ycr8xf7ni3l7y4wdqrdhqbhy8xnm8dx90nmj9x5"; })
+  (fetchNuGet { pname = "Humanizer.Core.mt"; version = "2.14.1"; sha256 = "0b183r1apzfa1hasimp2f27yfjkfp87nfbd8qdyrqdigw6nzcics"; })
+  (fetchNuGet { pname = "Humanizer.Core.nb"; version = "2.14.1"; sha256 = "12rd75f83lv6z12b5hbwnarv3dkk29pvc836jpg2mzffm0g0kxj2"; })
+  (fetchNuGet { pname = "Humanizer.Core.nb-NO"; version = "2.14.1"; sha256 = "1n033yfw44sjf99mv51c53wggjdffz8b9wv7gwm3q7i6g7ck4vv1"; })
+  (fetchNuGet { pname = "Humanizer.Core.nl"; version = "2.14.1"; sha256 = "0q4231by40bsr6mjy93n0zs365pz6da32pwkxcz1cc2hfdlkn0vd"; })
+  (fetchNuGet { pname = "Humanizer.Core.pl"; version = "2.14.1"; sha256 = "0h2wbwrlcmjk8b2mryyd8rbb1qmripvg0zyg61gg0hifiqfg3cr2"; })
+  (fetchNuGet { pname = "Humanizer.Core.pt"; version = "2.14.1"; sha256 = "0pg260zvyhqz8h1c96px1vs9q5ywvd0j2ixsq21mj96dj7bl5fay"; })
+  (fetchNuGet { pname = "Humanizer.Core.ro"; version = "2.14.1"; sha256 = "04mr28bjcb9hs0wmpb4nk2v178i0fjr0ymc78dv9bbqkmrzfsmcn"; })
+  (fetchNuGet { pname = "Humanizer.Core.ru"; version = "2.14.1"; sha256 = "060abvk7mrgawipjgw0h4hrvizby7acmj58w2g35fv54g43isgcl"; })
+  (fetchNuGet { pname = "Humanizer.Core.sk"; version = "2.14.1"; sha256 = "182xiqf71kiqp42b8yqrag6z57wzqraqi10bnhx0crrc1gxq8v0j"; })
+  (fetchNuGet { pname = "Humanizer.Core.sl"; version = "2.14.1"; sha256 = "12ygvzyqa0km7a0wz42zssq8qqakvghh96x1ng7qvwcrna3v2rdi"; })
+  (fetchNuGet { pname = "Humanizer.Core.sr"; version = "2.14.1"; sha256 = "1ggj15qksyr16rilq2w76x38bxp6a6z75b30c9b7w5ni88nkgc7x"; })
+  (fetchNuGet { pname = "Humanizer.Core.sr-Latn"; version = "2.14.1"; sha256 = "0lwr0gnashirny8lgaw0qnbb7x0qrjg8fs11594x8l7li3mahzz3"; })
+  (fetchNuGet { pname = "Humanizer.Core.sv"; version = "2.14.1"; sha256 = "1c7yx59haikdqx7k7vqll6223jjmikgwbl3dzmrcs3laywgfnmgn"; })
+  (fetchNuGet { pname = "Humanizer.Core.th-TH"; version = "2.14.1"; sha256 = "0kyyi5wc23i2lcag3zvrhga9gsnba3ahl4kdlaqvvg2jhdfarl4m"; })
+  (fetchNuGet { pname = "Humanizer.Core.tr"; version = "2.14.1"; sha256 = "0rdvp0an263b2nj3c5v11hvdwgmj86ljf2m1h3g1x28pygbcx6am"; })
+  (fetchNuGet { pname = "Humanizer.Core.uk"; version = "2.14.1"; sha256 = "0a2p6mhh0ajn0y7x98zbfasln1l04iiknd50sgf3svna99wybnxd"; })
+  (fetchNuGet { pname = "Humanizer.Core.uz-Cyrl-UZ"; version = "2.14.1"; sha256 = "1jfzfgnk6wz5na2md800vq0djm6z194x618yvwxbnk2c7wikbjj2"; })
+  (fetchNuGet { pname = "Humanizer.Core.uz-Latn-UZ"; version = "2.14.1"; sha256 = "0vimhw500rq60naxfari8qm6gjmjm8h9j6c04k67fs447djy8ndi"; })
+  (fetchNuGet { pname = "Humanizer.Core.vi"; version = "2.14.1"; sha256 = "1yr0l73cy2qypkssmmjwfbbqgdplam62dqnzk9vx6x47dzpys077"; })
+  (fetchNuGet { pname = "Humanizer.Core.zh-CN"; version = "2.14.1"; sha256 = "1k6nnawd016xpwgzdzy84z1lcv2vc1cygcksw19wbgd8dharyyk7"; })
+  (fetchNuGet { pname = "Humanizer.Core.zh-Hans"; version = "2.14.1"; sha256 = "0zn99311zfn602phxyskfjq9vly0w5712z6fly8r4q0h94qa8c85"; })
+  (fetchNuGet { pname = "Humanizer.Core.zh-Hant"; version = "2.14.1"; sha256 = "0qxjnbdj645l5sd6y3100yyrq1jy5misswg6xcch06x8jv7zaw1p"; })
+  (fetchNuGet { pname = "JetBrains.Annotations"; version = "2022.3.1"; sha256 = "0lkhyyz25q82ygnxy26lwy5cl8fvkdc13pcn433xpjj8akzbmgd6"; })
+  (fetchNuGet { pname = "JetBrains.ReSharper.GlobalTools"; version = "2022.2.3"; sha256 = "0ck4nkk8wlj2gcgs7j4j6z4yqrnf2f5rs2pgwa8kar026sc29xsl"; })
+  (fetchNuGet { pname = "managed-midi"; version = "1.10.0"; sha256 = "1rih8iq8k4j6n3206d2j7z4vygp725kzs95c6yc7p1mlhfiiimvq"; })
+  (fetchNuGet { pname = "Markdig"; version = "0.23.0"; sha256 = "1bwn885w7balwncmr764vidyyp9bixqlq6r3lhsapj8ykrpxxa70"; })
+  (fetchNuGet { pname = "MessagePack"; version = "2.5.129"; sha256 = "08bpg5v467zyx5ni8pj9x2nkqx3r2vbfdh7v72laii0707163fb2"; })
+  (fetchNuGet { pname = "MessagePack.Annotations"; version = "2.5.129"; sha256 = "1q0pprliqr8wrn09k8sa2p9l28q30rk6sl47vlazgwc678f96vg7"; })
+  (fetchNuGet { pname = "Microsoft.AspNetCore.Connections.Abstractions"; version = "7.0.12"; sha256 = "0dih84mzrgnf0zm2k8w9ivhlxx1vin9srir8jqcvhibw0xwrpzzw"; })
+  (fetchNuGet { pname = "Microsoft.AspNetCore.Http.Connections.Client"; version = "7.0.12"; sha256 = "1k9xak1f13nb4kp3ld0azlx2mp7ya8rbnd23587yanzv4lwpgab8"; })
+  (fetchNuGet { pname = "Microsoft.AspNetCore.Http.Connections.Common"; version = "7.0.12"; sha256 = "0xs23299gmnjf92jjbn3bgi7493a89zylhvm7gcraayin1g8prpc"; })
+  (fetchNuGet { pname = "Microsoft.AspNetCore.SignalR.Client"; version = "7.0.12"; sha256 = "0yjqyn7kdq4nmysaj9lab870hxc07l5q5qgkj7ppmrq7vzf49lbf"; })
+  (fetchNuGet { pname = "Microsoft.AspNetCore.SignalR.Client.Core"; version = "7.0.12"; sha256 = "1x5d3jh4vxvankxx6xp1937m6p3ryz39cwwiajnck1lj5mkwhw5h"; })
+  (fetchNuGet { pname = "Microsoft.AspNetCore.SignalR.Common"; version = "7.0.12"; sha256 = "1zqidbidqa0jyrsfm5rna6h37q18acqxh0v5vwxp6cf65r39w1z1"; })
+  (fetchNuGet { pname = "Microsoft.AspNetCore.SignalR.Protocols.Json"; version = "7.0.12"; sha256 = "1irln0dn89kls3k2h9j9hj616psl71xpid3vz7cllc0n0fjxkz0y"; })
+  (fetchNuGet { pname = "Microsoft.AspNetCore.SignalR.Protocols.MessagePack"; version = "7.0.12"; sha256 = "1374x6j7r79piji2r8ppddyzgf9nadc6mmgabk3jgg9m4lc67z48"; })
+  (fetchNuGet { pname = "Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson"; version = "7.0.12"; sha256 = "0zmvb48yvm1i6pysqbz63jk0y4c61nxapdwlb3c5nxwgjcy0n06k"; })
+  (fetchNuGet { pname = "Microsoft.CodeAnalysis.BannedApiAnalyzers"; version = "3.3.4"; sha256 = "1vzrni7n94f17bzc13lrvcxvgspx9s25ap1p005z6i1ikx6wgx30"; })
+  (fetchNuGet { pname = "Microsoft.CSharp"; version = "4.5.0"; sha256 = "01i28nvzccxbqmiz217fxs6hnjwmd5fafs37rd49a6qp53y6623l"; })
+  (fetchNuGet { pname = "Microsoft.CSharp"; version = "4.7.0"; sha256 = "0gd67zlw554j098kabg887b5a6pq9kzavpa3jjy5w53ccjzjfy8j"; })
+  (fetchNuGet { pname = "Microsoft.Data.Sqlite.Core"; version = "7.0.12"; sha256 = "05ljbjqjipq5lhn5ydh1567wd5qgz9dbhlc9i5xjid8pdfn4zzs1"; })
+  (fetchNuGet { pname = "Microsoft.Diagnostics.NETCore.Client"; version = "0.2.61701"; sha256 = "1ic1607jj4ln8dbibf1fz5v9svk9x2kqlgvhndc6ijaqnbc4wcr1"; })
+  (fetchNuGet { pname = "Microsoft.Diagnostics.Runtime"; version = "2.0.161401"; sha256 = "02qcm8nv1ch07g8b0i60ynrjn33b8y5ivyk4rxal3vd9zfi6pvwi"; })
+  (fetchNuGet { pname = "Microsoft.DotNet.PlatformAbstractions"; version = "2.0.3"; sha256 = "020214swxm0hip1d9gjskrzmqzjnji7c6l5b3xcch8vp166066m9"; })
+  (fetchNuGet { pname = "Microsoft.Extensions.Configuration.Abstractions"; version = "7.0.0"; sha256 = "1as8cygz0pagg17w22nsf6mb49lr2mcl1x8i3ad1wi8lyzygy1a3"; })
+  (fetchNuGet { pname = "Microsoft.Extensions.DependencyInjection"; version = "6.0.0-rc.1.21451.13"; sha256 = "0r6945jq7c2f1wjifq514zvngicndjqfnsjya6hqw0yzah0jr56c"; })
+  (fetchNuGet { pname = "Microsoft.Extensions.DependencyInjection"; version = "7.0.0"; sha256 = "121zs4jp8iimgbpzm3wsglhjwkc06irg1pxy8c1zcdlsg34cfq1p"; })
+  (fetchNuGet { pname = "Microsoft.Extensions.DependencyInjection.Abstractions"; version = "6.0.0-rc.1.21451.13"; sha256 = "11dg16x6g0gssb143qpghxz1s41himvhr7yhjwxs9hacx4ij2dm1"; })
+  (fetchNuGet { pname = "Microsoft.Extensions.DependencyInjection.Abstractions"; version = "7.0.0"; sha256 = "181d7mp9307fs17lyy42f8cxnjwysddmpsalky4m0pqxcimnr6g7"; })
+  (fetchNuGet { pname = "Microsoft.Extensions.DependencyModel"; version = "2.0.3"; sha256 = "0dpyjp0hy9kkvk2dd4dclfmb10yq5avsw2a6v8nra9g6ii2p1nla"; })
+  (fetchNuGet { pname = "Microsoft.Extensions.Features"; version = "7.0.12"; sha256 = "0cdh6kchc9yjlid6vdx74p1r5i7x7dalys107hbj4aqcrqx0jnnd"; })
+  (fetchNuGet { pname = "Microsoft.Extensions.Logging"; version = "7.0.0"; sha256 = "1bqd3pqn5dacgnkq0grc17cgb2i0w8z1raw12nwm3p3zhrfcvgxf"; })
+  (fetchNuGet { pname = "Microsoft.Extensions.Logging.Abstractions"; version = "7.0.0"; sha256 = "1gn7d18i1wfy13vrwhmdv1rmsb4vrk26kqdld4cgvh77yigj90xs"; })
+  (fetchNuGet { pname = "Microsoft.Extensions.Logging.Abstractions"; version = "7.0.1"; sha256 = "0xv3sqc1lbx5j4yy6g2w3kakzvrpwqs2ihax6lqasj5sz5map6fk"; })
+  (fetchNuGet { pname = "Microsoft.Extensions.ObjectPool"; version = "5.0.11"; sha256 = "0i7li76gmk6hml12aig4cvyvja9mgl16qr8pkwvx5vm6lc9a3nn4"; })
+  (fetchNuGet { pname = "Microsoft.Extensions.Options"; version = "7.0.0"; sha256 = "0b90zkrsk5dw3wr749rbynhpxlg4bgqdnd7d5vdlw2g9c7zlhgx6"; })
+  (fetchNuGet { pname = "Microsoft.Extensions.Options"; version = "7.0.1"; sha256 = "0ghz4y4gxnf2vw8yvhz9nkw21p6q2qqwh19phkk1xwxywyilr3mq"; })
+  (fetchNuGet { pname = "Microsoft.Extensions.Primitives"; version = "7.0.0"; sha256 = "1b4km9fszid9vp2zb3gya5ni9fn8bq62bzaas2ck2r7gs0sdys80"; })
+  (fetchNuGet { pname = "Microsoft.NET.StringTools"; version = "17.6.3"; sha256 = "0g5jdg0jp844a2ygwlm04igsxkrihqcq2rpmfx722nrv3vrk0r0z"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Platforms"; version = "1.0.1"; sha256 = "01al6cfxp68dscl15z7rxfw9zvhm64dncsw09a1vmdkacsa2v6lr"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Platforms"; version = "1.1.0"; sha256 = "08vh1r12g6ykjygq5d3vq09zylgb84l63k49jc4v8faw9g93iqqm"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Platforms"; version = "2.0.0"; sha256 = "1fk2fk2639i7nzy58m9dvpdnzql4vb8yl8vr19r2fp8lmj9w2jr0"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Platforms"; version = "5.0.0"; sha256 = "0mwpwdflidzgzfx2dlpkvvnkgkr2ayaf0s80737h4wa35gaj11rc"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Targets"; version = "1.0.1"; sha256 = "0ppdkwy6s9p7x9jix3v4402wb171cdiibq7js7i13nxpdky7074p"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Targets"; version = "1.1.0"; sha256 = "193xwf33fbm0ni3idxzbr5fdq3i2dlfgihsac9jj7whj0gd902nh"; })
+  (fetchNuGet { pname = "Microsoft.Toolkit.HighPerformance"; version = "7.1.2"; sha256 = "18l950mq0l8s1z771l9p332ni7jryidjh4hi9p37l6p8frcnccxb"; })
+  (fetchNuGet { pname = "Microsoft.Win32.Primitives"; version = "4.3.0"; sha256 = "0j0c1wj4ndj21zsgivsc24whiya605603kxrbiw6wkfdync464wq"; })
+  (fetchNuGet { pname = "Microsoft.Win32.Registry"; version = "4.5.0"; sha256 = "1zapbz161ji8h82xiajgriq6zgzmb1f3ar517p2h63plhsq5gh2q"; })
+  (fetchNuGet { pname = "Microsoft.Win32.Registry"; version = "5.0.0"; sha256 = "102hvhq2gmlcbq8y2cb7hdr2dnmjzfp2k3asr1ycwrfacwyaak7n"; })
+  (fetchNuGet { pname = "MongoDB.Bson"; version = "2.19.1"; sha256 = "1v7n5lnslb8v6iwcfasipgl03bd215n153bdkc8dc93k3hplyiqx"; })
+  (fetchNuGet { pname = "Mono.Posix.NETStandard"; version = "1.0.0"; sha256 = "0xlja36hwpjm837haq15mjh2prcf68lyrmn72nvgpz8qnf9vappw"; })
+  (fetchNuGet { pname = "NativeLibraryLoader"; version = "1.0.13"; sha256 = "18vi5gpa243jvz8cixyhbbrccj4js5sc8g4gy10ldjy50szrpnqh"; })
+  (fetchNuGet { pname = "NETStandard.Library"; version = "1.6.1"; sha256 = "1z70wvsx2d847a2cjfii7b83pjfs34q05gb037fdjikv5kbagml8"; })
+  (fetchNuGet { pname = "NETStandard.Library"; version = "2.0.0"; sha256 = "1bc4ba8ahgk15m8k4nd7x406nhi0kwqzbgjk2dmw52ss553xz7iy"; })
+  (fetchNuGet { pname = "Newtonsoft.Json"; version = "13.0.1"; sha256 = "0fijg0w6iwap8gvzyjnndds0q4b8anwxxvik7y8vgq97dram4srb"; })
+  (fetchNuGet { pname = "Newtonsoft.Json"; version = "13.0.3"; sha256 = "0xrwysmrn4midrjal8g2hr1bbg38iyisl0svamb11arqws4w2bw7"; })
+  (fetchNuGet { pname = "NuGet.Common"; version = "5.11.0"; sha256 = "1amf6scr5mcjdvd1fflag6i4qjwmydq5qwp6g3f099n901zq0dr3"; })
+  (fetchNuGet { pname = "NuGet.Configuration"; version = "5.11.0"; sha256 = "1s9pbrh7xy9jz7npz0sahdsj1cw8gfx1fwf3knv0ms1n0c9bk53l"; })
+  (fetchNuGet { pname = "NuGet.DependencyResolver.Core"; version = "5.11.0"; sha256 = "0yllxfv8lx1b7zj114mpxw03186q5ynsdvza6llp3wypxp367inr"; })
+  (fetchNuGet { pname = "NuGet.Frameworks"; version = "5.11.0"; sha256 = "0wv26gq39hfqw9md32amr5771s73f5zn1z9vs4y77cgynxr73s4z"; })
+  (fetchNuGet { pname = "NuGet.LibraryModel"; version = "5.11.0"; sha256 = "18kcxl46d004brvj7xmpskgml5qq001ip7bc7vhg2q92cisqa1by"; })
+  (fetchNuGet { pname = "NuGet.Packaging"; version = "5.11.0"; sha256 = "0rxgnsh8ny37bv6cdn70prqbq3xavncyd3nqhw5yarxkp29i11xv"; })
+  (fetchNuGet { pname = "NuGet.ProjectModel"; version = "5.11.0"; sha256 = "1i0dcak9qdj8s68c5f3zhrjs5sc4rsim92dy1qw4x9cavv5jrp05"; })
+  (fetchNuGet { pname = "NuGet.Protocol"; version = "5.11.0"; sha256 = "041pva6ykc5h6az7bb87mkg32c95cvxlixgspnd34zbdldr4ypdb"; })
+  (fetchNuGet { pname = "NuGet.Versioning"; version = "5.11.0"; sha256 = "041351n1rbyqpfxqyxbvjgfrcbbawymbq96givz5pvdbabvyf5vq"; })
+  (fetchNuGet { pname = "NUnit"; version = "3.13.3"; sha256 = "0wdzfkygqnr73s6lpxg5b1pwaqz9f414fxpvpdmf72bvh4jaqzv6"; })
+  (fetchNuGet { pname = "NVika"; version = "2.2.0"; sha256 = "1lxv5m5nf4hfwfdhcscrl8m0hhjkqxxn555wxwb95x0d5w2czx6x"; })
+  (fetchNuGet { pname = "OpenTabletDriver"; version = "0.6.4"; sha256 = "14wc2rgnbi2ili6sx9iqnmcbn1zlmbsk49zbiz5cycib6rxkqfdm"; })
+  (fetchNuGet { pname = "OpenTabletDriver.Configurations"; version = "0.6.4"; sha256 = "0l7vf607i54y1xilr7bmjy9zlxacm00wz42mfbvzjf9rr54sy2pm"; })
+  (fetchNuGet { pname = "OpenTabletDriver.Native"; version = "0.6.4"; sha256 = "1jsw2kwxxskwppk65i52yrxjjgbfbhicpmz30iaxlm68d5m6gwz2"; })
+  (fetchNuGet { pname = "OpenTabletDriver.Plugin"; version = "0.6.4"; sha256 = "0lbd80yddsy7wqjw014kvj9an49h2rbgd9s86ifq38dyin5r2czn"; })
+  (fetchNuGet { pname = "PolySharp"; version = "1.10.0"; sha256 = "06qici3hhk6a0jmy0nyvspcnmhbapnic6iin3i28pkdvrii02hnz"; })
+  (fetchNuGet { pname = "ppy.LocalisationAnalyser"; version = "2023.1117.0"; sha256 = "04q65q27nzjq0fmv8p62r5lmhzdbpfk6y65fxqmfmm7qz2wkiy27"; })
+  (fetchNuGet { pname = "ppy.LocalisationAnalyser.Tools"; version = "2023.1117.0"; sha256 = "1yr0r628x5aaa1vqxpkr9ys1xnf4qnz6ypggms6v4a336gjz2734"; })
+  (fetchNuGet { pname = "ppy.ManagedBass"; version = "2022.1216.0"; sha256 = "19nnj1hq2v21mrplnivjr9c4y3wg4hhfnc062sjgzkmiv1cchvf8"; })
+  (fetchNuGet { pname = "ppy.ManagedBass.Fx"; version = "2022.1216.0"; sha256 = "1vw573mkligpx9qiqasw1683cqaa1kgnxhlnbdcj9c4320b1pwjm"; })
+  (fetchNuGet { pname = "ppy.ManagedBass.Mix"; version = "2022.1216.0"; sha256 = "185bpvgbnd8y20r7vxb1an4pd1aal9b7b5wvmv3knz0qg8j0chd9"; })
+  (fetchNuGet { pname = "ppy.ManagedBass.Wasapi"; version = "2022.1216.0"; sha256 = "0h2ncf59sza8whvrwwqi8b6fcrkqrnfgfhd0vnhyw0s98nj74f0z"; })
+  (fetchNuGet { pname = "ppy.osu.Framework"; version = "2023.1227.1"; sha256 = "1jx40963xr1wsbx09n7aq9i86wa33qm932159wp0nhbk6iqwafix"; })
+  (fetchNuGet { pname = "ppy.osu.Framework.NativeLibs"; version = "2023.1225.0-nativelibs"; sha256 = "008kj91i9486ff2q7fcgb8mmpinskvnmfsqza2m5vafh295y3h7m"; })
+  (fetchNuGet { pname = "ppy.osu.Framework.SourceGeneration"; version = "2023.720.0"; sha256 = "001vvxyv483ibid25fdknvij77x0y983mp4psx2lbg3x2al7yxax"; })
+  (fetchNuGet { pname = "ppy.osu.Game.Resources"; version = "2023.1228.0"; sha256 = "09qjfavp71nlzyl6fqgpjfpsilii2fbsjyjggdbq9hf9i49hwz7s"; })
+  (fetchNuGet { pname = "ppy.osuTK.NS20"; version = "1.0.211"; sha256 = "0j4a9n39pqm0cgdcps47p5n2mqph3h94r7hmf0bs59imif4jxvjy"; })
+  (fetchNuGet { pname = "ppy.SDL2-CS"; version = "1.0.693-alpha"; sha256 = "15fgd3j9cs3adldiscqm0ffixf68h06wqdz1xy1286z4gczhi954"; })
+  (fetchNuGet { pname = "ppy.Veldrid"; version = "4.9.3-g91ce5a6cda"; sha256 = "0m96jkagz1ab3jgmz61d4z7jrxz058nzsamvqz93c90rlw802cvm"; })
+  (fetchNuGet { pname = "ppy.Veldrid.MetalBindings"; version = "4.9.3-g91ce5a6cda"; sha256 = "14qcrvhpvj3w9nr8fcki0j53qxc8bfgflivr989salh0srnlv764"; })
+  (fetchNuGet { pname = "ppy.Veldrid.OpenGLBindings"; version = "4.9.3-g91ce5a6cda"; sha256 = "1gdwk7s9sdvzrqr2rs9j87nvyl7b47b7m6kkhk1mpz6ryq403nsx"; })
+  (fetchNuGet { pname = "ppy.Veldrid.SPIRV"; version = "1.0.15-gca6cec7843"; sha256 = "09pi4c91ljavilw9kx7kzhcax7ar4zk7zy1qwvqfrqsgxznvyxa1"; })
+  (fetchNuGet { pname = "Realm"; version = "11.5.0"; sha256 = "0r7j5si3n4ncq8xnnjk1q5jjqbj0s1w3ps124y8pgqd14dzvch6a"; })
+  (fetchNuGet { pname = "Realm.PlatformHelpers"; version = "11.5.0"; sha256 = "1ggbmlsf04pxnh1k86hs0wxnvcw0ja2xnn6358qmrp826km0w1g9"; })
+  (fetchNuGet { pname = "Remotion.Linq"; version = "2.2.0"; sha256 = "1y46ni0xswmmiryp8sydjgryafwn458dr91f9xn653w73kdyk4xf"; })
+  (fetchNuGet { pname = "runtime.any.System.Collections"; version = "4.3.0"; sha256 = "0bv5qgm6vr47ynxqbnkc7i797fdi8gbjjxii173syrx14nmrkwg0"; })
+  (fetchNuGet { pname = "runtime.any.System.Diagnostics.Tools"; version = "4.3.0"; sha256 = "1wl76vk12zhdh66vmagni66h5xbhgqq7zkdpgw21jhxhvlbcl8pk"; })
+  (fetchNuGet { pname = "runtime.any.System.Diagnostics.Tracing"; version = "4.3.0"; sha256 = "00j6nv2xgmd3bi347k00m7wr542wjlig53rmj28pmw7ddcn97jbn"; })
+  (fetchNuGet { pname = "runtime.any.System.Globalization"; version = "4.3.0"; sha256 = "1daqf33hssad94lamzg01y49xwndy2q97i2lrb7mgn28656qia1x"; })
+  (fetchNuGet { pname = "runtime.any.System.Globalization.Calendars"; version = "4.3.0"; sha256 = "1ghhhk5psqxcg6w88sxkqrc35bxcz27zbqm2y5p5298pv3v7g201"; })
+  (fetchNuGet { pname = "runtime.any.System.IO"; version = "4.3.0"; sha256 = "0l8xz8zn46w4d10bcn3l4yyn4vhb3lrj2zw8llvz7jk14k4zps5x"; })
+  (fetchNuGet { pname = "runtime.any.System.Reflection"; version = "4.3.0"; sha256 = "02c9h3y35pylc0zfq3wcsvc5nqci95nrkq0mszifc0sjx7xrzkly"; })
+  (fetchNuGet { pname = "runtime.any.System.Reflection.Extensions"; version = "4.3.0"; sha256 = "0zyri97dfc5vyaz9ba65hjj1zbcrzaffhsdlpxc9bh09wy22fq33"; })
+  (fetchNuGet { pname = "runtime.any.System.Reflection.Primitives"; version = "4.3.0"; sha256 = "0x1mm8c6iy8rlxm8w9vqw7gb7s1ljadrn049fmf70cyh42vdfhrf"; })
+  (fetchNuGet { pname = "runtime.any.System.Resources.ResourceManager"; version = "4.3.0"; sha256 = "03kickal0iiby82wa5flar18kyv82s9s6d4xhk5h4bi5kfcyfjzl"; })
+  (fetchNuGet { pname = "runtime.any.System.Runtime"; version = "4.3.0"; sha256 = "1cqh1sv3h5j7ixyb7axxbdkqx6cxy00p4np4j91kpm492rf4s25b"; })
+  (fetchNuGet { pname = "runtime.any.System.Runtime.Handles"; version = "4.3.0"; sha256 = "0bh5bi25nk9w9xi8z23ws45q5yia6k7dg3i4axhfqlnj145l011x"; })
+  (fetchNuGet { pname = "runtime.any.System.Runtime.InteropServices"; version = "4.3.0"; sha256 = "0c3g3g3jmhlhw4klrc86ka9fjbl7i59ds1fadsb2l8nqf8z3kb19"; })
+  (fetchNuGet { pname = "runtime.any.System.Text.Encoding"; version = "4.3.0"; sha256 = "0aqqi1v4wx51h51mk956y783wzags13wa7mgqyclacmsmpv02ps3"; })
+  (fetchNuGet { pname = "runtime.any.System.Text.Encoding.Extensions"; version = "4.3.0"; sha256 = "0lqhgqi0i8194ryqq6v2gqx0fb86db2gqknbm0aq31wb378j7ip8"; })
+  (fetchNuGet { pname = "runtime.any.System.Threading.Tasks"; version = "4.3.0"; sha256 = "03mnvkhskbzxddz4hm113zsch1jyzh2cs450dk3rgfjp8crlw1va"; })
+  (fetchNuGet { pname = "runtime.any.System.Threading.Timer"; version = "4.3.0"; sha256 = "0aw4phrhwqz9m61r79vyfl5la64bjxj8l34qnrcwb28v49fg2086"; })
+  (fetchNuGet { pname = "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "16rnxzpk5dpbbl1x354yrlsbvwylrq456xzpsha1n9y3glnhyx9d"; })
+  (fetchNuGet { pname = "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "0hkg03sgm2wyq8nqk6dbm9jh5vcq57ry42lkqdmfklrw89lsmr59"; })
+  (fetchNuGet { pname = "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "0c2p354hjx58xhhz7wv6div8xpi90sc6ibdm40qin21bvi7ymcaa"; })
+  (fetchNuGet { pname = "runtime.native.System"; version = "4.0.0"; sha256 = "1ppk69xk59ggacj9n7g6fyxvzmk1g5p4fkijm0d7xqfkig98qrkf"; })
+  (fetchNuGet { pname = "runtime.native.System"; version = "4.3.0"; sha256 = "15hgf6zaq9b8br2wi1i3x0zvmk410nlmsmva9p0bbg73v6hml5k4"; })
+  (fetchNuGet { pname = "runtime.native.System.IO.Compression"; version = "4.3.0"; sha256 = "1vvivbqsk6y4hzcid27pqpm5bsi6sc50hvqwbcx8aap5ifrxfs8d"; })
+  (fetchNuGet { pname = "runtime.native.System.Net.Http"; version = "4.3.0"; sha256 = "1n6rgz5132lcibbch1qlf0g9jk60r0kqv087hxc0lisy50zpm7kk"; })
+  (fetchNuGet { pname = "runtime.native.System.Net.Security"; version = "4.3.0"; sha256 = "0dnqjhw445ay3chpia9p6vy4w2j6s9vy3hxszqvdanpvvyaxijr3"; })
+  (fetchNuGet { pname = "runtime.native.System.Security.Cryptography.Apple"; version = "4.3.0"; sha256 = "1b61p6gw1m02cc1ry996fl49liiwky6181dzr873g9ds92zl326q"; })
+  (fetchNuGet { pname = "runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "18pzfdlwsg2nb1jjjjzyb5qlgy6xjxzmhnfaijq5s2jw3cm3ab97"; })
+  (fetchNuGet { pname = "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "0qyynf9nz5i7pc26cwhgi8j62ps27sqmf78ijcfgzab50z9g8ay3"; })
+  (fetchNuGet { pname = "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "1klrs545awhayryma6l7g2pvnp9xy4z0r1i40r80zb45q3i9nbyf"; })
+  (fetchNuGet { pname = "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple"; version = "4.3.0"; sha256 = "10yc8jdrwgcl44b4g93f1ds76b176bajd3zqi2faf5rvh1vy9smi"; })
+  (fetchNuGet { pname = "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "0zcxjv5pckplvkg0r6mw3asggm7aqzbdjimhvsasb0cgm59x09l3"; })
+  (fetchNuGet { pname = "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "0vhynn79ih7hw7cwjazn87rm9z9fj0rvxgzlab36jybgcpcgphsn"; })
+  (fetchNuGet { pname = "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "160p68l2c7cqmyqjwxydcvgw7lvl1cr0znkw8fp24d1by9mqc8p3"; })
+  (fetchNuGet { pname = "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "15zrc8fgd8zx28hdghcj5f5i34wf3l6bq5177075m2bc2j34jrqy"; })
+  (fetchNuGet { pname = "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "1p4dgxax6p7rlgj4q73k73rslcnz4wdcv8q2flg1s8ygwcm58ld5"; })
+  (fetchNuGet { pname = "runtime.unix.Microsoft.Win32.Primitives"; version = "4.3.0"; sha256 = "0y61k9zbxhdi0glg154v30kkq7f8646nif8lnnxbvkjpakggd5id"; })
+  (fetchNuGet { pname = "runtime.unix.System.Console"; version = "4.3.0"; sha256 = "1pfpkvc6x2if8zbdzg9rnc5fx51yllprl8zkm5npni2k50lisy80"; })
+  (fetchNuGet { pname = "runtime.unix.System.Diagnostics.Debug"; version = "4.3.0"; sha256 = "1lps7fbnw34bnh3lm31gs5c0g0dh7548wfmb8zz62v0zqz71msj5"; })
+  (fetchNuGet { pname = "runtime.unix.System.IO.FileSystem"; version = "4.3.0"; sha256 = "14nbkhvs7sji5r1saj2x8daz82rnf9kx28d3v2qss34qbr32dzix"; })
+  (fetchNuGet { pname = "runtime.unix.System.Net.Primitives"; version = "4.3.0"; sha256 = "0bdnglg59pzx9394sy4ic66kmxhqp8q8bvmykdxcbs5mm0ipwwm4"; })
+  (fetchNuGet { pname = "runtime.unix.System.Net.Sockets"; version = "4.3.0"; sha256 = "03npdxzy8gfv035bv1b9rz7c7hv0rxl5904wjz51if491mw0xy12"; })
+  (fetchNuGet { pname = "runtime.unix.System.Private.Uri"; version = "4.3.0"; sha256 = "1jx02q6kiwlvfksq1q9qr17fj78y5v6mwsszav4qcz9z25d5g6vk"; })
+  (fetchNuGet { pname = "runtime.unix.System.Runtime.Extensions"; version = "4.3.0"; sha256 = "0pnxxmm8whx38dp6yvwgmh22smknxmqs5n513fc7m4wxvs1bvi4p"; })
+  (fetchNuGet { pname = "Sentry"; version = "3.40.0"; sha256 = "1vijf4dfv842y2567sgs4bx51g7jyqsrmg689nj4nbbf44aay99a"; })
+  (fetchNuGet { pname = "SharpCompress"; version = "0.33.0"; sha256 = "1j94hfjvkygpp97svv75jay0rmnx9ygg86d5syyahl9hayns4ig9"; })
+  (fetchNuGet { pname = "SharpCompress"; version = "0.34.1"; sha256 = "0m02yk97fxafdqg6s8408vqcg1a0wll483sj4ff2m0dnxajffkii"; })
+  (fetchNuGet { pname = "SharpFNT"; version = "2.0.0"; sha256 = "1bgacgh9hbck0qvji6frbb50sdiqfdng2fvvfgfw8b9qaql91mx0"; })
+  (fetchNuGet { pname = "SharpGen.Runtime"; version = "2.0.0-beta.13"; sha256 = "1250z6sa9ghf84czlkzvaysb29c0n229z1f0vh5qls89akrkl7h8"; })
+  (fetchNuGet { pname = "SharpGen.Runtime.COM"; version = "2.0.0-beta.13"; sha256 = "1lmv3jp2g7mgy9j23pd3j0wr3p89qiq8v6c6qxqf688izyni1166"; })
+  (fetchNuGet { pname = "SixLabors.ImageSharp"; version = "2.1.0"; sha256 = "0lmj3qs39v5jcf2rjwav43nqnc7g6sd4l226l2jw85nidzmpvkwr"; })
+  (fetchNuGet { pname = "SQLitePCLRaw.bundle_e_sqlite3"; version = "2.1.6"; sha256 = "0pzgdfl707pd9fz108xaff22w7c2y27yaix6wfp36phqkdnzz43m"; })
+  (fetchNuGet { pname = "SQLitePCLRaw.core"; version = "2.1.4"; sha256 = "09akxz92qipr1cj8mk2hw99i0b81wwbwx26gpk21471zh543f8ld"; })
+  (fetchNuGet { pname = "SQLitePCLRaw.core"; version = "2.1.6"; sha256 = "1w8zsgz2w2q0a9cw9cl1rzrpv48a04nhyq67ywan6xlgknds65a7"; })
+  (fetchNuGet { pname = "SQLitePCLRaw.lib.e_sqlite3"; version = "2.1.6"; sha256 = "0g959z7r3h43nwzm7z3jiib1xvyx146lxyv0x6fl8ll5wivpjyxq"; })
+  (fetchNuGet { pname = "SQLitePCLRaw.provider.e_sqlite3"; version = "2.1.6"; sha256 = "1vs1c7yhi0mdqrd35ji289cxkhg7dxdnn6wgjjbngvqxkdhkyxyc"; })
+  (fetchNuGet { pname = "StbiSharp"; version = "1.1.0"; sha256 = "0wbw20m7nyhxj32k153l668sxigamlwig0qpz8l8d0jqz35vizm0"; })
+  (fetchNuGet { pname = "System.AppContext"; version = "4.1.0"; sha256 = "0fv3cma1jp4vgj7a8hqc9n7hr1f1kjp541s6z0q1r6nazb4iz9mz"; })
+  (fetchNuGet { pname = "System.AppContext"; version = "4.3.0"; sha256 = "1649qvy3dar900z3g817h17nl8jp4ka5vcfmsr05kh0fshn7j3ya"; })
+  (fetchNuGet { pname = "System.Buffers"; version = "4.3.0"; sha256 = "0fgns20ispwrfqll4q1zc1waqcmylb3zc50ys9x8zlwxh9pmd9jy"; })
+  (fetchNuGet { pname = "System.Buffers"; version = "4.5.1"; sha256 = "04kb1mdrlcixj9zh1xdi5as0k0qi8byr5mi3p3jcxx72qz93s2y3"; })
+  (fetchNuGet { pname = "System.Collections"; version = "4.0.11"; sha256 = "1ga40f5lrwldiyw6vy67d0sg7jd7ww6kgwbksm19wrvq9hr0bsm6"; })
+  (fetchNuGet { pname = "System.Collections"; version = "4.3.0"; sha256 = "19r4y64dqyrq6k4706dnyhhw7fs24kpp3awak7whzss39dakpxk9"; })
+  (fetchNuGet { pname = "System.Collections.Concurrent"; version = "4.3.0"; sha256 = "0wi10md9aq33jrkh2c24wr2n9hrpyamsdhsxdcnf43b7y86kkii8"; })
+  (fetchNuGet { pname = "System.Collections.Immutable"; version = "1.7.1"; sha256 = "1nh4nlxfc7lbnbl86wwk1a3jwl6myz5j6hvgh5sp4krim9901hsq"; })
+  (fetchNuGet { pname = "System.ComponentModel.Annotations"; version = "5.0.0"; sha256 = "021h7x98lblq9avm1bgpa4i31c2kgsa7zn4sqhxf39g087ar756j"; })
+  (fetchNuGet { pname = "System.Console"; version = "4.3.0"; sha256 = "1flr7a9x920mr5cjsqmsy9wgnv3lvd0h1g521pdr1lkb2qycy7ay"; })
+  (fetchNuGet { pname = "System.Diagnostics.Debug"; version = "4.0.11"; sha256 = "0gmjghrqmlgzxivd2xl50ncbglb7ljzb66rlx8ws6dv8jm0d5siz"; })
+  (fetchNuGet { pname = "System.Diagnostics.Debug"; version = "4.3.0"; sha256 = "00yjlf19wjydyr6cfviaph3vsjzg3d5nvnya26i2fvfg53sknh3y"; })
+  (fetchNuGet { pname = "System.Diagnostics.DiagnosticSource"; version = "4.3.0"; sha256 = "0z6m3pbiy0qw6rn3n209rrzf9x1k4002zh90vwcrsym09ipm2liq"; })
+  (fetchNuGet { pname = "System.Diagnostics.Tools"; version = "4.3.0"; sha256 = "0in3pic3s2ddyibi8cvgl102zmvp9r9mchh82ns9f0ms4basylw1"; })
+  (fetchNuGet { pname = "System.Diagnostics.Tracing"; version = "4.3.0"; sha256 = "1m3bx6c2s958qligl67q7grkwfz3w53hpy7nc97mh6f7j5k168c4"; })
+  (fetchNuGet { pname = "System.Dynamic.Runtime"; version = "4.0.11"; sha256 = "1pla2dx8gkidf7xkciig6nifdsb494axjvzvann8g2lp3dbqasm9"; })
+  (fetchNuGet { pname = "System.Dynamic.Runtime"; version = "4.3.0"; sha256 = "1d951hrvrpndk7insiag80qxjbf2y0y39y8h5hnq9612ws661glk"; })
+  (fetchNuGet { pname = "System.Formats.Asn1"; version = "5.0.0"; sha256 = "1axc8z0839yvqi2cb63l73l6d9j6wd20lsbdymwddz9hvrsgfwpn"; })
+  (fetchNuGet { pname = "System.Globalization"; version = "4.0.11"; sha256 = "070c5jbas2v7smm660zaf1gh0489xanjqymkvafcs4f8cdrs1d5d"; })
+  (fetchNuGet { pname = "System.Globalization"; version = "4.3.0"; sha256 = "1cp68vv683n6ic2zqh2s1fn4c2sd87g5hpp6l4d4nj4536jz98ki"; })
+  (fetchNuGet { pname = "System.Globalization.Calendars"; version = "4.3.0"; sha256 = "1xwl230bkakzzkrggy1l1lxmm3xlhk4bq2pkv790j5lm8g887lxq"; })
+  (fetchNuGet { pname = "System.Globalization.Extensions"; version = "4.3.0"; sha256 = "02a5zfxavhv3jd437bsncbhd2fp1zv4gxzakp1an9l6kdq1mcqls"; })
+  (fetchNuGet { pname = "System.IO"; version = "4.1.0"; sha256 = "1g0yb8p11vfd0kbkyzlfsbsp5z44lwsvyc0h3dpw6vqnbi035ajp"; })
+  (fetchNuGet { pname = "System.IO"; version = "4.3.0"; sha256 = "05l9qdrzhm4s5dixmx68kxwif4l99ll5gqmh7rqgw554fx0agv5f"; })
+  (fetchNuGet { pname = "System.IO.Compression"; version = "4.3.0"; sha256 = "084zc82yi6yllgda0zkgl2ys48sypiswbiwrv7irb3r0ai1fp4vz"; })
+  (fetchNuGet { pname = "System.IO.Compression.ZipFile"; version = "4.3.0"; sha256 = "1yxy5pq4dnsm9hlkg9ysh5f6bf3fahqqb6p8668ndy5c0lk7w2ar"; })
+  (fetchNuGet { pname = "System.IO.FileSystem"; version = "4.0.1"; sha256 = "0kgfpw6w4djqra3w5crrg8xivbanh1w9dh3qapb28q060wb9flp1"; })
+  (fetchNuGet { pname = "System.IO.FileSystem"; version = "4.3.0"; sha256 = "0z2dfrbra9i6y16mm9v1v6k47f0fm617vlb7s5iybjjsz6g1ilmw"; })
+  (fetchNuGet { pname = "System.IO.FileSystem.Primitives"; version = "4.3.0"; sha256 = "0j6ndgglcf4brg2lz4wzsh1av1gh8xrzdsn9f0yznskhqn1xzj9c"; })
+  (fetchNuGet { pname = "System.IO.Packaging"; version = "7.0.0"; sha256 = "16fgj2ab5ci217shmfsi6c0rnmkh90h6vyb60503nhpmh7y8di13"; })
+  (fetchNuGet { pname = "System.IO.Pipelines"; version = "7.0.0"; sha256 = "1ila2vgi1w435j7g2y7ykp2pdbh9c5a02vm85vql89az93b7qvav"; })
+  (fetchNuGet { pname = "System.Linq"; version = "4.1.0"; sha256 = "1ppg83svb39hj4hpp5k7kcryzrf3sfnm08vxd5sm2drrijsla2k5"; })
+  (fetchNuGet { pname = "System.Linq"; version = "4.3.0"; sha256 = "1w0gmba695rbr80l1k2h4mrwzbzsyfl2z4klmpbsvsg5pm4a56s7"; })
+  (fetchNuGet { pname = "System.Linq.Expressions"; version = "4.1.0"; sha256 = "1gpdxl6ip06cnab7n3zlcg6mqp7kknf73s8wjinzi4p0apw82fpg"; })
+  (fetchNuGet { pname = "System.Linq.Expressions"; version = "4.3.0"; sha256 = "0ky2nrcvh70rqq88m9a5yqabsl4fyd17bpr63iy2mbivjs2nyypv"; })
+  (fetchNuGet { pname = "System.Linq.Queryable"; version = "4.0.1"; sha256 = "11jn9k34g245yyf260gr3ldzvaqa9477w2c5nhb1p8vjx4xm3qaw"; })
+  (fetchNuGet { pname = "System.Memory"; version = "4.5.3"; sha256 = "0naqahm3wljxb5a911d37mwjqjdxv9l0b49p5dmfyijvni2ppy8a"; })
+  (fetchNuGet { pname = "System.Memory"; version = "4.5.4"; sha256 = "14gbbs22mcxwggn0fcfs1b062521azb9fbb7c113x0mq6dzq9h6y"; })
+  (fetchNuGet { pname = "System.Memory"; version = "4.5.5"; sha256 = "08jsfwimcarfzrhlyvjjid61j02irx6xsklf32rv57x2aaikvx0h"; })
+  (fetchNuGet { pname = "System.Net.Http"; version = "4.3.0"; sha256 = "1i4gc757xqrzflbk7kc5ksn20kwwfjhw9w7pgdkn19y3cgnl302j"; })
+  (fetchNuGet { pname = "System.Net.NameResolution"; version = "4.3.0"; sha256 = "15r75pwc0rm3vvwsn8rvm2krf929mjfwliv0mpicjnii24470rkq"; })
+  (fetchNuGet { pname = "System.Net.Primitives"; version = "4.3.0"; sha256 = "0c87k50rmdgmxx7df2khd9qj7q35j9rzdmm2572cc55dygmdk3ii"; })
+  (fetchNuGet { pname = "System.Net.Security"; version = "4.3.0"; sha256 = "1aa5igz31ivk6kpgsrwck3jccab7wd88wr52lddmgypmbh9mmf87"; })
+  (fetchNuGet { pname = "System.Net.Sockets"; version = "4.3.0"; sha256 = "1ssa65k6chcgi6mfmzrznvqaxk8jp0gvl77xhf1hbzakjnpxspla"; })
+  (fetchNuGet { pname = "System.Net.WebHeaderCollection"; version = "4.3.0"; sha256 = "0ms3ddjv1wn8sqa5qchm245f3vzzif6l6fx5k92klqpn7zf4z562"; })
+  (fetchNuGet { pname = "System.Net.WebSockets"; version = "4.3.0"; sha256 = "1gfj800078kggcgl0xyl00a6y5k4wwh2k2qm69rjy22wbmq7fy4p"; })
+  (fetchNuGet { pname = "System.Net.WebSockets.Client"; version = "4.3.2"; sha256 = "103y8lfsfa5xd1sqmq9sml4qyp4rij2i3fnnw119h119hb04l0rk"; })
+  (fetchNuGet { pname = "System.Numerics.Tensors"; version = "8.0.0"; sha256 = "0k5zc5msnixpraqiqk6ysva8jymbdj3k0y5fl0wjj9vav38w6x5d"; })
+  (fetchNuGet { pname = "System.ObjectModel"; version = "4.0.12"; sha256 = "1sybkfi60a4588xn34nd9a58png36i0xr4y4v4kqpg8wlvy5krrj"; })
+  (fetchNuGet { pname = "System.ObjectModel"; version = "4.3.0"; sha256 = "191p63zy5rpqx7dnrb3h7prvgixmk168fhvvkkvhlazncf8r3nc2"; })
+  (fetchNuGet { pname = "System.Private.Uri"; version = "4.3.0"; sha256 = "04r1lkdnsznin0fj4ya1zikxiqr0h6r6a1ww2dsm60gqhdrf0mvx"; })
+  (fetchNuGet { pname = "System.Reflection"; version = "4.1.0"; sha256 = "1js89429pfw79mxvbzp8p3q93il6rdff332hddhzi5wqglc4gml9"; })
+  (fetchNuGet { pname = "System.Reflection"; version = "4.3.0"; sha256 = "0xl55k0mw8cd8ra6dxzh974nxif58s3k1rjv1vbd7gjbjr39j11m"; })
+  (fetchNuGet { pname = "System.Reflection.Emit"; version = "4.0.1"; sha256 = "0ydqcsvh6smi41gyaakglnv252625hf29f7kywy2c70nhii2ylqp"; })
+  (fetchNuGet { pname = "System.Reflection.Emit"; version = "4.3.0"; sha256 = "11f8y3qfysfcrscjpjym9msk7lsfxkk4fmz9qq95kn3jd0769f74"; })
+  (fetchNuGet { pname = "System.Reflection.Emit.ILGeneration"; version = "4.0.1"; sha256 = "1pcd2ig6bg144y10w7yxgc9d22r7c7ww7qn1frdfwgxr24j9wvv0"; })
+  (fetchNuGet { pname = "System.Reflection.Emit.ILGeneration"; version = "4.3.0"; sha256 = "0w1n67glpv8241vnpz1kl14sy7zlnw414aqwj4hcx5nd86f6994q"; })
+  (fetchNuGet { pname = "System.Reflection.Emit.Lightweight"; version = "4.0.1"; sha256 = "1s4b043zdbx9k39lfhvsk68msv1nxbidhkq6nbm27q7sf8xcsnxr"; })
+  (fetchNuGet { pname = "System.Reflection.Emit.Lightweight"; version = "4.3.0"; sha256 = "0ql7lcakycrvzgi9kxz1b3lljd990az1x6c4jsiwcacrvimpib5c"; })
+  (fetchNuGet { pname = "System.Reflection.Extensions"; version = "4.0.1"; sha256 = "0m7wqwq0zqq9gbpiqvgk3sr92cbrw7cp3xn53xvw7zj6rz6fdirn"; })
+  (fetchNuGet { pname = "System.Reflection.Extensions"; version = "4.3.0"; sha256 = "02bly8bdc98gs22lqsfx9xicblszr2yan7v2mmw3g7hy6miq5hwq"; })
+  (fetchNuGet { pname = "System.Reflection.Metadata"; version = "1.8.1"; sha256 = "17xxl3m99wa4hcpqy42vl8qb1jk2jfq32rj3sfjc1a46hi2si5jj"; })
+  (fetchNuGet { pname = "System.Reflection.Primitives"; version = "4.0.1"; sha256 = "1bangaabhsl4k9fg8khn83wm6yial8ik1sza7401621jc6jrym28"; })
+  (fetchNuGet { pname = "System.Reflection.Primitives"; version = "4.3.0"; sha256 = "04xqa33bld78yv5r93a8n76shvc8wwcdgr1qvvjh959g3rc31276"; })
+  (fetchNuGet { pname = "System.Reflection.TypeExtensions"; version = "4.1.0"; sha256 = "1bjli8a7sc7jlxqgcagl9nh8axzfl11f4ld3rjqsyxc516iijij7"; })
+  (fetchNuGet { pname = "System.Reflection.TypeExtensions"; version = "4.3.0"; sha256 = "0y2ssg08d817p0vdag98vn238gyrrynjdj4181hdg780sif3ykp1"; })
+  (fetchNuGet { pname = "System.Resources.ResourceManager"; version = "4.0.1"; sha256 = "0b4i7mncaf8cnai85jv3wnw6hps140cxz8vylv2bik6wyzgvz7bi"; })
+  (fetchNuGet { pname = "System.Resources.ResourceManager"; version = "4.3.0"; sha256 = "0sjqlzsryb0mg4y4xzf35xi523s4is4hz9q4qgdvlvgivl7qxn49"; })
+  (fetchNuGet { pname = "System.Runtime"; version = "4.1.0"; sha256 = "02hdkgk13rvsd6r9yafbwzss8kr55wnj8d5c7xjnp8gqrwc8sn0m"; })
+  (fetchNuGet { pname = "System.Runtime"; version = "4.3.0"; sha256 = "066ixvgbf2c929kgknshcxqj6539ax7b9m570cp8n179cpfkapz7"; })
+  (fetchNuGet { pname = "System.Runtime.CompilerServices.Unsafe"; version = "4.7.1"; sha256 = "119br3pd85lq8zcgh4f60jzmv1g976q1kdgi3hvqdlhfbw6siz2j"; })
+  (fetchNuGet { pname = "System.Runtime.CompilerServices.Unsafe"; version = "5.0.0"; sha256 = "02k25ivn50dmqx5jn8hawwmz24yf0454fjd823qk6lygj9513q4x"; })
+  (fetchNuGet { pname = "System.Runtime.CompilerServices.Unsafe"; version = "6.0.0"; sha256 = "0qm741kh4rh57wky16sq4m0v05fxmkjjr87krycf5vp9f0zbahbc"; })
+  (fetchNuGet { pname = "System.Runtime.CompilerServices.Unsafe"; version = "6.0.0-rc.1.21451.13"; sha256 = "0v5bc80p35jj5b5xdgsn5r1v4w68gqz0sahi214rprrrlr3sl206"; })
+  (fetchNuGet { pname = "System.Runtime.Extensions"; version = "4.1.0"; sha256 = "0rw4rm4vsm3h3szxp9iijc3ksyviwsv6f63dng3vhqyg4vjdkc2z"; })
+  (fetchNuGet { pname = "System.Runtime.Extensions"; version = "4.3.0"; sha256 = "1ykp3dnhwvm48nap8q23893hagf665k0kn3cbgsqpwzbijdcgc60"; })
+  (fetchNuGet { pname = "System.Runtime.Handles"; version = "4.3.0"; sha256 = "0sw2gfj2xr7sw9qjn0j3l9yw07x73lcs97p8xfc9w1x9h5g5m7i8"; })
+  (fetchNuGet { pname = "System.Runtime.InteropServices"; version = "4.3.0"; sha256 = "00hywrn4g7hva1b2qri2s6rabzwgxnbpw9zfxmz28z09cpwwgh7j"; })
+  (fetchNuGet { pname = "System.Runtime.InteropServices.RuntimeInformation"; version = "4.0.0"; sha256 = "0glmvarf3jz5xh22iy3w9v3wyragcm4hfdr17v90vs7vcrm7fgp6"; })
+  (fetchNuGet { pname = "System.Runtime.InteropServices.RuntimeInformation"; version = "4.3.0"; sha256 = "0q18r1sh4vn7bvqgd6dmqlw5v28flbpj349mkdish2vjyvmnb2ii"; })
+  (fetchNuGet { pname = "System.Runtime.Numerics"; version = "4.3.0"; sha256 = "19rav39sr5dky7afygh309qamqqmi9kcwvz3i0c5700v0c5cg61z"; })
+  (fetchNuGet { pname = "System.Security.AccessControl"; version = "4.5.0"; sha256 = "1wvwanz33fzzbnd2jalar0p0z3x0ba53vzx1kazlskp7pwyhlnq0"; })
+  (fetchNuGet { pname = "System.Security.AccessControl"; version = "5.0.0"; sha256 = "17n3lrrl6vahkqmhlpn3w20afgz09n7i6rv0r3qypngwi7wqdr5r"; })
+  (fetchNuGet { pname = "System.Security.Claims"; version = "4.3.0"; sha256 = "0jvfn7j22l3mm28qjy3rcw287y9h65ha4m940waaxah07jnbzrhn"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.Algorithms"; version = "4.3.0"; sha256 = "03sq183pfl5kp7gkvq77myv7kbpdnq3y0xj7vi4q1kaw54sny0ml"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.Cng"; version = "4.3.0"; sha256 = "1k468aswafdgf56ab6yrn7649kfqx2wm9aslywjam1hdmk5yypmv"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.Cng"; version = "5.0.0"; sha256 = "06hkx2za8jifpslkh491dfwzm5dxrsyxzj5lsc0achb6yzg4zqlw"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.Csp"; version = "4.3.0"; sha256 = "1x5wcrddf2s3hb8j78cry7yalca4lb5vfnkrysagbn6r9x6xvrx1"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.Encoding"; version = "4.3.0"; sha256 = "1jr6w70igqn07k5zs1ph6xja97hxnb3mqbspdrff6cvssgrixs32"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "0givpvvj8yc7gv4lhb6s1prq6p2c4147204a0wib89inqzd87gqc"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.Pkcs"; version = "5.0.0"; sha256 = "0hb2mndac3xrw3786bsjxjfh19bwnr991qib54k6wsqjhjyyvbwj"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.Primitives"; version = "4.3.0"; sha256 = "0pyzncsv48zwly3lw4f2dayqswcfvdwq2nz0dgwmi7fj3pn64wby"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.ProtectedData"; version = "4.4.0"; sha256 = "1q8ljvqhasyynp94a1d7jknk946m20lkwy2c3wa8zw2pc517fbj6"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.X509Certificates"; version = "4.3.0"; sha256 = "0valjcz5wksbvijylxijjxb1mp38mdhv03r533vnx1q3ikzdav9h"; })
+  (fetchNuGet { pname = "System.Security.Principal"; version = "4.3.0"; sha256 = "12cm2zws06z4lfc4dn31iqv7072zyi4m910d4r6wm8yx85arsfxf"; })
+  (fetchNuGet { pname = "System.Security.Principal.Windows"; version = "4.3.0"; sha256 = "00a0a7c40i3v4cb20s2cmh9csb5jv2l0frvnlzyfxh848xalpdwr"; })
+  (fetchNuGet { pname = "System.Security.Principal.Windows"; version = "4.5.0"; sha256 = "0rmj89wsl5yzwh0kqjgx45vzf694v9p92r4x4q6yxldk1cv1hi86"; })
+  (fetchNuGet { pname = "System.Security.Principal.Windows"; version = "5.0.0"; sha256 = "1mpk7xj76lxgz97a5yg93wi8lj0l8p157a5d50mmjy3gbz1904q8"; })
+  (fetchNuGet { pname = "System.Text.Encoding"; version = "4.0.11"; sha256 = "1dyqv0hijg265dwxg6l7aiv74102d6xjiwplh2ar1ly6xfaa4iiw"; })
+  (fetchNuGet { pname = "System.Text.Encoding"; version = "4.3.0"; sha256 = "1f04lkir4iladpp51sdgmis9dj4y8v08cka0mbmsy0frc9a4gjqr"; })
+  (fetchNuGet { pname = "System.Text.Encoding.CodePages"; version = "5.0.0"; sha256 = "1bn2pzaaq4wx9ixirr8151vm5hynn3lmrljcgjx9yghmm4k677k0"; })
+  (fetchNuGet { pname = "System.Text.Encoding.Extensions"; version = "4.3.0"; sha256 = "11q1y8hh5hrp5a3kw25cb6l00v5l5dvirkz8jr3sq00h1xgcgrxy"; })
+  (fetchNuGet { pname = "System.Text.Encodings.Web"; version = "7.0.0"; sha256 = "1151hbyrcf8kyg1jz8k9awpbic98lwz9x129rg7zk1wrs6vjlpxl"; })
+  (fetchNuGet { pname = "System.Text.Json"; version = "7.0.3"; sha256 = "0zjrnc9lshagm6kdb9bdh45dmlnkpwcpyssa896sda93ngbmj8k9"; })
+  (fetchNuGet { pname = "System.Text.RegularExpressions"; version = "4.3.0"; sha256 = "1bgq51k7fwld0njylfn7qc5fmwrk2137gdq7djqdsw347paa9c2l"; })
+  (fetchNuGet { pname = "System.Threading"; version = "4.0.11"; sha256 = "19x946h926bzvbsgj28csn46gak2crv2skpwsx80hbgazmkgb1ls"; })
+  (fetchNuGet { pname = "System.Threading"; version = "4.3.0"; sha256 = "0rw9wfamvhayp5zh3j7p1yfmx9b5khbf4q50d8k5rk993rskfd34"; })
+  (fetchNuGet { pname = "System.Threading.Channels"; version = "6.0.0"; sha256 = "1qbyi7yymqc56frqy7awvcqc1m7x3xrpx87a37dgb3mbrjg9hlcj"; })
+  (fetchNuGet { pname = "System.Threading.Channels"; version = "7.0.0"; sha256 = "1qrmqa6hpzswlmyp3yqsbnmia9i5iz1y208xpqc1y88b1f6j1v8a"; })
+  (fetchNuGet { pname = "System.Threading.Tasks"; version = "4.0.11"; sha256 = "0nr1r41rak82qfa5m0lhk9mp0k93bvfd7bbd9sdzwx9mb36g28p5"; })
+  (fetchNuGet { pname = "System.Threading.Tasks"; version = "4.3.0"; sha256 = "134z3v9abw3a6jsw17xl3f6hqjpak5l682k2vz39spj4kmydg6k7"; })
+  (fetchNuGet { pname = "System.Threading.Tasks.Extensions"; version = "4.3.0"; sha256 = "1xxcx2xh8jin360yjwm4x4cf5y3a2bwpn2ygkfkwkicz7zk50s2z"; })
+  (fetchNuGet { pname = "System.Threading.ThreadPool"; version = "4.3.0"; sha256 = "027s1f4sbx0y1xqw2irqn6x161lzj8qwvnh2gn78ciiczdv10vf1"; })
+  (fetchNuGet { pname = "System.Threading.Timer"; version = "4.3.0"; sha256 = "1nx773nsx6z5whv8kaa1wjh037id2f1cxhb69pvgv12hd2b6qs56"; })
+  (fetchNuGet { pname = "System.Xml.ReaderWriter"; version = "4.3.0"; sha256 = "0c47yllxifzmh8gq6rq6l36zzvw4kjvlszkqa9wq3fr59n0hl3s1"; })
+  (fetchNuGet { pname = "System.Xml.XDocument"; version = "4.3.0"; sha256 = "08h8fm4l77n0nd4i4fk2386y809bfbwqb7ih9d7564ifcxr5ssxd"; })
+  (fetchNuGet { pname = "TagLibSharp"; version = "2.3.0"; sha256 = "1z7v9lrkss1f8s42sclsq3az9zjihgmhyxnwhjyf0scgk1amngrw"; })
+  (fetchNuGet { pname = "Vk"; version = "1.0.25"; sha256 = "18kx3g088215803yznnmf6621wgwvgakj8hlmrb726b7zwb3x53l"; })
+  (fetchNuGet { pname = "Vortice.D3DCompiler"; version = "2.4.2"; sha256 = "07wdz77cb4c0f4bzzkd7fzkfl5jx6m6mnddpxgab8a95ryv60xrd"; })
+  (fetchNuGet { pname = "Vortice.Direct3D11"; version = "2.4.2"; sha256 = "18zyx9srbszah9hk8fkc1iws0hb5137gd77xi0qq9gx1nb62lkl5"; })
+  (fetchNuGet { pname = "Vortice.DirectX"; version = "2.4.2"; sha256 = "11yjyvyz922z1ygl8gxmdym3918df12nl7xxry4pdjpl8is33qic"; })
+  (fetchNuGet { pname = "Vortice.DXGI"; version = "2.4.2"; sha256 = "17vsnm9ca6nqk3f1dfpfvd6i6fp8x8v41bn65rchrzwcv1zzi6pz"; })
+  (fetchNuGet { pname = "Vortice.Mathematics"; version = "1.4.25"; sha256 = "0vl6g087disxyzskvkbnwym74s47lkza0ly3nk4y0y88zibcggrj"; })
+  (fetchNuGet { pname = "ZstdSharp.Port"; version = "0.7.2"; sha256 = "0ngngpjaxy3dnrz3mrfhkw52bp05n1xg4ckzf07yhc81hwzq1yi1"; })
+]
diff --git a/nixpkgs/pkgs/games/osu-lazer/osu.runtimeconfig.json b/nixpkgs/pkgs/games/osu-lazer/osu.runtimeconfig.json
new file mode 100644
index 000000000000..4148c494fbc7
--- /dev/null
+++ b/nixpkgs/pkgs/games/osu-lazer/osu.runtimeconfig.json
@@ -0,0 +1,9 @@
+{
+  "runtimeOptions": {
+    "tfm": "net6.0",
+    "framework": {
+      "name": "Microsoft.NETCore.App",
+      "version": "6.0.0"
+    }
+  }
+}
diff --git a/nixpkgs/pkgs/games/osu-lazer/update-bin.sh b/nixpkgs/pkgs/games/osu-lazer/update-bin.sh
new file mode 100755
index 000000000000..0aa5e97751b9
--- /dev/null
+++ b/nixpkgs/pkgs/games/osu-lazer/update-bin.sh
@@ -0,0 +1,40 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -I nixpkgs=../../../. -i bash -p unzip curl jq common-updater-scripts
+set -eo pipefail
+cd "$(dirname "${BASH_SOURCE[0]}")"
+
+bin_file="$(realpath ./bin.nix)"
+
+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' ./bin.nix)"
+if [[ "$new_version" == "$old_version" ]]; then
+    echo "Already up to date."
+    exit 0
+fi
+
+cd ../../..
+
+echo "Updating osu-lazer-bin from $old_version to $new_version..."
+sed -Ei.bak '/ *version = "/s/".+"/"'"$new_version"'"/' "$bin_file"
+rm "$bin_file.bak"
+
+for pair in \
+    'aarch64-darwin osu.app.Apple.Silicon.zip' \
+    'x86_64-darwin osu.app.Intel.zip' \
+    'x86_64-linux osu.AppImage'; do
+    set -- $pair
+    echo "Prefetching binary for $1..."
+    prefetch_output=$(nix --extra-experimental-features nix-command store prefetch-file --json --hash-type sha256 "https://github.com/ppy/osu/releases/download/$new_version/$2")
+    if [[ "$1" == *"darwin"* ]]; then
+        store_path=$(jq -r '.storePath' <<<"$prefetch_output")
+        tmpdir=$(mktemp -d)
+        unzip -q "$store_path" -d "$tmpdir"
+        hash=$(nix --extra-experimental-features nix-command hash path "$tmpdir")
+        rm -r "$tmpdir"
+    else
+        hash=$(jq -r '.hash' <<<"$prefetch_output")
+    fi
+    echo "$1 ($2): hash = $hash"
+    sed -Ei.bak '/ *'"$1"' = /{N;N; s@("sha256-)[^;"]+@"'"$hash"'@}' "$bin_file"
+    rm "$bin_file.bak"
+done
diff --git a/nixpkgs/pkgs/games/osu-lazer/update.sh b/nixpkgs/pkgs/games/osu-lazer/update.sh
new file mode 100755
index 000000000000..8e9849db1e16
--- /dev/null
+++ b/nixpkgs/pkgs/games/osu-lazer/update.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -I nixpkgs=../../../. -i bash -p curl jq common-updater-scripts
+set -eo pipefail
+cd "$(dirname "${BASH_SOURCE[0]}")"
+
+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"
+    exit 0
+fi
+
+cd ../../..
+
+if [[ "$1" != "--deps-only" ]]; then
+    update-source-version osu-lazer "$new_version"
+fi
+
+$(nix-build . -A osu-lazer.fetch-deps --no-out-link)
diff --git a/nixpkgs/pkgs/games/otto-matic/default.nix b/nixpkgs/pkgs/games/otto-matic/default.nix
new file mode 100644
index 000000000000..c56db251a1b0
--- /dev/null
+++ b/nixpkgs/pkgs/games/otto-matic/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv, fetchFromGitHub, SDL2, cmake, makeWrapper }:
+
+stdenv.mkDerivation rec {
+  pname = "OttoMatic";
+  version = "4.0.1";
+
+  src = fetchFromGitHub {
+    owner = "jorio";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-0mqOAdAmJGxKa6yXktrbmdXkoQIliimq37iy9bCBZYg=";
+    fetchSubmodules = true;
+  };
+
+  nativeBuildInputs = [
+    cmake
+    makeWrapper
+  ];
+
+  buildInputs = [
+    SDL2
+  ];
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p "$out/bin"
+    mkdir -p "$out/share/OttoMatic"
+    mv Data ReadMe.txt "$out/share/OttoMatic/"
+    install -Dm755 {.,$out/bin}/OttoMatic
+    wrapProgram $out/bin/OttoMatic --chdir "$out/share/OttoMatic"
+    install -Dm644 $src/packaging/io.jor.ottomatic.desktop $out/share/applications/io.jor.ottomatic.desktop
+    install -Dm644 $src/packaging/io.jor.ottomatic.png $out/share/pixmaps/io.jor.ottomatic.png
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "A port of Otto Matic, a 2001 Macintosh game by Pangea Software, for modern operating systems";
+    homepage = "https://github.com/jorio/OttoMatic";
+    license = licenses.cc-by-sa-40;
+    maintainers = with maintainers; [ lux ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/pacvim/default.nix b/nixpkgs/pkgs/games/pacvim/default.nix
new file mode 100644
index 000000000000..a4347550c1d2
--- /dev/null
+++ b/nixpkgs/pkgs/games/pacvim/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, fetchFromGitHub, fetchpatch, ncurses }:
+
+stdenv.mkDerivation {
+  pname = "pacvim";
+  version = "2018-05-16";
+  src = fetchFromGitHub {
+    owner = "jmoon018";
+    repo = "PacVim";
+    rev = "ca7c8833c22c5fe97974ba5247ef1fcc00cedb8e";
+    sha256 = "1kq6j7xmsl5qfl1246lyglkb2rs9mnb2rhsdrp18965dpbj2mhx2";
+  };
+  patches = [
+    # Fix pending upstream inclusion for ncurses-6.3 support:
+    #   https://github.com/jmoon018/PacVim/pull/53
+    (fetchpatch {
+      name = "ncurses-6.3.patch";
+      url = "https://github.com/jmoon018/PacVim/commit/760682824cdbb328af616ff43bf822ade23924f7.patch";
+      sha256 = "1y3928dc2nkfldqhpiqk0blbx7qj8ar35f1w7fb92qwxrj8p4i6g";
+    })
+  ];
+
+  buildInputs = [ ncurses ];
+  makeFlags = [ "PREFIX=$(out)" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/jmoon018/PacVim";
+    description = "A game that teaches you vim commands";
+    maintainers = with maintainers; [ infinisil ];
+    license = licenses.lgpl3;
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/games/papermc/default.nix b/nixpkgs/pkgs/games/papermc/default.nix
new file mode 100644
index 000000000000..20861779185c
--- /dev/null
+++ b/nixpkgs/pkgs/games/papermc/default.nix
@@ -0,0 +1,50 @@
+{
+  lib,
+  stdenvNoCC,
+  fetchurl,
+  jre,
+  makeBinaryWrapper,
+}:
+stdenvNoCC.mkDerivation (finalAttrs: {
+  pname = "papermc";
+  version = "1.20.2.234";
+
+  src =
+    let
+      mcVersion = lib.versions.pad 3 finalAttrs.version;
+      buildNum = builtins.elemAt (lib.splitVersion finalAttrs.version) 3;
+    in
+    fetchurl {
+      url = "https://papermc.io/api/v2/projects/paper/versions/${mcVersion}/builds/${buildNum}/downloads/paper-${mcVersion}-${buildNum}.jar";
+      hash = "sha256-fR7Dq09iFGVXodQjrS7Hg4NcrKPJbNg0hexU520JC6c=";
+    };
+
+  installPhase = ''
+    runHook preInstall
+
+    install -D $src $out/share/papermc/papermc.jar
+
+    makeWrapper ${lib.getExe jre} "$out/bin/minecraft-server" \
+      --append-flags "-jar $out/share/papermc/papermc.jar nogui"
+
+    runHook postInstall
+  '';
+
+  nativeBuildInputs = [
+    makeBinaryWrapper
+  ];
+
+  dontUnpack = true;
+  preferLocalBuild = true;
+  allowSubstitutes = false;
+
+  meta = {
+    description = "High-performance Minecraft Server";
+    homepage = "https://papermc.io/";
+    sourceProvenance = with lib.sourceTypes; [ binaryBytecode ];
+    license = lib.licenses.gpl3Only;
+    platforms = lib.platforms.unix;
+    maintainers = with lib.maintainers; [ aaronjanse neonfuz ];
+    mainProgram = "minecraft-server";
+  };
+})
diff --git a/nixpkgs/pkgs/games/path-of-building/default.nix b/nixpkgs/pkgs/games/path-of-building/default.nix
new file mode 100644
index 000000000000..a889b6f7ea74
--- /dev/null
+++ b/nixpkgs/pkgs/games/path-of-building/default.nix
@@ -0,0 +1,72 @@
+{ stdenv, lib, fetchFromGitHub, unzip, meson, ninja, pkg-config, qtbase, qttools, wrapQtAppsHook, luajit }:
+let
+  data = stdenv.mkDerivation(finalAttrs: {
+    pname = "path-of-building-data";
+    version = "2.38.4";
+
+    src = fetchFromGitHub {
+      owner = "PathOfBuildingCommunity";
+      repo = "PathOfBuilding";
+      rev = "v${finalAttrs.version}";
+      hash = "sha256-fCKOmP0PxhK2trBA1lyE6kf128FrsuCmBrXMIGTIt0U=";
+    };
+
+    nativeBuildInputs = [ unzip ];
+
+    buildCommand = ''
+      # I have absolutely no idea how this file is generated
+      # and I don't think I want to know. The Flatpak also does this.
+      unzip -j -d $out $src/runtime-win32.zip lua/sha1.lua
+
+      # Install the actual data
+      cp -r $src/src $src/runtime/lua/*.lua $src/manifest.xml $out
+
+      # Pretend this is an official build so we don't get the ugly "dev mode" warning
+      substituteInPlace $out/manifest.xml --replace '<Version' '<Version platform="nixos"'
+      touch $out/installed.cfg
+
+      # Completely stub out the update check
+      chmod +w $out/src/UpdateCheck.lua
+      echo 'return "none"' > $out/src/UpdateCheck.lua
+    '';
+  });
+in
+stdenv.mkDerivation {
+  pname = "path-of-building";
+  version = "${data.version}-unstable-2023-04-09";
+
+  src = fetchFromGitHub {
+    owner = "ernstp";
+    repo = "pobfrontend";
+    rev = "9faa19aa362f975737169824c1578d5011487c18";
+    hash = "sha256-zhw2PZ6ZNMgZ2hG+a6AcYBkeg7kbBHNc2eSt4if17Wk=";
+  };
+
+  nativeBuildInputs = [ meson ninja pkg-config qttools wrapQtAppsHook ];
+  buildInputs = [ qtbase luajit luajit.pkgs.lua-curl ];
+
+  installPhase = ''
+    runHook preInstall
+    install -Dm555 pobfrontend $out/bin/pobfrontend
+    runHook postInstall
+  '';
+
+  preFixup = ''
+    qtWrapperArgs+=(
+      --set LUA_PATH "$LUA_PATH"
+      --set LUA_CPATH "$LUA_CPATH"
+      --chdir "${data}"
+    )
+  '';
+
+  passthru.data = data;
+
+  meta = {
+    description = "Offline build planner for Path of Exile";
+    homepage = "https://pathofbuilding.community/";
+    license = lib.licenses.mit;
+    maintainers = [ lib.maintainers.k900 ];
+    mainProgram = "pobfrontend";
+    broken = stdenv.isDarwin;  # doesn't find uic6 for some reason
+  };
+}
diff --git a/nixpkgs/pkgs/games/pegasus-frontend/default.nix b/nixpkgs/pkgs/games/pegasus-frontend/default.nix
new file mode 100644
index 000000000000..855caa75dff2
--- /dev/null
+++ b/nixpkgs/pkgs/games/pegasus-frontend/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, fetchFromGitHub
+, stdenv
+, cmake
+, qtbase
+, qtgraphicaleffects
+, qtmultimedia
+, qtsvg
+, qttools
+, qtx11extras
+, SDL2
+, sqlite
+, wrapQtAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "pegasus-frontend";
+  version = "unstable-2023-05-22";
+
+  src = fetchFromGitHub {
+    owner = "mmatyas";
+    repo = "pegasus-frontend";
+    rev = "6421d7a75d29a82ea06008e4a08ec14e074430d9";
+    fetchSubmodules = true;
+    sha256 = "sha256-mwJm+3zMP4alcis7OFQUcH3eXlRTZhoZYtxKrvCQGc8=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    qttools
+    wrapQtAppsHook
+  ];
+
+  buildInputs = [
+    qtbase
+    qtmultimedia
+    qtsvg
+    qtgraphicaleffects
+    qtx11extras
+    sqlite
+    SDL2
+  ];
+
+  meta = with lib; {
+    description = "A cross platform, customizable graphical frontend for launching emulators and managing your game collection.";
+    homepage = "https://pegasus-frontend.org/";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ tengkuizdihar ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/pentobi/default.nix b/nixpkgs/pkgs/games/pentobi/default.nix
new file mode 100644
index 000000000000..e0bd6909fb94
--- /dev/null
+++ b/nixpkgs/pkgs/games/pentobi/default.nix
@@ -0,0 +1,38 @@
+{ lib, mkDerivation, appstream, fetchFromGitHub, cmake, gettext, libxslt, librsvg, itstool
+, qtbase, qtquickcontrols2, qtsvg, qttools, qtwebview, docbook_xsl
+}:
+
+mkDerivation rec {
+  version = "20.0";
+  pname = "pentobi";
+
+  src = fetchFromGitHub {
+    owner = "enz";
+    repo = "pentobi";
+    rev = "v${version}";
+    sha256 = "sha256-DQM3IJ0pRkX4OsrjZGROg50LfKb621UnpvtqSjxchz8=";
+  };
+
+  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/"
+    substituteInPlace pentobi/unix/CMakeLists.txt --replace "/manpages" "/share/xml/docbook-xsl/manpages/"
+    substituteInPlace pentobi/docbook/CMakeLists.txt --replace "/html" "/share/xml/docbook-xsl/html"
+  '';
+
+  cmakeFlags = [
+    "-DCMAKE_VERBOSE_MAKEFILE=1"
+    "-DDOCBOOKXSL_DIR=${docbook_xsl}"
+    "-DMETAINFO_ITS=${appstream}/share/gettext/its/metainfo.its"
+  ];
+
+  meta = with lib; {
+    description = "A computer opponent for the board game Blokus";
+    homepage = "https://pentobi.sourceforge.io";
+    license = licenses.gpl3Plus;
+    maintainers = [ ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/performous/default.nix b/nixpkgs/pkgs/games/performous/default.nix
new file mode 100644
index 000000000000..c82e1d02afc7
--- /dev/null
+++ b/nixpkgs/pkgs/games/performous/default.nix
@@ -0,0 +1,86 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, SDL2
+, aubio
+, boost
+, cmake
+, ffmpeg
+, fmt
+, gettext
+, glew
+, glibmm
+, glm
+, icu
+, libepoxy
+, librsvg
+, libxmlxx
+, nlohmann_json
+, pango
+, pkg-config
+, portaudio
+}:
+
+stdenv.mkDerivation rec {
+  pname = "performous";
+  version = "1.3.0";
+
+  src = fetchFromGitHub {
+    owner = "performous";
+    repo = "performous";
+    rev = "refs/tags/${version}";
+    hash = "sha256-y7kxLht15vULN9NxM0wzj9+7Uq4/3D5j9oBEnrTIwQ8=";
+  };
+
+  cedSrc = fetchFromGitHub {
+    owner = "performous";
+    repo = "compact_enc_det";
+    rev = "9ca1351fe0b1e85992a407b0fc54a63e9b3adc6e";
+    hash = "sha256-ztfeblR4YnB5+lb+rwOQJjogl+C9vtPH9IVnYO7oxec=";
+  };
+
+  patches = [
+    ./performous-cmake.patch
+    ./performous-fftw.patch
+  ];
+
+  postPatch = ''
+    mkdir ced-src
+    cp -R ${cedSrc}/* ced-src
+
+    substituteInPlace data/CMakeLists.txt \
+      --replace "/usr" "$out"
+  '';
+
+  nativeBuildInputs = [
+    cmake
+    gettext
+    pkg-config
+  ];
+
+  buildInputs = [
+    SDL2
+    aubio
+    boost
+    ffmpeg
+    fmt
+    glew
+    glibmm
+    glm
+    icu
+    libepoxy
+    librsvg
+    libxmlxx
+    nlohmann_json
+    pango
+    portaudio
+  ];
+
+  meta = with lib; {
+    description = "Karaoke, band and dancing game";
+    homepage = "https://performous.org/";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ wegank ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/performous/performous-cmake.patch b/nixpkgs/pkgs/games/performous/performous-cmake.patch
new file mode 100644
index 000000000000..dae399cd54de
--- /dev/null
+++ b/nixpkgs/pkgs/games/performous/performous-cmake.patch
@@ -0,0 +1,17 @@
+diff --git a/cmake/Modules/FindCed.cmake b/cmake/Modules/FindCed.cmake
+index d6e2aca..3085adb 100644
+--- a/cmake/Modules/FindCed.cmake
++++ b/cmake/Modules/FindCed.cmake
+@@ -1,11 +1 @@
+-include(LibFetchMacros)
+-
+-set(Ced_GIT_VERSION "master")
+-
+-libfetch_git_pkg(Ced
+-	REPOSITORY ${SELF_BUILT_GIT_BASE}/compact_enc_det.git
+-	#https://github.com/google/compact_enc_det.git
+-	REFERENCE  ${Ced_GIT_VERSION}
+-	FIND_PATH  compact_enc_det/compact_enc_det.h
+-)
+-message(STATUS "Found Google CED ${Ced_VERSION}")
++add_subdirectory(../ced-src ced-src)
diff --git a/nixpkgs/pkgs/games/performous/performous-fftw.patch b/nixpkgs/pkgs/games/performous/performous-fftw.patch
new file mode 100644
index 000000000000..f24808ae80d0
--- /dev/null
+++ b/nixpkgs/pkgs/games/performous/performous-fftw.patch
@@ -0,0 +1,15 @@
+diff --git a/game/audio.cc b/game/audio.cc
+index da810488..d7f3d072 100644
+--- a/game/audio.cc
++++ b/game/audio.cc
+@@ -121,8 +121,8 @@ Music::Music(Audio::Files const& files, unsigned int sr, bool preview): srate(sr
+ 	suppressCenterChannel = config["audio/suppress_center_channel"].b();
+ }
+ 
+-unsigned Audio::aubio_win_size = 1536;
+-unsigned Audio::aubio_hop_size = 768;
++unsigned Audio::aubio_win_size = 2048;
++unsigned Audio::aubio_hop_size = 1024;
+ 
+ std::unique_ptr<aubio_tempo_t, void(*)(aubio_tempo_t*)> Audio::aubioTempo =
+ 					std::unique_ptr<aubio_tempo_t, void(*)(aubio_tempo_t*)>(
diff --git a/nixpkgs/pkgs/games/pinball/default.nix b/nixpkgs/pkgs/games/pinball/default.nix
new file mode 100644
index 000000000000..488a3b30a588
--- /dev/null
+++ b/nixpkgs/pkgs/games/pinball/default.nix
@@ -0,0 +1,41 @@
+{ 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}"
+  ];
+
+  env.NIX_CFLAGS_COMPILE = toString [
+    "-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/nixpkgs/pkgs/games/pingus/default.nix b/nixpkgs/pkgs/games/pingus/default.nix
new file mode 100644
index 000000000000..fd0ebddfc32f
--- /dev/null
+++ b/nixpkgs/pkgs/games/pingus/default.nix
@@ -0,0 +1,22 @@
+{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 pkg-config git ];
+  buildInputs = [ SDL2 SDL2_image boost libpng SDL2_mixer libGLU libGL jsoncpp ];
+  src = fetchgit {
+    url = "https://gitlab.com/pingus/pingus/";
+    rev = "709546d9b9c4d6d5f45fc9112b45ac10c7f9417d";
+    sha256 = "11mmzk0766riaw5qyd1r5i7s7vczbbzfccm92bvgrm99iy1sj022";
+    fetchSubmodules = true;
+  };
+
+  meta = {
+    description = "A puzzle game with mechanics similar to Lemmings";
+    platforms = lib.platforms.linux;
+    maintainers = [lib.maintainers.raskin];
+    license = lib.licenses.gpl3;
+  };
+}
diff --git a/nixpkgs/pkgs/games/pioneer/default.nix b/nixpkgs/pkgs/games/pioneer/default.nix
new file mode 100644
index 000000000000..b70ef8c3dab6
--- /dev/null
+++ b/nixpkgs/pkgs/games/pioneer/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, pkg-config
+, assimp
+, curl
+, freetype
+#, glew
+, libGL
+, libGLU
+, libpng
+, libsigcxx
+, libvorbis
+, lua5_2
+, mesa
+, SDL2
+, SDL2_image
+}:
+
+stdenv.mkDerivation rec {
+  pname = "pioneer";
+  version = "20220203";
+
+  src = fetchFromGitHub{
+    owner = "pioneerspacesim";
+    repo = "pioneer";
+    rev = version;
+    hash = "sha256-HNVg8Lq6k6gQDmgOdpnBwJ57WSEnn5XwtqzmkDU1WGI=";
+  };
+
+  postPatch = ''
+    substituteInPlace CMakeLists.txt \
+      --replace 'string(TIMESTAMP PROJECT_VERSION "%Y%m%d")' 'set(PROJECT_VERSION ${version})'
+  '';
+
+  nativeBuildInputs = [ cmake pkg-config ];
+
+  buildInputs = [
+    assimp
+    curl
+    freetype
+    libGL
+    libGLU
+    libpng
+    libsigcxx
+    libvorbis
+    lua5_2
+    mesa
+    SDL2
+    SDL2_image
+  ];
+
+  cmakeFlags = [
+    "-DPIONEER_DATA_DIR:PATH=${placeholder "out"}/share/pioneer/data"
+    "-DUSE_SYSTEM_LIBLUA:BOOL=YES"
+  ];
+
+  makeFlags = [ "all" "build-data" ];
+
+  meta = with lib; {
+    description = "A space adventure game set in the Milky Way galaxy at the turn of the 31st century";
+    homepage = "https://pioneerspacesim.net";
+    license = with licenses; [
+        gpl3Only cc-by-sa-30
+    ];
+    platforms = [ "x86_64-linux" "i686-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/pioneers/default.nix b/nixpkgs/pkgs/games/pioneers/default.nix
new file mode 100644
index 000000000000..f4122dc6bfb7
--- /dev/null
+++ b/nixpkgs/pkgs/games/pioneers/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv
+, fetchurl
+, pkg-config
+, intltool
+, itstool
+, gtk3
+, libxml2
+}:
+
+stdenv.mkDerivation rec {
+  pname = "pioneers";
+  version = "15.6";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/pio/${pname}-${version}.tar.gz";
+    sha256 = "07b3xdd81n8ybsb4fzc5lx0813y9crzp1hj69khncf4faj48sdcs";
+  };
+
+  nativeBuildInputs = [ pkg-config intltool itstool ];
+
+  buildInputs = [ gtk3 libxml2 ];
+
+  meta = with lib; {
+    description = "Addicting game based on The Settlers of Catan";
+    homepage = "https://pio.sourceforge.net/";  # https does not work
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ viric ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/planetaryannihilation/default.nix b/nixpkgs/pkgs/games/planetaryannihilation/default.nix
new file mode 100644
index 000000000000..73adffab475a
--- /dev/null
+++ b/nixpkgs/pkgs/games/planetaryannihilation/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv, config, fetchurl, patchelf, makeWrapper, gtk2, glib, udev, alsa-lib, atk
+, nspr, fontconfig, cairo, pango, nss, freetype, gnome2, gdk-pixbuf, curl, systemd, xorg, requireFile }:
+
+stdenv.mkDerivation rec {
+  pname = "planetary-annihalation";
+  version = "62857";
+
+  src = requireFile {
+    message = "This file has to be downloaded manually via nix-prefetch-url.";
+    name = "PA_Linux_${version}.tar.bz2";
+    sha256 = "0imi3k5144dsn3ka9khx3dj76klkw46ga7m6rddqjk4yslwabh3k";
+  };
+
+  nativeBuildInputs = [ patchelf makeWrapper ];
+
+  installPhase = ''
+    mkdir -p $out/{bin,lib}
+
+    cp -R * $out/
+    mv $out/*.so $out/lib
+    ln -s $out/PA $out/bin/PA
+
+    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 "${lib.makeLibraryPath [ stdenv.cc.cc.lib xorg.libXdamage xorg.libXfixes gtk2 glib stdenv.cc.libc "$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.cc.libc}/lib64" "$out/host/CoherentUI_Host"
+
+    wrapProgram $out/PA --prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath [ stdenv.cc.cc.lib stdenv.cc.libc xorg.libX11 xorg.libXcursor gtk2 glib curl "$out" ]}:${stdenv.cc.cc.lib}/lib64:${stdenv.cc.libc}/lib64"
+
+    for f in $out/lib/*; do
+      patchelf --set-rpath "${lib.makeLibraryPath [ stdenv.cc.cc.lib curl xorg.libX11 stdenv.cc.libc xorg.libXcursor "$out" ]}:${stdenv.cc.cc.lib}/lib64:${stdenv.cc.libc}/lib64" $f
+    done
+  '';
+
+  meta = with lib; {
+    homepage = "http://www.uberent.com/pa/";
+    description = "Next-generation RTS that takes the genre to a planetary scale";
+    license = lib.licenses.unfree;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/pokerth/default.nix b/nixpkgs/pkgs/games/pokerth/default.nix
new file mode 100644
index 000000000000..021fe4100eae
--- /dev/null
+++ b/nixpkgs/pkgs/games/pokerth/default.nix
@@ -0,0 +1,74 @@
+{ lib, mkDerivation, fetchFromGitHub, fetchpatch, qmake, qtbase
+, SDL, SDL_mixer, boost, curl, gsasl, libgcrypt, libircclient, protobuf, sqlite
+, wrapQtAppsHook
+, tinyxml2, target ? "client" }:
+
+mkDerivation rec {
+  pname = "pokerth-${target}";
+  version = "1.1.2";
+
+  src = fetchFromGitHub {
+    owner = "pokerth";
+    repo = "pokerth";
+    rev = "v${version}";
+    hash = "sha256-j4E3VMpaPqX7+hE3wYRZZUeRD//F+K2Gp8oPmJqX5FQ=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "pokerth-1.1.2.patch";
+      url = "https://aur.archlinux.org/cgit/aur.git/plain/pokerth-1.1.2.patch?h=pokerth&id=7734029cf9c6ef58f42ed873e1b9c3c19eb1df3b";
+      hash = "sha256-we2UOCFF5J/Wlji/rJeCHDu/dNsUU+R+bTw83AmvDxs=";
+    })
+    (fetchpatch {
+      name = "pokerth-1.1.2.patch.2019";
+      url = "https://aur.archlinux.org/cgit/aur.git/plain/pokerth-1.1.2.patch.2019?h=pokerth&id=7734029cf9c6ef58f42ed873e1b9c3c19eb1df3b";
+      hash = "sha256-m6uFPmPC3T9kV7EI1p33vQSi0d/w+YCH0dKjviAphMY=";
+    })
+    (fetchpatch {
+      name = "pokerth-1.1.2.patch.2020";
+      url = "https://aur.archlinux.org/cgit/aur.git/plain/pokerth-1.1.2.patch.2020?h=pokerth&id=7734029cf9c6ef58f42ed873e1b9c3c19eb1df3b";
+      hash = "sha256-I2qrgLGSMvFDHyUZFWGPGnuecZ914NBf2uGK02X/wOg=";
+    })
+  ];
+
+  postPatch = ''
+    for f in *.pro; do
+      substituteInPlace $f \
+        --replace '$$'{PREFIX}/include/libircclient ${libircclient.dev}/include/libircclient \
+        --replace 'LIB_DIRS =' 'LIB_DIRS = ${boost.out}/lib' \
+        --replace /opt/gsasl ${gsasl}
+    done
+  '';
+
+  nativeBuildInputs = [ qmake wrapQtAppsHook ];
+
+  buildInputs = [
+    SDL
+    SDL_mixer
+    boost
+    curl
+    gsasl
+    libgcrypt
+    libircclient
+    protobuf
+    qtbase
+    sqlite
+    tinyxml2
+  ];
+
+  qmakeFlags = [
+    "CONFIG+=${target}"
+    "pokerth.pro"
+  ];
+
+  env.NIX_CFLAGS_COMPILE = "-I${lib.getDev SDL}/include/SDL";
+
+  meta = with lib; {
+    homepage = "https://www.pokerth.net";
+    description = "Poker game ${target}";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ obadz yana ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/games/pokete/default.nix b/nixpkgs/pkgs/games/pokete/default.nix
new file mode 100644
index 000000000000..73ff661e9d09
--- /dev/null
+++ b/nixpkgs/pkgs/games/pokete/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, python3
+, fetchFromGitHub
+, testers
+, pokete
+, faketty
+}:
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "pokete";
+  version = "0.9.1";
+
+  format = "other";
+
+  src = fetchFromGitHub {
+    owner = "lxgr-linux";
+    repo = "pokete";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-T18908Einsgful8hYMVHl0cL4sIYFvhpy0MbLIcVhxs=";
+  };
+
+  pythonPath = with python3.pkgs; [
+    scrap-engine
+    pynput
+  ];
+
+  buildPhase = ''
+    ${python3.interpreter} -O -m compileall .
+  '';
+
+  installPhase = ''
+    mkdir -p $out/share/pokete
+    cp -r assets pokete_classes pokete_data mods *.py $out/share/pokete/
+    mkdir -p $out/bin
+    ln -s $out/share/pokete/pokete.py $out/bin/pokete
+  '';
+
+  postFixup = ''
+    wrapPythonProgramsIn $out/share/pokete "$pythonPath"
+  '';
+
+  passthru.tests = {
+    pokete-version = testers.testVersion {
+      package = pokete;
+      command = "${faketty}/bin/faketty pokete --help";
+      version = "v${version}";
+    };
+  };
+
+  meta = with lib; {
+    description = "A terminal based Pokemon like game";
+    homepage = "https://lxgr-linux.github.io/pokete";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ fgaz ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/pong3d/default.nix b/nixpkgs/pkgs/games/pong3d/default.nix
new file mode 100644
index 000000000000..9e965c95482a
--- /dev/null
+++ b/nixpkgs/pkgs/games/pong3d/default.nix
@@ -0,0 +1,24 @@
+{lib, stdenv, fetchurl, libX11}:
+
+stdenv.mkDerivation rec {
+  pname = "3dpong";
+  version = "0.5";
+  src = fetchurl {
+    url = "ftp://ftp.tuxpaint.org/unix/x/3dpong/src/3dpong-${version}.tar.gz";
+    sha256 = "1ibb79sbzlbn4ra3n0qk22gqr6fg7q0jy6cm0wg2qj4z64c7hmdi";
+  };
+
+  buildInputs = [ libX11 ];
+
+  preConfigure = ''
+    sed -i s,/usr/local,$out, Makefile
+    mkdir -p $out/bin
+  '';
+
+  meta = {
+    homepage = "http://www.newbreedsoftware.com/3dpong/";
+    description = "One or two player 3d sports game based on Pong from Atari";
+    license = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/portmod/default.nix b/nixpkgs/pkgs/games/portmod/default.nix
new file mode 100644
index 000000000000..f9631c6d764f
--- /dev/null
+++ b/nixpkgs/pkgs/games/portmod/default.nix
@@ -0,0 +1,127 @@
+{ lib
+, bubblewrap
+, cacert
+, fetchFromGitLab
+, git
+, imagemagick
+, openmw
+, python3Packages
+, rustPlatform
+, tes3cmd
+, tr-patcher
+}:
+
+let
+  version = "2.6.2";
+
+  src = fetchFromGitLab {
+    owner = "portmod";
+    repo = "Portmod";
+    rev = "v${version}";
+    hash = "sha256-ufr2guaPdCvI5JOicL/lTrT3t6UlaY1hEB2xbwzhw6A=";
+  };
+
+  portmod-rust = rustPlatform.buildRustPackage rec {
+    inherit src version;
+    pname = "portmod-rust";
+
+    cargoHash = "sha256-sAjgGVVjgXaWbmN/eGEvatYjkHeFTZNX1GXFcJqs3GI=";
+
+    nativeBuildInputs = [
+      python3Packages.python
+    ];
+
+    doCheck = false;
+  };
+
+  bin-programs = [
+    bubblewrap
+    git
+    python3Packages.virtualenv
+    tr-patcher
+    tes3cmd
+    imagemagick
+    openmw
+  ];
+
+in
+python3Packages.buildPythonApplication rec {
+  inherit src version;
+
+  pname = "portmod";
+  format = "pyproject";
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  # build the rust library independantly
+  prePatch = ''
+    substituteInPlace setup.py \
+      --replace "from setuptools_rust import Binding, RustExtension, Strip" "" \
+      --replace "RustExtension(\"portmodlib.portmod\", binding=Binding.PyO3, strip=Strip.Debug)" ""
+
+    substituteInPlace pyproject.toml \
+      --replace '"setuptools-rust"' ""
+  '';
+
+  nativeBuildInputs = with python3Packages; [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = with python3Packages; [
+    setuptools-scm
+    setuptools
+    requests
+    chardet
+    colorama
+    deprecated
+    restrictedpython
+    appdirs
+    gitpython
+    progressbar2
+    python-sat
+    redbaron
+    patool
+    packaging
+    fasteners
+  ];
+
+  nativeCheckInputs = with python3Packages; [
+    pytestCheckHook
+  ] ++ bin-programs;
+
+  preCheck = ''
+    cp ${portmod-rust}/lib/libportmod.so portmodlib/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"
+    "test_sync"
+    "test_manifest"
+    "test_add_repo"
+    "test_init_prefix_interactive"
+    "test_scan_sources"
+    "test_unpack"
+  ];
+
+  # for some reason, installPhase doesn't copy the compiled binary
+  postInstall = ''
+    cp ${portmod-rust}/lib/libportmod.so $out/${python3Packages.python.sitePackages}/portmodlib/portmod.so
+
+    makeWrapperArgs+=("--prefix" "GIT_SSL_CAINFO" ":" "${cacert}/etc/ssl/certs/ca-bundle.crt" \
+      "--prefix" "PATH" ":" "${lib.makeBinPath bin-programs }")
+  '';
+
+  meta = with lib; {
+    description = "mod manager for openMW based on portage";
+    homepage = "https://gitlab.com/portmod/portmod";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ marius851000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/powermanga/default.nix b/nixpkgs/pkgs/games/powermanga/default.nix
new file mode 100644
index 000000000000..25a1df5211a3
--- /dev/null
+++ b/nixpkgs/pkgs/games/powermanga/default.nix
@@ -0,0 +1,59 @@
+{ 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;
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/games/principia/default.nix b/nixpkgs/pkgs/games/principia/default.nix
new file mode 100644
index 000000000000..3cf98dada027
--- /dev/null
+++ b/nixpkgs/pkgs/games/principia/default.nix
@@ -0,0 +1,98 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, autoreconfHook
+, pkg-config
+
+, curl
+, freetype
+, glew
+, gtk2
+, libGL
+, libjpeg
+, libpng
+, SDL2
+, SDL2_gfx
+, SDL2_image
+, SDL2_mixer
+, SDL2_ttf
+}:
+
+stdenv.mkDerivation {
+  pname = "principia";
+  version = "unstable-2023-03-21";
+
+  src = fetchFromGitHub {
+    owner = "Bithack";
+    repo = "principia";
+    rev = "af2cfda21b6ce4c0725700e2a01b0597a97dbeff";
+    hash = "sha256-jBWdXzbPpk23elHcs5sWkxXfkekj+aa24VvEHzid8KE=";
+  };
+
+  nativeBuildInputs = [
+    autoreconfHook
+    pkg-config
+  ];
+
+  buildInputs = [
+    curl
+    freetype
+    glew
+    gtk2
+    libGL
+    libjpeg
+    libpng
+    SDL2
+    SDL2_gfx
+    SDL2_image
+    SDL2_mixer
+    SDL2_ttf
+  ];
+
+  preAutoreconf = ''
+    cd build-linux
+  '';
+
+  # Since we bypass the "build-linux/go" wrapper script so we can use nixpkgs'
+  # autotools/make integration, set the release flags manually.
+  # https://github.com/Bithack/principia/issues/98
+  preBuild = ''
+    RELEASE_SHARED="-ffast-math -DNDEBUG=1 -s -fomit-frame-pointer -fvisibility=hidden -fdata-sections -ffunction-sections"
+    makeFlagsArray+=(
+      CFLAGS="$RELEASE_SHARED -O1"
+      CXXFLAGS="$RELEASE_SHARED -O2 -fvisibility-inlines-hidden -fno-rtti"
+      LDFLAGS="-Wl,-O,-s,--gc-sections"
+    )
+  '';
+
+  # `make install` only installs the binary, and the binary looks for data
+  # files in its same directory, so we override installPhase, install the
+  # binary in $out/share, and link to it from $out/bin
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/bin
+    mkdir -p $out/share/principia
+    install -Dm755 principia $out/share/principia/principia
+    ln -s $out/share/principia/principia $out/bin/principia
+
+    cp -r --dereference data-pc data-shared $out/share/principia/
+    install -Dm644 principia.desktop $out/share/applications/principia.desktop
+    install -Dm644 principia-url-handler.desktop $out/share/applications/principia-url-handler.desktop
+    install -Dm644 principia.png $out/share/pixmaps/principia.png
+
+    runHook postInstall
+  '';
+
+  # The actual binary is here, see comment above installPhase
+  stripDebugList = [ "share/principia" ];
+
+  meta = with lib; {
+    description = "Physics-based sandbox game";
+    homepage = "https://principia-web.se/";
+    downloadPage = "https://principia-web.se/download";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.fgaz ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/prismlauncher/default.nix b/nixpkgs/pkgs/games/prismlauncher/default.nix
new file mode 100644
index 000000000000..c6378fbc368f
--- /dev/null
+++ b/nixpkgs/pkgs/games/prismlauncher/default.nix
@@ -0,0 +1,86 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, canonicalize-jars-hook
+, cmake
+, cmark
+, Cocoa
+, ninja
+, jdk17
+, zlib
+, qtbase
+, quazip
+, extra-cmake-modules
+, tomlplusplus
+, ghc_filesystem
+, gamemode
+, msaClientID ? null
+, gamemodeSupport ? stdenv.isLinux
+,
+}:
+let
+  libnbtplusplus = fetchFromGitHub {
+    owner = "PrismLauncher";
+    repo = "libnbtplusplus";
+    rev = "a5e8fd52b8bf4ab5d5bcc042b2a247867589985f";
+    hash = "sha256-A5kTgICnx+Qdq3Fir/bKTfdTt/T1NQP2SC+nhN1ENug=";
+  };
+in
+
+assert lib.assertMsg (stdenv.isLinux || !gamemodeSupport) "gamemodeSupport is only available on Linux";
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "prismlauncher-unwrapped";
+  version = "8.0";
+
+  src = fetchFromGitHub {
+    owner = "PrismLauncher";
+    repo = "PrismLauncher";
+    rev = finalAttrs.version;
+    hash = "sha256-WBajtfj3qAMq8zd2S53CQyHiyqtvffLOHOjmOpdALAA=";
+  };
+
+  nativeBuildInputs = [ extra-cmake-modules cmake jdk17 ninja canonicalize-jars-hook ];
+  buildInputs =
+    [
+      qtbase
+      zlib
+      quazip
+      ghc_filesystem
+      tomlplusplus
+      cmark
+    ]
+    ++ lib.optional gamemodeSupport gamemode
+    ++ lib.optionals stdenv.isDarwin [ Cocoa ];
+
+  hardeningEnable = lib.optionals stdenv.isLinux [ "pie" ];
+
+  cmakeFlags = [
+    # downstream branding
+    "-DLauncher_BUILD_PLATFORM=nixpkgs"
+  ] ++ lib.optionals (msaClientID != null) [ "-DLauncher_MSA_CLIENT_ID=${msaClientID}" ]
+  ++ lib.optionals (lib.versionOlder qtbase.version "6") [ "-DLauncher_QT_VERSION_MAJOR=5" ]
+  ++ lib.optionals stdenv.isDarwin [ "-DINSTALL_BUNDLE=nodeps" "-DMACOSX_SPARKLE_UPDATE_FEED_URL=''" ];
+
+  postUnpack = ''
+    rm -rf source/libraries/libnbtplusplus
+    ln -s ${libnbtplusplus} source/libraries/libnbtplusplus
+  '';
+
+  dontWrapQtApps = true;
+
+  meta = {
+    mainProgram = "prismlauncher";
+    homepage = "https://prismlauncher.org/";
+    description = "A free, open source launcher for Minecraft";
+    longDescription = ''
+      Allows you to have multiple, separate instances of Minecraft (each with
+      their own mods, texture packs, saves, etc) and helps you manage them and
+      their associated options with a simple interface.
+    '';
+    platforms = with lib.platforms; linux ++ darwin;
+    changelog = "https://github.com/PrismLauncher/PrismLauncher/releases/tag/${finalAttrs.version}";
+    license = lib.licenses.gpl3Only;
+    maintainers = with lib.maintainers; [ minion3665 Scrumplex getchoo ];
+  };
+})
diff --git a/nixpkgs/pkgs/games/prismlauncher/wrapper.nix b/nixpkgs/pkgs/games/prismlauncher/wrapper.nix
new file mode 100644
index 000000000000..dafe7276af88
--- /dev/null
+++ b/nixpkgs/pkgs/games/prismlauncher/wrapper.nix
@@ -0,0 +1,127 @@
+{ lib
+, stdenv
+, symlinkJoin
+, makeWrapper
+, wrapQtAppsHook
+, addOpenGLRunpath
+
+, prismlauncher-unwrapped
+
+, qtbase  # needed for wrapQtAppsHook
+, qtsvg
+, qtwayland
+, xorg
+, libpulseaudio
+, libGL
+, glfw
+, glfw-wayland-minecraft
+, openal
+, jdk8
+, jdk17
+, gamemode
+, flite
+, mesa-demos
+, pciutils
+, udev
+, libusb1
+
+, msaClientID ? null
+, gamemodeSupport ? stdenv.isLinux
+, textToSpeechSupport ? stdenv.isLinux
+, controllerSupport ? stdenv.isLinux
+
+  # Adds `glfw-wayland-minecraft` to `LD_LIBRARY_PATH`
+  # when launched on wayland, allowing for the game to be run natively.
+  # Make sure to enable "Use system installation of GLFW" in instance settings
+  # for this to take effect
+  #
+  # Warning: This build of glfw may be unstable, and the launcher
+  # itself can take slightly longer to start
+, withWaylandGLFW ? false
+
+, jdks ? [ jdk17 jdk8 ]
+, additionalLibs ? [ ]
+, additionalPrograms ? [ ]
+}:
+
+assert lib.assertMsg (withWaylandGLFW -> stdenv.isLinux) "withWaylandGLFW is only available on Linux";
+
+let
+  prismlauncher' = prismlauncher-unwrapped.override {
+    inherit msaClientID gamemodeSupport;
+  };
+in
+
+symlinkJoin {
+  name = "prismlauncher-${prismlauncher'.version}";
+
+  paths = [ prismlauncher' ];
+
+  nativeBuildInputs = [
+    wrapQtAppsHook
+  ]
+  # purposefully using a shell wrapper here for variable expansion
+  # see https://github.com/NixOS/nixpkgs/issues/172583
+  ++ lib.optional withWaylandGLFW makeWrapper;
+
+  buildInputs = [
+    qtbase
+    qtsvg
+  ]
+  ++ lib.optional (lib.versionAtLeast qtbase.version "6" && stdenv.isLinux) qtwayland;
+
+  waylandPreExec = ''
+    if [ -n "$WAYLAND_DISPLAY" ]; then
+      export LD_LIBRARY_PATH=${lib.getLib glfw-wayland-minecraft}/lib:"$LD_LIBRARY_PATH"
+    fi
+  '';
+
+  postBuild = ''
+    ${lib.optionalString withWaylandGLFW ''
+      qtWrapperArgs+=(--run "$waylandPreExec")
+    ''}
+
+    wrapQtAppsHook
+  '';
+
+  qtWrapperArgs =
+    let
+      runtimeLibs = [
+        xorg.libX11
+        xorg.libXext
+        xorg.libXcursor
+        xorg.libXrandr
+        xorg.libXxf86vm
+
+        # lwjgl
+        libpulseaudio
+        libGL
+        glfw
+        openal
+        stdenv.cc.cc.lib
+
+        # oshi
+        udev
+      ]
+      ++ lib.optional gamemodeSupport gamemode.lib
+      ++ lib.optional textToSpeechSupport flite
+      ++ lib.optional controllerSupport libusb1
+      ++ additionalLibs;
+
+      runtimePrograms = [
+        xorg.xrandr
+        mesa-demos # need glxinfo
+        pciutils # need lspci
+      ]
+      ++ additionalPrograms;
+
+    in
+    [ "--prefix PRISMLAUNCHER_JAVA_PATHS : ${lib.makeSearchPath "bin/java" jdks}" ]
+    ++ lib.optionals stdenv.isLinux [
+      "--set LD_LIBRARY_PATH ${addOpenGLRunpath.driverLink}/lib:${lib.makeLibraryPath runtimeLibs}"
+      # xorg.xrandr needed for LWJGL [2.9.2, 3) https://github.com/LWJGL/lwjgl/issues/128
+      "--prefix PATH : ${lib.makeBinPath runtimePrograms}"
+    ];
+
+  inherit (prismlauncher') meta;
+}
diff --git a/nixpkgs/pkgs/games/pro-office-calculator/default.nix b/nixpkgs/pkgs/games/pro-office-calculator/default.nix
new file mode 100644
index 000000000000..381a6e8742b0
--- /dev/null
+++ b/nixpkgs/pkgs/games/pro-office-calculator/default.nix
@@ -0,0 +1,24 @@
+{ mkDerivation, lib, fetchFromGitHub, tinyxml-2, cmake, qtbase, qtmultimedia }:
+mkDerivation rec {
+  version = "1.0.13";
+  pname = "pro-office-calculator";
+
+  src = fetchFromGitHub {
+    owner  = "RobJinman";
+    repo   = "pro_office_calc";
+    rev    = "v${version}";
+    sha256 = "1v75cysargmp4fk7px5zgib1p6h5ya4w39rndbzk614fcnv0iipd";
+  };
+
+  buildInputs = [ qtbase qtmultimedia tinyxml-2 ];
+
+  nativeBuildInputs = [ cmake ];
+
+  meta = with lib; {
+    description = "A completely normal office calculator";
+    homepage = "https://proofficecalculator.com/";
+    maintainers = [ maintainers.pmiddend ];
+    platforms = platforms.linux;
+    license = licenses.gpl3;
+  };
+}
diff --git a/nixpkgs/pkgs/games/purpur/default.nix b/nixpkgs/pkgs/games/purpur/default.nix
new file mode 100644
index 000000000000..33ec936dc63d
--- /dev/null
+++ b/nixpkgs/pkgs/games/purpur/default.nix
@@ -0,0 +1,43 @@
+{ lib, stdenv, fetchurl, nixosTests, jre_headless, makeWrapper }:
+
+stdenv.mkDerivation rec {
+  pname = "purpur";
+  version = "1.19.2r1763";
+
+  src = fetchurl {
+    url = "https://api.purpurmc.org/v2/purpur/${builtins.replaceStrings [ "r" ] [ "/" ] version}/download";
+    sha256 = "sha256-6wcCwVIGV32YQlgB57qthy6uWtuXGN4G8S7uAAgVyDE=";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  preferLocalBuild = true;
+
+  installPhase = ''
+    mkdir -p $out/bin $out/lib/minecraft
+    cp -v $src $out/lib/minecraft/server.jar
+
+    makeWrapper ${jre_headless}/bin/java $out/bin/minecraft-server \
+      --add-flags "-jar $out/lib/minecraft/server.jar nogui"
+  '';
+
+  dontUnpack = true;
+
+  passthru = {
+    tests = { inherit (nixosTests) minecraft-server; };
+  };
+
+  meta = with lib; {
+    description = "A drop-in replacement for Minecraft Paper servers";
+    longDescription = ''
+      Purpur is a drop-in replacement for Minecraft Paper servers designed for configurability, new fun and exciting
+      gameplay features, and performance built on top of Airplane.
+    '';
+    homepage = "https://purpurmc.org/";
+    sourceProvenance = with sourceTypes; [ binaryBytecode ];
+    license = licenses.mit;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ joelkoen ];
+    mainProgram = "minecraft-server";
+  };
+}
diff --git a/nixpkgs/pkgs/games/pysolfc/default.nix b/nixpkgs/pkgs/games/pysolfc/default.nix
new file mode 100644
index 000000000000..c543434b610d
--- /dev/null
+++ b/nixpkgs/pkgs/games/pysolfc/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, fetchzip
+, buildPythonApplication
+, python3Packages
+, desktop-file-utils
+, freecell-solver
+}:
+
+buildPythonApplication rec {
+  pname = "PySolFC";
+  version = "2.20.1";
+
+  src = fetchzip {
+    url = "https://versaweb.dl.sourceforge.net/project/pysolfc/PySolFC/PySolFC-${version}/PySolFC-${version}.tar.xz";
+    hash = "sha256-mEnsq8Su0ses+nqoSFC+Wr0MHY7aTDMbtDV8toYVNPY=";
+  };
+
+  cardsets = fetchzip {
+    url = "https://versaweb.dl.sourceforge.net/project/pysolfc/PySolFC-Cardsets/PySolFC-Cardsets-2.2/PySolFC-Cardsets-2.2.tar.bz2";
+    hash = "sha256-mWJ0l9rvn9KeZ9rCWy7VjngJzJtSQSmG8zGcYFE4yM0=";
+  };
+
+  music = fetchzip {
+    url = "https://versaweb.dl.sourceforge.net/project/pysolfc/PySol-Music/PySol-Music-4.50/pysol-music-4.50.tar.xz";
+    hash = "sha256-sOl5U98aIorrQHJRy34s0HHaSW8hMUE7q84FMQAj5Yg=";
+  };
+
+  propagatedBuildInputs = with python3Packages; [
+    tkinter
+    six
+    random2
+    configobj
+    pysol-cards
+    attrs
+    pycotap
+    # optional :
+    pygame
+    freecell-solver
+    pillow
+  ];
+
+  patches = [
+    ./pysolfc-datadir.patch
+  ];
+
+  nativeBuildInputs = [ desktop-file-utils ];
+  postPatch = ''
+    desktop-file-edit --set-key Icon --set-value ${placeholder "out"}/share/icons/pysol01.png data/pysol.desktop
+    desktop-file-edit --set-key Comment --set-value "${meta.description}" data/pysol.desktop
+  '';
+
+  postInstall = ''
+    mkdir $out/share/PySolFC/cardsets
+    cp -r $cardsets/* $out/share/PySolFC/cardsets
+    cp -r $music/data/music $out/share/PySolFC
+  '';
+
+  # No tests in archive
+  doCheck = false;
+
+  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 ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/pysolfc/pysolfc-datadir.patch b/nixpkgs/pkgs/games/pysolfc/pysolfc-datadir.patch
new file mode 100644
index 000000000000..d9f1cf4e09f5
--- /dev/null
+++ b/nixpkgs/pkgs/games/pysolfc/pysolfc-datadir.patch
@@ -0,0 +1,19 @@
+diff --git a/pysollib/util.py b/pysollib/util.py
+index 8de3f00..26f4bc7 100644
+--- a/pysollib/util.py
++++ b/pysollib/util.py
+@@ -110,13 +110,7 @@ class DataLoader:
+         head, tail = os.path.split(argv0)
+         if not head:
+             head = os.curdir
+-        # dir where placed startup script
+-        path.append(head)
+-        path.append(os.path.join(head, "data"))
+-        path.append(os.path.join(head, os.pardir, "data"))
+-        # dir where placed pysol package
+-        path.append(os.path.join(sys.path[0], "data"))
+-        path.append(os.path.join(sys.path[0], "pysollib", "data"))
++        path.append(os.path.join(head, "..", "share", "PySolFC"))
+         # from settings.py
+         path.extend(DATA_DIRS)
+         # check path for valid directories
diff --git a/nixpkgs/pkgs/games/qgo/default.nix b/nixpkgs/pkgs/games/qgo/default.nix
new file mode 100644
index 000000000000..ec7986c6a36b
--- /dev/null
+++ b/nixpkgs/pkgs/games/qgo/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, mkDerivation
+, fetchFromGitHub
+, qmake
+, qtbase
+, qtmultimedia
+, qttools
+}:
+
+mkDerivation {
+  pname = "qgo";
+  version = "unstable-2017-12-18";
+
+  meta = with lib; {
+    description = "A Go client based on Qt5";
+    longDescription = ''
+      qGo is a Go Client based on Qt 5. It supports playing online at
+      IGS-compatible servers (including some special tweaks for WING and LGS,
+      also NNGS was reported to work) and locally against gnugo (or other
+      GTP-compliant engines). It also has rudimentary support for editing SGF
+      files and parital support for CyberORO/WBaduk, Tygem, Tom, and eWeiqi
+      (developers of these backends are currently inactive, everybody is welcome
+      to take them over).
+
+      Go is an ancient Chinese board game. It's called "åœæ£‹(Wei Qi)" in
+      Chinese, "囲ç¢(Yi Go)" in Japanese, "바둑(Baduk)" in Korean.
+    '';
+    homepage = "https://github.com/pzorin/qgo";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ zalakain ];
+  };
+
+  src = fetchFromGitHub {
+    owner = "pzorin";
+    repo = "qgo";
+    rev = "bef526dda4c79686edd95c88cc68de24f716703c";
+    sha256 = "1xzkayclmhsi07p9mnbf8185jw8n5ikxp2mik3x8qz1i6rmrfl5b";
+  };
+
+  patches = [ ./fix-paths.patch ];
+  postPatch = ''
+    sed -i 's|@out@|'"''${out}"'|g' src/src.pro src/defines.h
+  '';
+  nativeBuildInputs = [ qmake qttools ];
+  buildInputs = [ qtbase qtmultimedia ];
+}
diff --git a/nixpkgs/pkgs/games/qgo/fix-paths.patch b/nixpkgs/pkgs/games/qgo/fix-paths.patch
new file mode 100644
index 000000000000..c1d1e399ec1a
--- /dev/null
+++ b/nixpkgs/pkgs/games/qgo/fix-paths.patch
@@ -0,0 +1,50 @@
+diff --git a/src/defines.h b/src/defines.h
+index 5d40955..82d0627 100644
+--- a/src/defines.h
++++ b/src/defines.h
+@@ -48,7 +48,7 @@
+ * GNUgo default level
+ */
+ #define DEFAULT_ENGINE "gnugo"
+-#define DEFAULT_ENGINE_PATH "/usr/games/"
++#define DEFAULT_ENGINE_PATH ""
+ #define DEFAULT_ENGINE_OPTIONS "--mode gtp --quiet --level 10"
+ 
+ 
+@@ -220,8 +220,8 @@ extern QString applicationPath;
+ 	#define SOUND_PATH_PREFIX			"qGo.app/Contents/Resources/Sounds/"
+     #define TRANSLATIONS_PATH		"qGo.app/Contents/Resources/Translations/"
+ #else
+-    #define SOUND_PATH_PREFIX		"/usr/share/qgo/sounds/"
+-    #define TRANSLATIONS_PATH		"/usr/share/qgo/languages"
++    #define SOUND_PATH_PREFIX		"/@out@/share/qgo/sounds/"
++    #define TRANSLATIONS_PATH		"/@out@/share/qgo/languages"
+ #endif
+ 
+ #endif
+diff --git a/src/src.pro b/src/src.pro
+index f989ce7..b7d691f 100644
+--- a/src/src.pro
++++ b/src/src.pro
+@@ -165,17 +165,17 @@ SOURCES += displayboard.cpp \
+     newgamedialog.cpp
+ 
+ unix*:!macx-* {
+-    QGO_INSTALL_PATH = /usr/share/qgo
+-    QGO_INSTALL_BIN_PATH = /usr/bin
++    QGO_INSTALL_PATH = @out@/share/qgo
++    QGO_INSTALL_BIN_PATH = /@out@/bin
+ 
+-    icon.path = /usr/share/pixmaps
++    icon.path = @out@/share/pixmaps
+     icon.files = resources/pics/qgo.png
+     icon.files += resources/pics/qgo_16x16.xpm
+     icon.files += resources/pics/qgo_32x32.xpm
+     icon.files += resources/pics/qgo_48x48.png
+     icon.files += resources/pics/qgo_48x48.xpm
+     INSTALLS += icon
+-    desktopfile.path = /usr/share/applications
++    desktopfile.path = @out@/share/applications
+     desktopfile.files = qgo.desktop
+     INSTALLS += desktopfile
+ }
diff --git a/nixpkgs/pkgs/games/qqwing/default.nix b/nixpkgs/pkgs/games/qqwing/default.nix
new file mode 100644
index 000000000000..81a10b9ea2af
--- /dev/null
+++ b/nixpkgs/pkgs/games/qqwing/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv, fetchFromGitHub, perl, autoconf, automake, libtool }:
+
+stdenv.mkDerivation rec {
+  pname = "qqwing";
+  version = "1.3.4";
+
+  src = fetchFromGitHub {
+    owner = "stephenostermiller";
+    repo = "qqwing";
+    rev = "v${version}";
+    sha256 = "1qq0vi4ch4y3a5fb1ncr0yzkj3mbvdiwa3d51qpabq94sh0cz09i";
+  };
+
+  postPatch = ''
+    for file in "src-first-comment.pl" "src_neaten.pl"; do
+      substituteInPlace "build/$file" \
+        --replace "#!/usr/bin/perl" "#!${perl}/bin/perl"
+    done
+
+    substituteInPlace "build/cpp_install.sh" \
+      --replace "sudo " ""
+  '';
+
+  nativeBuildInputs = [ autoconf automake ];
+  buildInputs = [ perl libtool ];
+
+  makeFlags = [ "prefix=$(out)" "tgz" ];
+
+  meta = with lib; {
+    homepage = "https://qqwing.com";
+    description = "Sudoku generating and solving software";
+    license = licenses.gpl2;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/qtads/default.nix b/nixpkgs/pkgs/games/qtads/default.nix
new file mode 100644
index 000000000000..79a548a7134e
--- /dev/null
+++ b/nixpkgs/pkgs/games/qtads/default.nix
@@ -0,0 +1,27 @@
+{ lib, mkDerivation, fetchFromGitHub, fetchpatch, pkg-config, qmake
+, SDL2, fluidsynth, libsndfile, libvorbis, mpg123, qtbase
+}:
+
+mkDerivation rec {
+  pname = "qtads";
+  version = "3.4.0";
+
+  src = fetchFromGitHub {
+    owner = "realnc";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-KIqufpvl7zeUtDBXUOAZxBIbfv+s51DoSaZr3jol+bw=";
+  };
+
+  nativeBuildInputs = [ pkg-config qmake ];
+
+  buildInputs = [ SDL2 fluidsynth libsndfile libvorbis mpg123 qtbase ];
+
+  meta = with lib; {
+    homepage = "https://realnc.github.io/qtads/";
+    description = "Multimedia interpreter for TADS games";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ orivej ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/quake2/yquake2/default.nix b/nixpkgs/pkgs/games/quake2/yquake2/default.nix
new file mode 100644
index 000000000000..9a3597937d8c
--- /dev/null
+++ b/nixpkgs/pkgs/games/quake2/yquake2/default.nix
@@ -0,0 +1,90 @@
+{ stdenv, lib, fetchFromGitHub, buildEnv, makeWrapper
+, SDL2, libGL, curl
+, openalSupport ? true, openal
+, Cocoa, OpenAL
+}:
+
+let
+  mkFlag = b: if b then "yes" else "no";
+
+  games = import ./games.nix { inherit stdenv lib fetchFromGitHub; };
+
+  wrapper = import ./wrapper.nix { inherit stdenv lib buildEnv makeWrapper yquake2; };
+
+  yquake2 = stdenv.mkDerivation rec {
+    pname = "yquake2";
+    version = "8.30";
+
+    src = fetchFromGitHub {
+      owner = "yquake2";
+      repo = "yquake2";
+      rev = "QUAKE2_${builtins.replaceStrings ["."] ["_"] version}";
+      sha256 = "sha256-2x/qxrhvy+An/HitmWAhmwuDJ2djMeTsLhAtijuvbzE=";
+    };
+
+    postPatch = ''
+      substituteInPlace src/client/curl/qcurl.c \
+        --replace "\"libcurl.so.3\", \"libcurl.so.4\"" "\"${curl.out}/lib/libcurl.so\", \"libcurl.so.3\", \"libcurl.so.4\""
+    '' + lib.optionalString (openalSupport && !stdenv.isDarwin) ''
+      substituteInPlace Makefile \
+        --replace "\"libopenal.so.1\"" "\"${openal}/lib/libopenal.so.1\""
+    '';
+
+    buildInputs = [ SDL2 libGL curl ]
+      ++ lib.optionals stdenv.isDarwin [ Cocoa OpenAL ]
+      ++ lib.optional openalSupport openal;
+
+    makeFlags = [
+      "WITH_OPENAL=${mkFlag openalSupport}"
+      "WITH_SYSTEMWIDE=yes"
+      "WITH_SYSTEMDIR=$\{out}/share/games/quake2"
+    ];
+
+    enableParallelBuilding = true;
+
+    installPhase = ''
+      # Yamagi Quake II expects all binaries (executables and libs) to be in the
+      # same directory.
+      mkdir -p $out/bin $out/lib/yquake2 $out/share/games/quake2/baseq2
+      cp -r release/* $out/lib/yquake2
+      ln -s $out/lib/yquake2/quake2 $out/bin/yquake2
+      ln -s $out/lib/yquake2/q2ded $out/bin/yq2ded
+      cp $src/stuff/yq2.cfg $out/share/games/quake2/baseq2
+    '';
+
+    meta = with lib; {
+      description = "Yamagi Quake II client";
+      homepage = "https://www.yamagi.org/quake2/";
+      license = licenses.gpl2;
+      platforms = platforms.unix;
+      maintainers = with maintainers; [ tadfisher ];
+    };
+  };
+
+in {
+  inherit yquake2;
+
+  yquake2-ctf = wrapper {
+    games = [ games.ctf ];
+    name = "yquake2-ctf";
+    inherit (games.ctf) description;
+  };
+
+  yquake2-ground-zero = wrapper {
+    games = [ games.ground-zero ];
+    name = "yquake2-ground-zero";
+    inherit (games.ground-zero) description;
+  };
+
+  yquake2-the-reckoning = wrapper {
+    games = [ games.the-reckoning ];
+    name = "yquake2-the-reckoning";
+    inherit (games.the-reckoning) description;
+  };
+
+  yquake2-all-games = wrapper {
+    games = lib.attrValues games;
+    name = "yquake2-all-games";
+    description = "Yamagi Quake II with all add-on games";
+  };
+}
diff --git a/nixpkgs/pkgs/games/quake2/yquake2/games.nix b/nixpkgs/pkgs/games/quake2/yquake2/games.nix
new file mode 100644
index 000000000000..c78689971a63
--- /dev/null
+++ b/nixpkgs/pkgs/games/quake2/yquake2/games.nix
@@ -0,0 +1,55 @@
+{ stdenv, lib, fetchFromGitHub }:
+
+let
+  games = {
+    ctf = {
+      id = "ctf";
+      version = "1.07";
+      description = "'Capture The Flag' for Yamagi Quake II";
+      sha256 = "0i9bwhjvq6yhalrsbzjambh27fdzrzgswqz3jgfn9qw6k1kjvlin";
+    };
+
+    ground-zero = {
+      id = "rogue";
+      version = "2.07";
+      description = "'Ground Zero' for Yamagi Quake II";
+      sha256 = "1m2r4vgfdxpsi0lkf32liwf1433mdhhmjxiicjwzqjlkncjyfcb1";
+    };
+
+    the-reckoning = {
+      id = "xatrix";
+      version = "2.08";
+      description = "'The Reckoning' for Yamagi Quake II";
+      sha256 = "1wp9fg1q8nly2r9hh4394r1h4dxyni3lvdy7g419cz5s8hhn5msr";
+    };
+  };
+
+  toDrv = title: data: stdenv.mkDerivation rec {
+    inherit (data) id version description sha256;
+    inherit title;
+
+    pname = "yquake2-${title}";
+
+    src = fetchFromGitHub {
+      inherit sha256;
+      owner = "yquake2";
+      repo = data.id;
+      rev = "${lib.toUpper id}_${builtins.replaceStrings ["."] ["_"] version}";
+    };
+
+    installPhase = ''
+      mkdir -p $out/lib/yquake2/${id}
+      cp release/* $out/lib/yquake2/${id}
+    '';
+
+    meta = with lib; {
+      inherit (data) description;
+      homepage = "https://www.yamagi.org/quake2/";
+      license = licenses.unfree;
+      platforms = platforms.unix;
+      maintainers = with maintainers; [ tadfisher ];
+    };
+  };
+
+in
+  lib.mapAttrs toDrv games
diff --git a/nixpkgs/pkgs/games/quake2/yquake2/wrapper.nix b/nixpkgs/pkgs/games/quake2/yquake2/wrapper.nix
new file mode 100644
index 000000000000..4850dff99dcd
--- /dev/null
+++ b/nixpkgs/pkgs/games/quake2/yquake2/wrapper.nix
@@ -0,0 +1,31 @@
+{ stdenv, lib, buildEnv, makeWrapper, yquake2 }:
+
+{ games
+, name
+, description
+}:
+
+let
+  env = buildEnv {
+    name = "${name}-env";
+    paths = [ yquake2 ] ++ games;
+  };
+
+in stdenv.mkDerivation {
+  name = "${name}-${lib.getVersion yquake2}";
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  buildCommand = ''
+    mkdir -p $out/bin
+  '' + lib.concatMapStringsSep "\n" (game: ''
+    makeWrapper ${env}/bin/yquake2 $out/bin/yquake2-${game.title} \
+      --add-flags "+set game ${game.id}"
+    makeWrapper ${env}/bin/yq2ded $out/bin/yq2ded-${game.title} \
+      --add-flags "+set game ${game.id}"
+  '') games;
+
+  meta = {
+    inherit description;
+  };
+}
diff --git a/nixpkgs/pkgs/games/quake3/content/demo.nix b/nixpkgs/pkgs/games/quake3/content/demo.nix
new file mode 100644
index 000000000000..36d0396ec796
--- /dev/null
+++ b/nixpkgs/pkgs/games/quake3/content/demo.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, fetchurl }:
+
+let
+  version = "1.11-6";
+in stdenv.mkDerivation {
+  pname = "quake3-demodata";
+  inherit version;
+
+  src = fetchurl {
+    url = "https://ftp.gwdg.de/pub/misc/ftp.idsoftware.com/idstuff/quake3/linux/linuxq3ademo-${version}.x86.gz.sh";
+    sha256 = "1v54a1hx1bczk9hgn9qhx8vixsy7xn7wj2pylhfjsybfkgvf7pk4";
+  };
+
+  buildCommand = ''
+    tail -n +165 $src | tar xfz -
+
+    mkdir -p $out/baseq3
+    cp demoq3/*.pk3 $out/baseq3
+  '';
+
+  preferLocalBuild = true;
+
+  meta = with lib; {
+    description = "Quake 3 Arena demo content";
+    license = licenses.unfreeRedistributable;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/quake3/content/hires.nix b/nixpkgs/pkgs/games/quake3/content/hires.nix
new file mode 100644
index 000000000000..7314028d5405
--- /dev/null
+++ b/nixpkgs/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/nixpkgs/pkgs/games/quake3/content/pointrelease.nix b/nixpkgs/pkgs/games/quake3/content/pointrelease.nix
new file mode 100644
index 000000000000..d9c9a55ddce9
--- /dev/null
+++ b/nixpkgs/pkgs/games/quake3/content/pointrelease.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, fetchurl }:
+
+let
+  version = "1.32b-3";
+in stdenv.mkDerivation {
+  pname = "quake3-pointrelease";
+  inherit version;
+
+  src = fetchurl {
+    url = "https://ftp.gwdg.de/pub/misc/ftp.idsoftware.com/idstuff/quake3/linux/linuxq3apoint-${version}.x86.run";
+    sha256 = "11piyksfqyxwl9mpgbc71w9sacsh4d3cdsgia0cy0dbbap2k4qf3";
+  };
+
+  buildCommand = ''
+    sh $src --tar xf
+
+    mkdir -p $out/baseq3
+    cp baseq3/*.pk3 $out/baseq3
+  '';
+
+  preferLocalBuild = true;
+
+  meta = with lib; {
+    description = "Quake 3 Arena point release";
+    license = licenses.unfreeRedistributable;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/quake3/ioquake/Makefile.local b/nixpkgs/pkgs/games/quake3/ioquake/Makefile.local
new file mode 100644
index 000000000000..9f487970eabc
--- /dev/null
+++ b/nixpkgs/pkgs/games/quake3/ioquake/Makefile.local
@@ -0,0 +1,6 @@
+USE_CURL = 1
+USE_CURL_DLOPEN = 0
+USE_FREETYPE = 1
+USE_INTERNAL_LIBS = 0
+USE_OPENAL = 1
+USE_OPENAL_DLOPEN = 0
diff --git a/nixpkgs/pkgs/games/quake3/ioquake/default.nix b/nixpkgs/pkgs/games/quake3/ioquake/default.nix
new file mode 100644
index 000000000000..437b99ae3439
--- /dev/null
+++ b/nixpkgs/pkgs/games/quake3/ioquake/default.nix
@@ -0,0 +1,90 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, pkg-config
+, which
+, copyDesktopItems
+, makeBinaryWrapper
+, SDL2
+, libGL
+, openal
+, curl
+, speex
+, opusfile
+, libogg
+, libvorbis
+, libjpeg
+, makeDesktopItem
+, freetype
+, mumble
+}:
+
+stdenv.mkDerivation {
+  pname = "ioquake3";
+  version = "unstable-2023-08-13";
+
+  src = fetchFromGitHub {
+    owner = "ioquake";
+    repo = "ioq3";
+    rev = "ee950eb7b0e41437cc23a9943254c958da8a61ab";
+    sha256 = "sha256-NfhInwrtw85i2mnv7EtBrrpNaslaQaVhLNlK0I9aYto=";
+  };
+
+  nativeBuildInputs = [
+    copyDesktopItems
+    makeBinaryWrapper
+    pkg-config
+    which
+  ];
+
+  buildInputs = [
+    SDL2
+    libGL
+    openal
+    curl
+    speex
+    opusfile
+    libogg
+    libvorbis
+    libjpeg
+    freetype
+    mumble
+  ];
+
+  enableParallelBuilding = true;
+
+  preConfigure = ''
+    cp ${./Makefile.local} ./Makefile.local
+  '';
+
+  installTargets = [ "copyfiles" ];
+
+  installFlags = [ "COPYDIR=$(out)/share/ioquake3" ];
+
+  postInstall = ''
+    install -Dm644 misc/quake3.svg $out/share/icons/hicolor/scalable/apps/ioquake3.svg
+
+    makeWrapper $out/share/ioquake3/ioquake3.* $out/bin/ioquake3
+    makeWrapper $out/share/ioquake3/ioq3ded.* $out/bin/ioq3ded
+  '';
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "IOQuake3";
+      exec = "ioquake3";
+      icon = "ioquake3";
+      comment = "A fast-paced 3D first-person shooter, a community effort to continue supporting/developing id's Quake III Arena";
+      desktopName = "ioquake3";
+      categories = [ "Game" "ActionGame" ];
+    })
+  ];
+
+  meta = {
+    homepage = "https://ioquake3.org/";
+    description = "A fast-paced 3D first-person shooter, a community effort to continue supporting/developing id's Quake III Arena";
+    license = lib.licenses.gpl2Plus;
+    mainProgram = "ioquake3";
+    maintainers = with lib.maintainers; [ abbradar drupol eelco rvolosatovs ];
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/quake3/quake3e/default.nix b/nixpkgs/pkgs/games/quake3/quake3e/default.nix
new file mode 100644
index 000000000000..a98772d241d0
--- /dev/null
+++ b/nixpkgs/pkgs/games/quake3/quake3e/default.nix
@@ -0,0 +1,54 @@
+{ lib, stdenv, fetchFromGitHub, makeWrapper
+, curl, libGL, libX11, libXxf86dga, alsa-lib, libXrandr, libXxf86vm, libXext, SDL2, glibc
+}:
+
+stdenv.mkDerivation rec {
+  pname = "Quake3e";
+  version = "2022-04-01-dev";
+
+  src = fetchFromGitHub {
+    owner = "ec-";
+    repo = pname;
+    rev = "c6cec00b858aa5955eb1d6eb65b9bfd41fd869cb";
+    sha256 = "0qd13fndbhgkkmhxbprpzmj2l2v9ihacxagpdqi9sg9nrzvahr9h";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ curl libGL libX11 libXxf86dga alsa-lib libXrandr libXxf86vm libXext SDL2 glibc ];
+  env.NIX_CFLAGS_COMPILE = "-I${SDL2.dev}/include/SDL2";
+  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( "libpthread.so.0" )#Sys_LoadLibrary( "${glibc}/lib/libpthread.so.0" )#' 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( "libXxf86dga.so.1" )#Sys_LoadLibrary( "${libXxf86dga}/lib/libXxf86dga.so.1" )#' code/unix/x11_dga.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( "libXxf86vm.so.1" )#Sys_LoadLibrary( "${libXxf86vm}/lib/libXxf86vm.so.1" )#' code/unix/x11_vidmode.c
+    sed -i -e 's#"libcurl.so.4"#"${curl.out}/lib/libcurl.so.4"#' code/client/cl_curl.h
+  '';
+
+  # Default value for `USE_SDL` changed (from 0 to 1) in 5f8ce6d (2020-12-26)
+  # Setting `USE_SDL=0` in `makeFlags` doesn't work
+  preConfigure = ''
+    sed -i 's/USE_SDL *= 1/USE_SDL = 0/' Makefile
+  '';
+
+  installPhase = ''
+    make install DESTDIR=$out/lib
+    makeWrapper $out/lib/quake3e.x64 $out/bin/quake3e
+    makeWrapper $out/lib/quake3e.ded.x64 $out/bin/quake3e.ded
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/ec-/Quake3e";
+    description = "Improved Quake III Arena engine";
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ pmiddend ];
+    badPlatforms = platforms.aarch64;
+    # never built on aarch64-linux since first introduction in nixpkgs
+    broken = stdenv.isLinux && stdenv.isAarch64;
+  };
+}
diff --git a/nixpkgs/pkgs/games/quake3/wrapper/default.nix b/nixpkgs/pkgs/games/quake3/wrapper/default.nix
new file mode 100644
index 000000000000..a1a5bfb03d26
--- /dev/null
+++ b/nixpkgs/pkgs/games/quake3/wrapper/default.nix
@@ -0,0 +1,34 @@
+{ stdenv, buildEnv, lib, libGL, ioquake3, makeWrapper }:
+
+{ paks, name ? (lib.head paks).name, description ? "" }:
+
+let
+  libPath = lib.makeLibraryPath [ libGL stdenv.cc.cc ];
+  env = buildEnv {
+    name = "quake3-env";
+    paths = [ ioquake3 ] ++ paks;
+  };
+
+in stdenv.mkDerivation {
+  name = "${name}-${ioquake3.name}";
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  buildCommand = ''
+    mkdir -p $out/bin
+
+    # We add Mesa to the end of $LD_LIBRARY_PATH to provide fallback
+    # software rendering. GCC is needed so that libgcc_s.so can be found
+    # when Mesa is used.
+    makeWrapper ${env}/bin/ioquake3* $out/bin/quake3 \
+      --suffix-each LD_LIBRARY_PATH ':' "${libPath}" \
+      --add-flags "+set fs_basepath ${env} +set r_allowSoftwareGL 1"
+
+    makeWrapper ${env}/bin/ioq3ded* $out/bin/quake3-server \
+      --add-flags "+set fs_basepath ${env}"
+  '';
+
+  meta = {
+    inherit description;
+  };
+}
diff --git a/nixpkgs/pkgs/games/quakespasm/default.nix b/nixpkgs/pkgs/games/quakespasm/default.nix
new file mode 100644
index 000000000000..b9541d1b274e
--- /dev/null
+++ b/nixpkgs/pkgs/games/quakespasm/default.nix
@@ -0,0 +1,105 @@
+{ lib, stdenv, SDL, SDL2, fetchurl, gzip, libvorbis, libmad, flac, libopus, opusfile, libogg, libxmp
+, Cocoa, CoreAudio, CoreFoundation, IOKit, OpenGL
+, copyDesktopItems, makeDesktopItem, pkg-config
+, useSDL2 ? stdenv.isDarwin # TODO: CoreAudio fails to initialize with SDL 1.x for some reason.
+}:
+
+stdenv.mkDerivation rec {
+  pname = "quakespasm";
+  version = "0.96.0";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/quakespasm/quakespasm-${version}.tar.gz";
+    sha256 = "sha256-Sa4lLALB3xpMGVjpKnzGl1OBEJcLOHDcFGEFsO0wwOw=";
+  };
+
+  sourceRoot = "${pname}-${version}/Quake";
+
+  patches = lib.optionals stdenv.isDarwin [
+    # Makes Darwin Makefile use system libraries instead of ones from app bundle
+    ./quakespasm-darwin-makefile-improvements.patch
+  ];
+
+  nativeBuildInputs = [
+    copyDesktopItems
+    pkg-config
+  ];
+
+  buildInputs = [
+    gzip libvorbis libmad flac libopus opusfile libogg libxmp
+    (if useSDL2 then SDL2 else SDL)
+  ] ++ lib.optionals stdenv.isDarwin [
+    Cocoa CoreAudio IOKit OpenGL
+  ] ++ lib.optionals (stdenv.isDarwin && useSDL2) [
+    CoreFoundation
+  ];
+
+  buildFlags = [
+    "DO_USERDIRS=1"
+    # Makefile defaults, set here to enforce consistency on Darwin build
+    "USE_CODEC_WAVE=1"
+    "USE_CODEC_MP3=1"
+    "USE_CODEC_VORBIS=1"
+    "USE_CODEC_FLAC=1"
+    "USE_CODEC_OPUS=1"
+    "USE_CODEC_MIKMOD=0"
+    "USE_CODEC_UMX=0"
+    "USE_CODEC_XMP=1"
+    "MP3LIB=mad"
+    "VORBISLIB=vorbis"
+  ] ++ lib.optionals useSDL2 [
+    "SDL_CONFIG=sdl2-config"
+    "USE_SDL2=1"
+  ];
+
+  makefile = if (stdenv.isDarwin) then "Makefile.darwin" else "Makefile";
+
+  preInstall = ''
+    mkdir -p "$out/bin"
+    substituteInPlace Makefile --replace "/usr/local/games" "$out/bin"
+    substituteInPlace Makefile.darwin --replace "/usr/local/games" "$out/bin"
+  '';
+
+  postInstall = lib.optionalString stdenv.isDarwin ''
+    # Let's build app bundle
+    mkdir -p $out/Applications/Quake.app/Contents/MacOS
+    mkdir -p $out/Applications/Quake.app/Contents/Resources
+    cp ../MacOSX/Info.plist $out/Applications/Quake.app/Contents/
+    cp ../MacOSX/QuakeSpasm.icns $out/Applications/Quake.app/Contents/Resources/
+    cp -r ../MacOSX/English.lproj $out/Applications/Quake.app/Contents/Resources/
+    ln -sf $out/bin/quake $out/Applications/Quake.app/Contents/MacOS/quake
+
+    substituteInPlace $out/Applications/Quake.app/Contents/Info.plist \
+      --replace '>''${EXECUTABLE_NAME}' '>quake'
+    substituteInPlace $out/Applications/Quake.app/Contents/Info.plist \
+      --replace '>''${PRODUCT_NAME}' '>QuakeSpasm'
+  '';
+
+  enableParallelBuilding = true;
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "quakespasm";
+      exec = "quake";
+      desktopName = "Quakespasm";
+      categories = [ "Game" ];
+    })
+  ];
+
+  meta = with lib; {
+    description = "An engine for iD software's Quake";
+    homepage = "https://quakespasm.sourceforge.net/";
+    longDescription = ''
+      QuakeSpasm is a modern, cross-platform Quake 1 engine based on FitzQuake.
+      It includes support for 64 bit CPUs and custom music playback, a new sound driver,
+      some graphical niceities, and numerous bug-fixes and other improvements.
+      Quakespasm utilizes either the SDL or SDL2 frameworks, so choose which one
+      works best for you. SDL is probably less buggy, but SDL2 has nicer features
+      and smoother mouse input - though no CD support.
+    '';
+
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ mikroskeem ];
+    mainProgram = "quake";
+  };
+}
diff --git a/nixpkgs/pkgs/games/quakespasm/quakespasm-darwin-makefile-improvements.patch b/nixpkgs/pkgs/games/quakespasm/quakespasm-darwin-makefile-improvements.patch
new file mode 100644
index 000000000000..c3098fa23d63
--- /dev/null
+++ b/nixpkgs/pkgs/games/quakespasm/quakespasm-darwin-makefile-improvements.patch
@@ -0,0 +1,111 @@
+diff --git a/Quake/Makefile.darwin b/Quake/Makefile.darwin
+index 6a08e6d..4e320cd 100644
+--- a/Makefile.darwin
++++ b/Makefile.darwin
+@@ -50,6 +50,7 @@ LINKER = $(CC)
+ LIPO ?= lipo
+ 
+ STRIP ?= strip -S
++PKG_CONFIG ?= pkg-config
+ 
+ CPUFLAGS=
+ LDFLAGS =
+@@ -86,9 +87,6 @@ USE_RPATH=1
+ endif
+ CFLAGS += $(call check_gcc,-std=gnu11,)
+ CFLAGS += $(CPUFLAGS)
+-ifeq ($(USE_RPATH),1)
+-LDFLAGS+=-Wl,-rpath,@executable_path/../Frameworks
+-endif
+ ifneq ($(DEBUG),0)
+ DFLAGS += -DDEBUG
+ CFLAGS += -g
+@@ -117,19 +115,14 @@ CFLAGS += -DGL_SILENCE_DEPRECATION=1
+ # not relying on sdl-config command and assuming
+ # /Library/Frameworks/SDL.framework is available
+ SDL_CFLAGS =-D_GNU_SOURCE=1 -D_THREAD_SAFE
+-SDL_CFLAGS+=-DSDL_FRAMEWORK -DNO_SDL_CONFIG
+ ifeq ($(USE_SDL2),1)
+-SDL_FRAMEWORK_NAME = SDL2
++SDL_CONFIG ?= sdl2-config
+ else
+-SDL_FRAMEWORK_NAME = SDL
+-endif
+-# default to our local SDL[2].framework for build
+-SDL_FRAMEWORK_PATH ?=../MacOSX
+-ifneq ($(SDL_FRAMEWORK_PATH),)
+-SDL_LIBS  +=-F$(SDL_FRAMEWORK_PATH)
+-SDL_CFLAGS+=-F$(SDL_FRAMEWORK_PATH)
++SDL_CONFIG ?= sdl-config
+ endif
+-SDL_LIBS  +=-Wl,-framework,$(SDL_FRAMEWORK_NAME) -Wl,-framework,Cocoa
++SDL_CFLAGS := $(shell $(SDL_CONFIG) --cflags)
++SDL_LIBS   := $(shell $(SDL_CONFIG) --libs)
++SDL_LIBS   += -Wl,-framework,Cocoa
+ 
+ NET_LIBS   :=
+ 
+@@ -165,45 +158,31 @@ ifeq ($(USE_CODEC_WAVE),1)
+ CFLAGS+= -DUSE_CODEC_WAVE
+ endif
+ ifeq ($(USE_CODEC_FLAC),1)
+-CFLAGS+= -DUSE_CODEC_FLAC
+-CODEC_INC = -I../MacOSX/codecs/include
+-CODEC_LINK= -L../MacOSX/codecs/lib
+-CODECLIBS+= -lFLAC
++CFLAGS+= -DUSE_CODEC_FLAC $(shell $(PKG_CONFIG) --cflags flac)
++CODECLIBS+= $(shell $(PKG_CONFIG) --libs flac)
+ endif
+ ifeq ($(USE_CODEC_OPUS),1)
+-CFLAGS+= -DUSE_CODEC_OPUS
+-CODEC_INC = -I../MacOSX/codecs/include
+-CODEC_LINK= -L../MacOSX/codecs/lib
+-CODECLIBS+= -lopusfile -lopus -logg
++CFLAGS+= -DUSE_CODEC_OPUS $(shell $(PKG_CONFIG) --cflags ogg opus opusfile)
++CODECLIBS+= $(shell $(PKG_CONFIG) --libs ogg opus opusfile)
+ endif
+ ifeq ($(USE_CODEC_VORBIS),1)
+-CFLAGS+= -DUSE_CODEC_VORBIS $(cpp_vorbisdec)
+-CODEC_INC = -I../MacOSX/codecs/include
+-CODEC_LINK= -L../MacOSX/codecs/lib
+-CODECLIBS+= $(lib_vorbisdec)
++CFLAGS+= -DUSE_CODEC_VORBIS $(shell $(PKG_CONFIG) --cflags ogg vorbis vorbisfile)
++CODECLIBS+= $(shell $(PKG_CONFIG) --libs ogg vorbis vorbisfile)
+ endif
+ ifeq ($(USE_CODEC_MP3),1)
+-CFLAGS+= -DUSE_CODEC_MP3
+-CODEC_INC = -I../MacOSX/codecs/include
+-CODEC_LINK= -L../MacOSX/codecs/lib
+-CODECLIBS+= $(lib_mp3dec)
++CFLAGS+= -DUSE_CODEC_MP3 $(shell $(PKG_CONFIG) --cflags $(MP3LIB))
++CODECLIBS+= $(shell $(PKG_CONFIG) --libs $(MP3LIB))
+ endif
+ ifeq ($(USE_CODEC_MIKMOD),1)
+ CFLAGS+= -DUSE_CODEC_MIKMOD
+-CODEC_INC = -I../MacOSX/codecs/include
+-CODEC_LINK= -L../MacOSX/codecs/lib
+ CODECLIBS+= -lmikmod
+ endif
+ ifeq ($(USE_CODEC_XMP),1)
+-CFLAGS+= -DUSE_CODEC_XMP
+-CODEC_INC = -I../MacOSX/codecs/include
+-CODEC_LINK= -L../MacOSX/codecs/lib
+-CODECLIBS+= -lxmp
++CFLAGS+= -DUSE_CODEC_XMP $(shell $(PKG_CONFIG) --cflags libxmp)
++CODECLIBS+= $(shell $(PKG_CONFIG) --libs libxmp)
+ endif
+ ifeq ($(USE_CODEC_MODPLUG),1)
+ CFLAGS+= -DUSE_CODEC_MODPLUG
+-CODEC_INC = -I../MacOSX/codecs/include
+-CODEC_LINK= -L../MacOSX/codecs/lib
+ CODECLIBS+= -lmodplug
+ endif
+ ifeq ($(USE_CODEC_UMX),1)
+@@ -333,4 +312,7 @@ debug:
+ clean:
+ 	$(RM) *.o *.d $(DEFAULT_TARGET)
+ 
++install: quakespasm
++	install -D -m 755 quakespasm /usr/local/games/quake
++
+ sinclude $(OBJS:.o=.d)
diff --git a/nixpkgs/pkgs/games/quakespasm/vulkan.nix b/nixpkgs/pkgs/games/quakespasm/vulkan.nix
new file mode 100644
index 000000000000..50862be46bd3
--- /dev/null
+++ b/nixpkgs/pkgs/games/quakespasm/vulkan.nix
@@ -0,0 +1,61 @@
+{ lib, stdenv, fetchFromGitHub, makeWrapper
+, SDL2, gzip, libvorbis, libmad, vulkan-headers, vulkan-loader, moltenvk
+}:
+
+stdenv.mkDerivation rec {
+  pname = "vkquake";
+  version = "1.22.3";
+
+  src = fetchFromGitHub {
+    owner = "Novum";
+    repo = "vkQuake";
+    rev = version;
+    sha256 = "sha256-+8DU1QT3Lgqf1AIReVnXQ2Lq6R6eBb8VjdkJfAn/Rtc=";
+  };
+
+  sourceRoot = "${src.name}/Quake";
+
+  nativeBuildInputs = [
+    makeWrapper
+    vulkan-headers
+  ];
+
+  buildInputs = [
+    gzip
+    SDL2
+    libvorbis
+    libmad
+    vulkan-loader
+  ] ++ lib.optional stdenv.isDarwin moltenvk;
+
+  buildFlags = [ "DO_USERDIRS=1" ];
+
+  preInstall = ''
+    mkdir -p "$out/bin"
+  '';
+
+  makeFlags = [ "prefix=$(out) bindir=$(out)/bin" ];
+
+  postFixup = ''
+    wrapProgram $out/bin/vkquake \
+      --prefix LD_LIBRARY_PATH : ${vulkan-loader}/lib
+  '';
+
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    description = "Vulkan Quake port based on QuakeSpasm";
+    homepage = src.meta.homepage;
+    longDescription = ''
+      vkQuake is a Quake 1 port using Vulkan instead of OpenGL for rendering.
+      It is based on the popular QuakeSpasm port and runs all mods compatible with it
+      like Arcane Dimensions or In The Shadows. vkQuake also serves as a Vulkan demo
+      application that shows basic usage of the API. For example it demonstrates render
+      passes & sub passes, pipeline barriers & synchronization, compute shaders, push &
+      specialization constants, CPU/GPU parallelism and memory pooling.
+    '';
+
+    platforms = with platforms; linux ++ darwin;
+    maintainers = with maintainers; [ ylh ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/quantumminigolf/default.nix b/nixpkgs/pkgs/games/quantumminigolf/default.nix
new file mode 100644
index 000000000000..7ecafa5eab65
--- /dev/null
+++ b/nixpkgs/pkgs/games/quantumminigolf/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv, fetchurl, fftwSinglePrec, freetype, SDL, SDL_ttf }:
+
+stdenv.mkDerivation rec {
+  pname = "quantumminigolf";
+  version = "1.1.1";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/project/quantumminigolf/quantumminigolf/${version}/quantumminigolf-${version}.src.tar.gz";
+    sha256 = "sha256-Y3LUGk6pAuNGVOYkc0WYDbgJFtwJJn+aLRHmCKY7W5k=";
+  };
+
+  buildInputs = [
+    fftwSinglePrec
+    freetype
+    SDL
+    SDL_ttf
+  ];
+
+  preBuild = ''
+    export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -I${lib.getDev SDL}/include/SDL -I${SDL_ttf}/include/SDL"
+
+    sed -re 's@"(gfx|fonts|tracks)/@"'"$out"'/share/quantumminigolf/\1/@g' -i *.cpp
+  '';
+
+  installPhase = ''
+    mkdir -p "$out"/{share/doc,share/quantumminigolf,bin}
+    cp README THANKS LICENSE "$out/share/doc"
+    cp -r fonts gfx tracks "$out/share/quantumminigolf"
+    cp quantumminigolf "$out/bin"
+  '';
+
+  meta = with lib; {
+    description = "Quantum mechanics-based minigolf-like game";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ raskin ];
+    platforms = platforms.linux;
+    # never built on aarch64-linux since first introduction in nixpkgs
+    broken = stdenv.isLinux && stdenv.isAarch64;
+  };
+}
diff --git a/nixpkgs/pkgs/games/qzdl/default.nix b/nixpkgs/pkgs/games/qzdl/default.nix
new file mode 100644
index 000000000000..0b44328fb8e4
--- /dev/null
+++ b/nixpkgs/pkgs/games/qzdl/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, inih
+, ninja
+, pkg-config
+, qtbase
+, wrapQtAppsHook
+, makeDesktopItem
+, copyDesktopItems
+}:
+
+stdenv.mkDerivation rec {
+  pname = "qzdl";
+  version = "unstable-2023-04-04";
+
+  src = fetchFromGitHub {
+    owner = "qbasicer";
+    repo = "qzdl";
+    rev = "44aaec0182e781a3cef373e5c795c9dbd9cd61bb";
+    hash = "sha256-K/mJQb7uO2H94krWJIJtFRYd6BAe2TX1xBt6fGBb1tA=";
+  };
+
+  patches = [
+    ./non-bundled-inih.patch
+  ];
+
+  nativeBuildInputs = [
+    cmake
+    copyDesktopItems
+    ninja
+    pkg-config
+    wrapQtAppsHook
+  ];
+
+  buildInputs = [
+    inih
+    qtbase
+  ];
+
+  postInstall = ''
+    install -Dm644 $src/res/zdl3.svg $out/share/icons/hicolor/scalable/apps/zdl3.svg
+  '';
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "zdl3";
+      exec = "zdl %U";
+      icon = "zdl3";
+      desktopName = "ZDL";
+      genericName = "A ZDoom WAD Launcher";
+      categories = [ "Game" ];
+    })
+  ];
+
+  meta = with lib; {
+    description = "A ZDoom WAD Launcher";
+    homepage = "https://zdl.vectec.net";
+    license = licenses.gpl3Only;
+    inherit (qtbase.meta) platforms;
+    maintainers = with maintainers; [ azahi ];
+    mainProgram = "zdl";
+  };
+}
diff --git a/nixpkgs/pkgs/games/qzdl/non-bundled-inih.patch b/nixpkgs/pkgs/games/qzdl/non-bundled-inih.patch
new file mode 100644
index 000000000000..7e47dd8c2017
--- /dev/null
+++ b/nixpkgs/pkgs/games/qzdl/non-bundled-inih.patch
@@ -0,0 +1,36 @@
+diff --git i/CMakeLists.txt w/CMakeLists.txt
+index 10a8fb6..dcab540 100644
+--- i/CMakeLists.txt
++++ w/CMakeLists.txt
+@@ -6,16 +6,8 @@ set(CMAKE_AUTOMOC ON)
+ project(qzdl LANGUAGES C CXX)
+ find_package(Qt5 COMPONENTS Core Widgets REQUIRED)
+ 
+-include(FetchContent)
+-FetchContent_Declare(
+-	inih
+-	GIT_REPOSITORY https://github.com/benhoyt/inih.git
+-	GIT_TAG r44
+-)
+-FetchContent_GetProperties(inih)
+-if (NOT inih_POPULATED)
+-	FetchContent_Populate(inih)
+-endif()
++find_package(PkgConfig)
++pkg_check_modules(INIH inih)
+ 
+ add_executable(
+ 	zdl
+@@ -45,9 +37,8 @@ add_executable(
+ 	libwad.cpp
+ 	qzdl.cpp
+ 	${PROJECT_SOURCE_DIR}/zdlconf/zdlconf.cpp
+-	${inih_SOURCE_DIR}/ini.c
+ )
+ 
+-target_include_directories(zdl PRIVATE ${PROJECT_SOURCE_DIR}/zdlconf)
+-target_include_directories(zdl PRIVATE ${inih_SOURCE_DIR})
+-target_link_libraries(zdl Qt5::Core Qt5::Widgets)
++target_include_directories(zdl PRIVATE ${PROJECT_SOURCE_DIR}/zdlconf ${INIH_INCLUDEDIR})
++target_link_libraries(zdl Qt5::Core Qt5::Widgets ${INIH_LDFLAGS})
++install(TARGETS zdl RUNTIME DESTINATION "bin")
diff --git a/nixpkgs/pkgs/games/r2mod_cli/default.nix b/nixpkgs/pkgs/games/r2mod_cli/default.nix
new file mode 100644
index 000000000000..3ea7432550fc
--- /dev/null
+++ b/nixpkgs/pkgs/games/r2mod_cli/default.nix
@@ -0,0 +1,38 @@
+{ fetchFromGitHub
+, bashInteractive
+, jq
+, makeWrapper
+, p7zip
+, lib, stdenv
+}:
+
+stdenv.mkDerivation rec {
+  pname = "r2mod_cli";
+  version = "1.3.3";
+
+  src = fetchFromGitHub {
+    owner = "Foldex";
+    repo = "r2mod_cli";
+    rev = "v${version}";
+    sha256 = "sha256-VtJtAyojFOkMLBfpQ6N+8fDDkcJtVCflWjwsdq8OD0w=";
+  };
+
+  buildInputs = [ bashInteractive ];
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  makeFlags = [ "DESTDIR=" "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 ];
+    mainProgram = "r2mod";
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/games/r2modman/default.nix b/nixpkgs/pkgs/games/r2modman/default.nix
new file mode 100644
index 000000000000..8c284bece161
--- /dev/null
+++ b/nixpkgs/pkgs/games/r2modman/default.nix
@@ -0,0 +1,119 @@
+{ lib
+, stdenv
+, yarn
+, fetchYarnDeps
+, prefetch-yarn-deps
+, nodejs
+, electron
+, fetchFromGitHub
+, gitUpdater
+, makeWrapper
+, makeDesktopItem
+, copyDesktopItems
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "r2modman";
+  version = "3.1.45";
+
+  src = fetchFromGitHub {
+    owner = "ebkr";
+    repo = "r2modmanPlus";
+    rev = "v${finalAttrs.version}";
+    hash = "sha256-6o6iPDKKqCzt7H0a64HGTvEvwO6hjRh1Drl8o4x+4ew=";
+  };
+
+  offlineCache = fetchYarnDeps {
+    yarnLock = "${finalAttrs.src}/yarn.lock";
+    hash = "sha256-CXitb/b2tvTfrkFrFv4KP4WdmMg+1sDtC/s2u5ezDfI=";
+  };
+
+  patches = [
+    # Make it possible to launch Steam games from r2modman.
+    ./steam-launch-fix.patch
+  ];
+
+  nativeBuildInputs = [
+    yarn
+    prefetch-yarn-deps
+    nodejs
+    makeWrapper
+    copyDesktopItems
+  ];
+
+  configurePhase = ''
+    runHook preConfigure
+
+    # Workaround for webpack bug
+    # https://github.com/webpack/webpack/issues/14532
+    export NODE_OPTIONS="--openssl-legacy-provider"
+    export HOME=$(mktemp -d)
+    yarn config --offline set yarn-offline-mirror $offlineCache
+    fixup-yarn-lock yarn.lock
+    yarn install --offline --frozen-lockfile --ignore-platform --ignore-scripts --no-progress --non-interactive
+    patchShebangs node_modules/
+
+    runHook postConfigure
+  '';
+
+  buildPhase = ''
+    runHook preBuild
+
+    yarn --offline quasar build --mode electron --skip-pkg
+
+    # Remove dev dependencies.
+    yarn install --production --offline --frozen-lockfile --ignore-platform --ignore-scripts --no-progress --non-interactive
+
+    runHook postBuild
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/share/r2modman
+    cp -r dist/electron/UnPackaged/. node_modules $out/share/r2modman
+
+    (
+      cd public/icons
+      for img in *png; do
+        dimensions=''${img#favicon-}
+        dimensions=''${dimensions%.png}
+        mkdir -p $out/share/icons/hicolor/$dimensions/apps
+        cp $img $out/share/icons/hicolor/$dimensions/apps/r2modman.png
+      done
+    )
+
+    makeWrapper '${lib.getExe electron}' "$out/bin/r2modman" \
+      --inherit-argv0 \
+      --add-flags "$out/share/r2modman" \
+      --add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations}}"
+
+    runHook postInstall
+  '';
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "r2modman";
+      exec = "r2modman";
+      icon = "r2modman";
+      desktopName = "r2modman";
+      comment = finalAttrs.meta.description;
+      categories = [ "Game" ];
+      keywords = [ "launcher" "mod manager" "thunderstore" ];
+    })
+  ];
+
+  passthru.updateScript = gitUpdater {
+    rev-prefix = "v";
+  };
+
+  meta = {
+    changelog = "https://github.com/ebkr/r2modmanPlus/releases/tag/v${finalAttrs.version}";
+    description = "Unofficial Thunderstore mod manager";
+    homepage = "https://github.com/ebkr/r2modmanPlus";
+    license = lib.licenses.mit;
+    mainProgram = "r2modman";
+    maintainers = with lib.maintainers; [ aidalgol huantian ];
+    inherit (electron.meta) platforms;
+  };
+})
diff --git a/nixpkgs/pkgs/games/r2modman/steam-launch-fix.patch b/nixpkgs/pkgs/games/r2modman/steam-launch-fix.patch
new file mode 100644
index 000000000000..4a52c8fdb359
--- /dev/null
+++ b/nixpkgs/pkgs/games/r2modman/steam-launch-fix.patch
@@ -0,0 +1,21 @@
+diff --git a/src/r2mm/launching/runners/linux/SteamGameRunner_Linux.ts b/src/r2mm/launching/runners/linux/SteamGameRunner_Linux.ts
+index ddee0e9..fc9ffca 100644
+--- a/src/r2mm/launching/runners/linux/SteamGameRunner_Linux.ts
++++ b/src/r2mm/launching/runners/linux/SteamGameRunner_Linux.ts
+@@ -61,15 +61,9 @@ export default class SteamGameRunner_Linux extends GameRunnerProvider {
+     async start(game: Game, args: string): Promise<void | R2Error> {
+ 
+         const settings = await ManagerSettings.getSingleton(game);
+-        const steamDir = await GameDirectoryResolverProvider.instance.getSteamDirectory();
+-        if(steamDir instanceof R2Error) {
+-            return steamDir;
+-        }
+-
+-        LoggerProvider.instance.Log(LogSeverity.INFO, `Steam directory is: ${steamDir}`);
+ 
+         try {
+-            const cmd = `"${steamDir}/steam.sh" -applaunch ${game.activePlatform.storeIdentifier} ${args} ${settings.getContext().gameSpecific.launchParameters}`;
++            const cmd = `steam -applaunch ${game.activePlatform.storeIdentifier} ${args} ${settings.getContext().gameSpecific.launchParameters}`;
+             LoggerProvider.instance.Log(LogSeverity.INFO, `Running command: ${cmd}`);
+             await exec(cmd);
+         } catch(err) {
diff --git a/nixpkgs/pkgs/games/racer/default.nix b/nixpkgs/pkgs/games/racer/default.nix
new file mode 100644
index 000000000000..bdb56c85dbff
--- /dev/null
+++ b/nixpkgs/pkgs/games/racer/default.nix
@@ -0,0 +1,32 @@
+{ fetchurl, lib, stdenv, allegro, libjpeg, makeWrapper }:
+
+stdenv.mkDerivation rec {
+  pname = "racer";
+  version = "1.1";
+
+  src = if stdenv.hostPlatform.system == "i686-linux" then fetchurl {
+    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-${version}.64.tar.gz";
+    sha256 = "0rjy3gmlhwfkb9zs58j0mc0dar0livwpbc19r6zw5r2k6r7xdan0";
+  } else
+    throw "System not supported";
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ allegro libjpeg ];
+
+  prePatch = ''
+    sed -i s,/usr/local,$out, Makefile src/HGFX.cpp src/STDH.cpp
+    sed -i s,/usr/share,$out/share, src/HGFX.cpp src/STDH.cpp
+  '';
+
+  patches = [ ./mkdir.patch ];
+
+  meta = {
+    description = "Car racing game";
+    homepage = "http://hippo.nipax.cz/download.en.php";
+    license = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/racer/mkdir.patch b/nixpkgs/pkgs/games/racer/mkdir.patch
new file mode 100644
index 000000000000..910eaf390f4c
--- /dev/null
+++ b/nixpkgs/pkgs/games/racer/mkdir.patch
@@ -0,0 +1,13 @@
+diff --git a/src/STDH.cpp b/src/STDH.cpp
+index 5f78473..47c3f8b 100644
+--- a/src/STDH.cpp
++++ b/src/STDH.cpp
+@@ -5,6 +5,8 @@
+ #include "player.h"

+ #include "drivers.h"

+ #include "cup.h"

++#include <sys/stat.h>
++#include <sys/types.h>
+ 

+ HScreen hscreen;

+ 

diff --git a/nixpkgs/pkgs/games/randtype/default.nix b/nixpkgs/pkgs/games/randtype/default.nix
new file mode 100644
index 000000000000..97993a5ffdac
--- /dev/null
+++ b/nixpkgs/pkgs/games/randtype/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, fetchzip, zlib }:
+
+stdenv.mkDerivation rec {
+  pname = "randtype";
+  version = "1.13";
+
+  src = fetchzip {
+    url = "mirror://sourceforge/randtype/${pname}-${version}.tar.gz";
+    sha256 = "055xs02qwpgbkn2l57bwghbsrsysg1zhm2asp0byvjpz4sc4w1rd";
+  };
+
+  buildInputs = [ zlib ];
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/share/man/man1 $out/bin
+    install -cp randtype.1.gz $out/share/man/man1
+    install -cps randtype $out/bin
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "semi-random text typer";
+    homepage = "https://benkibbey.wordpress.com/randtype/";
+    maintainers = with maintainers; [ dandellion ];
+    license = licenses.gpl2Only;
+    platforms = platforms.unix;
+    broken = stdenv.isDarwin; # never built on Hydra https://hydra.nixos.org/job/nixpkgs/trunk/randtype.x86_64-darwin
+  };
+}
diff --git a/nixpkgs/pkgs/games/rare/default.nix b/nixpkgs/pkgs/games/rare/default.nix
new file mode 100644
index 000000000000..6d46b09626f6
--- /dev/null
+++ b/nixpkgs/pkgs/games/rare/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, fetchFromGitHub
+, buildPythonApplication
+, qt5
+, legendary-gl
+, orjson
+, pypresence
+, pyqt5
+, python
+, qtawesome
+, requests
+, setuptools
+, typing-extensions
+}:
+
+buildPythonApplication rec {
+  pname = "rare";
+  version = "1.10.11";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "RareDevs";
+    repo = "Rare";
+    rev = "refs/tags/${version}";
+    hash = "sha256-2DtI5iaK4bYdGfIEhPy52WaEqh+IJMZ6qo/348lMnLY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    qt5.wrapQtAppsHook
+  ];
+
+  propagatedBuildInputs = [
+    legendary-gl
+    orjson
+    pypresence
+    pyqt5
+    qtawesome
+    requests
+    typing-extensions
+  ];
+
+  dontWrapQtApps = true;
+
+  postInstall = ''
+    install -Dm644 misc/rare.desktop -t $out/share/applications/
+    install -Dm644 $out/${python.sitePackages}/rare/resources/images/Rare.png $out/share/pixmaps/rare.png
+  '';
+
+  preFixup = ''
+    makeWrapperArgs+=("''${qtWrapperArgs[@]}")
+  '';
+
+  # Project has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "GUI for Legendary, an Epic Games Launcher open source alternative";
+    homepage = "https://github.com/RareDevs/Rare";
+    maintainers = with maintainers; [ wolfangaukang ];
+    license = licenses.gpl3Only;
+    platforms = platforms.linux;
+    mainProgram = "rare";
+  };
+}
diff --git a/nixpkgs/pkgs/games/raylib-games/default.nix b/nixpkgs/pkgs/games/raylib-games/default.nix
new file mode 100644
index 000000000000..34ef5c801435
--- /dev/null
+++ b/nixpkgs/pkgs/games/raylib-games/default.nix
@@ -0,0 +1,61 @@
+{ lib, stdenv, fetchFromGitHub, raylib, darwin }:
+
+let
+  inherit (darwin.apple_sdk.frameworks) Cocoa;
+in
+stdenv.mkDerivation rec {
+  pname = "raylib-games";
+  version = "2022-10-24";
+
+  src = fetchFromGitHub {
+    owner = "raysan5";
+    repo = pname;
+    rev = "e00d77cf96ba63472e8316ae95a23c624045dcbe";
+    hash = "sha256-N9ip8yFUqXmNMKcvQuOyxDI4yF/w1YaoIh0prvS4Xr4=";
+  };
+
+  buildInputs = [ raylib ]
+    ++ lib.optionals stdenv.isDarwin [ Cocoa ];
+
+  configurePhase = ''
+    runHook preConfigure
+    for d in *; do
+      if [ -d $d/src/resources ]; then
+        for f in $d/src/*.c $d/src/*.h; do
+          sed "s|\"resources/|\"$out/resources/$d/|g" -i $f
+        done
+      fi
+    done
+    runHook postConfigure
+  '';
+
+  buildPhase = ''
+    runHook preBuild
+    for d in *; do
+      if [ -f $d/src/Makefile ]; then
+        make -C $d/src
+      fi
+    done
+    runHook postBuild
+  '';
+
+  installPhase = ''
+    runHook preBuild
+    mkdir -p $out/bin $out/resources
+    find . -type f -executable -exec cp {} $out/bin \;
+    for d in *; do
+      if [ -d "$d/src/resources" ]; then
+        cp -ar "$d/src/resources" "$out/resources/$d"
+      fi
+    done
+    runHook postBuild
+  '';
+
+  meta = with lib; {
+    description = "A collection of games made with raylib ";
+    homepage = "https://www.raylib.com/games.html";
+    license = licenses.zlib;
+    maintainers = with maintainers; [ ehmry ];
+    inherit (raylib.meta) platforms;
+  };
+}
diff --git a/nixpkgs/pkgs/games/redeclipse/default.nix b/nixpkgs/pkgs/games/redeclipse/default.nix
new file mode 100644
index 000000000000..07c2b9e33adf
--- /dev/null
+++ b/nixpkgs/pkgs/games/redeclipse/default.nix
@@ -0,0 +1,48 @@
+{ lib, stdenv, fetchFromGitHub, fetchurl, fetchpatch
+, curl, ed, pkg-config, freetype, zlib, libX11
+, SDL2, SDL2_image, SDL2_mixer
+}:
+
+stdenv.mkDerivation rec {
+  pname = "redeclipse";
+  version = "2.0.0";
+
+  src = fetchurl {
+    url = "https://github.com/redeclipse/base/releases/download/v${version}/redeclipse_${version}_nix.tar.bz2";
+    sha256 = "143i713ggbk607qr4n39pi0pn8d93x9x6fcbh8rc51jb9qhi8p5i";
+  };
+
+  buildInputs = [
+    libX11 freetype zlib
+    SDL2 SDL2_image SDL2_mixer
+  ];
+
+  nativeBuildInputs = [
+    curl ed pkg-config
+  ];
+
+  makeFlags = [ "-C" "src/" "prefix=$(out)" ];
+
+  enableParallelBuilding = true;
+
+  installTargets = [ "system-install" ];
+
+  postInstall = ''
+      cp -R -t $out/share/redeclipse/data/ data/*
+  '';
+
+  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
+      toward balanced gameplay, with a general theme of agility in a variety of
+      environments.
+    '';
+    homepage = "https://www.redeclipse.net";
+    license = with licenses; [ licenses.zlib cc-by-sa-30 ];
+    maintainers = with maintainers; [ lambda-11235 ];
+    platforms = platforms.linux;
+    hydraPlatforms = [];
+  };
+}
diff --git a/nixpkgs/pkgs/games/rftg/default.nix b/nixpkgs/pkgs/games/rftg/default.nix
new file mode 100644
index 000000000000..1dfeaf3c3a89
--- /dev/null
+++ b/nixpkgs/pkgs/games/rftg/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, fetchurl, gtk2, pkg-config }:
+
+stdenv.mkDerivation rec {
+
+  pname = "rftg";
+  version = "0.9.4";
+
+  src = fetchurl {
+    url = "http://keldon.net/rftg/rftg-${version}.tar.bz2";
+    sha256 = "0j2y6ggpwdlvyqhirp010aix2g6aacj3kvggvpwzxhig30x9vgq8";
+  };
+
+  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 = lib.licenses.gpl2;
+    maintainers = [ lib.maintainers.falsifian ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/games/rigsofrods-bin/default.nix b/nixpkgs/pkgs/games/rigsofrods-bin/default.nix
new file mode 100644
index 000000000000..fa9edfe72f45
--- /dev/null
+++ b/nixpkgs/pkgs/games/rigsofrods-bin/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, stdenv
+, fetchurl
+, autoPatchelfHook
+, makeWrapper
+, unzip
+, libGL
+, libICE
+, libSM
+, libX11
+, libXrandr
+, zlib
+, alsa-lib
+}:
+
+stdenv.mkDerivation rec {
+  pname = "rigsofrods-bin";
+  version = "2022.12";
+
+  src = fetchurl {
+    url = "https://update.rigsofrods.org/rigs-of-rods-linux-2022-12.zip";
+    hash = "sha256-jj152fd4YHlU6YCVCnN6DKRfmi5+ORpMQVDacy/TPeE=";
+  };
+
+  sourceRoot = ".";
+
+  nativeBuildInputs = [
+    autoPatchelfHook
+    makeWrapper
+    unzip
+  ];
+
+  buildInputs = [
+    libGL
+    libICE
+    libSM
+    libX11
+    libXrandr
+    stdenv.cc.cc
+    zlib
+  ];
+
+  runtimeDependencies = [
+    alsa-lib
+  ];
+
+  noDumpEnvVars = true;
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/bin $out/share/rigsofrods
+    cp -a . $out/share/rigsofrods
+    for f in RoR RunRoR; do
+      makeWrapper $out/share/rigsofrods/$f $out/bin/$f \
+        --chdir $out/share/rigsofrods
+    done
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "A free/libre soft-body physics simulator mainly targeted at simulating vehicle physics";
+    homepage = "https://www.rigsofrods.org";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ raskin wegank ];
+    platforms = [ "x86_64-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/riko4/default.nix b/nixpkgs/pkgs/games/riko4/default.nix
new file mode 100644
index 000000000000..7014bf9ca21b
--- /dev/null
+++ b/nixpkgs/pkgs/games/riko4/default.nix
@@ -0,0 +1,65 @@
+{ lib, stdenv, fetchFromGitHub, cmake, SDL2, libGLU, luajit, curl, curlpp }:
+
+let
+  # Newer versions of sdl-gpu don't work with Riko4 (corrupted graphics),
+  # and this library does not have a proper release version, so let the
+  # derivation for this stay next to the Riko4 derivation for now.
+  sdl-gpu = stdenv.mkDerivation {
+    pname = "sdl-gpu";
+    version = "2018-11-01";
+    src = fetchFromGitHub {
+      owner = "grimfang4";
+      repo = "sdl-gpu";
+      rev = "a4ff1ab02410f154b004c29ec46e07b22890fa1f";
+      sha256 = "1wdwg331s7r4dhq1l8w4dvlqf4iywskpdrscgbwrz9j0c6nqqi3v";
+    };
+    buildInputs = [ SDL2 libGLU ];
+    nativeBuildInputs = [ cmake ];
+
+    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;
+      maintainers = with maintainers; [ CrazedProgrammer ];
+    };
+  };
+in
+
+stdenv.mkDerivation rec {
+  pname = "riko4";
+  version = "0.1.0";
+  src = fetchFromGitHub {
+    owner = "incinirate";
+    repo = "Riko4";
+    rev = "v${version}";
+    sha256 = "008i9991sn616dji96jfwq6gszrspbx4x7cynxb1cjw66phyy5zp";
+  };
+
+  buildInputs = [ SDL2 luajit sdl-gpu curl curlpp ];
+  nativeBuildInputs = [ cmake ];
+
+  hardeningDisable = [ "fortify" ];
+  cmakeFlags = [ "-DSDL2_gpu_INCLUDE_DIR=\"${sdl-gpu}/include\"" ];
+
+  # Riko4 needs the data/ and scripts/ directories to be in its PWD.
+  installPhase = ''
+    install -Dm0755 riko4 $out/bin/.riko4-unwrapped
+    mkdir -p $out/lib/riko4
+    cp -r ../data $out/lib/riko4
+    cp -r ../scripts $out/lib/riko4
+    cat > $out/bin/riko4 <<EOF
+    #!/bin/sh
+    pushd $out/lib/riko4 > /dev/null
+    exec $out/bin/.riko4-unwrapped "\$@"
+    popd > /dev/null
+    EOF
+    chmod +x $out/bin/riko4
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/incinirate/Riko4";
+    description = "Fantasy console for pixel art game development";
+    license = licenses.mit;
+    maintainers = with maintainers; [ CrazedProgrammer ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/rili/default.nix b/nixpkgs/pkgs/games/rili/default.nix
new file mode 100644
index 000000000000..b02cf7e5dea0
--- /dev/null
+++ b/nixpkgs/pkgs/games/rili/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv, fetchurl, fetchpatch, SDL_mixer, SDL, autoreconfHook }:
+
+stdenv.mkDerivation rec {
+  pname = "ri_li";
+  version = "2.0.1";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/ri-li/Ri-li-${version}.tar.bz2";
+    sha256 = "f71ccc20c37c601358d963e087ac0d524de8c68e96df09c3aac1ae65edd38dbd";
+  };
+
+  patches = [
+    ./moderinze_cpp.patch
+
+    # Build fix for gcc-11 pending upstream inclusion:
+    #  https://sourceforge.net/p/ri-li/bugs/2/
+    (fetchpatch {
+      name = "gcc-11.patch";
+      url = "https://sourceforge.net/p/ri-li/bugs/2/attachment/0001-Fix-build-on-gcc-11.patch";
+      sha256 = "01il9lm3amwp3b435ka9q63p0jwlzajwnbshyazx6n9vcnrr17yw";
+    })
+  ];
+
+  CPPFLAGS = "-I${lib.getDev SDL}/include -I${lib.getDev SDL}/include/SDL -I${SDL_mixer}/include";
+
+  nativeBuildInputs = [ autoreconfHook ];
+  buildInputs = [ SDL SDL_mixer ];
+
+  meta = {
+    homepage = "https://ri-li.sourceforge.net";
+    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 lib.maintainers; [ jcumming ];
+    platforms = with lib.platforms; linux;
+    mainProgram = "Ri_li";
+  };
+}
diff --git a/nixpkgs/pkgs/games/rili/moderinze_cpp.patch b/nixpkgs/pkgs/games/rili/moderinze_cpp.patch
new file mode 100644
index 000000000000..3d076afb39e3
--- /dev/null
+++ b/nixpkgs/pkgs/games/rili/moderinze_cpp.patch
@@ -0,0 +1,391 @@
+diff -r -u Ri-li-2.0.1.orig/src/audio.cc Ri-li-2.0.1/src/audio.cc
+--- Ri-li-2.0.1.orig/src/audio.cc	2012-01-22 00:40:56.928609371 -0800
++++ Ri-li-2.0.1/src/audio.cc	2012-01-22 00:28:33.360636539 -0800
+@@ -22,8 +22,8 @@
+ //    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ 
+ #include <stdlib.h>
+-#include <iostream.h>
+-#include <string.h>
++#include <iostream>
++#include <string>
+ 
+ #include "audio.h"
+ #include "utils.h"
+@@ -57,7 +57,7 @@
+   char PathFile[512];
+ 
+   if(Mix_OpenAudio(22050,AUDIO_S16,1,1024)) {
+-    cerr <<"Enable to init Sound card ! "<<SDL_GetError()<<endl;
++    std::cerr <<"Enable to init Sound card ! "<<SDL_GetError()<<std::endl;
+     return false;
+   }
+   
+diff -r -u Ri-li-2.0.1.orig/src/ecran.cc Ri-li-2.0.1/src/ecran.cc
+--- Ri-li-2.0.1.orig/src/ecran.cc	2007-11-02 04:48:16.000000000 -0700
++++ Ri-li-2.0.1/src/ecran.cc	2012-01-22 00:13:54.422798653 -0800
+@@ -21,7 +21,7 @@
+ //    with this program; if not, write to the Free Software Foundation, Inc.,
+ //    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ 
+-#include <iostream.h>
++#include <iostream>
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <math.h>
+diff -r -u Ri-li-2.0.1.orig/src/editeur.cc Ri-li-2.0.1/src/editeur.cc
+--- Ri-li-2.0.1.orig/src/editeur.cc	2007-11-02 04:48:17.000000000 -0700
++++ Ri-li-2.0.1/src/editeur.cc	2012-01-22 00:28:59.632635579 -0800
+@@ -25,10 +25,10 @@
+ #include <windows.h>
+ #endif
+ 
+-#include <iostream.h>
++#include <iostream>
+ #include <stdio.h>
+ #include <stdlib.h>
+-#include <string.h>
++#include <string>
+ #include <math.h>
+ #include <SDL/SDL.h>
+ 
+@@ -374,7 +374,7 @@
+     
+     // Sauve le niveau
+     if(Niveau.Save()==false) {
+-      cerr <<"ERREUR Saving levels!"<<endl;
++      std::cerr <<"ERREUR Saving levels!"<<std::endl;
+       exit(-1);
+     }
+     
+diff -r -u Ri-li-2.0.1.orig/src/jeux.cc Ri-li-2.0.1/src/jeux.cc
+--- Ri-li-2.0.1.orig/src/jeux.cc	2007-11-02 04:48:17.000000000 -0700
++++ Ri-li-2.0.1/src/jeux.cc	2012-01-22 00:14:08.422798143 -0800
+@@ -25,10 +25,10 @@
+ #include <windows.h>
+ #endif
+ 
+-#include <iostream.h>
++#include <iostream>
+ #include <stdio.h>
+ #include <stdlib.h>
+-#include <string.h>
++#include <string>
+ #include <math.h>
+ #include <SDL/SDL.h>
+ 
+diff -r -u Ri-li-2.0.1.orig/src/loco.cc Ri-li-2.0.1/src/loco.cc
+--- Ri-li-2.0.1.orig/src/loco.cc	2007-11-02 04:48:18.000000000 -0700
++++ Ri-li-2.0.1/src/loco.cc	2012-01-22 00:14:17.878797797 -0800
+@@ -21,10 +21,10 @@
+ //    with this program; if not, write to the Free Software Foundation, Inc.,
+ //    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ 
+-#include <iostream.h>
++#include <iostream>
+ #include <stdio.h>
+ #include <stdlib.h>
+-#include <string.h>
++#include <string>
+ #include <math.h>
+ #include "preference.h"
+ #include "loco.h"
+diff -r -u Ri-li-2.0.1.orig/src/main.cc Ri-li-2.0.1/src/main.cc
+--- Ri-li-2.0.1.orig/src/main.cc	2007-11-02 04:48:19.000000000 -0700
++++ Ri-li-2.0.1/src/main.cc	2012-01-22 00:29:40.080634136 -0800
+@@ -23,8 +23,8 @@
+ 
+ #include <stdio.h>
+ #include <stdlib.h>
+-#include <iostream.h>
+-#include <string.h>
++#include <iostream>
++#include <string>
+ #include <SDL/SDL.h>
+ #include <SDL/SDL_mixer.h>
+ 
+@@ -115,7 +115,7 @@
+  
+   // Initilise SDL
+   if( SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_AUDIO|SDL_INIT_NOPARACHUTE) < 0 ) {
+-    cerr <<"Impossible d'initialiser SDL:"<<SDL_GetError()<<endl;
++    std::cerr <<"Impossible d'initialiser SDL:"<<SDL_GetError()<<std::endl;
+     exit(-1);
+   }
+   // Ferme le programme correctement quant quit
+@@ -125,7 +125,7 @@
+   sdlVideoInfo=(SDL_VideoInfo*)SDL_GetVideoInfo();
+ 
+   if(sdlVideoInfo->vfmt->BitsPerPixel==8) {
+-    cerr <<"Impossible d'utiliser 8bits pour la vidéo !"<<endl;
++    std::cerr <<"Impossible d'utiliser 8bits pour la vidéo !"<<std::endl;
+     exit(-1);
+   }
+   
+@@ -145,7 +145,7 @@
+   sdlVideo=SDL_SetVideoMode(800,600,sdlVideoInfo->vfmt->BitsPerPixel,vOption);
+ 
+   if(sdlVideo==NULL) {
+-    cerr <<"Impossible de passer dans le mode vidéo 800x600 !"<<endl;
++    std::cerr <<"Impossible de passer dans le mode vidéo 800x600 !"<<std::endl;
+     exit(-1);
+   }
+   // Change le nom de la fenetre
+diff -r -u Ri-li-2.0.1.orig/src/menu.cc Ri-li-2.0.1/src/menu.cc
+--- Ri-li-2.0.1.orig/src/menu.cc	2007-11-02 04:48:19.000000000 -0700
++++ Ri-li-2.0.1/src/menu.cc	2012-01-22 00:30:04.752633198 -0800
+@@ -21,10 +21,10 @@
+ //    with this program; if not, write to the Free Software Foundation, Inc.,
+ //    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ 
+-#include <iostream.h>
++#include <iostream>
+ #include <stdio.h>
+ #include <stdlib.h>
+-#include <string.h>
++#include <string>
+ #include "preference.h"
+ #include "menu.h"
+ #include "sprite.h"
+@@ -92,7 +92,7 @@
+   // Teste la resolution video
+   sdlVideoInfo=(SDL_VideoInfo*)SDL_GetVideoInfo();
+   if(sdlVideoInfo->vfmt->BitsPerPixel==8) {
+-    cerr <<"Impossible d'utiliser 8bits pour la vidéo !"<<endl;
++    std::cerr <<"Impossible d'utiliser 8bits pour la vidéo !"<<std::endl;
+     exit(-1);
+   }
+   
+@@ -112,7 +112,7 @@
+   if(Pref.FullScreen) vOption|=SDL_FULLSCREEN;
+   sdlVideo=SDL_SetVideoMode(800,600,sdlVideoInfo->vfmt->BitsPerPixel,vOption);
+   if(sdlVideo==NULL) {
+-    cerr <<"Impossible de passer dans le mode vidéo 800x600 !"<<endl;
++    std::cerr <<"Impossible de passer dans le mode vidéo 800x600 !"<<std::endl;
+     exit(-1);
+   }
+   
+diff -r -u Ri-li-2.0.1.orig/src/mouse.cc Ri-li-2.0.1/src/mouse.cc
+--- Ri-li-2.0.1.orig/src/mouse.cc	2007-11-02 04:48:20.000000000 -0700
++++ Ri-li-2.0.1/src/mouse.cc	2012-01-22 00:14:36.438797120 -0800
+@@ -21,7 +21,7 @@
+ //    with this program; if not, write to the Free Software Foundation, Inc.,
+ //    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ 
+-#include <iostream.h>
++#include <iostream>
+ #include <stdio.h>
+ #include "mouse.h"
+ #include "preference.h"
+diff -r -u Ri-li-2.0.1.orig/src/sprite.cc Ri-li-2.0.1/src/sprite.cc
+--- Ri-li-2.0.1.orig/src/sprite.cc	2007-11-02 04:48:20.000000000 -0700
++++ Ri-li-2.0.1/src/sprite.cc	2012-01-22 00:30:43.640631779 -0800
+@@ -21,10 +21,10 @@
+ //    with this program; if not, write to the Free Software Foundation, Inc.,
+ //    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ 
+-#include <iostream.h>
++#include <iostream>
+ #include <stdio.h>
+ #include <stdlib.h>
+-#include <string.h>
++#include <string>
+ #include <math.h>
+ #include "sprite.h"
+ #include "preference.h"
+@@ -84,7 +84,7 @@
+   strcpy(PathFile,Langue[Pref.Langue]);
+   GetPath(PathFile);
+   if(FileExiste(PathFile)==false) {
+-    cerr <<"Impossible de trouver "<<Langue[Pref.Langue]<<endl;
++    std::cerr <<"Impossible de trouver "<<Langue[Pref.Langue]<<std::endl;
+     return false;
+   }
+   L=ChargeFichier(PathFile,Buf);
+@@ -128,7 +128,7 @@
+   // *** Charge le fichier des langues ***
+   // *************************************
+   if(FileExiste(PathFile)==false) {
+-    cerr <<"Impossible de trouver 'language.dat'"<<endl;
++    std::cerr <<"Impossible de trouver 'language.dat'"<<std::endl;
+     return false;
+   }
+   L=ChargeFichier(PathFile,Buf);
+@@ -163,7 +163,7 @@
+   strcpy(PathFile,"sprites.dat");
+   GetPath(PathFile);
+   if(FileExiste(PathFile)==false) {
+-    cerr <<"Impossible de trouver 'sprites.dat'"<<endl;
++    std::cerr <<"Impossible de trouver 'sprites.dat'"<<std::endl;
+     return false;
+   }
+   L=ChargeFichier(PathFile,Buf);
+@@ -352,7 +352,7 @@
+     Image[i]=SDL_CreateRGBSurface((Dim[i].bpp-3)*SDL_SRCALPHA,Dim[i].L,Dim[i].H,Dim[i].bpp*8,
+ 				  0xff,0xff00,0xff0000,0xff000000*(Dim[i].bpp-3));
+     if(Image[i]<=NULL) {
+-      cerr <<"Impossible de créer une Surface SDL!"<<endl;
++      std::cerr <<"Impossible de créer une Surface SDL!"<<std::endl;
+       return false;
+     }
+     
+@@ -486,7 +486,7 @@
+   Image[0]=SDL_CreateRGBSurface((Dim[0].bpp-3)*SDL_SRCALPHA,Dim[0].L,Dim[0].H,Dim[0].bpp*8,
+ 				0xff,0xff00,0xff0000,0xff000000*(Dim[0].bpp-3));
+   if(Image[0]<=NULL) {
+-    cerr <<"Impossible de créer une Surface SDL!"<<endl;
++    std::cerr <<"Impossible de créer une Surface SDL!"<<std::endl;
+     return false;
+   }
+   return true;
+diff -r -u Ri-li-2.0.1.orig/src/tableau.cc Ri-li-2.0.1/src/tableau.cc
+--- Ri-li-2.0.1.orig/src/tableau.cc	2007-11-02 04:48:21.000000000 -0700
++++ Ri-li-2.0.1/src/tableau.cc	2012-01-22 00:14:50.710796598 -0800
+@@ -21,7 +21,7 @@
+ //    with this program; if not, write to the Free Software Foundation, Inc.,
+ //    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ 
+-#include <iostream.h>
++#include <iostream>
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include "preference.h"
+diff -r -u Ri-li-2.0.1.orig/src/utils.cc Ri-li-2.0.1/src/utils.cc
+--- Ri-li-2.0.1.orig/src/utils.cc	2007-11-02 04:48:22.000000000 -0700
++++ Ri-li-2.0.1/src/utils.cc	2012-01-22 00:31:30.944630051 -0800
+@@ -21,10 +21,10 @@
+ //    with this program; if not, write to the Free Software Foundation, Inc.,
+ //    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ 
+-#include <iostream.h>
++#include <iostream>
+ #include <stdio.h>
+ #include <stdlib.h>
+-#include <string.h>
++#include <string>
+ 
+ #ifdef WINDOWS
+ #include <windows.h>
+@@ -77,7 +77,7 @@
+ 
+   file=fopen(Path,"r");
+   if(!file) {
+-    cerr <<"ERREUR: Impossible d'ouvrir '"<<Path<<"'"<<endl;
++    std::cerr <<"ERREUR: Impossible d'ouvrir '"<<Path<<"'"<<std::endl;
+     perror("fopen");
+     return -1;
+   }
+@@ -93,7 +93,7 @@
+ 
+   Buf=new unsigned char [L+1];
+   if(Buf==NULL) {
+-    cerr <<"ERREUR: Memoire insuffisante!"<<endl;
++    std::cerr <<"ERREUR: Memoire insuffisante!"<<std::endl;
+     fclose(file);
+     return -1;
+   }
+@@ -104,7 +104,7 @@
+   while(Compt>1024) {
+     AfficheChargeur();
+     if( fread(Po,1,1024,file) != 1024 ) {
+-      cerr <<"ERREUR de lecture du fichier '"<<Path<<"'"<<endl;
++      std::cerr <<"ERREUR de lecture du fichier '"<<Path<<"'"<<std::endl;
+       perror("fread");
+       fclose(file);
+       delete [] Buf;
+@@ -131,13 +131,13 @@
+ 
+   file=_lopen(Path,OF_READ);
+   if(file==-1) {
+-    cerr <<"Impossible d'ouvrir "<<Path<<endl;
++    std::cerr <<"Impossible d'ouvrir "<<Path<<std::endl;
+     exit(-1);
+   }
+   
+   long L=(long)_llseek(file,0,SEEK_END);
+   if(L==-1) {
+-    cerr <<"Impossible de trouver la longueur du fichier"<<endl;
++    std::cerr <<"Impossible de trouver la longueur du fichier"<<std::endl;
+     perror("lseek");
+     _lclose(file);
+     return -1;
+@@ -146,7 +146,7 @@
+   
+   Buf=new unsigned char [L+1];
+   if(Buf==NULL) {
+-    cerr <<"ERREUR: Memoire insuffisante!"<<endl;
++    std::cerr <<"ERREUR: Memoire insuffisante!"<<std::endl;
+     _lclose(file);
+     return -1;
+   }
+@@ -169,14 +169,14 @@
+   
+   file=fopen(Path,"w");
+   if(!file) {
+-    cerr <<"ERREUR: Impossible d'ouvrir '"<<Path<<"'"<<endl;
++    std::cerr <<"ERREUR: Impossible d'ouvrir '"<<Path<<"'"<<std::endl;
+     perror("fopen");
+     return false;
+   }
+   
+   while(L>512) {
+     if( fwrite(Buf,1,512,file) != 512 ) {
+-      cerr <<"ERREUR d'ecriture du fichier '"<<Path<<"'"<<endl;
++      std::cerr <<"ERREUR d'ecriture du fichier '"<<Path<<"'"<<std::endl;
+       perror("fwrite");
+       fclose(file);
+       return false;
+@@ -187,7 +187,7 @@
+ 
+   if(L>0) {
+     if( fwrite(Buf,1,(size_t)L,file) != (size_t)L ) {
+-      cerr <<"ERREUR d'ecriture du fichier '"<<Path<<"'"<<endl;
++      std::cerr <<"ERREUR d'ecriture du fichier '"<<Path<<"'"<<std::endl;
+       perror("fwrite");
+       fclose(file);
+       return false;
+@@ -208,7 +208,7 @@
+ 
+   file=_lcreat(Path,0);
+   if(!file) {
+-    cerr <<"ERREUR: Impossible de créer le fichier '"<<Path<<"'"<<endl;
++    std::cerr <<"ERREUR: Impossible de créer le fichier '"<<Path<<"'"<<std::endl;
+     return false;
+   }
+   
+@@ -216,7 +216,7 @@
+   _lclose(file);
+ 
+   if(Lec!=L) {
+-    cerr <<"Problème d'ecriture du fichier '"<<Path<<"' ecris="<<Lec<<" au lieux de ="<<L<<endl;
++    std::cerr <<"Problème d'ecriture du fichier '"<<Path<<"' ecris="<<Lec<<" au lieux de ="<<L<<std::endl;
+     return false;
+   }
+ 
+@@ -250,7 +250,7 @@
+   sprintf(Path,"/usr/share/games/Ri-li/%s",Provi);
+   if(FileExiste(Path)) return;
+   
+-  cerr <<"Impossible de trouver le fichier '"<<Provi<<endl;
++  std::cerr <<"Impossible de trouver le fichier '"<<Provi<<std::endl;
+   exit(-1);
+ }
+ #endif
+@@ -266,7 +266,7 @@
+   sprintf(Path,"PROGDIR:%s",Provi);
+   if(FileExiste(Path)) return;
+   
+-  cerr <<"Impossible de trouver le fichier '"<<Path<<endl;
++  std::cerr <<"Impossible de trouver le fichier '"<<Path<<std::endl;
+   exit(-1);
+ }
+ #endif
+@@ -282,7 +282,7 @@
+   sprintf(Path,"Ri-li.app/Contents/Resources/%s",Provi);
+   if(FileExiste(Path)) return;
+   
+-  cerr <<"Impossible de trouver le fichier '"<<Path<<endl;
++  std::cerr <<"Impossible de trouver le fichier '"<<Path<<std::endl;
+   exit(-1);
+ }
+ #endif
diff --git a/nixpkgs/pkgs/games/rocksndiamonds/default.nix b/nixpkgs/pkgs/games/rocksndiamonds/default.nix
new file mode 100644
index 000000000000..67d798f8d4a6
--- /dev/null
+++ b/nixpkgs/pkgs/games/rocksndiamonds/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, stdenv
+, fetchurl
+, fetchpatch
+, makeDesktopItem
+, SDL2
+, SDL2_image
+, SDL2_mixer
+, SDL2_net
+, zlib
+}:
+
+stdenv.mkDerivation rec {
+  pname = "rocksndiamonds";
+  version = "4.3.8.1";
+
+  src = fetchurl {
+    url = "https://www.artsoft.org/RELEASES/linux/${pname}/${pname}-${version}-linux.tar.gz";
+    hash = "sha256-kc8E9hyXSr8UdwDA5I4/iP6NfpV/Lso5Q//E/cV02UA=";
+  };
+
+  desktopItem = makeDesktopItem {
+    name = "rocksndiamonds";
+    exec = "rocksndiamonds";
+    icon = "rocksndiamonds";
+    comment = meta.description;
+    desktopName = "Rocks'n'Diamonds";
+    genericName = "Tile-based puzzle";
+    categories = [ "Game" "LogicGame" ];
+  };
+
+  buildInputs = [ SDL2 SDL2_image SDL2_mixer SDL2_net zlib ];
+
+  preBuild = ''
+    dataDir="$out/share/rocksndiamonds"
+    makeFlags+="BASE_PATH=$dataDir"
+  '';
+
+  installPhase = ''
+    appDir=$out/share/applications
+    iconDir=$out/share/icons/hicolor/32x32/apps
+    mkdir -p $out/bin $appDir $iconDir $dataDir
+    cp rocksndiamonds $out/bin/
+    ln -s ${desktopItem}/share/applications/* $appDir/
+    ln -s $dataDir/graphics/gfx_classic/RocksIcon32x32.png $iconDir/rocksndiamonds.png
+    cp -r conf docs graphics levels music sounds $dataDir
+  '';
+
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    description = "Scrolling tile-based arcade style puzzle game";
+    homepage = "https://www.artsoft.org/rocksndiamonds/";
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ orivej xfix ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/rogue/default.nix b/nixpkgs/pkgs/games/rogue/default.nix
new file mode 100644
index 000000000000..4865b85bbe38
--- /dev/null
+++ b/nixpkgs/pkgs/games/rogue/default.nix
@@ -0,0 +1,25 @@
+{lib, stdenv, fetchurl, ncurses}:
+
+stdenv.mkDerivation rec {
+  pname = "rogue";
+  version = "5.4.4";
+
+  src = fetchurl {
+    urls = [
+      "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";
+  };
+
+  buildInputs = [ ncurses ];
+
+  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;
+    license = licenses.bsd3;
+    maintainers = [ maintainers.eelco ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/rotp/0001-store-config-and-saves-in-XDG_CONFIG_HOME.patch b/nixpkgs/pkgs/games/rotp/0001-store-config-and-saves-in-XDG_CONFIG_HOME.patch
new file mode 100644
index 000000000000..686b929a5f95
--- /dev/null
+++ b/nixpkgs/pkgs/games/rotp/0001-store-config-and-saves-in-XDG_CONFIG_HOME.patch
@@ -0,0 +1,106 @@
+From 0b49ad87d24193b819dfaf706b4f9f62256863ac Mon Sep 17 00:00:00 2001
+From: Joshua Trees <me@jtrees.io>
+Date: Tue, 31 Jan 2023 22:59:55 +0100
+Subject: [PATCH] store config and saves in XDG_CONFIG_HOME
+
+---
+ src/rotp/Rotp.java               | 15 +++++++++++++++
+ src/rotp/lang/bn/labels.txt      |  2 +-
+ src/rotp/lang/en/labels.txt      |  2 +-
+ src/rotp/ui/UserPreferences.java |  7 ++++---
+ 4 files changed, 21 insertions(+), 5 deletions(-)
+
+diff --git a/src/rotp/Rotp.java b/src/rotp/Rotp.java
+index 72d8e446..a8fcd695 100644
+--- a/src/rotp/Rotp.java
++++ b/src/rotp/Rotp.java
+@@ -43,6 +43,7 @@ public class Rotp {
+     public static String exeFileName = "Remnants.exe";
+     public static boolean countWords = false;
+     private static String startupDir = System.getProperty("startupdir");
++    private static String configDir = null;
+     private static JFrame frame;
+     public static String releaseId = "1.04";
+     public static long startMs = System.currentTimeMillis();
+@@ -165,6 +166,20 @@ public class Rotp {
+         }
+         return startupDir;
+     }
++    public static String configDir()  {
++        if (configDir == null) {
++            configDir = getXdgConfigHome() + File.separator + "rotp" + File.separator;
++        }
++        return configDir;
++    }
++    private static String getXdgConfigHome() {
++        String value = System.getenv().get("XDG_CONFIG_HOME");
++        if (value == null || value.trim().length() == 0) {
++            String XDG_CONFIG_HOME_DEFAULT = System.getenv().get("HOME") + File.separator + ".config";
++            value = XDG_CONFIG_HOME_DEFAULT;
++        }
++        return value;
++    }
+     private static void stopIfInsufficientMemory(JFrame frame, int allocMb) {
+         if (allocMb < 260) {
+             JOptionPane.showMessageDialog(frame, "Error starting game: Not enough free memory to play");
+diff --git a/src/rotp/lang/bn/labels.txt b/src/rotp/lang/bn/labels.txt
+index bdbc47ef..6072c90a 100644
+--- a/src/rotp/lang/bn/labels.txt
++++ b/src/rotp/lang/bn/labels.txt
+@@ -362,7 +362,7 @@ GAME_SETTINGS_BACKUP_DESC         | Enable to have your current game periodicall
+ GAME_SETTINGS_SAVEDIR             | Save Directory: %1
+ GAME_SETTINGS_SAVEDIR_DEFAULT     | Default
+ GAME_SETTINGS_SAVEDIR_CUSTOM      | Custom
+-GAME_SETTINGS_SAVEDIR_DESC1       | The save directory is currently set to the same directory as the game.
++GAME_SETTINGS_SAVEDIR_DESC1       | The save directory is currently set to the default location.
+ GAME_SETTINGS_SAVEDIR_DESC2       | The save directory is currently set to: %1
+ 
+ // Load Game UI
+diff --git a/src/rotp/lang/en/labels.txt b/src/rotp/lang/en/labels.txt
+index 6ba316ae..59e3f0e6 100644
+--- a/src/rotp/lang/en/labels.txt
++++ b/src/rotp/lang/en/labels.txt
+@@ -362,7 +362,7 @@ GAME_SETTINGS_BACKUP_DESC         | Enable to have your current game periodicall
+ GAME_SETTINGS_SAVEDIR             | Save Directory: %1
+ GAME_SETTINGS_SAVEDIR_DEFAULT     | Default
+ GAME_SETTINGS_SAVEDIR_CUSTOM      | Custom
+-GAME_SETTINGS_SAVEDIR_DESC1       | The save directory is currently set to the same directory as the game.
++GAME_SETTINGS_SAVEDIR_DESC1       | The save directory is currently set to the default location.
+ GAME_SETTINGS_SAVEDIR_DESC2       | The save directory is currently set to: %1
+ 
+ // Load Game UI
+diff --git a/src/rotp/ui/UserPreferences.java b/src/rotp/ui/UserPreferences.java
+index 6deec256..a792091e 100644
+--- a/src/rotp/ui/UserPreferences.java
++++ b/src/rotp/ui/UserPreferences.java
+@@ -190,7 +190,7 @@ public class UserPreferences {
+     public static void screenSizePct(int i) { setScreenSizePct(i); }
+     public static String saveDirectoryPath() {
+         if (saveDir.isEmpty())
+-            return Rotp.jarPath();
++            return Rotp.configDir();
+         else
+             return saveDir;
+     }
+@@ -233,7 +233,7 @@ public class UserPreferences {
+         save();
+     }
+     public static void load() {
+-        String path = Rotp.jarPath();
++        String path = Rotp.configDir();
+         File configFile = new File(path, PREFERENCES_FILE);
+ 		// modnar: change to InputStreamReader, force UTF-8
+ 		try ( BufferedReader in = new BufferedReader( new InputStreamReader( new FileInputStream(configFile), "UTF-8"));) {
+@@ -251,7 +251,8 @@ public class UserPreferences {
+         }
+     }
+     public static int save() {
+-        String path = Rotp.jarPath();
++        String path = Rotp.configDir();
++        new File(path).mkdirs();
+         try (FileOutputStream fout = new FileOutputStream(new File(path, PREFERENCES_FILE));
+             // modnar: change to OutputStreamWriter, force UTF-8
+             PrintWriter out = new PrintWriter(new OutputStreamWriter(fout, "UTF-8")); ) {
+-- 
+2.38.3
+
diff --git a/nixpkgs/pkgs/games/rotp/default.nix b/nixpkgs/pkgs/games/rotp/default.nix
new file mode 100644
index 000000000000..a5ff60c25a40
--- /dev/null
+++ b/nixpkgs/pkgs/games/rotp/default.nix
@@ -0,0 +1,87 @@
+{ lib, stdenv, fetchFromGitHub, makeWrapper, jdk, jre }:
+
+stdenv.mkDerivation {
+  pname = "remnants-of-the-precursors";
+  version = "1.04";
+
+  src = fetchFromGitHub {
+    owner = "rayfowler";
+    repo = "rotp-public";
+    rev = "e3726fc22c2c44316306c50c79779e3da1c4c140";
+    sha256 = "sha256-oMA8LRpBoBX7t4G+HuRz0a8g+UEwYO7Ya0Qq4j8AWec=";
+  };
+
+  nativeBuildInputs = [ jdk makeWrapper ];
+
+  # By default, the game tries to write to the java class path. If that fails
+  # (and it always does, since they are in the read-only nix store), it won't
+  # launch.
+  patches = [ ./0001-store-config-and-saves-in-XDG_CONFIG_HOME.patch ];
+
+  buildPhase = ''
+    runHook preBuild
+
+    javac -d "$out/share/" -sourcepath src src/rotp/Rotp.java
+
+    runHook postBuild
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    # We need the assets, but don't want the source files.
+    find "src/rotp" -type f -name '*java' -exec rm "{}" \;
+    cp -r src/rotp/* "$out/share/rotp/"
+
+    mkdir -p $out/bin
+    makeWrapper ${jre}/bin/java $out/bin/rotp \
+      --add-flags "-cp $out/share rotp.Rotp"
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = ''Open-source modernization of the 1993 classic "Master of Orion", written in Java'';
+    homepage = "https://www.remnantsoftheprecursors.com/";
+
+    # See LICENSE file in source repo for more details.
+    license = with licenses; [
+      # All java files created by Ray Fowler:
+      gpl3Only
+
+      # All Java files in the src/rotp/apachemath folder:
+      asl20
+
+      # The /src/rotp/model/planet/PlanetHeightMap.java file:
+      #
+      # This file is a Java-rewrite of the "Planet Generator" code (originally in C)
+      # available from the following site:
+      #
+      #     http://hjemmesider.diku.dk/~torbenm/Planet
+      #
+      # That page includes the following statement: "Both the program itself and
+      # maps created by the program are free for use, modification and reproduction,
+      # both privately and for commercial purposes, as long as this does not limit
+      # what other people may do with the program and the images they produce with
+      # the program"
+      {
+        free = true;
+        url = "http://hjemmesider.diku.dk/~torbenm/Planet";
+      }
+
+      # All image files are copyright by Peter Penev.
+      #
+      # All sound files are copyright by Remi Agullo.
+      #
+      # Various *.txt files that contain a license notice are copyright by Jeff Colucci. This
+      # includes English text and any foreign language translations.
+      #
+      # The manual.pdf file is copyright by Tom Chick. This includes any foreign language
+      # translations of the manual contained in this repository
+      cc-by-nc-nd-40
+    ];
+
+    maintainers = with maintainers; [ jtrees ];
+    platforms = [ "x86_64-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/rott/default.nix b/nixpkgs/pkgs/games/rott/default.nix
new file mode 100644
index 000000000000..591275631fa9
--- /dev/null
+++ b/nixpkgs/pkgs/games/rott/default.nix
@@ -0,0 +1,75 @@
+{ stdenv
+, lib
+, fetchurl
+, writeShellScript
+, SDL
+, SDL_mixer
+, makeDesktopItem
+, copyDesktopItems
+, runtimeShell
+, buildShareware ? false
+}:
+
+let
+  # Allow the game to be launched from a user's PATH and load the game data from the user's home directory.
+  launcher = writeShellScript "rott" ''
+    set -eEuo pipefail
+    dir=$HOME/.rott/data
+    test -e $dir || mkdir -p $dir
+    cd $dir
+    exec @out@/libexec/rott "$@"
+  '';
+
+in
+stdenv.mkDerivation rec {
+  pname = "rott";
+  version = "1.1.2";
+
+  src = fetchurl {
+    url = "https://icculus.org/rott/releases/${pname}-${version}.tar.gz";
+    sha256 = "1zr7v5dv2iqx40gzxbg8mhac7fxz3kqf28y6ysxv1xhjqgl1c98h";
+  };
+
+  nativeBuildInputs = [ copyDesktopItems ];
+
+  buildInputs = [ SDL SDL_mixer ];
+
+  sourceRoot = "rott-${version}/rott";
+
+  makeFlags = [
+    "SHAREWARE=${if buildShareware then "1" else "0"}"
+  ];
+
+  # when using SDL_compat instead of SDL_classic, SDL_mixer isn't correctly
+  # detected, but there is no harm just specifying it
+  env.NIX_CFLAGS_COMPILE = toString [
+    "-I${lib.getDev SDL_mixer}/include/SDL"
+  ];
+
+  installPhase = ''
+    runHook preInstall
+
+    install -Dm555 -t $out/libexec rott
+    install -Dm555 ${launcher} $out/bin/${launcher.name}
+    substituteInPlace $out/bin/rott --subst-var out
+
+    runHook postInstall
+  '';
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "rott";
+      exec = "rott";
+      desktopName = "Rise of the Triad: ${if buildShareware then "The HUNT Begins" else "Dark War"}";
+      categories = [ "Game" ];
+    })
+  ];
+
+  meta = with lib; {
+    description = "SDL port of Rise of the Triad";
+    homepage = "https://icculus.org/rott/";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ sander ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/games/rpg-cli/default.nix b/nixpkgs/pkgs/games/rpg-cli/default.nix
new file mode 100644
index 000000000000..cad3b539d9ad
--- /dev/null
+++ b/nixpkgs/pkgs/games/rpg-cli/default.nix
@@ -0,0 +1,25 @@
+{ rustPlatform, fetchFromGitHub, lib }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "rpg-cli";
+  version = "1.0.1";
+
+  src = fetchFromGitHub {
+    owner = "facundoolano";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-rhG/EK68PWvQYoZdjhk0w7oNmh/QiTaAt4/WgEkgxEA=";
+  };
+
+  cargoSha256 = "sha256-YXQohmDmkClziaLkL2N4cGURZ0tewyt7BuNY4hS+a4w=";
+
+  # 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; [ lom ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/rrootage/default.nix b/nixpkgs/pkgs/games/rrootage/default.nix
new file mode 100644
index 000000000000..a5b656a4044a
--- /dev/null
+++ b/nixpkgs/pkgs/games/rrootage/default.nix
@@ -0,0 +1,81 @@
+{ lib, stdenv, fetchpatch, fetchurl, SDL, SDL_mixer, bulletml }:
+
+let
+  version = "0.23a";
+  debianRevision = "12";
+  debianPatch = patchname: hash: fetchpatch {
+    name = "${patchname}.patch";
+    url = "https://sources.debian.org/data/main/r/rrootage/${version}-${debianRevision}/debian/patches/${patchname}.patch";
+    sha256 = hash;
+  };
+
+in stdenv.mkDerivation {
+  pname = "rrootage";
+  inherit version;
+  src = fetchurl {
+    url = "http://downloads.sourceforge.net/rrootage/rRootage-${version}.tar.gz";
+    sha256 = "01zzg4ih3kmbhsn1p9zr7g8srv1d2dhrp8cdd86y9qq233idnkln";
+  };
+
+  patches = [
+    (debianPatch
+      "01_makefile"
+      "0wgplznx9kgb82skwqplpydbpallgrby3w662h52wky5zl0pyijj")
+    (debianPatch
+      "02_data_dir"
+      "12vw60s94by3f6k8pk45k555h4y7gzlqfds0a96nrrryammpgnq3")
+    (debianPatch
+      "03_texture_filename"
+      "1qxkxy6821xvanacf25mi43wj8nf40c1qiyavhc8av798xprpkjh")
+    (debianPatch
+      "04_home"
+      "0s15b0liv40jzjd9l4zsq688ky1yp9b1gmb1xhi3bih4y7q9awdz")
+    (debianPatch
+      "05_gcc"
+      "06ihgbfrklabs7cb6216w1jjb9sglv86iagzhhmyydwyph4fb782")
+    (debianPatch
+      "06_rrootage_highres"
+      "0ifjmh236yiv3g896nfwwydgcnq3njdb8ldah7s3jxp3xkpvwcga")
+    (debianPatch
+      "07_use_system_bulletml"
+      "1sxsl1yzx3msvz8mf0jk1vnahqb1ahq9drm391idgh0afy77l6j7")
+    (debianPatch
+      "08_windowed_mode"
+      "0knx4g445ngilsz4dvdkq69f5f8i2xv2fnmdmq037xd5rhfg0b23")
+    (debianPatch
+      "09_rootage_make_highres_default"
+      "1zqz8s54rl8jmqmvdi9c3ayfcma6qkbfkx5vw0fzyn268wcs022p")
+    (debianPatch
+      "10_deg_out_of_range"
+      "1wr76az4rlv1gaj9xdknzqcjazw6h8myqw6y3753q259hxbq4cah")
+  ];
+  postPatch = ''
+    substituteInPlace "src/screen.c" --replace "/usr/share/games/rrootage" "$out/share/games/rrootage"
+    substituteInPlace "src/soundmanager.c" --replace "/usr/share/games/rrootage" "$out/share/games/rrootage"
+    substituteInPlace "src/barragemanager.cc" --replace "/usr/share/games/rrootage" "$out/share/games/rrootage"
+  '';
+
+  buildInputs = [ SDL SDL_mixer bulletml ];
+  makeFlags = [ "-C src" "-f makefile.lin" ];
+  hardeningDisable = [ "stackprotector" "fortify" ]; # buffer overflow without this
+
+  installPhase = ''
+    install -d "$out"/share/games
+    cp -r rr_share "$out"/share/games/rrootage
+    install -D src/rrootage "$out"/bin/rrootage
+
+    install -D -m 644 readme.txt "$out"/share/licenses/rrootage/README.jp
+    install -m 644 readme_e.txt "$out"/share/licenses/rrootage/README.en
+
+    install -D -m 644 readme.txt "$out"/share/doc/rrootage/README.jp
+    install -m 644 readme_e.txt "$out"/share/doc/rrootage/README.en
+    install -m 644 readme_linux "$out"/share/doc/rrootage/README
+  '';
+
+  meta = with lib; {
+    description = "Abstract shooter created by Kenta Cho";
+    homepage = "https://rrootage.sourceforge.net/";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ fgaz ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/runelite/default.nix b/nixpkgs/pkgs/games/runelite/default.nix
new file mode 100644
index 000000000000..02c41307101f
--- /dev/null
+++ b/nixpkgs/pkgs/games/runelite/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, fetchFromGitHub
+, makeDesktopItem
+, makeWrapper
+, maven
+, jre
+, xorg
+, gitUpdater
+, libGL
+}:
+
+maven.buildMavenPackage rec {
+  pname = "runelite";
+  version = "2.6.12";
+
+  src = fetchFromGitHub {
+    owner = "runelite";
+    repo = "launcher";
+    rev = version;
+    hash = "sha256-lovDkEvzclZCBu/Ha8h0j595NZ4ejefEOX7lNmzb8I8=";
+  };
+  mvnHash = "sha256-bsJlsIXIIVzZyVgEF/SN+GgpZt6v0u800arO1c5QYHk=";
+
+  desktop = makeDesktopItem {
+    name = "RuneLite";
+    type = "Application";
+    exec = "runelite";
+    icon = "runelite";
+    comment = "Open source Old School RuneScape client";
+    desktopName = "RuneLite";
+    genericName = "Oldschool Runescape";
+    categories = [ "Game" ];
+  };
+
+  # tests require internet :(
+  mvnParameters = "-Dmaven.test.skip";
+  nativeBuildInputs = [ makeWrapper ];
+
+  installPhase = ''
+    mkdir -p $out/share/icons
+    mkdir -p $out/share/applications
+
+    cp target/RuneLite.jar $out/share
+    cp appimage/runelite.png $out/share/icons
+
+    ln -s ${desktop}/share/applications/RuneLite.desktop $out/share/applications/RuneLite.desktop
+
+    makeWrapper ${jre}/bin/java $out/bin/runelite \
+      --prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath [ xorg.libXxf86vm libGL ]}" \
+      --add-flags "-jar $out/share/RuneLite.jar"
+  '';
+
+  passthru.updateScript = gitUpdater { };
+
+  meta = {
+    description = "Open source Old School RuneScape client";
+    homepage = "https://runelite.net/";
+    sourceProvenance = with lib.sourceTypes; [
+      binaryBytecode
+      binaryNativeCode
+    ];
+    license = lib.licenses.bsd2;
+    maintainers = with lib.maintainers; [ kmeakin moody ];
+    platforms = [ "x86_64-linux" ];
+    mainProgram = "runelite";
+  };
+}
diff --git a/nixpkgs/pkgs/games/runescape-launcher/default.nix b/nixpkgs/pkgs/games/runescape-launcher/default.nix
new file mode 100644
index 000000000000..062a194c83dc
--- /dev/null
+++ b/nixpkgs/pkgs/games/runescape-launcher/default.nix
@@ -0,0 +1,155 @@
+{ stdenv
+, lib
+, autoPatchelfHook
+, buildFHSEnv
+, cairo
+, dpkg
+, fetchurl
+, gcc-unwrapped
+, glib
+, glibc
+, gnome2
+, gtk2-x11
+, libGL
+, libpulseaudio
+, libSM
+, libXxf86vm
+, libX11
+, openssl_1_1
+, pango
+, SDL2
+, wrapGAppsHook
+, xdg-utils
+, xorg
+, xorg_sys_opengl
+, zlib
+}:
+let
+
+  runescape = stdenv.mkDerivation rec {
+    pname = "runescape-launcher";
+    version = "2.2.10";
+
+    # Packages: https://content.runescape.com/downloads/ubuntu/dists/trusty/non-free/binary-amd64/Packages
+    # upstream is https://content.runescape.com/downloads/ubuntu/pool/non-free/r/${pname}/${pname}_${version}_amd64.deb
+    src = fetchurl {
+      url = "https://archive.org/download/${pname}_${version}_amd64/${pname}_${version}_amd64.deb";
+      sha256 = "1v96vjiblphhbqhpp3m7wbvdvcnp76ncdlf4pdcr2z1dz8nh6shg";
+    };
+
+    nativeBuildInputs = [
+      autoPatchelfHook
+      dpkg
+      wrapGAppsHook
+    ];
+
+    buildInputs = [
+      cairo
+      gcc-unwrapped
+      glib
+      glibc
+      gtk2-x11
+      libSM
+      libXxf86vm
+      libX11
+      openssl_1_1
+      pango
+      zlib
+    ];
+
+    runtimeDependencies = [
+      libGL
+      libpulseaudio
+      SDL2
+      openssl_1_1
+      xdg-utils # The launcher uses `xdg-open` to open HTTP URLs in the user's browser
+      xorg_sys_opengl
+      zlib
+    ];
+
+    dontUnpack = true;
+
+    preBuild = ''
+      export DH_VERBOSE=1
+    '';
+
+    envVarsWithXmodifiers = ''
+      export MESA_GLSL_CACHE_DIR=~/Jagex
+      export GDK_SCALE=2
+      unset XMODIFIERS
+    '';
+
+    installPhase = ''
+      mkdir -p $out/bin $out/share
+      dpkg -x $src $out
+
+      patchShebangs $out/usr/bin/runescape-launcher
+      substituteInPlace $out/usr/bin/runescape-launcher \
+        --replace "unset XMODIFIERS" "$envVarsWithXmodifiers" \
+        --replace "/usr/share/games/runescape-launcher/runescape" "$out/share/games/runescape-launcher/runescape"
+
+      cp -r $out/usr/bin $out/
+      cp -r $out/usr/share $out/
+
+      rm -r $out/usr
+    '';
+
+
+    meta = with lib; {
+      description = "Launcher for RuneScape 3, the current main RuneScape";
+      homepage = "https://www.runescape.com/";
+      sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+      license = licenses.unfree;
+      maintainers = with maintainers; [ grburst ];
+      platforms = [ "x86_64-linux" ];
+    };
+  };
+
+in
+
+  /*
+  * We can patch the runescape launcher, but it downloads a client at runtime and checks it for changes.
+  * For that we need use a buildFHSEnv.
+  * FHS simulates a classic linux shell
+  */
+  buildFHSEnv {
+    name = "RuneScape";
+    targetPkgs = pkgs: [
+      runescape
+      cairo
+      dpkg
+      gcc-unwrapped
+      glib
+      glibc
+      gtk2-x11
+      libGL
+      libpulseaudio
+      libSM
+      libXxf86vm
+      libX11
+      openssl_1_1
+      pango
+      SDL2
+      xdg-utils
+      xorg.libX11
+      xorg_sys_opengl
+      zlib
+    ];
+    multiPkgs = pkgs: [ libGL ];
+    runScript = "runescape-launcher";
+    extraInstallCommands = ''
+      mkdir -p "$out/share/applications"
+      cp ${runescape}/share/applications/runescape-launcher.desktop "$out/share/applications"
+      cp -r ${runescape}/share/icons "$out/share/icons"
+      substituteInPlace "$out/share/applications/runescape-launcher.desktop" \
+        --replace "/usr/bin/runescape-launcher" "RuneScape"
+    '';
+
+    meta = with lib; {
+      description = "RuneScape Game Client (NXT) - Launcher for RuneScape 3";
+      homepage = "https://www.runescape.com/";
+      license = licenses.unfree;
+      maintainers = with maintainers; [ grburst ];
+      platforms = [ "x86_64-linux" ];
+    };
+  }
diff --git a/nixpkgs/pkgs/games/sauerbraten/default.nix b/nixpkgs/pkgs/games/sauerbraten/default.nix
new file mode 100644
index 000000000000..e2365f9ad2de
--- /dev/null
+++ b/nixpkgs/pkgs/games/sauerbraten/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, stdenv
+, fetchzip
+, SDL2
+, SDL2_image
+, SDL2_mixer
+, zlib
+, makeWrapper
+, copyDesktopItems
+, makeDesktopItem
+}:
+
+stdenv.mkDerivation rec {
+  pname = "sauerbraten";
+  version = "2020-12-27";
+
+  src = fetchzip {
+    url = "mirror://sourceforge/sauerbraten/sauerbraten_${builtins.replaceStrings [ "-" ] [ "_" ] version}_linux.tar.bz2";
+    sha256 = "0llknzj23vx6f3y452by9c7wlhzclyq4bqi22qd52m3l916z2mn5";
+  };
+
+  nativeBuildInputs = [
+    makeWrapper
+    copyDesktopItems
+  ];
+
+  buildInputs = [
+    SDL2
+    SDL2_mixer
+    SDL2_image
+    zlib
+  ];
+
+  sourceRoot = "${src.name}/src";
+
+  enableParallelBuilding = true;
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "sauerbraten";
+      exec = "sauerbraten_client %u";
+      icon = "sauerbraten";
+      desktopName = "Sauerbraten";
+      comment = "FPS that uses an improved version of the Cube engine";
+      categories = [ "Application" "Game" "ActionGame" ];
+    })
+  ];
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/bin $out/share/icon/ $out/share/sauerbraten $out/share/doc/sauerbraten
+    cp -r "../docs/"* $out/share/doc/sauerbraten/
+    cp sauer_client sauer_server $out/share/sauerbraten/
+    cp -r ../packages ../data $out/share/sauerbraten/
+    ln -s $out/share/sauerbraten/cube.png $out/share/icon/sauerbraten.png
+
+    makeWrapper $out/share/sauerbraten/sauer_server $out/bin/sauerbraten_server \
+      --chdir "$out/share/sauerbraten"
+    makeWrapper $out/share/sauerbraten/sauer_client $out/bin/sauerbraten_client \
+      --chdir "$out/share/sauerbraten" \
+      --add-flags "-q\''${HOME}/.config/sauerbraten"
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "A free multiplayer & singleplayer first person shooter, the successor of the Cube FPS";
+    homepage = "http://sauerbraten.org";
+    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
+      [ ];
+    license = "freeware"; # as an aggregate - data files have different licenses code is under zlib license
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/scid-vs-pc/default.nix b/nixpkgs/pkgs/games/scid-vs-pc/default.nix
new file mode 100644
index 000000000000..dc76a6149c9d
--- /dev/null
+++ b/nixpkgs/pkgs/games/scid-vs-pc/default.nix
@@ -0,0 +1,50 @@
+{ lib, fetchurl, tcl, tk, libX11, zlib, makeWrapper, which, makeDesktopItem }:
+
+tcl.mkTclDerivation rec {
+  pname = "scid-vs-pc";
+  version = "4.24";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/scidvspc/scid_vs_pc-${version}.tgz";
+    hash = "sha256-x4Ljn1vaXrue16kUofWAH2sDNYC8h3NvzFjffRo0EhA=";
+  };
+
+  postPatch = ''
+    substituteInPlace configure Makefile.conf \
+      --replace "~/.fonts" "$out/share/fonts/truetype/Scid" \
+      --replace "which fc-cache" "false"
+  '';
+
+  nativeBuildInputs = [ makeWrapper which ];
+  buildInputs = [ tk libX11 zlib ];
+
+  configureFlags = [
+    "BINDIR=${placeholder "out"}/bin"
+    "SHAREDIR=${placeholder "out"}/share"
+  ];
+
+  postInstall = ''
+    mkdir -p $out/share/applications
+    cp $desktopItem/share/applications/* $out/share/applications/
+
+    install -D icons/scid.png "$out"/share/icons/hicolor/128x128/apps/scid.png
+  '';
+
+  desktopItem = makeDesktopItem {
+    name = "scid-vs-pc";
+    desktopName = "Scid vs. PC";
+    genericName = "Chess Database";
+    comment = meta.description;
+    icon = "scid";
+    exec = "scid";
+    categories = [ "Game" "BoardGame" ];
+  };
+
+  meta = with lib; {
+    description = "Chess database with play and training functionality";
+    homepage = "https://scidvspc.sourceforge.net/";
+    license = lib.licenses.gpl2;
+    maintainers = [ maintainers.paraseba ];
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/scid/default.nix b/nixpkgs/pkgs/games/scid/default.nix
new file mode 100644
index 000000000000..576e6dc36772
--- /dev/null
+++ b/nixpkgs/pkgs/games/scid/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, makeWrapper
+, tcl
+, tk
+, libX11
+, zlib
+}:
+
+tcl.mkTclDerivation rec {
+  pname = "scid";
+  version = "5.0.2";
+
+  src = fetchFromGitHub {
+    owner = "benini";
+    repo = "scid";
+    rev = "v${version}";
+    hash = "sha256-5WGZm7EwhZAMKJKxj/OOIFOJIgPBcc6/Bh4xVAlia4Y=";
+  };
+
+  postPatch = ''
+    substituteInPlace configure \
+      --replace "set var(INSTALL) {install_mac}" ""
+  '';
+
+  nativeBuildInputs = [
+    makeWrapper
+  ];
+
+  buildInputs = [
+    tk
+    libX11
+    zlib
+  ];
+
+  configureFlags = [
+    "BINDIR=$(out)/bin"
+    "SHAREDIR=$(out)/share"
+  ];
+
+  makeFlags = [
+    "CC=${stdenv.cc.targetPrefix}cc"
+  ];
+
+  enableParallelBuilding = true;
+
+  meta = {
+    description = "Chess database with play and training functionality";
+    maintainers = with lib.maintainers; [ agbrooks ];
+    homepage = "https://scid.sourceforge.net/";
+    license = lib.licenses.gpl2;
+    platforms = lib.platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/games/scorched3d/default.nix b/nixpkgs/pkgs/games/scorched3d/default.nix
new file mode 100644
index 000000000000..fa8b7bcc8dd4
--- /dev/null
+++ b/nixpkgs/pkgs/games/scorched3d/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv, fetchurl, libGLU, libGL, glew, pkg-config, openalSoft, freealut, wxGTK32, libogg
+, freetype, libvorbis, fftwSinglePrec, SDL, SDL_net, expat, libjpeg, libpng }:
+
+stdenv.mkDerivation rec {
+  version = "44";
+  pname = "scorched3d";
+  src = fetchurl {
+    url = "mirror://sourceforge/scorched3d/Scorched3D-${version}-src.tar.gz";
+    sha256 = "1fldi9pn7cz6hc9h70pacgb7sbykzcac44yp3pkhn0qh4axj10qw";
+  };
+
+  buildInputs =
+    [ libGLU libGL glew openalSoft freealut wxGTK32 libogg freetype libvorbis
+      SDL SDL_net expat libjpeg libpng fftwSinglePrec
+    ];
+
+  nativeBuildInputs = [ pkg-config ];
+
+  patches = [
+    ./file-existence.patch
+    (fetchurl {
+      url = "https://gitweb.gentoo.org/repo/gentoo.git/plain/games-strategy/scorched3d/files/scorched3d-44-fix-c++14.patch?id=1bbcfc9ae3dfdfcbdd35151cb7b6050776215e4d";
+      sha256 = "1farmjxbc2wm4scsdbdnvh29fipnb6mp6z85hxz4bx6n9kbc8y7n";
+    })
+    (fetchurl {
+      url = "https://sources.debian.org/data/main/s/scorched3d/44%2Bdfsg-7/debian/patches/wx3.0-compat.patch";
+      sha256 = "sha256-Y5U5yYNT5iMqhdRaDMFtZ4K7aD+pugFZP0jLh7rdDp8=";
+    })
+  ];
+
+  sourceRoot = "scorched";
+
+  configureFlags = [ "--with-fftw=${fftwSinglePrec.dev}" ];
+
+  NIX_LDFLAGS = "-lopenal";
+
+  meta = with lib; {
+    homepage = "http://scorched3d.co.uk/";
+    description = "3D Clone of the classic Scorched Earth";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux; # maybe more
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/scorched3d/file-existence.patch b/nixpkgs/pkgs/games/scorched3d/file-existence.patch
new file mode 100644
index 000000000000..35eb63d07022
--- /dev/null
+++ b/nixpkgs/pkgs/games/scorched3d/file-existence.patch
@@ -0,0 +1,37 @@
+diff --git a/src/common/common/DefinesFile.cpp b/src/common/common/DefinesFile.cpp
+index 6ad803d..022797a 100644
+--- a/src/common/common/DefinesFile.cpp
++++ b/src/common/common/DefinesFile.cpp
+@@ -36,6 +36,17 @@
+ #include <unistd.h>

+ #endif

+ 

++namespace {

++    bool fileCanBeStated(const std::string &file)

++    {

++        struct stat buf;

++        memset(&buf, 0, sizeof(buf));

++        int result = stat(file.c_str(), &buf );

++

++        return result == 0;

++    }

++}

++

+ std::string S3D::getHomeDir()

+ {

+ #ifdef _WIN32

+@@ -74,12 +85,12 @@ bool S3D::dirMake(const std::string &file)
+ 

+ bool S3D::fileExists(const std::string &file)

+ {

+-	return (S3D::fileModTime(file) != 0);

++	return fileCanBeStated(file);

+ }

+ 

+ bool S3D::dirExists(const std::string &file)

+ {

+-	return (S3D::fileModTime(file) != 0);

++	return fileCanBeStated(file);

+ }

+ 

+ time_t S3D::fileModTime(const std::string &file)

diff --git a/nixpkgs/pkgs/games/scrolls/default.nix b/nixpkgs/pkgs/games/scrolls/default.nix
new file mode 100644
index 000000000000..fad783571c5d
--- /dev/null
+++ b/nixpkgs/pkgs/games/scrolls/default.nix
@@ -0,0 +1,45 @@
+{ lib, stdenv, fetchurl, gcc
+, libGLU, libX11, libXext, libXcursor, libpulseaudio
+}:
+stdenv.mkDerivation {
+  pname = "scrolls";
+  version = "2015-10-13";
+
+  meta = {
+    description = "A strategy collectible card game";
+    homepage = "https://scrolls.com/";
+    # http://www.reddit.com/r/Scrolls/comments/2j3pxw/linux_client_experimental/
+
+    platforms = [ "x86_64-linux" ];
+
+    license = lib.licenses.unfree;
+  };
+
+  src = fetchurl {
+    url = "https://download.scrolls.com/client/linux.tar.gz";
+    sha256 = "ead1fd14988aa07041fedfa7f845c756cd5077a5a402d85bfb749cb669ececec";
+  };
+
+  libPath = lib.makeLibraryPath [
+    gcc
+    libGLU
+    libX11
+    libXext
+    libXcursor
+    libpulseaudio
+  ];
+
+  installPhase = ''
+    mkdir -p "$out/opt/Scrolls"
+    cp -r ../Scrolls "$out/opt/Scrolls/"
+    cp -r ../Scrolls_Data "$out/opt/Scrolls/"
+    chmod +x "$out/opt/Scrolls/Scrolls"
+
+    patchelf --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \
+      --set-rpath "$libPath" "$out/opt/Scrolls/Scrolls"
+
+    mkdir "$out/bin"
+    ln -s "$out/opt/Scrolls/Scrolls" "$out/bin/Scrolls"
+  '';
+
+}
diff --git a/nixpkgs/pkgs/games/scummvm/default.nix b/nixpkgs/pkgs/games/scummvm/default.nix
new file mode 100644
index 000000000000..4d40dcc7686b
--- /dev/null
+++ b/nixpkgs/pkgs/games/scummvm/default.nix
@@ -0,0 +1,52 @@
+{ lib, stdenv, fetchFromGitHub, nasm
+, alsa-lib, curl, flac, fluidsynth, freetype, libjpeg, libmad, libmpeg2, libogg, libtheora, libvorbis, libGLU, libGL, SDL2, zlib
+, Cocoa, AudioToolbox, Carbon, CoreMIDI, AudioUnit, cctools
+}:
+
+stdenv.mkDerivation rec {
+  pname = "scummvm";
+  version = "2.8.0";
+
+  src = fetchFromGitHub {
+    owner = "scummvm";
+    repo = "scummvm";
+    rev = "v${version}";
+    hash = "sha256-W8VZuRVpq0WwaCLH0ODcFmqbE7eKLK6nuyB7qrfqkiY=";
+  };
+
+  nativeBuildInputs = [ nasm ];
+
+  buildInputs = lib.optionals stdenv.isLinux [
+    alsa-lib libGLU libGL
+  ] ++ lib.optionals stdenv.isDarwin [
+    Cocoa AudioToolbox Carbon CoreMIDI AudioUnit
+  ] ++ [
+    curl freetype flac fluidsynth libjpeg libmad libmpeg2 libogg libtheora libvorbis SDL2 zlib
+  ];
+
+  dontDisableStatic = true;
+
+  enableParallelBuilding = true;
+
+  configurePlatforms = [ "host" ];
+  configureFlags = [
+    "--enable-release"
+  ];
+
+  # 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 \
+      --replace aarch64-apple-darwin-ranlib ${cctools}/bin/ranlib
+  '';
+
+  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.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/games/scummvm/games.nix b/nixpkgs/pkgs/games/scummvm/games.nix
new file mode 100644
index 000000000000..b146bf1bc49d
--- /dev/null
+++ b/nixpkgs/pkgs/games/scummvm/games.nix
@@ -0,0 +1,155 @@
+{ stdenv, lib, fetchurl, makeDesktopItem, unzip, writeText
+, scummvm, runtimeShell }:
+
+let
+  desktopItem = name: short: long: description: makeDesktopItem {
+    categories  = [ "Game" "AdventureGame" ];
+    comment     = description;
+    desktopName = long;
+    exec        = "@out@/bin/${short}";
+    genericName = description;
+    icon        = "scummvm";
+    name        = name;
+  };
+
+  run = name: short: code: writeText "${short}.sh" ''
+    #!${runtimeShell} -eu
+
+    exec ${scummvm}/bin/scummvm \
+      --path=@out@/share/${name} \
+      --fullscreen \
+      ${code}
+  '';
+
+  generic = { plong, pshort, pcode, description, version, files, docs ? [ "readme.txt" ], ... } @attrs:
+    let
+      attrs' = builtins.removeAttrs attrs [ "plong" "pshort" "pcode" "description" "docs" "files" "version" ];
+      pname = lib.replaceStrings [ " " ":" ] [ "-" "" ] (lib.toLower plong);
+    in stdenv.mkDerivation ({
+      name = "${pname}-${version}";
+
+      nativeBuildInputs = [ unzip ];
+
+      dontBuild = true;
+      dontFixup = true;
+
+      installPhase = ''
+        runHook preInstall
+
+        mkdir -p $out/bin $out/share/{applications,${pname},doc/${pname}}
+
+        ${lib.concatStringsSep "\n" (map (f: "mv ${f} $out/share/doc/${pname}") docs)}
+        ${lib.concatStringsSep "\n" (map (f: "mv ${f} $out/share/${pname}") files)}
+
+        substitute ${run pname pshort pcode} $out/bin/${pshort} \
+          --subst-var out
+        substitute ${desktopItem pname pshort plong description}/share/applications/${pname}.desktop $out/share/applications/${pname}.desktop \
+          --subst-var out
+
+        chmod 0755 $out/bin/${pshort}
+
+        runHook postInstall
+      '';
+
+      meta = with lib; {
+        homepage = "https://www.scummvm.org";
+        license = licenses.free; # refer to the readme for exact wording
+        maintainers = with maintainers; [ peterhoeg ];
+        inherit description;
+        inherit (scummvm.meta) platforms;
+      };
+    } // attrs');
+
+in {
+  beneath-a-steel-sky = generic rec {
+    plong = "Beneath a Steel Sky";
+    pshort = "bass";
+    pcode = "sky";
+    description = "2D point-and-click science fiction thriller set in a bleak vision of the future";
+    version = "1.2";
+    src = fetchurl {
+      url = "mirror://sourceforge/scummvm/${pshort}-cd-${version}.zip";
+      sha256 = "14s5jz67kavm8l15gfm5xb7pbpn8azrv460mlxzzvdpa02a9n82k";
+    };
+    files = [ "sky.*" ];
+  };
+
+  broken-sword-25 = generic rec {
+    plong = "Broken Sword 2.5";
+    pshort = "sword25";
+    pcode = "sword25";
+    description = "A fan game of the Broken Sword series";
+    version = "1.0";
+    src = fetchurl {
+      url = "mirror://sourceforge/scummvm/${pshort}-v${version}.zip";
+      sha256 = "0ivj1vflfpih5bs5a902mab88s4d77fwm3ya3fk7pammzc8gjqzz";
+    };
+    sourceRoot = ".";
+    docs = [ "README" "license-original.txt" ];
+    files = [ "data.b25c" ];
+  };
+
+  drascula-the-vampire-strikes-back = generic rec {
+    plong = "Drascula: The Vampire Strikes Back";
+    pshort = "drascula";
+    pcode = "drascula";
+    description = "Spanish 2D classic point & click style adventure with tons of humor and an easy interface";
+    version = "1.0";
+    # srcs = {
+      src = fetchurl {
+        url = "mirror://sourceforge/scummvm/${pshort}-${version}.zip";
+        sha256 = "1pj29rpb754sn6a56f8brfv6f2m1p5qgaqik7d68pfi2bb5zccdp";
+      };
+      # audio = fetchurl {
+        # url = "mirror://sourceforge/scummvm/${pshort}-audio-flac-2.0.zip";
+        # sha256 = "1zmqhrby8f5sj1qy6xjdgkvk9wyhr3nw8ljrrl58fmxb83x1rryw";
+      # };
+    # };
+    sourceRoot = ".";
+    docs = [ "readme.txt" "drascula.doc" ];
+    files = [ "Packet.001" ];
+  };
+
+  dreamweb = generic rec {
+    plong = "Dreamweb";
+    pshort = "dreamweb";
+    pcode = "dreamweb";
+    description = "2D point-and-click cyberpunk top-down adventure game";
+    version = "1.1";
+    src = fetchurl {
+      url = "mirror://sourceforge/scummvm/${pshort}-cd-uk-${version}.zip";
+      sha256 = "0hh1p3rd7s0ckvri14lc6wdry9vv0vn4h4744v2n4zg63j8i6vsa";
+    };
+    sourceRoot = ".";
+    docs = [ "license.txt" ];
+    files = [ "DREAMWEB.*" "SPEECH" "track01.flac" ];
+  };
+
+  flight-of-the-amazon-queen = generic rec {
+    plong = "Flight of the Amazon Queen";
+    pshort = "fotaq";
+    pcode = "queen";
+    description = "2D point-and-click adventure game set in the 1940s";
+    version = "1.1";
+    src = fetchurl {
+      url = "mirror://sourceforge/scummvm/FOTAQ_Talkie-${version}.zip";
+      sha256 = "1a6q71q1dl9vvw2qqsxk5h1sv0gaqy6236zr5905w2is01gdsp52";
+    };
+    sourceRoot = ".";
+    files = [ "*.1c" ];
+  };
+
+  lure-of-the-temptress = generic rec {
+    plong = "Lure of the Temptress";
+    pshort = "lott";
+    pcode = "lure";
+    description = "2D point-and-click adventure game with a fantasy theme";
+    version = "1.1";
+    src = fetchurl {
+      url = "mirror://sourceforge/scummvm/lure-${version}.zip";
+      sha256 = "0201i70qcs1m797kvxjx3ygkhg6kcl5yf49sihba2ga8l52q45zk";
+    };
+    docs = [ "README" "*.txt" "*.pdf" "*.PDF" ];
+    files = [ "*.vga" ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/sdlpop/default.nix b/nixpkgs/pkgs/games/sdlpop/default.nix
new file mode 100644
index 000000000000..5defb942e7e9
--- /dev/null
+++ b/nixpkgs/pkgs/games/sdlpop/default.nix
@@ -0,0 +1,72 @@
+{ lib, stdenv
+, makeWrapper
+, makeDesktopItem, copyDesktopItems
+, fetchFromGitHub
+, pkg-config
+, SDL2, SDL2_image
+}:
+
+stdenv.mkDerivation rec {
+  pname = "sdlpop";
+  version = "1.23";
+
+  src = fetchFromGitHub {
+    owner = "NagyD";
+    repo = "SDLPoP";
+    rev = "v${version}";
+    sha256 = "sha256-UI7NfOC/+druRYL5g2AhIjTPEq4ta1qEThcxgyrFjHY=";
+  };
+
+  nativeBuildInputs = [ pkg-config makeWrapper copyDesktopItems ];
+
+  buildInputs = [ SDL2 SDL2_image ];
+
+  makeFlags = [ "-C" "src" ];
+
+  preBuild = ''
+    substituteInPlace src/Makefile \
+      --replace "CC = gcc" "CC = ${stdenv.cc.targetPrefix}cc" \
+      --replace "CFLAGS += -I/opt/local/include" "CFLAGS += -I${SDL2.dev}/include/SDL2 -I${SDL2_image}/include/SDL2"
+  '';
+
+  # 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";
+    changelog = "https://github.com/NagyD/SDLPoP/blob/v${version}/doc/ChangeLog.txt";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ iblech ];
+    platforms = platforms.unix;
+    mainProgram = "prince";
+  };
+}
diff --git a/nixpkgs/pkgs/games/sdlpop/prince.sh b/nixpkgs/pkgs/games/sdlpop/prince.sh
new file mode 100644
index 000000000000..698c347272a4
--- /dev/null
+++ b/nixpkgs/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/nixpkgs/pkgs/games/sfrotz/default.nix b/nixpkgs/pkgs/games/sfrotz/default.nix
new file mode 100644
index 000000000000..e90f1639e170
--- /dev/null
+++ b/nixpkgs/pkgs/games/sfrotz/default.nix
@@ -0,0 +1,69 @@
+{ fetchFromGitLab
+, freetype
+, libao
+, libjpeg
+, libmodplug
+, libpng
+, libsamplerate
+, libsndfile
+, libvorbis
+, pkg-config
+, SDL2
+, SDL2_mixer
+, lib, stdenv
+, zlib }:
+
+stdenv.mkDerivation rec {
+  pname = "sfrotz";
+  version = "2.54";
+
+  src = fetchFromGitLab  {
+    domain = "gitlab.com";
+    owner = "DavidGriffith";
+    repo = "frotz";
+    rev = version;
+    sha256 = "sha256-GvGxojD8d5GVy/d8h3q6K7KJroz2lsKbfE0F0acjBl8=";
+  };
+
+  buildInputs = [
+    freetype
+    libao
+    libjpeg
+    libmodplug
+    libpng
+    libsamplerate
+    libsndfile
+    libvorbis
+    SDL2
+    SDL2_mixer
+    zlib
+  ];
+  nativeBuildInputs = [ pkg-config ];
+  makeFlags = [ "PREFIX=${placeholder "out"}" ];
+  buildPhase = "make sdl";
+  installTargets = [ "install_sfrotz" ];
+
+  meta = with lib; {
+    description =
+      "Interpreter for Infocom and other Z-Machine games (SDL interface)";
+    longDescription = ''
+      Frotz is a Z-Machine interpreter. The Z-machine is a virtual machine
+      designed by Infocom to run all of their text adventures. It went through
+      multiple revisions during the lifetime of the company, and two further
+      revisions (V7 and V8) were created by Graham Nelson after the company's
+      demise. The specification is now quite well documented; this version of
+      Frotz supports version 1.0.
+
+      This version of Frotz fully supports all these versions of the Z-Machine
+      including the graphical version 6. Graphics and sound are created through
+      the use of the SDL libraries. AIFF sound effects and music in MOD and OGG
+      formats are supported when packaged in Blorb container files or optionally
+      from individual files.
+    '';
+    homepage = "https://davidgriffith.gitlab.io/frotz/";
+    changelog = "https://gitlab.com/DavidGriffith/frotz/-/raw/${version}/NEWS";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ ddelabru ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/sgt-puzzles/default.nix b/nixpkgs/pkgs/games/sgt-puzzles/default.nix
new file mode 100644
index 000000000000..7361d2281113
--- /dev/null
+++ b/nixpkgs/pkgs/games/sgt-puzzles/default.nix
@@ -0,0 +1,82 @@
+{ lib, stdenv, fetchurl, desktop-file-utils
+, gtk3, libX11, cmake, imagemagick
+, pkg-config, perl, wrapGAppsHook, nixosTests, writeScript
+, isMobile ? false
+}:
+
+stdenv.mkDerivation rec {
+  pname = "sgt-puzzles";
+  version = "20240103.7a93ae5";
+
+  src = fetchurl {
+    url = "http://www.chiark.greenend.org.uk/~sgtatham/puzzles/puzzles-${version}.tar.gz";
+    hash = "sha256-1pTruSF+Kl1wqTFIaYYHrvbD9p+k+1PGa5PpV4jvgEk=";
+  };
+
+  sgt-puzzles-menu = fetchurl {
+    url = "https://raw.githubusercontent.com/gentoo/gentoo/720e614d0107e86fc1e520bac17726578186843d/games-puzzle/sgt-puzzles/files/sgt-puzzles.menu";
+    sha256 = "088w0x9g3j8pn725ix8ny8knhdsfgjr3hpswsh9fvfkz5vlg2xkm";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    desktop-file-utils
+    imagemagick
+    perl
+    pkg-config
+    wrapGAppsHook
+  ];
+
+  env.NIX_CFLAGS_COMPILE = lib.optionalString isMobile "-DSTYLUS_BASED";
+
+  buildInputs = [ gtk3 libX11 ];
+
+  postInstall = ''
+    for i in  $(basename -s $out/bin/*); do
+
+      ln -s $out/bin/$i $out/bin/sgt-puzzle-$i
+      install -Dm644 icons/$i-96d24.png -t $out/share/icons/hicolor/96x96/apps/
+
+      # Generate/validate/install .desktop files.
+      echo "[Desktop Entry]" > $i.desktop
+      desktop-file-install --dir $out/share/applications \
+        --set-key Type --set-value Application \
+        --set-key Exec --set-value $i \
+        --set-key Name --set-value $i \
+        --set-key Comment --set-value "${meta.description}" \
+        --set-key Categories --set-value "Game;LogicGame;X-sgt-puzzles;" \
+        --set-key Icon --set-value $out/share/icons/hicolor/96x96/apps/$i-96d24.png \
+        $i.desktop
+    done
+
+    echo "[Desktop Entry]" > sgt-puzzles.directory
+    desktop-file-install --dir $out/share/desktop-directories \
+      --set-key Type --set-value Directory \
+      --set-key Name --set-value Puzzles \
+      --set-key Icon --set-value $out/share/icons/hicolor/48x48/apps/sgt-puzzles_map \
+      sgt-puzzles.directory
+
+    install -Dm644 ${sgt-puzzles-menu} -t $out/etc/xdg/menus/applications-merged/
+  '';
+
+  passthru = {
+    tests.sgt-puzzles = nixosTests.sgt-puzzles;
+    updateScript = writeScript "update-sgt-puzzles" ''
+      #!/usr/bin/env nix-shell
+      #!nix-shell -i bash -p curl pcre common-updater-scripts
+
+      set -eu -o pipefail
+
+      version="$(curl -sI 'https://www.chiark.greenend.org.uk/~sgtatham/puzzles/puzzles.tar.gz' | grep -Fi Location: | pcregrep -o1 'puzzles-([0-9a-f.]*).tar.gz')"
+      update-source-version sgt-puzzles "$version"
+    '';
+  };
+
+  meta = with lib; {
+    description = "Simon Tatham's portable puzzle collection";
+    license = licenses.mit;
+    maintainers = with maintainers; [ raskin tomfitzhenry ];
+    platforms = platforms.linux;
+    homepage = "https://www.chiark.greenend.org.uk/~sgtatham/puzzles/";
+  };
+}
diff --git a/nixpkgs/pkgs/games/shattered-pixel-dungeon/default.nix b/nixpkgs/pkgs/games/shattered-pixel-dungeon/default.nix
new file mode 100644
index 000000000000..625fe5010833
--- /dev/null
+++ b/nixpkgs/pkgs/games/shattered-pixel-dungeon/default.nix
@@ -0,0 +1,30 @@
+{ callPackage
+, fetchFromGitHub
+, nixosTests
+}:
+
+callPackage ./generic.nix rec {
+  pname = "shattered-pixel-dungeon";
+  version = "2.2.1";
+
+  src = fetchFromGitHub {
+    owner = "00-Evan";
+    repo = "shattered-pixel-dungeon";
+    rev = "v${version}";
+    hash = "sha256-0wSlCazsy3TYckWc2bQJL1xBVN2DuYsBIbb9Ajnfl7M=";
+  };
+
+  depsHash = "sha256-QfAV6LYD6S/8ptaqqKSDtOe4kStwp6LJp8WVc3sH8yc=";
+
+  passthru.tests = {
+    shattered-pixel-dungeon-starts = nixosTests.shattered-pixel-dungeon;
+  };
+
+  desktopName = "Shattered Pixel Dungeon";
+
+  meta = {
+    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";
+  };
+}
diff --git a/nixpkgs/pkgs/games/shattered-pixel-dungeon/disable-beryx.patch b/nixpkgs/pkgs/games/shattered-pixel-dungeon/disable-beryx.patch
new file mode 100644
index 000000000000..9530f5b137ba
--- /dev/null
+++ b/nixpkgs/pkgs/games/shattered-pixel-dungeon/disable-beryx.patch
@@ -0,0 +1,40 @@
+diff --git a/desktop/build.gradle b/desktop/build.gradle
+index 97f35f7..afd5116 100644
+--- a/desktop/build.gradle
++++ b/desktop/build.gradle
+@@ -1,6 +1,7 @@
+-plugins {
+-    id 'org.beryx.runtime' version '1.12.7'
+-}
++//plugins {
++//    id 'org.beryx.runtime' version '1.12.7'
++//}
++apply plugin: "java"
+ 
+ [compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
+ sourceCompatibility = targetCompatibility = appJavaCompatibility
+@@ -43,11 +44,11 @@ task release(type: Jar) {
+         attributes 'Implementation-Version': appVersionCode
+     }
+ }
+-installDist.dependsOn release
+-startScripts.dependsOn release
+-jpackageImage.dependsOn release
++//installDist.dependsOn release
++//startScripts.dependsOn release
++//jpackageImage.dependsOn release
+ 
+-runtime {
++/*runtime {
+     modules = ['java.base',
+                'java.desktop',
+                'jdk.unsupported',
+@@ -102,7 +103,7 @@ runtime {
+         }
+     }
+ 
+-}
++}*/
+ 
+ dependencies {
+     implementation project(':core')
diff --git a/nixpkgs/pkgs/games/shattered-pixel-dungeon/disable-git-version.patch b/nixpkgs/pkgs/games/shattered-pixel-dungeon/disable-git-version.patch
new file mode 100644
index 000000000000..fb905939f66d
--- /dev/null
+++ b/nixpkgs/pkgs/games/shattered-pixel-dungeon/disable-git-version.patch
@@ -0,0 +1,29 @@
+diff --git a/build.gradle b/build.gradle
+--- a/build.gradle
++++ b/build.gradle
+@@ -11,7 +11,6 @@ buildscript {
+         //FIXME the version of R8 coming with gradle plugin 4.0.0 causes serious problems
+         //noinspection GradleDependency
+         classpath 'com.android.tools.build:gradle:3.6.4'
+-        classpath "com.palantir.gradle.gitversion:gradle-git-version:0.12.3"
+     }
+ }
+ 
+@@ -19,16 +18,13 @@ buildscript {
+ 
+ allprojects {
+ 
+-    apply plugin: "com.palantir.git-version"
+-
+-    def details = versionDetails()
+ 
+     ext {
+         appName = 'Summoning Pixel Dungeon'
+         appPackageName = 'com.trashboxbobylev.summoningpixeldungeon'
+ 
+         appVersionCode = 432
+-        appVersionName = '@version@-' + details.gitHash.substring(0, 7)
++        appVersionName = '@version@'
+ 
+         appAndroidCompileSDK = 33
+         appAndroidMinSDK = 15
diff --git a/nixpkgs/pkgs/games/shattered-pixel-dungeon/experienced-pixel-dungeon.nix b/nixpkgs/pkgs/games/shattered-pixel-dungeon/experienced-pixel-dungeon.nix
new file mode 100644
index 000000000000..bf8ed2ea5b66
--- /dev/null
+++ b/nixpkgs/pkgs/games/shattered-pixel-dungeon/experienced-pixel-dungeon.nix
@@ -0,0 +1,30 @@
+{ callPackage
+, fetchFromGitHub
+}:
+
+callPackage ./generic.nix rec {
+  pname = "experienced-pixel-dungeon";
+  version = "2.16";
+
+  src = fetchFromGitHub {
+    owner = "TrashboxBobylev";
+    repo = "Experienced-Pixel-Dungeon-Redone";
+    rev = "ExpPD-${version}";
+    hash = "sha256-EfSByMceefUcnNmLSTnFNJs/iz1Q45X0BHHfj89d7PI=";
+  };
+
+  postPatch = ''
+    substituteInPlace build.gradle \
+      --replace "gdxControllersVersion = '2.2.3-SNAPSHOT'" "gdxControllersVersion = '2.2.3'"
+  '';
+
+  depsHash = "sha256-MUUeWZUCVPakK1MJwn0lPnjAlLpPWB/J17Ad68XRcHg=";
+
+  desktopName = "Experienced Pixel Dungeon";
+
+  meta = {
+    homepage = "https://github.com/TrashboxBobylev/Experienced-Pixel-Dungeon-Redone";
+    downloadPage = "https://github.com/TrashboxBobylev/Experienced-Pixel-Dungeon-Redone/releases";
+    description = "A fork of the Shattered Pixel Dungeon roguelike without limits on experience and items";
+  };
+}
diff --git a/nixpkgs/pkgs/games/shattered-pixel-dungeon/generic.nix b/nixpkgs/pkgs/games/shattered-pixel-dungeon/generic.nix
new file mode 100644
index 000000000000..fdd87ba2bd19
--- /dev/null
+++ b/nixpkgs/pkgs/games/shattered-pixel-dungeon/generic.nix
@@ -0,0 +1,138 @@
+# Generic builder for shattered pixel forks/mods
+{ pname
+, version
+, src
+, depsHash
+, meta
+, desktopName
+, patches ? [ ./disable-beryx.patch ]
+
+, lib
+, stdenv
+, makeWrapper
+, gradle
+, perl
+, jre
+, libGL
+, libpulseaudio
+, makeDesktopItem
+, copyDesktopItems
+, ...
+}@attrs:
+
+let
+  cleanAttrs = builtins.removeAttrs attrs [
+    "lib"
+    "stdenv"
+    "makeWrapper"
+    "gradle"
+    "perl"
+    "jre"
+    "libpulseaudio"
+    "makeDesktopItem"
+    "copyDesktopItems"
+  ];
+
+  postPatch = ''
+    # disable gradle plugins with native code and their targets
+    perl -i.bak1 -pe "s#(^\s*id '.+' version '.+'$)#// \1#" build.gradle
+    perl -i.bak2 -pe "s#(.*)#// \1# if /^(buildscript|task portable|task nsis|task proguard|task tgz|task\(afterEclipseImport\)|launch4j|macAppBundle|buildRpm|buildDeb|shadowJar|robovm|git-version)/ ... /^}/" build.gradle
+    # Remove unbuildable Android/iOS stuff
+    rm -f android/build.gradle ios/build.gradle
+    ${attrs.postPatch or ""}
+  '';
+
+  desktopItem = makeDesktopItem {
+    name = pname;
+    inherit desktopName;
+    comment = meta.description;
+    icon = pname;
+    exec = pname;
+    terminal = false;
+    categories = [ "Game" "AdventureGame" ];
+    keywords = [ "roguelike" "dungeon" "crawler" ];
+  };
+
+  # fake build to pre-download deps into fixed-output derivation
+  deps = stdenv.mkDerivation {
+    pname = "${pname}-deps";
+    inherit version src patches postPatch;
+    nativeBuildInputs = [ gradle perl ] ++ attrs.nativeBuildInputs or [];
+    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)
+    installPhase = ''
+      find $GRADLE_USER_HOME/caches/modules-2 -type f -regex '.*\.\(jar\|pom\)' \
+        | perl -pe 's#(.*/([^/]+)/([^/]+)/([^/]+)/[0-9a-f]{30,40}/([^/\s]+))$# ($x = $2) =~ tr|\.|/|; "install -Dm444 $1 \$out/$x/$3/$4/$5" #e' \
+        | sh
+    '';
+    outputHashMode = "recursive";
+    outputHash = depsHash;
+  };
+
+in stdenv.mkDerivation (cleanAttrs // {
+  inherit pname version src patches postPatch;
+
+  nativeBuildInputs = [
+    gradle
+    perl
+    makeWrapper
+    copyDesktopItems
+  ] ++ attrs.nativeBuildInputs or [];
+
+  desktopItems = [ desktopItem ];
+
+  buildPhase = ''
+    runHook preBuild
+
+    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
+
+    runHook postBuild
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    install -Dm644 desktop/build/libs/desktop-*.jar $out/share/${pname}.jar
+    mkdir $out/bin
+    makeWrapper ${jre}/bin/java $out/bin/${pname} \
+      --prefix LD_LIBRARY_PATH : ${lib.makeLibraryPath [ libGL libpulseaudio ]} \
+      --add-flags "-jar $out/share/${pname}.jar"
+
+    for s in 16 32 48 64 128 256; do
+      # Some forks only have some icons and/or name them slightly differently
+      if [ -f desktop/src/main/assets/icons/icon_$s.png ]; then
+        install -Dm644 desktop/src/main/assets/icons/icon_$s.png \
+          $out/share/icons/hicolor/''${s}x$s/apps/${pname}.png
+      fi
+      if [ -f desktop/src/main/assets/icons/icon_''${s}x$s.png ]; then
+        install -Dm644 desktop/src/main/assets/icons/icon_''${s}x$s.png \
+          $out/share/icons/hicolor/''${s}x$s/apps/${pname}.png
+      fi
+    done
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    sourceProvenance = with sourceTypes; [
+      fromSource
+      binaryBytecode  # deps
+    ];
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ fgaz ];
+    platforms = platforms.all;
+    # https://github.com/NixOS/nixpkgs/pull/99885#issuecomment-740065005
+    broken = stdenv.isDarwin;
+    mainProgram = pname;
+  } // meta;
+})
diff --git a/nixpkgs/pkgs/games/shattered-pixel-dungeon/rat-king-adventure.nix b/nixpkgs/pkgs/games/shattered-pixel-dungeon/rat-king-adventure.nix
new file mode 100644
index 000000000000..c376545ffcef
--- /dev/null
+++ b/nixpkgs/pkgs/games/shattered-pixel-dungeon/rat-king-adventure.nix
@@ -0,0 +1,25 @@
+{ callPackage
+, fetchFromGitHub
+}:
+
+callPackage ./generic.nix rec {
+  pname = "rat-king-adventure";
+  version = "1.5.3";
+
+  src = fetchFromGitHub {
+    owner = "TrashboxBobylev";
+    repo = "Rat-King-Adventure";
+    rev = version;
+    hash = "sha256-Q/smIObu7khcRnwdT8m7+WstpPE1tbDFJcZ4OGYJ338=";
+  };
+
+  depsHash = "sha256-yE6zuLnFLtNq76AhtyE+giGLF2vcCqF7sfIvcY8W6Lg=";
+
+  desktopName = "Rat King Adventure";
+
+  meta = {
+    homepage = "https://github.com/TrashboxBobylev/Rat-King-Adventure";
+    downloadPage = "https://github.com/TrashboxBobylev/Rat-King-Adventure/releases";
+    description = "An expansive fork of RKPD2, itself a fork of the Shattered Pixel Dungeon roguelike";
+  };
+}
diff --git a/nixpkgs/pkgs/games/shattered-pixel-dungeon/rkpd2.nix b/nixpkgs/pkgs/games/shattered-pixel-dungeon/rkpd2.nix
new file mode 100644
index 000000000000..a3864dd3b6f5
--- /dev/null
+++ b/nixpkgs/pkgs/games/shattered-pixel-dungeon/rkpd2.nix
@@ -0,0 +1,25 @@
+{ callPackage
+, fetchFromGitHub
+}:
+
+callPackage ./generic.nix rec {
+  pname = "rkpd2";
+  version = "1.0.0";
+
+  src = fetchFromGitHub {
+    owner = "Zrp200";
+    repo = "rkpd2";
+    rev = "v${version}";
+    hash = "sha256-3WKQCXFDyliObXaIRp3x0kRh3XeNd24SCoTgdFA8/rM=";
+  };
+
+  depsHash = "sha256-yE6zuLnFLtNq76AhtyE+giGLF2vcCqF7sfIvcY8W6Lg=";
+
+  desktopName = "Rat King Pixel Dungeon 2";
+
+  meta = {
+    homepage = "https://github.com/Zrp200/rkpd2";
+    downloadPage = "https://github.com/Zrp200/rkpd2/releases";
+    description = "Fork of popular roguelike game Shattered Pixel Dungeon that drastically buffs heroes and thus makes the game significantly easier";
+  };
+}
diff --git a/nixpkgs/pkgs/games/shattered-pixel-dungeon/shorter-pixel-dungeon.nix b/nixpkgs/pkgs/games/shattered-pixel-dungeon/shorter-pixel-dungeon.nix
new file mode 100644
index 000000000000..062e76cf8526
--- /dev/null
+++ b/nixpkgs/pkgs/games/shattered-pixel-dungeon/shorter-pixel-dungeon.nix
@@ -0,0 +1,30 @@
+{ callPackage
+, fetchFromGitHub
+}:
+
+callPackage ./generic.nix rec {
+  pname = "shorter-pixel-dungeon";
+  version = "1.2.0";
+
+  src = fetchFromGitHub {
+    owner = "TrashboxBobylev";
+    repo = "Shorter-Pixel-Dungeon";
+    rev = "Short-${version}";
+    hash = "sha256-8vmh65XlNqfIh4WHLPuWU68tb3ajKI8kBMI68CYlsSk=";
+  };
+
+  postPatch = ''
+    substituteInPlace build.gradle \
+      --replace "gdxControllersVersion = '2.2.4-SNAPSHOT'" "gdxControllersVersion = '2.2.3'"
+  '';
+
+  depsHash = "sha256-MUUeWZUCVPakK1MJwn0lPnjAlLpPWB/J17Ad68XRcHg=";
+
+  desktopName = "Shorter Pixel Dungeon";
+
+  meta = {
+    homepage = "https://github.com/TrashboxBobylev/Shorter-Pixel-Dungeon";
+    downloadPage = "https://github.com/TrashboxBobylev/Shorter-Pixel-Dungeon/releases";
+    description = "A shorter fork of the Shattered Pixel Dungeon roguelike";
+  };
+}
diff --git a/nixpkgs/pkgs/games/shattered-pixel-dungeon/summoning-pixel-dungeon.nix b/nixpkgs/pkgs/games/shattered-pixel-dungeon/summoning-pixel-dungeon.nix
new file mode 100644
index 000000000000..488110684c09
--- /dev/null
+++ b/nixpkgs/pkgs/games/shattered-pixel-dungeon/summoning-pixel-dungeon.nix
@@ -0,0 +1,36 @@
+{ callPackage
+, fetchFromGitHub
+, gradle_6
+, substitute
+}:
+
+callPackage ./generic.nix rec {
+  pname = "summoning-pixel-dungeon";
+  version = "1.2.5a";
+
+  src = fetchFromGitHub {
+    owner = "TrashboxBobylev";
+    repo = "Summoning-Pixel-Dungeon";
+    # The GH release is named "$version-$hash", but it's actually a mutable "_latest" tag
+    rev = "89ff59e7f42abcc88b7a1f24391f95ddc30f9d29";
+    hash = "sha256-VQcWkbGe/0qyt3M5WWgTxczwC5mE3lRHbYidOwRoukI=";
+  };
+
+  patches = [(substitute {
+    src = ./disable-git-version.patch;
+    replacements = [ "--subst-var-by" "version" version ];
+  })];
+
+  depsHash = "sha256-0P/BcjNnbDN25DguRcCyzPuUG7bouxEx1ySodIbSwvg=";
+
+  desktopName = "Summoning Pixel Dungeon";
+
+  meta = {
+    homepage = "https://github.com/TrashboxBobylev/Summoning-Pixel-Dungeon";
+    downloadPage = "https://github.com/TrashboxBobylev/Summoning-Pixel-Dungeon/releases";
+    description = "A fork of the Shattered Pixel Dungeon roguelike with added summoning mechanics";
+  };
+
+  # Probably due to https://github.com/gradle/gradle/issues/17236
+  gradle = gradle_6;
+}
diff --git a/nixpkgs/pkgs/games/shipwright/default.nix b/nixpkgs/pkgs/games/shipwright/default.nix
new file mode 100644
index 000000000000..47487e7f7024
--- /dev/null
+++ b/nixpkgs/pkgs/games/shipwright/default.nix
@@ -0,0 +1,216 @@
+{ stdenv
+, cmake
+, lsb-release
+, ninja
+, lib
+, fetchFromGitHub
+, fetchurl
+, makeDesktopItem
+, python3
+, libX11
+, libXrandr
+, libXinerama
+, libXcursor
+, libXi
+, libXext
+, glew
+, boost
+, SDL2
+, SDL2_net
+, pkg-config
+, libpulseaudio
+, libpng
+, imagemagick
+, requireFile
+
+, oot ? rec {
+    enable = true;
+    variant = "debug";
+
+    rom = requireFile {
+      name = "oot-${variant}.z64";
+      message = ''
+        This nix expression requires that oot-${variant}.z64 is already part of the store.
+        To get this file you can dump your Ocarina of Time's cartridge to a file,
+        and add it to the nix store with nix-store --add-fixed sha1 <FILE>, or override the package:
+          shipwright.override { oot = { enable = true; variant = "debug"; rom = path/to/oot-debug-mq.z64; } }
+
+        The supported variants are:
+         - debug: Ocarina of Time Debug PAL GC (not Master Quest)
+         - pal-gc: Ocarina of Time PAL GameCube (may lead to crashes and instability)
+
+        This is optional if you have imported an Ocarina of Time Master Quest ROM.
+        If so, please set oot.enable to false and ootMq.enable to true.
+        If both are enabled, Ship of Harkinian will be built with both ROMs.
+      '';
+
+      # From upstream: https://github.com/HarbourMasters/Shipwright/blob/e46c60a7a1396374e23f7a1f7122ddf9efcadff7/README.md#1-check-your-sha1
+      sha1 = {
+        debug = "cee6bc3c2a634b41728f2af8da54d9bf8cc14099";
+        pal-gc = "0227d7c0074f2d0ac935631990da8ec5914597b4";
+      }.${variant} or (throw "Unsupported romVariant ${variant}. Valid options are 'debug' and 'pal-gc'.");
+    };
+  }
+
+, ootMq ? rec {
+    enable = false;
+    variant = "debug-mq";
+
+    rom = requireFile {
+      name = "oot-${variant}.z64";
+      message = ''
+        This nix expression requires that oot-${variant}.z64 is already part of the store.
+        To get this file you can dump your Ocarina of Time Master Quest's cartridge to a file,
+        and add it to the nix store with nix-store --add-fixed sha1 <FILE>, or override the package:
+          shipwright.override { ootMq = { enable = true; variant = "debug-mq"; rom = path/to/oot-debug-mq.z64; } }
+
+        The supported variants are:
+         - debug-mq: Ocarina of Time Debug PAL GC MQ (Dungeons will be Master Quest)
+         - debug-mq-alt: Alternate ROM, not produced by decompilation.
+
+        This is optional if you have imported an Ocarina of Time ROM.
+        If so, please set oot.enable to true and ootMq.enable to false.
+        If both are enabled, Ship of Harkinian will be built with both ROMs.
+      '';
+
+      # From upstream: https://github.com/HarbourMasters/Shipwright/blob/e46c60a7a1396374e23f7a1f7122ddf9efcadff7/README.md#1-check-your-sha1
+      sha1 = {
+        debug-mq = "079b855b943d6ad8bd1eb026c0ed169ecbdac7da";
+        debug-mq-alt = "50bebedad9e0f10746a52b07239e47fa6c284d03";
+      }.${variant} or (throw "Unsupported mqRomVariant ${variant}. Valid options are 'debug-mq' and 'debug-mq-alt'.");
+    };
+  }
+}:
+
+let
+  checkAttrs = attrs:
+    let
+      validAttrs = [ "enable" "rom" "variant" ];
+    in
+    lib.all (name: lib.elem name validAttrs) (lib.attrNames attrs);
+in
+assert (lib.assertMsg (checkAttrs oot) "oot must have the attributes 'enable' and 'rom', and none other");
+assert (lib.assertMsg (checkAttrs ootMq) "ootMq must have the attributes 'enable' and 'rom', and none other");
+assert (lib.assertMsg (oot.enable || ootMq.enable) "At least one of 'oot.enable' and 'ootMq.enable' must be true");
+
+stdenv.mkDerivation rec {
+  pname = "shipwright";
+  version = "7.1.1";
+
+  src = fetchFromGitHub {
+    owner = "harbourmasters";
+    repo = "shipwright";
+    rev = version;
+    hash = "sha256-zgxJj65wKsQWvVxeCspyHG9YqoYqZxd6GrYptOA8Byk=";
+    fetchSubmodules = true;
+  };
+
+  # This would get fetched at build time otherwise, see:
+  # https://github.com/HarbourMasters/Shipwright/blob/e46c60a7a1396374e23f7a1f7122ddf9efcadff7/soh/CMakeLists.txt#L736
+  gamecontrollerdb = fetchurl {
+    name = "gamecontrollerdb.txt";
+    url = "https://raw.githubusercontent.com/gabomdq/SDL_GameControllerDB/c5b4df0e1061175cb11e3ebbf8045178339864a5/gamecontrollerdb.txt";
+    hash = "sha256-2VFCsaalXoe+JYWCH6IbgjnLXNKxe0UqSyJNGZMn5Ko=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    ninja
+    pkg-config
+    lsb-release
+    python3
+    imagemagick
+  ];
+
+  buildInputs = [
+    boost
+    libX11
+    libXrandr
+    libXinerama
+    libXcursor
+    libXi
+    libXext
+    glew
+    SDL2
+    SDL2_net
+    libpulseaudio
+    libpng
+  ];
+
+  cmakeFlags = [
+    "-DCMAKE_INSTALL_PREFIX=${placeholder "out"}/lib"
+  ];
+
+  dontAddPrefix = true;
+
+  # Linking fails without this
+  hardeningDisable = [ "format" ];
+
+  postBuild = ''
+    cp ${gamecontrollerdb} ${gamecontrollerdb.name}
+
+    pushd ../OTRExporter
+    ${lib.optionalString oot.enable "python3 ./extract_assets.py -z ../build/ZAPD/ZAPD.out ${oot.rom}"}
+    ${lib.optionalString ootMq.enable "python3 ./extract_assets.py -z ../build/ZAPD/ZAPD.out ${ootMq.rom}"}
+    popd
+  '';
+
+  preInstall = ''
+    # Cmake likes it here for its install paths
+    cp ../OTRExporter/soh.otr ..
+  '';
+
+  postInstall = ''
+    mkdir -p $out/bin
+
+    # Copy the extracted assets, required to be in the same directory as the executable
+    ${lib.optionalString oot.enable "cp ../OTRExporter/oot.otr $out/lib"}
+    ${lib.optionalString ootMq.enable "cp ../OTRExporter/oot-mq.otr $out/lib"}
+
+    ln -s $out/lib/soh.elf $out/bin/soh
+  '';
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "soh";
+      icon = "soh";
+      exec = "soh";
+      genericName = "Ship of Harkinian";
+      desktopName = "soh";
+      categories = [ "Game" ];
+    })
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/HarbourMasters/Shipwright";
+    description = "A PC port of Ocarina of Time with modern controls, widescreen, high-resolution, and more";
+    longDescription = ''
+      An PC port of Ocarina of Time with modern controls, widescreen, high-resolution and more, based off of decompilation.
+      Note that you must supply an OoT rom yourself to use this package because propietary assets are extracted from it.
+
+      You can change the game variant like this:
+        shipwright.override { oot.enable = false; ootMq.enable = true }
+
+      The default ROM variants for Oot and OotMq are debug and debug-mq respectively.
+      If you have a pal-gc rom, you should override like this:
+        shipwright.override { oot = { enable = true; variant = "pal-gc"; rom = path/to/oot-pal-gc.z64; } }
+
+      The supported Oot variants are:
+       - debug: Ocarina of Time Debug PAL GC (not Master Quest)
+       - pal-gc: Ocarina of Time PAL GameCube (may lead to crashes and instability)
+
+      The supported OotMq variants are:
+       - debug-mq: Ocarina of Time Debug PAL GC MQ (Dungeons will be Master Quest)
+       - debug-mq-alt: Alternate ROM, not produced by decompilation.
+    '';
+    mainProgram = "soh";
+    platforms = [ "x86_64-linux" ];
+    maintainers = with maintainers; [ ivar j0lol ];
+    license = with licenses; [
+      # OTRExporter, OTRGui, ZAPDTR, libultraship
+      mit
+      # Ship of Harkinian itself
+      unfree
+    ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/shticker-book-unwritten/default.nix b/nixpkgs/pkgs/games/shticker-book-unwritten/default.nix
new file mode 100644
index 000000000000..f19fe258f70b
--- /dev/null
+++ b/nixpkgs/pkgs/games/shticker-book-unwritten/default.nix
@@ -0,0 +1,26 @@
+{ buildFHSEnv, callPackage, lib }:
+let
+
+  shticker-book-unwritten-unwrapped = callPackage ./unwrapped.nix { };
+
+in buildFHSEnv {
+  name = "shticker_book_unwritten";
+  targetPkgs = pkgs: with pkgs; [
+      alsa-lib
+      libglvnd
+      libpulseaudio
+      shticker-book-unwritten-unwrapped
+      xorg.libX11
+      xorg.libXcursor
+      xorg.libXext
+  ];
+  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/nixpkgs/pkgs/games/shticker-book-unwritten/unwrapped.nix b/nixpkgs/pkgs/games/shticker-book-unwritten/unwrapped.nix
new file mode 100644
index 000000000000..1d49a220235f
--- /dev/null
+++ b/nixpkgs/pkgs/games/shticker-book-unwritten/unwrapped.nix
@@ -0,0 +1,18 @@
+{ lib, rustPlatform, fetchCrate, pkg-config, openssl }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "shticker-book-unwritten";
+  version = "1.2.0";
+
+  src = fetchCrate {
+    inherit version;
+    crateName = "shticker_book_unwritten";
+    sha256 = "sha256-jI2uL8tMUmjZ5jPkCV2jb98qtKwi9Ti4NVCPfuO3iB4=";
+  };
+
+  cargoSha256 = "sha256-Tney9SG9MZh7AUIT1h/dlgJyRrSPX7mUhfsKD1Rfsfc=";
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [ openssl ];
+}
diff --git a/nixpkgs/pkgs/games/sienna/default.nix b/nixpkgs/pkgs/games/sienna/default.nix
new file mode 100644
index 000000000000..c6f8db0ea9e7
--- /dev/null
+++ b/nixpkgs/pkgs/games/sienna/default.nix
@@ -0,0 +1,50 @@
+{ lib, stdenv, fetchurl, love, makeWrapper, makeDesktopItem, copyDesktopItems }:
+
+stdenv.mkDerivation rec {
+  pname = "sienna";
+  version = "1.0d";
+
+  src = fetchurl {
+    url = "https://github.com/SimonLarsen/${pname}/releases/download/v${version}/${pname}-${version}.love";
+    sha256 = "sha256-1bFjhN7jL/PMYMJH1ete6uyHTYsTGgoP60sf/sJTLlU=";
+  };
+
+  icon = fetchurl {
+    url = "http://tangramgames.dk/img/thumb/sienna.png";
+    sha256 = "12q2rhk39dmb6ir50zafn8dylaad5gns8z3y21mfjabc5l5g02nn";
+  };
+
+  desktopItems = [ (makeDesktopItem {
+    name = "sienna";
+    exec = pname;
+    icon = icon;
+    comment = "Fast-paced one button platformer";
+    desktopName = "Sienna";
+    genericName = "sienna";
+    categories = [ "Game" ];
+  }) ];
+
+  nativeBuildInputs = [ makeWrapper copyDesktopItems ];
+
+  dontUnpack = true;
+
+  installPhase = ''
+    runHook preInstall
+    mkdir -p $out/bin
+    mkdir -p $out/share/games/lovegames
+
+    cp -v $src $out/share/games/lovegames/${pname}.love
+
+    makeWrapper ${love}/bin/love $out/bin/${pname} --add-flags $out/share/games/lovegames/${pname}.love
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Fast-paced one button platformer";
+    homepage = "https://tangramgames.dk/games/sienna";
+    maintainers = with maintainers; [ leenaars ];
+    platforms = platforms.linux;
+    license = licenses.free;
+  };
+
+}
diff --git a/nixpkgs/pkgs/games/sil-q/default.nix b/nixpkgs/pkgs/games/sil-q/default.nix
new file mode 100644
index 000000000000..9127d4e9afc0
--- /dev/null
+++ b/nixpkgs/pkgs/games/sil-q/default.nix
@@ -0,0 +1,73 @@
+{ pkgs, lib, stdenv, fetchFromGitHub, writeScript, makeWrapper, ncurses, libX11 }:
+
+let
+  setup = writeScript "setup" ''
+    mkdir -p "$ANGBAND_PATH"
+    # copy all the data files into place
+    cp -ar $1/* "$ANGBAND_PATH"
+    # the copied files need to be writable
+    chmod +w -R "$ANGBAND_PATH"
+  '';
+in stdenv.mkDerivation rec {
+  pname = "sil-q";
+  version = "1.5.0";
+
+  src = fetchFromGitHub {
+    owner = "sil-quirk";
+    repo = "sil-q";
+    rev = "v${version}";
+    sha256 = "sha256-v/sWhPWF9cCKD8N0RHpwzChMM1t9G2yrMDmi1cZxdOs=";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ ncurses libX11 ];
+
+  # Makefile(s) and config are not top-level
+  sourceRoot = "${src.name}/src";
+
+  postPatch = ''
+    # allow usage of ANGBAND_PATH
+    substituteInPlace config.h --replace "#define FIXED_PATHS" ""
+
+    # change Makefile.std for ncurses according to its own comment
+    substituteInPlace Makefile.std --replace "-lcurses" "-lncurses"
+  '';
+
+  makefile = "Makefile.std";
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/bin
+    cp sil $out/bin/sil-q
+    wrapProgram $out/bin/sil-q \
+      --run "export ANGBAND_PATH=\$HOME/.sil-q" \
+      --run "${setup} ${src}/lib"
+
+    runHook postInstall
+  '';
+
+  passthru.tests = {
+    saveDirCreation = pkgs.runCommand "save-dir-creation" {} ''
+      HOME=$(pwd) ${lib.getExe pkgs.sil-q} --help
+      test -d .sil-q && touch $out
+    '';
+  };
+
+  meta = {
+    description = "A roguelike 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
+      rang with Elven song and gleamed with Dwarven mail.
+
+      Walk the dark halls of Angband.  Slay creatures black and fell.  Wrest a shining
+      Silmaril from Morgoth’s iron crown.
+
+      A fork of Sil that's still actively developed.
+    '';
+    homepage = "https://github.com/sil-quirk/sil-q";
+    license = lib.licenses.gpl2;
+    maintainers = [ lib.maintainers.kenran ];
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/sil/default.nix b/nixpkgs/pkgs/games/sil/default.nix
new file mode 100644
index 000000000000..0c6a11f47981
--- /dev/null
+++ b/nixpkgs/pkgs/games/sil/default.nix
@@ -0,0 +1,84 @@
+{ pkgs, 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
+    cp -ar $1/* "$ANGBAND_PATH"
+    # The copied files are not writable, make them so
+    chmod +w -R "$ANGBAND_PATH"
+  '';
+in
+stdenv.mkDerivation rec {
+  pname = "Sil";
+  version = "1.3.0";
+
+  src = fetchzip {
+    url = "https://www.amirrorclear.net/flowers/game/sil/Sil-130-src.zip";
+    sha256 = "1amp2mr3fxascra0k76sdsvikjh8g76nqh46kka9379zd35lfq8w";
+    stripRoot = false;
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ ncurses libX11 libXaw libXt libXext libXmu ];
+
+  sourceRoot = "${src.name}/Sil/src";
+
+  makefile = "Makefile.std";
+
+  postPatch = ''
+    # Allow usage of ANGBAND_PATH
+    substituteInPlace config.h --replace "#define FIXED_PATHS" ""
+  '';
+
+  preConfigure = ''
+    buildFlagsArray+=("LIBS=-lXaw -lXext -lSM -lICE -lXmu -lXt -lX11 -lncurses")
+  '';
+
+  # Workaround build failure on -fno-common toolchains like upstream
+  # gcc-10. Otherwise build fails as:
+  #   ld: main.o:/build/source/Sil/src/externs.h:57: multiple definition of
+  #     `mini_screenshot_char'; variable.o:/build/source/Sil/src/externs.h:57: first defined here
+  env.NIX_CFLAGS_COMPILE = "-fcommon";
+
+  installPhase = ''
+    runHook preInstall
+
+    # the makefile doesn't have a sensible install target, so we have to do it ourselves
+    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
+    # lib directory anyway, so we might as well give everyone a copy
+    wrapProgram $out/bin/sil \
+      --run "export ANGBAND_PATH=\$HOME/.sil" \
+      --run "${setup} ${src}/Sil/lib"
+
+    runHook postInstall
+  '';
+
+  passthru.tests = {
+    saveDirCreation = pkgs.runCommand "save-dir-creation" {} ''
+      HOME=$(pwd) ${lib.getExe pkgs.sil} --help
+      test -d .sil && touch $out
+    '';
+  };
+
+  meta = {
+    description = "A rogue-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
+      rang with Elven song and gleamed with Dwarven mail.
+
+      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 = lib.licenses.gpl2;
+    maintainers = with lib.maintainers; [ michaelpj kenran ];
+    platforms = lib.platforms.linux;
+    mainProgram = "sil";
+  };
+}
diff --git a/nixpkgs/pkgs/games/simutrans/default.nix b/nixpkgs/pkgs/games/simutrans/default.nix
new file mode 100644
index 000000000000..cc8b864c1f3e
--- /dev/null
+++ b/nixpkgs/pkgs/games/simutrans/default.nix
@@ -0,0 +1,171 @@
+{ lib, stdenv, fetchurl, pkg-config, unzip, zlib, libpng, bzip2, SDL, SDL_mixer
+, buildEnv, config, runtimeShell
+}:
+
+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 lib; withPaks (
+    if paksets == "*" then attrValues pakSpec # taking all
+      else map (name: pakSpec.${name}) (splitString " " paksets)
+  );
+
+  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 = "1f463r6kr5ig0zd3mncc74k93xbjywsq3d06j5r17831jyc9bzb9";
+  };
+
+
+  # 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 = "${ver_dash}/simupak64-${ver_dash}";
+      sha256 = "1k335kh8dhm1hdn5iwn3sdgnrlpk0rqxmmgqgqcwsi09cmw45m5c";
+    };
+    "pak64.japan" = {
+      # No release for 121.0 yet!
+      srcPath = "120-0/simupak64.japan-120-0-1";
+      sha256 = "14swy3h4ij74bgaw7scyvmivfb5fmp21nixmhlpk3mav3wr3167i";
+    };
+
+    pak128 = {
+      srcPath = "pak128%20for%20ST%20120.4.1%20%282.8.1%2C%20priority%20signals%20%2B%20bugfix%29/pak128";
+      sha256 = "0z01y7r0rz7q79vr17bbnkgcbjjrimphy1dwb1pgbiv4klz7j5xw";
+    };
+    "pak128.britain" = {
+      srcPath = "pak128.Britain%20for%20120-1/pak128.Britain.1.18-120-3";
+      sha256 = "1kyb0s54kysvdr0zdln9106yx75d71j4lbw3v87k3i440cj3r1d3";
+    };
+    "pak128.cs" = { # note: it needs pak128 to work
+      url = "mirror://sourceforge/simutrans/Pak128.CS/pak128.cz_v.0.2.1.zip";
+      sha256 = "008d8x1s0vxsq78rkczlnf57pv1n5hi1v5nbd1l5w3yls7lk11sc";
+    };
+    "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 = "1cv1rzl1a3i5dvk476zq094wawk9hhdh2f0y4xrdny5gn17mb2xi";
+    };
+
+    /* This release contains accented filenames that prevent unzipping.
+    "pak192.comic" = {
+      srcPath = "pak192comic%20for%20${ver2_dash}/pak192comic-0.4-${ver2_dash}up";
+      sha256 = throw "";
+    };
+    */
+  };
+
+
+  mkPak = {
+    sha256, pakName, srcPath ? null
+    , url ? "mirror://sourceforge/simutrans/${pakName}/${srcPath}.zip"
+  }:
+    stdenv.mkDerivation {
+      name = "simutrans-${pakName}";
+      dontUnpack = true;
+      preferLocalBuild = true;
+      installPhase = let src = fetchurl { inherit url sha256; };
+      in ''
+        mkdir -p "$out/share/simutrans/${pakName}"
+        cd "$out/share/simutrans/${pakName}"
+        "${unzip}/bin/unzip" "${src}"
+        chmod -R +w . # some zipfiles need that
+
+        set +o pipefail # no idea why it's needed
+        toStrip=`find . -iname '*.pak' | head -n 1 | sed 's|\./\(.*\)/[^/]*$|\1|'`
+        echo "Detected path '$toStrip' to strip"
+        mv ./"$toStrip"/* .
+        rm -f "$toStrip/.directory" #pak128.german had this
+        rmdir -p "$toStrip"
+      '';
+    };
+
+  /* The binaries need all data in one directory; the default is directory
+      of the executable, and another option is the current directory :-/ */
+  withPaks = paks: buildEnv {
+    inherit (binaries) name;
+    paths = [binaries] ++ paks;
+    postBuild = ''
+      rm "$out/bin" && mkdir "$out/bin"
+      cat > "$out/bin/simutrans" <<EOF
+      #!${runtimeShell}
+      cd "$out"/share/simutrans
+      exec "${binaries}/bin/simutrans" -use_workdir "\$@"
+      EOF
+      chmod +x "$out/bin/simutrans"
+    '';
+
+    passthru.meta = binaries.meta // { hydraPlatforms = []; };
+    passthru.binaries = binaries;
+  };
+
+  binaries = stdenv.mkDerivation {
+    pname = "simutrans";
+    inherit version;
+
+    src = binary_src;
+
+    sourceRoot = ".";
+
+    nativeBuildInputs = [ pkg-config unzip ];
+    buildInputs = [ zlib libpng bzip2 SDL SDL_mixer ];
+
+    configurePhase = let
+      # Configuration as per the readme.txt and config.template
+      platform =
+        if stdenv.isLinux then "linux" else
+        if stdenv.isDarwin then "mac" else throw "add your platform";
+      config = ''
+        BACKEND = mixer_sdl
+        COLOUR_DEPTH = 16
+        OSTYPE = ${platform}
+        VERBOSE = 1
+      '';
+      #TODO: MULTI_THREAD = 1 is "highly recommended",
+      # but it's roughly doubling CPU usage for me
+    in ''
+      echo "${config}" > config.default
+
+      # Use ~/.simutrans instead of ~/simutrans
+      substituteInPlace simsys.cc --replace '%s/simutrans' '%s/.simutrans'
+
+      # use -O2 optimization (defaults are -O or -O3)
+      sed -i -e '/CFLAGS += -O/d' Makefile
+      export CFLAGS+=-O2
+    '';
+
+    enableParallelBuilding = true;
+
+    installPhase = ''
+      mkdir -p $out/share/
+      mv simutrans $out/share/
+
+      mkdir -p $out/bin/
+      mv build/default/sim $out/bin/simutrans
+    '';
+
+    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
+        player strives to run a successful transport system by
+        transporting goods, passengers, and mail between
+        places. Simutrans is an open source remake of Transport Tycoon.
+      '';
+
+      homepage = "http://www.simutrans.com/";
+      license = with licenses; [ artistic1 gpl1Plus ];
+      maintainers = with maintainers; [ ];
+      platforms = with platforms; linux; # TODO: ++ darwin;
+    };
+  };
+
+in result
diff --git a/nixpkgs/pkgs/games/sm64ex/coop.nix b/nixpkgs/pkgs/games/sm64ex/coop.nix
new file mode 100644
index 000000000000..742f41cea361
--- /dev/null
+++ b/nixpkgs/pkgs/games/sm64ex/coop.nix
@@ -0,0 +1,41 @@
+{ callPackage
+, fetchFromGitHub
+, autoPatchelfHook
+, zlib
+, stdenvNoCC
+}:
+
+callPackage ./generic.nix {
+  pname = "sm64ex-coop";
+  version = "unstable-2023-02-22";
+
+  src = fetchFromGitHub {
+    owner = "djoslin0";
+    repo = "sm64ex-coop";
+    rev = "8746a503086793c87860daadfaeaaf0a31b2d6cf";
+    sha256 = "sha256-iwJsq0FN9npxveIoMiB7zL5j1V72IExtEpzGj6lwLXQ=";
+  };
+
+  extraNativeBuildInputs = [
+    autoPatchelfHook
+  ];
+
+  extraBuildInputs = [
+    zlib
+  ];
+
+  postInstall =
+    let
+      sharedLib = stdenvNoCC.hostPlatform.extensions.sharedLibrary;
+    in
+    ''
+      mkdir -p $out/lib
+      cp $src/lib/bass/libbass{,_fx}${sharedLib} $out/lib
+      cp $src/lib/discordsdk/libdiscord_game_sdk${sharedLib} $out/lib
+    '';
+
+  extraMeta = {
+    homepage = "https://github.com/djoslin0/sm64ex-coop";
+    description = "Super Mario 64 online co-op mod, forked from sm64ex";
+  };
+}
diff --git a/nixpkgs/pkgs/games/sm64ex/default.nix b/nixpkgs/pkgs/games/sm64ex/default.nix
new file mode 100644
index 000000000000..17fcfdd131ac
--- /dev/null
+++ b/nixpkgs/pkgs/games/sm64ex/default.nix
@@ -0,0 +1,9 @@
+{ callPackage
+, branch
+}:
+
+{
+  sm64ex = callPackage ./sm64ex.nix { };
+
+  sm64ex-coop = callPackage ./coop.nix { };
+}.${branch}
diff --git a/nixpkgs/pkgs/games/sm64ex/generic.nix b/nixpkgs/pkgs/games/sm64ex/generic.nix
new file mode 100644
index 000000000000..95ba3be4a569
--- /dev/null
+++ b/nixpkgs/pkgs/games/sm64ex/generic.nix
@@ -0,0 +1,84 @@
+{ pname
+, version
+, src
+, extraNativeBuildInputs ? [ ]
+, extraBuildInputs ? [ ]
+, extraMeta ? { }
+, compileFlags ? [ ]
+, postInstall ? ""
+, region ? "us"
+
+, lib
+, stdenv
+, fetchFromGitHub
+, python3
+, pkg-config
+, audiofile
+, SDL2
+, hexdump
+, requireFile
+, baseRom ? requireFile {
+    name = "baserom.${region}.z64";
+    message = ''
+      This nix expression requires that baserom.${region}.z64 is
+      already part of the store. To get this file you can dump your Super Mario 64 cartridge's contents
+      and add it to the nix store with nix-store --add-fixed sha256 <FILE>.
+      Note that if you are not using a US baserom, you must overwrite the "region" attribute with either "eu" or "jp".
+    '';
+    sha256 = {
+      "us" = "17ce077343c6133f8c9f2d6d6d9a4ab62c8cd2aa57c40aea1f490b4c8bb21d91";
+      "eu" = "c792e5ebcba34c8d98c0c44cf29747c8ee67e7b907fcc77887f9ff2523f80572";
+      "jp" = "9cf7a80db321b07a8d461fe536c02c87b7412433953891cdec9191bfad2db317";
+    }.${region};
+  }
+}:
+
+stdenv.mkDerivation rec {
+  inherit pname version src postInstall;
+
+  nativeBuildInputs = [
+    python3
+    pkg-config
+    hexdump
+  ] ++ extraNativeBuildInputs;
+
+  buildInputs = [
+    audiofile
+    SDL2
+  ] ++ extraBuildInputs;
+
+  enableParallelBuilding = true;
+
+  makeFlags = [
+    "VERSION=${region}"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "OSX_BUILD=1"
+  ] ++ compileFlags;
+
+  preBuild = ''
+    patchShebangs extract_assets.py
+    ln -s ${baseRom} ./baserom.${region}.z64
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/bin
+    cp build/${region}_pc/sm64.${region}.f3dex2e $out/bin/sm64ex
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    longDescription =
+      extraMeta.description or "Super Mario 64 port based off of decompilation" + "\n" + ''
+        Note that you must supply a baserom yourself to extract assets from.
+        If you are not using an US baserom, you must overwrite the "region" attribute with either "eu" or "jp".
+        If you would like to use patches sm64ex distributes as makeflags, add them to the "compileFlags" attribute.
+      '';
+    mainProgram = "sm64ex";
+    license = licenses.unfree;
+    maintainers = with maintainers; [ ivar ];
+    platforms = platforms.unix;
+  } // extraMeta;
+}
diff --git a/nixpkgs/pkgs/games/sm64ex/sm64ex.nix b/nixpkgs/pkgs/games/sm64ex/sm64ex.nix
new file mode 100644
index 000000000000..ddac79697c6f
--- /dev/null
+++ b/nixpkgs/pkgs/games/sm64ex/sm64ex.nix
@@ -0,0 +1,21 @@
+{ callPackage
+, fetchFromGitHub
+}:
+
+callPackage ./generic.nix {
+  pname = "sm64ex";
+  version = "unstable-2022-12-19";
+
+  src = fetchFromGitHub {
+    owner = "sm64pc";
+    repo = "sm64ex";
+    rev = "afc7e8da695bdf1aea5400a0d5c8b188d16a2088";
+    sha256 = "sha256-TbA9yGPtP2uGsxN3eFaQwFeNjAjZ5hSk8Qmx1pRQxf8=";
+  };
+
+  extraMeta = {
+    homepage = "https://github.com/sm64pc/sm64ex";
+    description = "Super Mario 64 port based off of decompilation";
+  };
+}
+
diff --git a/nixpkgs/pkgs/games/snake4/default.nix b/nixpkgs/pkgs/games/snake4/default.nix
new file mode 100644
index 000000000000..aee8b9e0810c
--- /dev/null
+++ b/nixpkgs/pkgs/games/snake4/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, fetchurl, shhmsg, shhopt, xorg }:
+
+stdenv.mkDerivation rec {
+  pname = "snake4";
+  version = "1.0.14";
+
+  src = fetchurl {
+    url = "https://shh.thathost.com/pub-unix/files/snake4-${version}.tar.gz";
+    sha256 = "14cng9l857np42zixp440mbc8y5675frb6lhsds53j1cws9cncw9";
+  };
+
+  buildInputs = with xorg; [ shhmsg shhopt libX11 libXt libXpm libXaw libXext ];
+
+  preInstall = ''
+    substituteInPlace Makefile \
+      --replace "-o \$(OWNER) -g \$(GROUP)" "" \
+      --replace "4755" "755"
+  '';
+
+  installFlags = [ "INSTLIBDIR=$(out)/lib"
+                   "INSTBINDIR=$(out)/bin"
+                   "INSTMANDIR=$(out)/man" ];
+
+  meta = with lib; {
+    description = "A game starring a fruit-eating snake";
+    homepage = "https://shh.thathost.com/pub-unix/html/snake4.html";
+    license = licenses.artistic1;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/snipes/default.nix b/nixpkgs/pkgs/games/snipes/default.nix
new file mode 100644
index 000000000000..01b24ee434c3
--- /dev/null
+++ b/nixpkgs/pkgs/games/snipes/default.nix
@@ -0,0 +1,47 @@
+{ lib, stdenv, fetchFromGitHub, fetchurl, SDL2, SDL2_ttf }:
+
+let
+  font = fetchurl {
+    url    = "http://kingbird.myphotos.cc/ee22d44076adb8a34d8e20df4be3730a/SnipesConsole.ttf";
+    sha256 = "06n8gq18js0bv4svx84ljzhs9zmi81wy0zqcqj3b4g0rsrkr20a7";
+  };
+
+in stdenv.mkDerivation {
+  pname = "snipes";
+  version = "20180930";
+
+  src = fetchFromGitHub {
+    owner  = "Davidebyzero";
+    repo   = "Snipes";
+    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;
+
+  buildInputs = [ SDL2 SDL2_ttf ];
+
+  installPhase = ''
+    runHook preInstall
+
+    install -Dm755 -t $out/bin snipes
+    install -Dm644 -t $out/share/doc/snipes *.md
+    install -Dm644 ${font} $out/share/snipes/SnipesConsole.ttf
+
+    runHook postInstall
+  '';
+
+  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.
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/snis/default.nix b/nixpkgs/pkgs/games/snis/default.nix
new file mode 100644
index 000000000000..b74fef451820
--- /dev/null
+++ b/nixpkgs/pkgs/games/snis/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, pkg-config
+, coreutils
+, portaudio
+, libbsd
+, libpng
+, libvorbis
+, SDL2
+, makeWrapper
+, lua5_2
+, glew
+, openssl
+, picotts
+, alsa-utils
+, espeak-classic
+, sox
+, libopus
+, openscad
+, libxcrypt
+}:
+
+stdenv.mkDerivation {
+  pname = "snis_launcher";
+  version = "unstable-2021-10-17";
+
+  src = fetchFromGitHub {
+    owner = "smcameron";
+    repo = "space-nerds-in-space";
+    rev = "e70d3c63e33c940feb53c8d818ce2d8ea2aadf00";
+    sha256 = "sha256-HVCb1iFn7GWNpedtFCgLyd0It8s4PEmUwDfb8ap1TDc=";
+  };
+
+  postPatch = ''
+    substituteInPlace Makefile \
+      --replace "OPUSARCHIVE=libopus.a" "OPUSARCHIVE=" \
+      --replace "-I./opus-1.3.1/include" "-I${libopus.dev}/include/opus"
+    substituteInPlace snis_launcher \
+      --replace "PREFIX=." "PREFIX=$out"
+    substituteInPlace snis_text_to_speech.sh \
+      --replace "pico2wave" "${sox}/bin/pico2wave" \
+      --replace "espeak" "${espeak-classic}/bin/espeak" \
+      --replace "play" "${sox}/bin/play" \
+      --replace "aplay" "${alsa-utils}/bin/aplay" \
+      --replace "/bin/rm" "${coreutils}/bin/rm"
+  '';
+
+  nativeBuildInputs = [ pkg-config openscad makeWrapper ];
+  buildInputs = [ coreutils portaudio libbsd libpng libvorbis SDL2 lua5_2 glew openssl picotts sox alsa-utils libopus libxcrypt ];
+
+  postBuild = ''
+    make models -j$NIX_BUILD_CORES
+  '';
+
+  installPhase = ''
+    runHook preInstall
+    mkdir -p $out
+    cp -R share $out/share
+    cp -R bin $out/bin
+    cp snis_launcher $out/bin/
+    # without this, snis_client crashes on Wayland
+    wrapProgram $out/bin/snis_client --set SDL_VIDEODRIVER x11
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Space Nerds In Space, a multi-player spaceship bridge simulator";
+    homepage = "https://smcameron.github.io/space-nerds-in-space/";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ alyaeanyx ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/soi/default.nix b/nixpkgs/pkgs/games/soi/default.nix
new file mode 100644
index 000000000000..eb214752df84
--- /dev/null
+++ b/nixpkgs/pkgs/games/soi/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, fetchurl, cmake
+, boost, eigen2, lua, luabind, libGLU, libGL, SDL }:
+
+stdenv.mkDerivation rec {
+  pname = "soi";
+  version = "0.1.2";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/project/soi/Spheres%20of%20Influence-${version}-Source.tar.bz2";
+    name = "${pname}-${version}.tar.bz2";
+    sha256 = "03c3wnvhd42qh8mi68lybf8nv6wzlm1nx16d6pdcn2jzgx1j2lzd";
+  };
+
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ boost lua luabind libGLU libGL SDL ];
+
+  cmakeFlags = [
+    "-DEIGEN_INCLUDE_DIR=${eigen2}/include/eigen2"
+    "-DLUABIND_LIBRARY=${luabind}/lib/libluabind09.a"
+  ];
+
+  meta = with lib; {
+    description = "A physics-based puzzle game";
+    maintainers = with maintainers; [ raskin ];
+    platforms = platforms.linux;
+    license = licenses.free;
+    downloadPage = "https://sourceforge.net/projects/soi/files/";
+  };
+}
diff --git a/nixpkgs/pkgs/games/solarus/default.nix b/nixpkgs/pkgs/games/solarus/default.nix
new file mode 100644
index 000000000000..0e95a77a7cd4
--- /dev/null
+++ b/nixpkgs/pkgs/games/solarus/default.nix
@@ -0,0 +1,42 @@
+{ lib, mkDerivation, fetchFromGitLab, cmake, luajit
+,  SDL2, SDL2_image, SDL2_ttf, physfs, glm
+, openal, libmodplug, libvorbis
+, qtbase, qttools }:
+
+mkDerivation rec {
+  pname = "solarus";
+  version = "1.6.4";
+
+  src = fetchFromGitLab {
+    owner = "solarus-games";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sbdlf+R9OskDQ5U5rqUX2gF8l/fj0sDJv6BL7H1I1Ng=";
+  };
+
+  outputs = [ "out" "lib" "dev" ];
+
+  nativeBuildInputs = [ cmake qttools ];
+  buildInputs = [ luajit SDL2
+    SDL2_image SDL2_ttf physfs
+    openal libmodplug libvorbis
+    qtbase glm ];
+
+  preFixup = ''
+    mkdir $lib/
+    mv $out/lib $lib
+  '';
+
+  meta = with lib; {
+    description = "A Zelda-like ARPG game engine";
+    longDescription = ''
+      Solarus is a game engine for Zelda-like ARPG games written in lua.
+      Many full-fledged games have been writen for the engine.
+    '';
+    homepage = "https://www.solarus-games.org";
+    license = licenses.gpl3;
+    maintainers = [ ];
+    platforms = platforms.linux;
+  };
+
+}
diff --git a/nixpkgs/pkgs/games/solicurses/default.nix b/nixpkgs/pkgs/games/solicurses/default.nix
new file mode 100644
index 000000000000..3b0a60cb1e81
--- /dev/null
+++ b/nixpkgs/pkgs/games/solicurses/default.nix
@@ -0,0 +1,41 @@
+{ stdenv
+, lib
+, fetchFromGitHub
+, ncurses
+}:
+
+stdenv.mkDerivation {
+  pname = "solicurses";
+  version = "unstable-2020-02-13";
+
+  src = fetchFromGitHub {
+    owner = "KaylaPP";
+    repo = "SoliCurses";
+    rev = "dc89ca00fc1711dc449d0a594a4727af22fc35a0";
+    sha256 = "sha256-zWYXpvEnViT/8gsdMU9Ymi4Hw+nwkG6FT/3h5sNMCE4=";
+  };
+
+  buildInputs = [
+    ncurses
+  ];
+
+  preBuild = ''
+    cd build
+  '';
+
+  makeFlags = [
+    "CC=${stdenv.cc.targetPrefix}c++"
+  ];
+
+  installPhase = ''
+    install -D SoliCurses.out $out/bin/solicurses
+  '';
+
+  meta = with lib; {
+    description = "A version of Solitaire written in C++ using the ncurses library";
+    homepage = "https://github.com/KaylaPP/SoliCurses";
+    maintainers = with maintainers; [ laalsaas ];
+    license = licenses.gpl3Only;
+    inherit (ncurses.meta) platforms;
+  };
+}
diff --git a/nixpkgs/pkgs/games/space-cadet-pinball/default.nix b/nixpkgs/pkgs/games/space-cadet-pinball/default.nix
new file mode 100644
index 000000000000..3957bf4fc1bc
--- /dev/null
+++ b/nixpkgs/pkgs/games/space-cadet-pinball/default.nix
@@ -0,0 +1,70 @@
+{ lib, stdenv, fetchFromGitHub, fetchzip
+, cmake, SDL2, SDL2_mixer, Cocoa
+, unrar-wrapper, makeWrapper
+, fetchpatch
+}:
+
+let
+  assets = (fetchzip {
+    url = "https://archive.org/download/SpaceCadet_Plus95/Space_Cadet.rar";
+    sha256 = "sha256-fC+zsR8BY6vXpUkVd6i1jF0IZZxVKVvNi6VWCKT+pA4=";
+    stripRoot = false;
+  }).overrideAttrs (old: {
+    nativeBuildInputs = old.nativeBuildInputs ++ [ unrar-wrapper ];
+  });
+in
+stdenv.mkDerivation rec {
+  pname = "SpaceCadetPinball";
+  version = "2.0.1";
+
+  src = fetchFromGitHub {
+    owner = "k4zmu2a";
+    repo = pname;
+    rev = "Release_${version}";
+    sha256 = "sha256-LmYplJr1Mg4yNg9eP02FXf9mL1FnzNBhpted3GpmlQ0=";
+  };
+
+  patches = [
+    # remove when updating past 2.0.1
+    (fetchpatch {
+      name = "fix-install-directories";
+      url = "https://github.com/k4zmu2a/SpaceCadetPinball/commit/d8ee1b9bfeee21d3981a40e735411393392bc1f6.patch";
+      sha256 = "sha256-BtCDJ+a9AFaOM8nyId0eU9GN/gUQT2kFCO4RIVTzZlE=";
+    })
+  ];
+
+  nativeBuildInputs = [ cmake makeWrapper ];
+  buildInputs = [
+    SDL2
+    SDL2_mixer
+  ] ++ lib.optional stdenv.isDarwin Cocoa;
+
+  # Darwin needs a custom installphase since it is excluded from the cmake install
+  # https://github.com/k4zmu2a/SpaceCadetPinball/blob/0f88e43ba261bc21fa5c3ef9d44969a2a079d0de/CMakeLists.txt#L221
+  installPhase = lib.optionalString stdenv.isDarwin ''
+    runHook preInstall
+    mkdir -p $out/bin
+    install ../bin/SpaceCadetPinball $out/bin
+    runHook postInstall
+  '';
+
+  postInstall = ''
+    mkdir -p $out/lib/SpaceCadetPinball
+    install ${assets}/*.{DAT,DOC,MID,BMP,INF} ${assets}/Sounds/*.WAV $out/lib/SpaceCadetPinball
+
+    # Assets are loaded from the directory of the program is stored in
+    # https://github.com/k4zmu2a/SpaceCadetPinball/blob/de13d4e326b2dfa8e6dfb59815c0a8b9657f942d/SpaceCadetPinball/winmain.cpp#L119
+    mv $out/bin/SpaceCadetPinball $out/lib/SpaceCadetPinball
+    makeWrapper $out/lib/SpaceCadetPinball/SpaceCadetPinball $out/bin/SpaceCadetPinball
+  '';
+
+  meta = with lib; {
+    description = "Reverse engineering of 3D Pinball for Windows – Space Cadet, a game bundled with Windows";
+    homepage = "https://github.com/k4zmu2a/SpaceCadetPinball";
+    # The assets are unfree while the code is labeled as MIT
+    license = with licenses; [ unfree mit ];
+    maintainers = [ maintainers.hqurve ];
+    platforms = platforms.all;
+    mainProgram = "SpaceCadetPinball";
+  };
+}
diff --git a/nixpkgs/pkgs/games/space-orbit/default.nix b/nixpkgs/pkgs/games/space-orbit/default.nix
new file mode 100644
index 000000000000..7e51d7a4b290
--- /dev/null
+++ b/nixpkgs/pkgs/games/space-orbit/default.nix
@@ -0,0 +1,46 @@
+{ lib, stdenv, fetchurl
+, libGLU, libGL, libXi, libXt, libXext, libX11, libXmu, freeglut
+}:
+
+stdenv.mkDerivation rec {
+  pname = "space-orbit";
+  version = "1.01";
+  patchversion = "9";
+
+  buildInputs = [ libGLU libGL libXi libXt libXext libX11 libXmu freeglut ];
+
+  src = fetchurl {
+    url = "mirror://debian/pool/main/s/space-orbit/space-orbit_${version}.orig.tar.gz";
+    sha256 = "1kx69f9jqnfzwjh47cl1df8p8hn3bnp6bznxnb6c4wx32ijn5gri";
+  };
+
+  patches = [
+    (fetchurl {
+       url = "mirror://debian/pool/main/s/space-orbit/space-orbit_${version}-${patchversion}.diff.gz";
+       sha256 = "1v3s97day6fhv08l2rn81waiprhi1lfyjjsj55axfh6n6zqfn1w2";
+     })
+  ];
+
+  preBuild = ''
+    cd src
+    sed -e 's@/usr/share/games/orbit/@'$out'/dump/@g' -i *.c
+    sed -e '/DIR=/d; s/-lesd//; s/-DESD//;' -i Makefile
+  '';
+
+  installPhase = ''
+    mkdir -p $out/bin
+    cp -r .. $out/dump
+    cat >$out/bin/space-orbit <<EOF
+#! ${stdenv.shell}
+exec $out/dump/orbit "\$@"
+EOF
+    chmod a+x $out/bin/space-orbit
+  '';
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "A space combat simulator";
+    license = licenses.gpl2;
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/games/space-station-14-launcher/default.nix b/nixpkgs/pkgs/games/space-station-14-launcher/default.nix
new file mode 100644
index 000000000000..606f0659c788
--- /dev/null
+++ b/nixpkgs/pkgs/games/space-station-14-launcher/default.nix
@@ -0,0 +1,40 @@
+{ soundfont-fluid
+, buildFHSEnv
+, runCommand
+, callPackage
+}:
+
+let
+  space-station-14-launcher = callPackage ./space-station-14-launcher.nix { };
+
+  # Workaround for hardcoded soundfont paths in downloaded engine assemblies.
+  soundfont-fluid-fixed = runCommand "soundfont-fluid-fixed" { } ''
+    mkdir -p "$out/share/soundfonts"
+    ln -sf ${soundfont-fluid}/share/soundfonts/FluidR3_GM2-2.sf2 $out/share/soundfonts/FluidR3_GM.sf2
+  '';
+in
+buildFHSEnv rec {
+  name = "space-station-14-launcher-wrapped";
+
+  targetPkgs = pkgs: [
+    space-station-14-launcher
+    soundfont-fluid-fixed
+  ];
+
+  runScript = "SS14.Launcher";
+
+  extraInstallCommands = ''
+    mkdir -p $out/share/applications
+    ln -s ${space-station-14-launcher}/share/icons $out/share
+    cp ${space-station-14-launcher}/share/applications/space-station-14-launcher.desktop "$out/share/applications"
+    substituteInPlace "$out/share/applications/space-station-14-launcher.desktop" \
+        --replace ${space-station-14-launcher.meta.mainProgram} ${meta.mainProgram}
+  '';
+
+  passthru = space-station-14-launcher.passthru // {
+    unwrapped = space-station-14-launcher;
+  };
+  meta = space-station-14-launcher.meta // {
+    mainProgram = name;
+  };
+}
diff --git a/nixpkgs/pkgs/games/space-station-14-launcher/deps.nix b/nixpkgs/pkgs/games/space-station-14-launcher/deps.nix
new file mode 100644
index 000000000000..5e3fdfec2bc2
--- /dev/null
+++ b/nixpkgs/pkgs/games/space-station-14-launcher/deps.nix
@@ -0,0 +1,143 @@
+# This file was automatically generated by passthru.fetch-deps.
+# Please dont edit it manually, your changes might get overwritten!
+
+{ fetchNuGet }: [
+  (fetchNuGet { pname = "Avalonia"; version = "0.10.19"; sha256 = "1yzrbp0b6kv9h9d4kl96ldr6ln40xj1j2yvbvpm0pgv7ajwr7qhc"; })
+  (fetchNuGet { pname = "Avalonia.Angle.Windows.Natives"; version = "2.1.0.2020091801"; sha256 = "04jm83cz7vkhhr6n2c9hya2k8i2462xbf6np4bidk55as0jdq43a"; })
+  (fetchNuGet { pname = "Avalonia.Controls.DataGrid"; version = "0.10.19"; sha256 = "0wlmr4dlz8x3madm7xwhmsf0kgdnwcy6n7zvfd9x6h0bllii1lbn"; })
+  (fetchNuGet { pname = "Avalonia.Desktop"; version = "0.10.19"; sha256 = "0vghwp1wx6l1z0dlvd9aqdaikz6k34q0i9yzaphqlzjp6ms2g2ny"; })
+  (fetchNuGet { pname = "Avalonia.Diagnostics"; version = "0.10.19"; sha256 = "1zlcp8mwn2nscrdsvxlspny22m054gsva9az27pvk7s2s5mrqgfk"; })
+  (fetchNuGet { pname = "Avalonia.FreeDesktop"; version = "0.10.19"; sha256 = "01fin1w9nwa3c9kpvbri26x1r4g59hmayx9r5hxwbhq7s7vm5ghr"; })
+  (fetchNuGet { pname = "Avalonia.Native"; version = "0.10.19"; sha256 = "0c9rw2wckyx9h5yfhm0af5zbs53n9bnhv0mlshl7mn0p92v1wfl3"; })
+  (fetchNuGet { pname = "Avalonia.ReactiveUI"; version = "0.10.19"; sha256 = "0kx4qka2rdmlp54qyn04hh79qc5w796gv3ryv24n82hpplzksqi9"; })
+  (fetchNuGet { pname = "Avalonia.Remote.Protocol"; version = "0.10.19"; sha256 = "0klk9hqas0h3d3lmr0di175nw2kwq5br1xpprkb4y4m83r5lfy0s"; })
+  (fetchNuGet { pname = "Avalonia.Skia"; version = "0.10.19"; sha256 = "16cl9ssmyif2a25fq9kvxs2vr83j589yns53zkfr3wmggl9n6lf2"; })
+  (fetchNuGet { pname = "Avalonia.Win32"; version = "0.10.19"; sha256 = "1pd3jmrdc738j7b4d8rzaj7fxrfq1m2pl3i62z2ym3h0sxl51xy2"; })
+  (fetchNuGet { pname = "Avalonia.X11"; version = "0.10.19"; sha256 = "1h71w73r7r9ci059qwsjqnhp60l8sfd3i3xsw37qfnbhslcna6hh"; })
+  (fetchNuGet { pname = "CodeHollow.FeedReader"; version = "1.2.6"; sha256 = "1ac98diww07cfs3cv142nlwzi9w3n2s5w7m60mkc0rpzg0vpq3mv"; })
+  (fetchNuGet { pname = "Dapper"; version = "2.0.123"; sha256 = "15hxrchfgiqnmgf8fqhrf4pb4c8l9igg5qnkw9yk3rkagcqfkk91"; })
+  (fetchNuGet { pname = "DynamicData"; version = "7.13.1"; sha256 = "0hy2ba2nkhgp23glkinhfx3v892fkkf4cr9m41daaahnl2r2l8y1"; })
+  (fetchNuGet { pname = "Fody"; version = "6.6.4"; sha256 = "1hhdwj0ska7dvak9hki8cnyfmmw5r8yw8w24gzsdwhqx68dnrvsx"; })
+  (fetchNuGet { pname = "HarfBuzzSharp"; version = "2.8.2.1-preview.108"; sha256 = "0xs4px4fy5b6glc77rqswzpi5ddhxvbar1md6q9wla7hckabnq0z"; })
+  (fetchNuGet { pname = "HarfBuzzSharp.NativeAssets.Linux"; version = "2.8.2.1-preview.108"; sha256 = "16wvgvyra2g1b38rxxgkk85wbz89hspixs54zfcm4racgmj1mrj4"; })
+  (fetchNuGet { pname = "HarfBuzzSharp.NativeAssets.macOS"; version = "2.8.2.1-preview.108"; sha256 = "16v7lrwwif2f5zfkx08n6y6w3m56mh4hy757biv0w9yffaf200js"; })
+  (fetchNuGet { pname = "HarfBuzzSharp.NativeAssets.WebAssembly"; version = "2.8.2.1-preview.108"; sha256 = "15kqb353snwpavz3jja63mq8xjqsrw1f902scm8wxmsqrm5q6x55"; })
+  (fetchNuGet { pname = "HarfBuzzSharp.NativeAssets.Win32"; version = "2.8.2.1-preview.108"; sha256 = "0n6ymn9jqms3mk5hg0ar4y9jmh96myl6q0jimn7ahb1a8viq55k1"; })
+  (fetchNuGet { pname = "JetBrains.Annotations"; version = "10.3.0"; sha256 = "1grdx28ga9fp4hwwpwv354rizm8anfq4lp045q4ss41gvhggr3z8"; })
+  (fetchNuGet { pname = "libsodium"; version = "1.0.18.2"; sha256 = "02xd4phd6wfixhdq48ma92c166absqw41vdq5kvjch8p0vc9cdl2"; })
+  (fetchNuGet { pname = "Microsoft.CodeAnalysis.Analyzers"; version = "2.9.6"; sha256 = "18mr1f0wpq0fir8vjnq0a8pz50zpnblr7sabff0yqx37c975934a"; })
+  (fetchNuGet { pname = "Microsoft.CodeAnalysis.Common"; version = "3.4.0"; sha256 = "12rn6gl4viycwk3pz5hp5df63g66zvba4hnkwr3f0876jj5ivmsw"; })
+  (fetchNuGet { pname = "Microsoft.CodeAnalysis.CSharp"; version = "3.4.0"; sha256 = "0rhylcwa95bxawcgixk64knv7p7xrykdjcabmx3gknk8hvj1ai9y"; })
+  (fetchNuGet { pname = "Microsoft.CodeAnalysis.CSharp.Scripting"; version = "3.4.0"; sha256 = "1h2f0z9xnw987x8bydka1sd42ijqjx973md6v1gvpy1qc6ad244g"; })
+  (fetchNuGet { pname = "Microsoft.CodeAnalysis.Scripting.Common"; version = "3.4.0"; sha256 = "195gqnpwqkg2wlvk8x6yzm7byrxfq9bki20xmhf6lzfsdw3z4mf2"; })
+  (fetchNuGet { pname = "Microsoft.CSharp"; version = "4.3.0"; sha256 = "0gw297dgkh0al1zxvgvncqs0j15lsna9l1wpqas4rflmys440xvb"; })
+  (fetchNuGet { pname = "Microsoft.Data.Sqlite"; version = "7.0.4"; sha256 = "0lsbzwqiwqv2qq6858aphq7rsp6fs3i0di132w7c0r2r081szql9"; })
+  (fetchNuGet { pname = "Microsoft.Data.Sqlite.Core"; version = "7.0.4"; sha256 = "0mhfj8bj8dlc01y20ihq6j9r59f67cry6yd6qi6rg9zh93m43jpv"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Platforms"; version = "1.0.1"; sha256 = "01al6cfxp68dscl15z7rxfw9zvhm64dncsw09a1vmdkacsa2v6lr"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Platforms"; version = "1.1.0"; sha256 = "08vh1r12g6ykjygq5d3vq09zylgb84l63k49jc4v8faw9g93iqqm"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Platforms"; version = "2.0.0"; sha256 = "1fk2fk2639i7nzy58m9dvpdnzql4vb8yl8vr19r2fp8lmj9w2jr0"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Platforms"; version = "2.1.2"; sha256 = "1507hnpr9my3z4w1r6xk5n0s1j3y6a2c2cnynj76za7cphxi1141"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Targets"; version = "1.0.1"; sha256 = "0ppdkwy6s9p7x9jix3v4402wb171cdiibq7js7i13nxpdky7074p"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Targets"; version = "1.1.0"; sha256 = "193xwf33fbm0ni3idxzbr5fdq3i2dlfgihsac9jj7whj0gd902nh"; })
+  (fetchNuGet { pname = "Microsoft.Toolkit.Mvvm"; version = "7.1.2"; sha256 = "0hrlgjr41hlpp3hb697i0513x2cm4ysbl0wj4bj67md604cmkv14"; })
+  (fetchNuGet { pname = "Microsoft.Win32.SystemEvents"; version = "4.5.0"; sha256 = "0fnkv3ky12227zqg4zshx4kw2mvysq2ppxjibfw02cc3iprv4njq"; })
+  (fetchNuGet { pname = "Mono.Posix.NETStandard"; version = "1.0.0"; sha256 = "0xlja36hwpjm837haq15mjh2prcf68lyrmn72nvgpz8qnf9vappw"; })
+  (fetchNuGet { pname = "NSec.Cryptography"; version = "22.4.0"; sha256 = "0v89wyvl58ia8r74wn3shajs1ia0rgx1p60nlr87g7ys6lq7ql2d"; })
+  (fetchNuGet { pname = "ReactiveUI"; version = "18.4.26"; sha256 = "0xhj4vk64smjfw7sr2gqxvradqbgky6jgfryq8q85h1hz10r7xaa"; })
+  (fetchNuGet { pname = "ReactiveUI.Fody"; version = "18.4.26"; sha256 = "0i79ajjmibg10cardpq9qh5wy1b4ngvb2v33fr4c5pf1y65xzhmr"; })
+  (fetchNuGet { pname = "Robust.Natives"; version = "0.1.1"; sha256 = "1spfaxk8nsx368zncdcj0b3kg7gj7h14mjji19xrraf8ij0dnczw"; })
+  (fetchNuGet { pname = "Robust.Natives.Angle"; version = "0.1.1-chromium4758"; sha256 = "0awydljd6psr0w661p9q73pg2aa29lfb4i0arkpszl0ra33mhrah"; })
+  (fetchNuGet { pname = "Robust.Natives.Fluidsynth"; version = "0.1.0"; sha256 = "00nkww5sjixs1dmn979niq0hrhplcpabrp18bmpm240wl53ay72x"; })
+  (fetchNuGet { pname = "Robust.Natives.Freetype"; version = "0.1.0"; sha256 = "0skrj5bj5vlxvmp8wg8ar8n393w1vv1bs64hwas7svxf2adwgrw2"; })
+  (fetchNuGet { pname = "Robust.Natives.Glfw"; version = "0.1.0"; sha256 = "0xfak1d76jmr4ajfzclarna0x1c19xf4c3zfzhjn4vqmkk1znck0"; })
+  (fetchNuGet { pname = "Robust.Natives.OpenAL"; version = "0.1.0"; sha256 = "06waksj5rmc50xas4a2nmlj8v01kpwh5k367pcq2yjn0ld22klnx"; })
+  (fetchNuGet { pname = "Robust.Natives.Swnfd"; version = "0.1.0"; sha256 = "1ssnl6zasf2cdaffib4pzyfd1w962y1zmcsivyalgpsh6p4g9as1"; })
+  (fetchNuGet { pname = "Robust.Shared.AuthLib"; version = "0.1.2"; sha256 = "1vn19d81n8jdyy75ryrlajyxr0kp7pwjdlbyqcn8gcid5plrzmh0"; })
+  (fetchNuGet { pname = "runtime.any.System.Collections"; version = "4.3.0"; sha256 = "0bv5qgm6vr47ynxqbnkc7i797fdi8gbjjxii173syrx14nmrkwg0"; })
+  (fetchNuGet { pname = "runtime.any.System.Globalization"; version = "4.3.0"; sha256 = "1daqf33hssad94lamzg01y49xwndy2q97i2lrb7mgn28656qia1x"; })
+  (fetchNuGet { pname = "runtime.any.System.IO"; version = "4.3.0"; sha256 = "0l8xz8zn46w4d10bcn3l4yyn4vhb3lrj2zw8llvz7jk14k4zps5x"; })
+  (fetchNuGet { pname = "runtime.any.System.Reflection"; version = "4.3.0"; sha256 = "02c9h3y35pylc0zfq3wcsvc5nqci95nrkq0mszifc0sjx7xrzkly"; })
+  (fetchNuGet { pname = "runtime.any.System.Reflection.Extensions"; version = "4.3.0"; sha256 = "0zyri97dfc5vyaz9ba65hjj1zbcrzaffhsdlpxc9bh09wy22fq33"; })
+  (fetchNuGet { pname = "runtime.any.System.Reflection.Primitives"; version = "4.3.0"; sha256 = "0x1mm8c6iy8rlxm8w9vqw7gb7s1ljadrn049fmf70cyh42vdfhrf"; })
+  (fetchNuGet { pname = "runtime.any.System.Resources.ResourceManager"; version = "4.3.0"; sha256 = "03kickal0iiby82wa5flar18kyv82s9s6d4xhk5h4bi5kfcyfjzl"; })
+  (fetchNuGet { pname = "runtime.any.System.Runtime"; version = "4.3.0"; sha256 = "1cqh1sv3h5j7ixyb7axxbdkqx6cxy00p4np4j91kpm492rf4s25b"; })
+  (fetchNuGet { pname = "runtime.any.System.Runtime.Handles"; version = "4.3.0"; sha256 = "0bh5bi25nk9w9xi8z23ws45q5yia6k7dg3i4axhfqlnj145l011x"; })
+  (fetchNuGet { pname = "runtime.any.System.Runtime.InteropServices"; version = "4.3.0"; sha256 = "0c3g3g3jmhlhw4klrc86ka9fjbl7i59ds1fadsb2l8nqf8z3kb19"; })
+  (fetchNuGet { pname = "runtime.any.System.Text.Encoding"; version = "4.3.0"; sha256 = "0aqqi1v4wx51h51mk956y783wzags13wa7mgqyclacmsmpv02ps3"; })
+  (fetchNuGet { pname = "runtime.any.System.Threading.Tasks"; version = "4.3.0"; sha256 = "03mnvkhskbzxddz4hm113zsch1jyzh2cs450dk3rgfjp8crlw1va"; })
+  (fetchNuGet { pname = "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "16rnxzpk5dpbbl1x354yrlsbvwylrq456xzpsha1n9y3glnhyx9d"; })
+  (fetchNuGet { pname = "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "0hkg03sgm2wyq8nqk6dbm9jh5vcq57ry42lkqdmfklrw89lsmr59"; })
+  (fetchNuGet { pname = "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "0c2p354hjx58xhhz7wv6div8xpi90sc6ibdm40qin21bvi7ymcaa"; })
+  (fetchNuGet { pname = "runtime.native.System"; version = "4.3.0"; sha256 = "15hgf6zaq9b8br2wi1i3x0zvmk410nlmsmva9p0bbg73v6hml5k4"; })
+  (fetchNuGet { pname = "runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "18pzfdlwsg2nb1jjjjzyb5qlgy6xjxzmhnfaijq5s2jw3cm3ab97"; })
+  (fetchNuGet { pname = "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "0qyynf9nz5i7pc26cwhgi8j62ps27sqmf78ijcfgzab50z9g8ay3"; })
+  (fetchNuGet { pname = "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "1klrs545awhayryma6l7g2pvnp9xy4z0r1i40r80zb45q3i9nbyf"; })
+  (fetchNuGet { pname = "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "0zcxjv5pckplvkg0r6mw3asggm7aqzbdjimhvsasb0cgm59x09l3"; })
+  (fetchNuGet { pname = "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "0vhynn79ih7hw7cwjazn87rm9z9fj0rvxgzlab36jybgcpcgphsn"; })
+  (fetchNuGet { pname = "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "160p68l2c7cqmyqjwxydcvgw7lvl1cr0znkw8fp24d1by9mqc8p3"; })
+  (fetchNuGet { pname = "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "15zrc8fgd8zx28hdghcj5f5i34wf3l6bq5177075m2bc2j34jrqy"; })
+  (fetchNuGet { pname = "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "1p4dgxax6p7rlgj4q73k73rslcnz4wdcv8q2flg1s8ygwcm58ld5"; })
+  (fetchNuGet { pname = "runtime.unix.System.Diagnostics.Debug"; version = "4.3.0"; sha256 = "1lps7fbnw34bnh3lm31gs5c0g0dh7548wfmb8zz62v0zqz71msj5"; })
+  (fetchNuGet { pname = "runtime.unix.System.Private.Uri"; version = "4.3.0"; sha256 = "1jx02q6kiwlvfksq1q9qr17fj78y5v6mwsszav4qcz9z25d5g6vk"; })
+  (fetchNuGet { pname = "runtime.unix.System.Runtime.Extensions"; version = "4.3.0"; sha256 = "0pnxxmm8whx38dp6yvwgmh22smknxmqs5n513fc7m4wxvs1bvi4p"; })
+  (fetchNuGet { pname = "Serilog"; version = "2.12.0"; sha256 = "0lqxpc96qcjkv9pr1rln7mi4y7n7jdi4vb36c2fv3845w1vswgr4"; })
+  (fetchNuGet { pname = "Serilog.Sinks.Console"; version = "4.1.0"; sha256 = "1rpkphmqfh3bv3m7v1zwz88wz4sirj4xqyff9ga0c6bqhblj6wii"; })
+  (fetchNuGet { pname = "Serilog.Sinks.File"; version = "5.0.0"; sha256 = "097rngmgcrdfy7jy8j7dq3xaq2qky8ijwg0ws6bfv5lx0f3vvb0q"; })
+  (fetchNuGet { pname = "SharpZstd.Interop"; version = "1.5.2-beta2"; sha256 = "1145jlprsgll8ixwib0i8phc6jsv6nm4yki4wi1bkxx2bgf9yjay"; })
+  (fetchNuGet { pname = "SkiaSharp"; version = "2.88.1-preview.108"; sha256 = "01sm36hdgmcgkai9m09xn2qfz8v7xhh803n8fng8rlxwnw60rgg6"; })
+  (fetchNuGet { pname = "SkiaSharp.NativeAssets.Linux"; version = "2.88.1-preview.108"; sha256 = "19jf2jcq2spwbpx3cfdi2a95jf4y8205rh56lmkh8zsxd2k7fjyp"; })
+  (fetchNuGet { pname = "SkiaSharp.NativeAssets.macOS"; version = "2.88.1-preview.108"; sha256 = "1vcpqd7slh2b9gsacpd7mk1266r1xfnkm6230k8chl3ng19qlf15"; })
+  (fetchNuGet { pname = "SkiaSharp.NativeAssets.WebAssembly"; version = "2.88.1-preview.108"; sha256 = "0a89gqjw8k97arr0kyd0fm3f46k1qamksbnyns9xdlgydjg557dd"; })
+  (fetchNuGet { pname = "SkiaSharp.NativeAssets.Win32"; version = "2.88.1-preview.108"; sha256 = "05g9blprq5msw3wshrgsk19y0fvhjlqiybs1vdyhfmww330jlypn"; })
+  (fetchNuGet { pname = "SpaceWizards.Sodium"; version = "0.2.1"; sha256 = "059slmfg8diivd7hv53cp24vvrzfviqp6fyg8135azynyxk787fp"; })
+  (fetchNuGet { pname = "SpaceWizards.Sodium.Interop"; version = "1.0.18-beta4"; sha256 = "1w59i27z2xdvdflfbnq2braas5f4gpkq9m1xcmc1961hm97z1wvn"; })
+  (fetchNuGet { pname = "Splat"; version = "14.6.8"; sha256 = "1nj0bsqcr93n8jdyb1all8l35gydlgih67kr7cs1bc12l18fwx2w"; })
+  (fetchNuGet { pname = "SQLitePCLRaw.bundle_e_sqlite3"; version = "2.1.4"; sha256 = "0shdspl9cm71wwqg9103s44r0l01r3sgnpxr523y4a0wlgac50g0"; })
+  (fetchNuGet { pname = "SQLitePCLRaw.core"; version = "2.1.4"; sha256 = "09akxz92qipr1cj8mk2hw99i0b81wwbwx26gpk21471zh543f8ld"; })
+  (fetchNuGet { pname = "SQLitePCLRaw.lib.e_sqlite3"; version = "2.1.4"; sha256 = "11l85ksv1ck46j8z08fyf0c3l572zmp9ynb7p5chm5iyrh8xwkkn"; })
+  (fetchNuGet { pname = "SQLitePCLRaw.provider.e_sqlite3"; version = "2.1.4"; sha256 = "0b8f51nrjkq0pmfzjaqk5rp7r0cp2lbdm2whynj3xsjklppzmn35"; })
+  (fetchNuGet { pname = "System.Collections"; version = "4.3.0"; sha256 = "19r4y64dqyrq6k4706dnyhhw7fs24kpp3awak7whzss39dakpxk9"; })
+  (fetchNuGet { pname = "System.Collections.Immutable"; version = "1.5.0"; sha256 = "1d5gjn5afnrf461jlxzawcvihz195gayqpcfbv6dd7pxa9ialn06"; })
+  (fetchNuGet { pname = "System.ComponentModel.Annotations"; version = "4.5.0"; sha256 = "1jj6f6g87k0iwsgmg3xmnn67a14mq88np0l1ys5zkxhkvbc8976p"; })
+  (fetchNuGet { pname = "System.Diagnostics.Debug"; version = "4.3.0"; sha256 = "00yjlf19wjydyr6cfviaph3vsjzg3d5nvnya26i2fvfg53sknh3y"; })
+  (fetchNuGet { pname = "System.Drawing.Common"; version = "4.5.0"; sha256 = "0knqa0zsm91nfr34br8gx5kjqq4v81zdhqkacvs2hzc8nqk0ddhc"; })
+  (fetchNuGet { pname = "System.Dynamic.Runtime"; version = "4.3.0"; sha256 = "1d951hrvrpndk7insiag80qxjbf2y0y39y8h5hnq9612ws661glk"; })
+  (fetchNuGet { pname = "System.Globalization"; version = "4.3.0"; sha256 = "1cp68vv683n6ic2zqh2s1fn4c2sd87g5hpp6l4d4nj4536jz98ki"; })
+  (fetchNuGet { pname = "System.IO"; version = "4.3.0"; sha256 = "05l9qdrzhm4s5dixmx68kxwif4l99ll5gqmh7rqgw554fx0agv5f"; })
+  (fetchNuGet { pname = "System.Linq"; version = "4.3.0"; sha256 = "1w0gmba695rbr80l1k2h4mrwzbzsyfl2z4klmpbsvsg5pm4a56s7"; })
+  (fetchNuGet { pname = "System.Linq.Expressions"; version = "4.3.0"; sha256 = "0ky2nrcvh70rqq88m9a5yqabsl4fyd17bpr63iy2mbivjs2nyypv"; })
+  (fetchNuGet { pname = "System.Memory"; version = "4.5.3"; sha256 = "0naqahm3wljxb5a911d37mwjqjdxv9l0b49p5dmfyijvni2ppy8a"; })
+  (fetchNuGet { pname = "System.Memory"; version = "4.5.4"; sha256 = "14gbbs22mcxwggn0fcfs1b062521azb9fbb7c113x0mq6dzq9h6y"; })
+  (fetchNuGet { pname = "System.Numerics.Vectors"; version = "4.5.0"; sha256 = "1kzrj37yzawf1b19jq0253rcs8hsq1l2q8g69d7ipnhzb0h97m59"; })
+  (fetchNuGet { pname = "System.ObjectModel"; version = "4.3.0"; sha256 = "191p63zy5rpqx7dnrb3h7prvgixmk168fhvvkkvhlazncf8r3nc2"; })
+  (fetchNuGet { pname = "System.Private.Uri"; version = "4.3.0"; sha256 = "04r1lkdnsznin0fj4ya1zikxiqr0h6r6a1ww2dsm60gqhdrf0mvx"; })
+  (fetchNuGet { pname = "System.Reactive"; version = "5.0.0"; sha256 = "1lafmpnadhiwxyd543kraxa3jfdpm6ipblxrjlibym9b1ykpr5ik"; })
+  (fetchNuGet { pname = "System.Reflection"; version = "4.3.0"; sha256 = "0xl55k0mw8cd8ra6dxzh974nxif58s3k1rjv1vbd7gjbjr39j11m"; })
+  (fetchNuGet { pname = "System.Reflection.Emit"; version = "4.3.0"; sha256 = "11f8y3qfysfcrscjpjym9msk7lsfxkk4fmz9qq95kn3jd0769f74"; })
+  (fetchNuGet { pname = "System.Reflection.Emit"; version = "4.7.0"; sha256 = "121l1z2ypwg02yz84dy6gr82phpys0njk7yask3sihgy214w43qp"; })
+  (fetchNuGet { pname = "System.Reflection.Emit.ILGeneration"; version = "4.3.0"; sha256 = "0w1n67glpv8241vnpz1kl14sy7zlnw414aqwj4hcx5nd86f6994q"; })
+  (fetchNuGet { pname = "System.Reflection.Emit.Lightweight"; version = "4.3.0"; sha256 = "0ql7lcakycrvzgi9kxz1b3lljd990az1x6c4jsiwcacrvimpib5c"; })
+  (fetchNuGet { pname = "System.Reflection.Extensions"; version = "4.3.0"; sha256 = "02bly8bdc98gs22lqsfx9xicblszr2yan7v2mmw3g7hy6miq5hwq"; })
+  (fetchNuGet { pname = "System.Reflection.Metadata"; version = "1.6.0"; sha256 = "1wdbavrrkajy7qbdblpbpbalbdl48q3h34cchz24gvdgyrlf15r4"; })
+  (fetchNuGet { pname = "System.Reflection.Primitives"; version = "4.3.0"; sha256 = "04xqa33bld78yv5r93a8n76shvc8wwcdgr1qvvjh959g3rc31276"; })
+  (fetchNuGet { pname = "System.Reflection.TypeExtensions"; version = "4.3.0"; sha256 = "0y2ssg08d817p0vdag98vn238gyrrynjdj4181hdg780sif3ykp1"; })
+  (fetchNuGet { pname = "System.Resources.ResourceManager"; version = "4.3.0"; sha256 = "0sjqlzsryb0mg4y4xzf35xi523s4is4hz9q4qgdvlvgivl7qxn49"; })
+  (fetchNuGet { pname = "System.Runtime"; version = "4.1.0"; sha256 = "02hdkgk13rvsd6r9yafbwzss8kr55wnj8d5c7xjnp8gqrwc8sn0m"; })
+  (fetchNuGet { pname = "System.Runtime"; version = "4.3.0"; sha256 = "066ixvgbf2c929kgknshcxqj6539ax7b9m570cp8n179cpfkapz7"; })
+  (fetchNuGet { pname = "System.Runtime.CompilerServices.Unsafe"; version = "4.5.2"; sha256 = "1vz4275fjij8inf31np78hw50al8nqkngk04p3xv5n4fcmf1grgi"; })
+  (fetchNuGet { pname = "System.Runtime.CompilerServices.Unsafe"; version = "4.6.0"; sha256 = "0xmzi2gpbmgyfr75p24rqqsba3cmrqgmcv45lsqp5amgrdwd0f0m"; })
+  (fetchNuGet { pname = "System.Runtime.Extensions"; version = "4.3.0"; sha256 = "1ykp3dnhwvm48nap8q23893hagf665k0kn3cbgsqpwzbijdcgc60"; })
+  (fetchNuGet { pname = "System.Runtime.Handles"; version = "4.3.0"; sha256 = "0sw2gfj2xr7sw9qjn0j3l9yw07x73lcs97p8xfc9w1x9h5g5m7i8"; })
+  (fetchNuGet { pname = "System.Runtime.InteropServices"; version = "4.3.0"; sha256 = "00hywrn4g7hva1b2qri2s6rabzwgxnbpw9zfxmz28z09cpwwgh7j"; })
+  (fetchNuGet { pname = "System.Security.Principal.Windows"; version = "4.7.0"; sha256 = "1a56ls5a9sr3ya0nr086sdpa9qv0abv31dd6fp27maqa9zclqq5d"; })
+  (fetchNuGet { pname = "System.Text.Encoding"; version = "4.3.0"; sha256 = "1f04lkir4iladpp51sdgmis9dj4y8v08cka0mbmsy0frc9a4gjqr"; })
+  (fetchNuGet { pname = "System.Text.Encoding.CodePages"; version = "4.5.1"; sha256 = "1z21qyfs6sg76rp68qdx0c9iy57naan89pg7p6i3qpj8kyzn921w"; })
+  (fetchNuGet { pname = "System.Threading"; version = "4.3.0"; sha256 = "0rw9wfamvhayp5zh3j7p1yfmx9b5khbf4q50d8k5rk993rskfd34"; })
+  (fetchNuGet { pname = "System.Threading.Tasks"; version = "4.3.0"; sha256 = "134z3v9abw3a6jsw17xl3f6hqjpak5l682k2vz39spj4kmydg6k7"; })
+  (fetchNuGet { pname = "System.Threading.Tasks.Extensions"; version = "4.5.3"; sha256 = "0g7r6hm572ax8v28axrdxz1gnsblg6kszq17g51pj14a5rn2af7i"; })
+  (fetchNuGet { pname = "System.ValueTuple"; version = "4.5.0"; sha256 = "00k8ja51d0f9wrq4vv5z2jhq8hy31kac2rg0rv06prylcybzl8cy"; })
+  (fetchNuGet { pname = "TerraFX.Interop.Windows"; version = "10.0.22621.1"; sha256 = "0qbiaczssgd28f1kb1zz1g0fqsizv36qr2lbjmdrd1lfsyp2a2nj"; })
+  (fetchNuGet { pname = "Tmds.DBus"; version = "0.9.0"; sha256 = "0vvx6sg8lxm23g5jvm5wh2gfs95mv85vd52lkq7d1b89bdczczf3"; })
+  (fetchNuGet { pname = "XamlNameReferenceGenerator"; version = "1.6.1"; sha256 = "0348gj9g5rl0pj2frx4vscj6602gfyn9ba3i1rmfcrxh9jwwa09m"; })
+  (fetchNuGet { pname = "YamlDotNet"; version = "13.0.2"; sha256 = "031pvc6idvjyrn1bfdn8zaljrndp5ch7fkcn82f06332gqs3n8k8"; })
+]
diff --git a/nixpkgs/pkgs/games/space-station-14-launcher/space-station-14-launcher.nix b/nixpkgs/pkgs/games/space-station-14-launcher/space-station-14-launcher.nix
new file mode 100644
index 000000000000..8d1078a8a01f
--- /dev/null
+++ b/nixpkgs/pkgs/games/space-station-14-launcher/space-station-14-launcher.nix
@@ -0,0 +1,143 @@
+{ lib
+, buildDotnetModule
+, dotnetCorePackages
+, fetchFromGitHub
+, wrapGAppsHook
+, iconConvTools
+, copyDesktopItems
+, makeDesktopItem
+, libX11
+, libICE
+, libSM
+, libXi
+, libXcursor
+, libXext
+, libXrandr
+, fontconfig
+, glew
+, SDL2
+, glfw
+, glibc
+, libGL
+, freetype
+, openal
+, fluidsynth
+, gtk3
+, pango
+, atk
+, cairo
+, zlib
+, glib
+, gdk-pixbuf
+}:
+let
+  version = "0.24.0";
+  pname = "space-station-14-launcher";
+in
+buildDotnetModule rec {
+  inherit pname;
+
+  # Workaround to prevent buildDotnetModule from overriding assembly versions.
+  name = "${pname}-${version}";
+
+  src = fetchFromGitHub {
+    owner = "space-wizards";
+    repo = "SS14.Launcher";
+    rev = "v${version}";
+    hash = "sha256-n0OiNxw9QDibX5HBSzq6jdOxyUd0bPkjKd+mtb/S/BY=";
+    fetchSubmodules = true;
+  };
+
+  buildType = "Release";
+  selfContainedBuild = false;
+
+  projectFile = [
+    "SS14.Loader/SS14.Loader.csproj"
+    "SS14.Launcher/SS14.Launcher.csproj"
+  ];
+
+  nugetDeps = ./deps.nix;
+
+  passthru = {
+    inherit version; # Workaround so update script works.
+    updateScript = ./update.sh;
+  };
+
+  dotnet-sdk = with dotnetCorePackages; combinePackages [ sdk_7_0 sdk_6_0 ];
+  dotnet-runtime = dotnetCorePackages.runtime_7_0;
+
+  dotnetFlags = [
+    "-p:FullRelease=true"
+    "-p:RobustILLink=true"
+    "-nologo"
+  ];
+
+  nativeBuildInputs = [ wrapGAppsHook iconConvTools copyDesktopItems ];
+
+  runtimeDeps = [
+    # Required by the game.
+    glfw
+    SDL2
+    glibc
+    libGL
+    openal
+    freetype
+    fluidsynth
+
+    # Needed for file dialogs.
+    gtk3
+    pango
+    cairo
+    atk
+    zlib
+    glib
+    gdk-pixbuf
+
+    # Avalonia UI dependencies.
+    libX11
+    libICE
+    libSM
+    libXi
+    libXcursor
+    libXext
+    libXrandr
+    fontconfig
+    glew
+  ];
+
+  executables = [ "SS14.Launcher" ];
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = pname;
+      exec = meta.mainProgram;
+      icon = pname;
+      desktopName = "Space Station 14 Launcher";
+      comment = meta.description;
+      categories = [ "Game" ];
+      startupWMClass = meta.mainProgram;
+    })
+  ];
+
+  postInstall = ''
+    mkdir -p $out/lib/space-station-14-launcher/loader
+    cp -r SS14.Loader/bin/${buildType}/*/*/* $out/lib/space-station-14-launcher/loader/
+
+    icoFileToHiColorTheme SS14.Launcher/Assets/icon.ico space-station-14-launcher $out
+  '';
+
+  dontWrapGApps = true;
+
+  preFixup = ''
+    makeWrapperArgs+=("''${gappsWrapperArgs[@]}")
+  '';
+
+  meta = with lib; {
+    description = "Launcher for Space Station 14, a multiplayer game about paranoia and disaster";
+    homepage = "https://spacestation14.io";
+    license = licenses.mit;
+    maintainers = [ maintainers.zumorica ];
+    platforms = [ "x86_64-linux" ];
+    mainProgram = "SS14.Launcher";
+  };
+}
diff --git a/nixpkgs/pkgs/games/space-station-14-launcher/update.sh b/nixpkgs/pkgs/games/space-station-14-launcher/update.sh
new file mode 100755
index 000000000000..6e8b337d3842
--- /dev/null
+++ b/nixpkgs/pkgs/games/space-station-14-launcher/update.sh
@@ -0,0 +1,16 @@
+#! /usr/bin/env nix-shell
+#! nix-shell -I nixpkgs=./. -i bash -p curl jq common-updater-scripts
+set -eo pipefail
+cd "$(dirname "${BASH_SOURCE[0]}")"
+
+new_version="$(curl -s "https://api.github.com/repos/space-wizards/SS14.Launcher/releases?per_page=1" | jq -r '.[0].tag_name' | sed 's/v//')"
+old_version="$(sed -nE 's/\s*version = "(.*)".*/\1/p' ./space-station-14-launcher.nix)"
+
+if [[ "$new_version" == "$old_version" ]]; then
+  echo "Already up to date!"
+  exit 0
+fi
+
+cd ../../..
+update-source-version space-station-14-launcher.unwrapped "$new_version"
+$(nix-build -A space-station-14-launcher.fetch-deps --no-out-link)
diff --git a/nixpkgs/pkgs/games/speed-dreams/default.nix b/nixpkgs/pkgs/games/speed-dreams/default.nix
new file mode 100644
index 000000000000..a44c3d670558
--- /dev/null
+++ b/nixpkgs/pkgs/games/speed-dreams/default.nix
@@ -0,0 +1,76 @@
+{ 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, pkg-config, libvorbis, runtimeShell, curl }:
+
+let
+  version = "2.2.3-r7616";
+  shortVersion = builtins.substring 0 5 version;
+in
+stdenv.mkDerivation rec {
+  inherit version;
+  pname = "speed-dreams";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/speed-dreams/${shortVersion}/speed-dreams-src-base-${version}.tar.xz";
+    sha256 = "sha256-GvB8SDZB9UivJSsQfMMon9N5MURdxTOwsaN4F0XQUCE=";
+  };
+
+  cars-and-tracks = fetchurl {
+    url = "mirror://sourceforge/speed-dreams/${shortVersion}/speed-dreams-src-hq-cars-and-tracks-${version}.tar.xz";
+    sha256 = "sha256-BuryCUvBD7rKmApCNsTkRN0UJ1q6P3sdYrSzpTqdTHc=";
+  };
+
+  more-cars-and-tracks = fetchurl {
+    url = "mirror://sourceforge/speed-dreams/${shortVersion}/speed-dreams-src-more-hq-cars-and-tracks-${version}.tar.xz";
+    sha256 = "sha256-GSCHYbJS352yAMczzss7tYSQXwLQV68rv/XkyGy+GoY=";
+  };
+
+  wip-cars-and-tracks = fetchurl {
+    url = "mirror://sourceforge/speed-dreams/${shortVersion}/speed-dreams-src-wip-cars-and-tracks-${version}.tar.xz";
+    sha256 = "sha256-r/IOSf+UZg2e+WIHn2QNDO6qQUhpIJvh7EF2jQ7lyyA=";
+  };
+
+  sourceRoot = ".";
+
+  postUnpack = ''
+    echo Unpacking data
+    tar -xf ${cars-and-tracks}
+    tar -xf ${more-cars-and-tracks}
+    tar -xf ${wip-cars-and-tracks}
+  '';
+
+  preBuild = ''
+    make -C src/libs/portability
+    make -C src/libs/portability portability.o
+    ar -rv "$(echo lib*/games/speed-dreams*/lib)"/libportability_static.a src/libs/portability/CMakeFiles/portability.dir/portability.cpp.o
+    export NIX_LDFLAGS="$NIX_LDFLAGS -L$(echo $PWD/lib*/games/speed-dreams*/lib) -lexpat"
+    echo "libportability_static.a built"
+  '';
+
+  postInstall = ''
+    mkdir "$out/bin"
+    for i in "$out"/games/*; do
+      echo '#!${runtimeShell}' >> "$out/bin/$(basename "$i")"
+      echo "$i"' "$@"' >> "$out/bin/$(basename "$i")"
+      chmod a+x "$out/bin/$(basename "$i")"
+    done
+  '';
+
+  # RPATH of binary /nix/store/.../lib64/games/speed-dreams-2/drivers/shadow_sc/shadow_sc.so contains a forbidden reference to /build/
+  cmakeFlags = [ "-DCMAKE_SKIP_BUILD_RPATH=ON" ];
+
+  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
+    SDL2 enet libjpeg openscenegraph libvorbis curl ];
+
+  meta = {
+    description = "Car racing game - TORCS fork with more experimental approach";
+    homepage = "https://speed-dreams.sourceforge.net/";
+    license = lib.licenses.gpl2Plus;
+    maintainers = with lib.maintainers; [raskin];
+    platforms = lib.platforms.linux;
+    hydraPlatforms = [];
+  };
+}
diff --git a/nixpkgs/pkgs/games/spring/default.nix b/nixpkgs/pkgs/games/spring/default.nix
new file mode 100644
index 000000000000..0a2eb6cfc911
--- /dev/null
+++ b/nixpkgs/pkgs/games/spring/default.nix
@@ -0,0 +1,92 @@
+{ lib
+, stdenv
+, asciidoc
+, boost
+, cmake
+, curl
+, docbook_xsl
+, docbook_xsl_ns
+, fetchurl
+, freetype
+, glew
+, jdk
+, libdevil
+, libGL
+, libGLU
+, libunwind
+, libvorbis
+, makeWrapper
+, minizip
+, openal
+, p7zip
+, python3
+, SDL2
+, xorg
+, xz
+, zlib
+, withAI ? true # support for AI Interfaces and Skirmish AIs
+}:
+
+stdenv.mkDerivation rec {
+  pname = "spring";
+  version = "106.0";
+
+  src = fetchurl {
+    url = "https://springrts.com/dl/buildbot/default/master/${version}/source/spring_${version}_src.tar.gz";
+    sha256 = "sha256-mSA4ioIv68NMEB72lYnwDb1QOuWr1VHwu4+grAoHlV0=";
+  };
+
+  postPatch = ''
+    patchShebangs .
+
+    substituteInPlace ./rts/build/cmake/FindAsciiDoc.cmake \
+      --replace "PATHS /usr /usr/share /usr/local /usr/local/share" "PATHS ${docbook_xsl}"\
+      --replace "xsl/docbook/manpages" "share/xml/docbook-xsl/manpages"
+
+    # The cmake included module correcly finds nix's glew, however
+    # it has to be the bundled FindGLEW for headless or dedicated builds
+    rm rts/build/cmake/FindGLEW.cmake
+  '';
+
+  cmakeFlags = [
+    "-DCMAKE_BUILD_WITH_INSTALL_RPATH:BOOL=ON"
+    "-DCMAKE_INSTALL_RPATH_USE_LINK_PATH:BOOL=ON"
+    "-DPREFER_STATIC_LIBS:BOOL=OFF"
+  ];
+
+  nativeBuildInputs = [ cmake makeWrapper docbook_xsl docbook_xsl_ns asciidoc ];
+  buildInputs = [
+    boost
+    curl
+    freetype
+    glew
+    libdevil
+    libGL
+    libGLU
+    libunwind
+    libvorbis
+    minizip
+    openal
+    p7zip
+    SDL2
+    xorg.libX11
+    xorg.libXcursor
+    xz
+    zlib
+  ]
+  ++ lib.optionals withAI [ python3 jdk ];
+
+  postInstall = ''
+    wrapProgram "$out/bin/spring" \
+      --prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath [ stdenv.cc.cc ]}"
+  '';
+
+  meta = with lib; {
+    homepage = "https://springrts.com/";
+    description = "A powerful real-time strategy (RTS) game engine";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ qknight domenkozar sorki ];
+    platforms = [ "x86_64-linux" ];
+    broken = true;
+  };
+}
diff --git a/nixpkgs/pkgs/games/spring/fix-certs.patch b/nixpkgs/pkgs/games/spring/fix-certs.patch
new file mode 100644
index 000000000000..b31160a05cc6
--- /dev/null
+++ b/nixpkgs/pkgs/games/spring/fix-certs.patch
@@ -0,0 +1,11 @@
+--- a/src/downloader/lib/src/Downloader/CurlWrapper.cpp
++++ b/src/downloader/lib/src/Downloader/CurlWrapper.cpp
+@@ -108,7 +108,6 @@
+ 		if (res != CURLE_OK) {
+ 			LOG_WARN("Error setting CURLOPT_CAPATH: %d", res);
+ 		}
+-		return;
+ 	}
+ 
+ 	const std::string cafile = GetCAFilePath();
+
diff --git a/nixpkgs/pkgs/games/spring/revert_58b423e.patch b/nixpkgs/pkgs/games/spring/revert_58b423e.patch
new file mode 100644
index 000000000000..79a42cefa5a6
--- /dev/null
+++ b/nixpkgs/pkgs/games/spring/revert_58b423e.patch
@@ -0,0 +1,16 @@
+--- a/src/utils/slpaths.cpp
++++ b/src/utils/slpaths.cpp
+@@ -165,13 +165,10 @@
+ 			usync_paths.push_back(bundle);
+ 		}
+ 		if (!SlPaths::IsPortableMode()) {
+-			/*
+-//FIXME: reenable when #707 is fixed / spring 102.0 is "established"
+ 			LSL::SpringBundle systembundle;
+ 			if (LSL::SpringBundle::LocateSystemInstalledSpring(systembundle)) {
+ 				usync_paths.push_back(systembundle);
+ 			}
+-*/
+ 
+ 			std::vector<std::string> paths;
+ 			PossibleEnginePaths(paths);
diff --git a/nixpkgs/pkgs/games/spring/springlobby.nix b/nixpkgs/pkgs/games/spring/springlobby.nix
new file mode 100644
index 000000000000..ab792cf41a49
--- /dev/null
+++ b/nixpkgs/pkgs/games/spring/springlobby.nix
@@ -0,0 +1,71 @@
+{ lib
+, stdenv
+, fetchurl
+, cmake
+, wxGTK32
+, openal
+, pkg-config
+, curl
+, libtorrent-rasterbar
+, libpng
+, libX11
+, gettext
+, boost
+, libnotify
+, gtk3
+, doxygen
+, spring
+, makeWrapper
+, glib
+, minizip
+, alure
+, pcre
+, jsoncpp
+}:
+
+stdenv.mkDerivation rec {
+  pname = "springlobby";
+  version = "0.273";
+
+  src = fetchurl {
+    url = "https://springlobby.springrts.com/dl/stable/springlobby-${version}.tar.bz2";
+    sha256 = "sha256-XkU6i6ABCgw3H9vJu0xjHRO1BglueYM1LyJxcZdOrDk=";
+  };
+
+  nativeBuildInputs = [ cmake pkg-config gettext doxygen makeWrapper ];
+  buildInputs = [
+    wxGTK32
+    openal
+    curl
+    libtorrent-rasterbar
+    pcre
+    jsoncpp
+    boost
+    libpng
+    libX11
+    libnotify
+    gtk3
+    glib
+    minizip
+    alure
+  ];
+
+  patches = [
+    ./revert_58b423e.patch # Allows springLobby to continue using system installed spring until #707 is fixed
+    ./fix-certs.patch
+  ];
+
+  postInstall = ''
+    wrapProgram $out/bin/springlobby \
+      --prefix PATH : "${spring}/bin" \
+      --set SPRING_BUNDLE_DIR "${spring}/lib"
+  '';
+
+  meta = with lib; {
+    homepage = "https://springlobby.springrts.com";
+    description = "Cross-platform lobby client for the Spring RTS project";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ qknight domenkozar ];
+    platforms = [ "i686-linux" "x86_64-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/srb2/cmake.patch b/nixpkgs/pkgs/games/srb2/cmake.patch
new file mode 100644
index 000000000000..91af532e86fb
--- /dev/null
+++ b/nixpkgs/pkgs/games/srb2/cmake.patch
@@ -0,0 +1,61 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 80a3bdcd6..380a1573a 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -61,7 +61,7 @@ option(
+ 	"Link dependencies using CMake's find_package and do not use internal builds"
+ 	${SRB2_CONFIG_SYSTEM_LIBRARIES_DEFAULT}
+ )
+-option(SRB2_CONFIG_ENABLE_TESTS "Build the test suite" ON)
++option(SRB2_CONFIG_ENABLE_TESTS "Build the test suite" OFF)
+ # This option isn't recommended for distribution builds and probably won't work (yet).
+ cmake_dependent_option(
+ 	SRB2_CONFIG_SHARED_INTERNAL_LIBRARIES
+@@ -80,25 +80,6 @@ option(SRB2_CONFIG_ZDEBUG "Compile with ZDEBUG defined." OFF)
+ option(SRB2_CONFIG_PROFILEMODE "Compile for profiling (GCC only)." OFF)
+ set(SRB2_CONFIG_ASSET_DIRECTORY "" CACHE PATH "Path to directory that contains all asset files for the installer. If set, assets will be part of installation and cpack.")
+ 
+-if(SRB2_CONFIG_ENABLE_TESTS)
+-	# https://github.com/catchorg/Catch2
+-	CPMAddPackage(
+-		NAME Catch2
+-		VERSION 3.4.0
+-		GITHUB_REPOSITORY catchorg/Catch2
+-		OPTIONS
+-			"CATCH_INSTALL_DOCS OFF"
+-	)
+-	list(APPEND CMAKE_MODULE_PATH "${Catch2_SOURCE_DIR}/extras")
+-	include(CTest)
+-	include(Catch)
+-	add_executable(srb2tests)
+-	# To add tests, use target_sources to add individual test files to the target in subdirs.
+-	target_link_libraries(srb2tests PRIVATE Catch2::Catch2 Catch2::Catch2WithMain)
+-	target_compile_features(srb2tests PRIVATE c_std_11 cxx_std_17)
+-	catch_discover_tests(srb2tests)
+-endif()
+-
+ # Enable CCache
+ # (Set USE_CCACHE=ON to use, CCACHE_OPTIONS for options)
+ if("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL Windows)
+@@ -113,12 +94,6 @@ if("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL Windows)
+ 			message(WARNING "USE_CCACHE was set but ccache is not found (set CCACHE_TOOL_PATH)")
+ 		endif()
+ 	endif()
+-else()
+-	CPMAddPackage(
+-		NAME Ccache.cmake
+-		GITHUB_REPOSITORY TheLartians/Ccache.cmake
+-		VERSION 1.2
+-	)
+ endif()
+ 
+ # Dependencies
+@@ -179,7 +154,7 @@ include(GitUtilities)
+ if("${SRB2_SDL2_EXE_NAME}" STREQUAL "")
+ 	# cause a reconfigure if the branch changes
+ 	get_git_dir(SRB2_GIT_DIR)
+-	configure_file("${SRB2_GIT_DIR}/HEAD" HEAD COPYONLY)
++	#configure_file("${SRB2_GIT_DIR}/HEAD" HEAD COPYONLY)
+ 
+ 	git_current_branch(SRB2_GIT_REVISION)
+ 
diff --git a/nixpkgs/pkgs/games/srb2/default.nix b/nixpkgs/pkgs/games/srb2/default.nix
new file mode 100644
index 000000000000..fdb374a91751
--- /dev/null
+++ b/nixpkgs/pkgs/games/srb2/default.nix
@@ -0,0 +1,118 @@
+{ lib
+, stdenv
+, fetchurl
+, fetchFromGitHub
+, cmake
+, curl
+, nasm
+, libopenmpt
+, p7zip
+, game-music-emu
+, libpng
+, SDL2
+, SDL2_mixer
+, zlib
+, unzip
+, makeWrapper
+, makeDesktopItem
+, copyDesktopItems
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "srb2";
+  version = "2.2.13";
+
+  src = fetchFromGitHub {
+    owner = "STJr";
+    repo = "SRB2";
+    rev = "SRB2_release_${finalAttrs.version}";
+    hash = "sha256-OSkkjCz7ZW5+0vh6l7+TpnHLzXmd/5QvTidRQSHJYX8=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    nasm
+    p7zip
+    makeWrapper
+    copyDesktopItems
+  ];
+
+  buildInputs = [
+    curl
+    game-music-emu
+    libpng
+    libopenmpt
+    SDL2
+    SDL2_mixer
+    zlib
+  ];
+
+  assets = stdenv.mkDerivation {
+    pname = "srb2-data";
+    version = finalAttrs.version;
+
+    nativeBuildInputs = [
+      unzip
+    ];
+
+    src = fetchurl {
+      url = "https://github.com/STJr/SRB2/releases/download/SRB2_release_${finalAttrs.version}/SRB2-v${lib.replaceStrings ["."] [""] finalAttrs.version}-Full.zip";
+      hash = "sha256-g7kaNRE1tjcF5J2v+kTnrDzz4zs5f1b/NH67ce2ifUo=";
+    };
+
+    sourceRoot = ".";
+
+    installPhase = ''
+      mkdir -p $out/share/srb2
+      cp -r *pk3 *dta *dat models/ $out/share/srb2/
+    '';
+  };
+
+  cmakeFlags = [
+    "-DSRB2_ASSET_DIRECTORY=${finalAttrs.assets}/share/srb2"
+    "-DGME_INCLUDE_DIR=${game-music-emu}/include"
+    "-DOPENMPT_INCLUDE_DIR=${libopenmpt.dev}/include"
+    "-DSDL2_MIXER_INCLUDE_DIR=${lib.getDev SDL2_mixer}/include/SDL2"
+    "-DSDL2_INCLUDE_DIR=${lib.getDev SDL2.dev}/include/SDL2"
+  ];
+
+  patches = [
+    # Make the build work without internet connectivity
+    # See: https://build.opensuse.org/request/show/1109889
+    ./cmake.patch
+    ./thirdparty.patch
+  ];
+
+  desktopItems = [
+    (makeDesktopItem rec {
+      name = "Sonic Robo Blast 2";
+      exec = finalAttrs.pname;
+      icon = finalAttrs.pname;
+      comment = finalAttrs.meta.description;
+      desktopName = name;
+      genericName = name;
+      categories = [ "Game" ];
+    })
+  ];
+
+  installPhase = ''
+    mkdir -p $out/bin $out/share/applications $out/share/pixmaps $out/share/icons
+
+    copyDesktopItems
+
+    cp ../srb2.png $out/share/pixmaps/.
+    cp ../srb2.png $out/share/icons/.
+
+    cp bin/lsdlsrb2 $out/bin/srb2
+    wrapProgram $out/bin/srb2 --set SRB2WADDIR "${finalAttrs.assets}/share/srb2"
+  '';
+
+  meta = with lib; {
+    description = "Sonic Robo Blast 2 is a 3D Sonic the Hedgehog fangame based on a modified version of Doom Legacy";
+    homepage = "https://www.srb2.org/";
+    platforms = platforms.linux;
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ zeratax donovanglover ];
+    mainProgram = "srb2";
+  };
+})
diff --git a/nixpkgs/pkgs/games/srb2/thirdparty.patch b/nixpkgs/pkgs/games/srb2/thirdparty.patch
new file mode 100644
index 000000000000..bb550290d85d
--- /dev/null
+++ b/nixpkgs/pkgs/games/srb2/thirdparty.patch
@@ -0,0 +1,12 @@
+diff --git a/thirdparty/CMakeLists.txt b/thirdparty/CMakeLists.txt
+index f33b3bf3f..1214f179c 100644
+--- a/thirdparty/CMakeLists.txt
++++ b/thirdparty/CMakeLists.txt
+@@ -16,6 +16,5 @@ if(NOT "${SRB2_CONFIG_SYSTEM_LIBRARIES}")
+ 	include("cpm-png.cmake")
+ 	include("cpm-curl.cmake")
+ 	include("cpm-openmpt.cmake")
++	include("cpm-libgme.cmake")
+ endif()
+-
+-include("cpm-libgme.cmake")
diff --git a/nixpkgs/pkgs/games/srb2kart/default.nix b/nixpkgs/pkgs/games/srb2kart/default.nix
new file mode 100644
index 000000000000..441ffd284a0d
--- /dev/null
+++ b/nixpkgs/pkgs/games/srb2kart/default.nix
@@ -0,0 +1,87 @@
+{ lib
+, stdenv
+, fetchurl
+, fetchFromGitHub
+, substituteAll
+, cmake
+, curl
+, nasm
+, unzip
+, game-music-emu
+, libpng
+, SDL2
+, SDL2_mixer
+, zlib
+}:
+
+let
+
+  release_tag = "v1.6";
+
+  assets = fetchurl {
+    url = "https://github.com/STJr/Kart-Public/releases/download/${release_tag}/AssetsLinuxOnly.zip";
+    sha256 = "sha256-ejhPuZ1C8M9B0S4+2HN1T5pbormT1eVL3nlivqOszdE=";
+  };
+
+in stdenv.mkDerivation {
+  pname = "srb2kart";
+  version = "1.6.0";
+
+  src = fetchFromGitHub {
+    owner = "STJr";
+    repo = "Kart-Public";
+    rev = release_tag;
+    sha256 = "sha256-5sIHdeenWZjczyYM2q+F8Y1SyLqL+y77yxYDUM3dVA0=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    nasm
+    unzip
+  ];
+
+  buildInputs = [
+    curl
+    game-music-emu
+    libpng
+    SDL2
+    SDL2_mixer
+    zlib
+  ];
+
+  cmakeFlags = [
+    "-DGME_INCLUDE_DIR=${game-music-emu}/include"
+    "-DSDL2_MIXER_INCLUDE_DIR=${lib.getDev SDL2_mixer}/include/SDL2"
+    "-DSDL2_INCLUDE_DIR=${lib.getDev SDL2}/include/SDL2"
+  ];
+
+  patches = [
+    ./wadlocation.patch
+  ];
+
+  postPatch = ''
+    substituteInPlace src/sdl/i_system.c \
+        --replace '@wadlocation@' $out
+  '';
+
+  preConfigure = ''
+    mkdir assets/installer
+    pushd assets/installer
+    unzip ${assets} "*.kart" srb2.srb
+    popd
+  '';
+
+  postInstall = ''
+    mkdir -p $out/bin $out/share/games/SRB2Kart
+    mv $out/srb2kart* $out/bin/
+    mv $out/*.kart $out/share/games/SRB2Kart
+  '';
+
+  meta = with lib; {
+    description = "SRB2Kart is a classic styled kart racer";
+    homepage = "https://mb.srb2.org/threads/srb2kart.25868/";
+    platforms = platforms.linux;
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ viric ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/srb2kart/wadlocation.patch b/nixpkgs/pkgs/games/srb2kart/wadlocation.patch
new file mode 100644
index 000000000000..1923cda041d2
--- /dev/null
+++ b/nixpkgs/pkgs/games/srb2kart/wadlocation.patch
@@ -0,0 +1,61 @@
+diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c
+index 51f708d0..c4d971f7 100644
+--- a/src/sdl/i_system.c
++++ b/src/sdl/i_system.c
+@@ -139,7 +139,7 @@ typedef LPVOID (WINAPI *p_MapViewOfFile) (HANDLE, DWORD, DWORD, DWORD, SIZE_T);
+ 
+ // Locations for searching the srb2.srb
+ #if defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON)
+-#define DEFAULTWADLOCATION1 "/usr/local/share/games/SRB2Kart"
++#define DEFAULTWADLOCATION1 "@wadlocation@"
+ #define DEFAULTWADLOCATION2 "/usr/local/games/SRB2Kart"
+ #define DEFAULTWADLOCATION3 "/usr/share/games/SRB2Kart"
+ #define DEFAULTWADLOCATION4 "/usr/games/SRB2Kart"
+@@ -3646,47 +3646,6 @@ static const char *locateWad(void)
+ 	if (((envstr = I_GetEnv("SRB2WADDIR")) != NULL) && isWadPathOk(envstr))
+ 		return envstr;
+ 
+-#ifndef NOCWD
+-	I_OutputMsg(",.");
+-	// examine current dir
+-	strcpy(returnWadPath, ".");
+-	if (isWadPathOk(returnWadPath))
+-		return NULL;
+-#endif
+-
+-
+-#ifdef DEFAULTDIR
+-	I_OutputMsg(",HOME/" DEFAULTDIR);
+-	// examine user jart directory
+-	if ((envstr = I_GetEnv("HOME")) != NULL)
+-	{
+-		sprintf(returnWadPath, "%s" PATHSEP DEFAULTDIR, envstr);
+-		if (isWadPathOk(returnWadPath))
+-			return returnWadPath;
+-	}
+-#endif
+-
+-
+-#ifdef CMAKECONFIG
+-#ifndef NDEBUG
+-	I_OutputMsg(","CMAKE_ASSETS_DIR);
+-	strcpy(returnWadPath, CMAKE_ASSETS_DIR);
+-	if (isWadPathOk(returnWadPath))
+-	{
+-		return returnWadPath;
+-	}
+-#endif
+-#endif
+-
+-#ifdef __APPLE__
+-	OSX_GetResourcesPath(returnWadPath);
+-	I_OutputMsg(",%s", returnWadPath);
+-	if (isWadPathOk(returnWadPath))
+-	{
+-		return returnWadPath;
+-	}
+-#endif
+-
+ 	// examine default dirs
+ #ifdef DEFAULTWADLOCATION1
+ 	I_OutputMsg(","DEFAULTWADLOCATION1);
diff --git a/nixpkgs/pkgs/games/stardust/default.nix b/nixpkgs/pkgs/games/stardust/default.nix
new file mode 100644
index 000000000000..2555950506ab
--- /dev/null
+++ b/nixpkgs/pkgs/games/stardust/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, fetchurl, zlib, libtiff, libxml2, SDL, xorgproto, libX11
+, libXi, libXmu, libXext, libGLU, libGL }:
+
+stdenv.mkDerivation rec {
+  pname = "stardust";
+  version = "0.1.13";
+
+  src = fetchurl {
+    url = "http://iwar.free.fr/IMG/gz/${pname}-${version}.tar.gz";
+    sha256 = "19rs9lz5y5g2yiq1cw0j05b11digw40gar6rw8iqc7bk3s8355xp";
+  };
+
+  buildInputs = [
+    zlib libtiff libxml2 SDL xorgproto libX11 libXi
+    libXmu libXext libGLU libGL
+  ];
+
+  installFlags = [ "bindir=\${out}/bin" ];
+
+  hardeningDisable = [ "format" ];
+
+  postConfigure = ''
+    substituteInPlace config.h \
+      --replace '#define PACKAGE ""' '#define PACKAGE "stardust"'
+  '';
+
+  meta = with lib; {
+    description = "Space flight simulator";
+    maintainers = [ maintainers.raskin ];
+    platforms = platforms.linux;
+    license = licenses.gpl2Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/games/starsector/default.nix b/nixpkgs/pkgs/games/starsector/default.nix
new file mode 100644
index 000000000000..2d70022049e1
--- /dev/null
+++ b/nixpkgs/pkgs/games/starsector/default.nix
@@ -0,0 +1,89 @@
+{ lib
+, fetchzip
+, libXxf86vm
+, libGL
+, makeWrapper
+, openal
+, openjdk
+, stdenv
+, xorg
+, copyDesktopItems
+, makeDesktopItem
+, writeScript
+}:
+
+stdenv.mkDerivation rec {
+  pname = "starsector";
+  version = "0.96a-RC10";
+
+  src = fetchzip {
+    url = "https://f005.backblazeb2.com/file/fractalsoftworks/release/starsector_linux-${version}.zip";
+    sha256 = "sha256-RBSnms+QlKgTOhm3t2hDfv7OcMrQCk1rfkz9GaM74WM=";
+  };
+
+  nativeBuildInputs = [ copyDesktopItems makeWrapper ];
+  buildInputs = [ xorg.libXxf86vm openal libGL ];
+
+  dontBuild = true;
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "starsector";
+      exec = "starsector";
+      icon = "starsector";
+      comment = meta.description;
+      genericName = "starsector";
+      desktopName = "Starsector";
+      categories = [ "Game" ];
+    })
+  ];
+
+  # need to cd into $out in order for classpath to pick up correct jar files
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/bin $out/share/starsector
+    rm -r jre_linux # remove bundled jre7
+    rm starfarer.api.zip
+    cp -r ./* $out/share/starsector
+
+    mkdir -p $out/share/icons/hicolor/64x64/apps
+    ln -s $out/graphics/ui/s_icon64.png $out/share/icons/hicolor/64x64/apps/starsector.png
+
+    wrapProgram $out/share/starsector/starsector.sh \
+      --prefix PATH : ${lib.makeBinPath [ openjdk ]} \
+      --prefix LD_LIBRARY_PATH : ${lib.makeLibraryPath buildInputs} \
+      --run 'mkdir -p ''${XDG_DATA_HOME:-~/.local/share}/starsector' \
+      --chdir "$out/share/starsector"
+    ln -s $out/share/starsector/starsector.sh $out/bin/starsector
+
+    runHook postInstall
+  '';
+
+  # it tries to run everything with relative paths, which makes it CWD dependent
+  # also point mod, screenshot, and save directory to $XDG_DATA_HOME
+  # additionally, add some GC options to improve performance of the game
+  postPatch = ''
+    substituteInPlace starsector.sh \
+      --replace "./jre_linux/bin/java" "${openjdk}/bin/java" \
+      --replace "./native/linux" "$out/share/starsector/native/linux" \
+      --replace "=." "=\''${XDG_DATA_HOME:-\$HOME/.local/share}/starsector" \
+      --replace "-XX:+CompilerThreadHintNoPreempt" "-XX:+UnlockDiagnosticVMOptions -XX:-BytecodeVerificationRemote -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSConcurrentMTEnabled -XX:+DisableExplicitGC"
+  '';
+
+  meta = with lib; {
+    description = "Open-world single-player space-combat, roleplaying, exploration, and economic game";
+    homepage = "https://fractalsoftworks.com";
+    sourceProvenance = with sourceTypes; [ binaryBytecode ];
+    license = licenses.unfree;
+    maintainers = with maintainers; [ bbigras ];
+  };
+
+  passthru.updateScript = writeScript "starsector-update-script" ''
+    #!/usr/bin/env nix-shell
+    #!nix-shell -i bash -p curl gnugrep common-updater-scripts
+    set -eou pipefail;
+    version=$(curl -s https://fractalsoftworks.com/preorder/ | grep -oP "https://f005.backblazeb2.com/file/fractalsoftworks/release/starsector_linux-\K.*?(?=\.zip)" | head -1)
+    update-source-version ${pname} "$version" --file=./pkgs/games/starsector/default.nix
+  '';
+}
diff --git a/nixpkgs/pkgs/games/steam-tui/default.nix b/nixpkgs/pkgs/games/steam-tui/default.nix
new file mode 100644
index 000000000000..769553a69422
--- /dev/null
+++ b/nixpkgs/pkgs/games/steam-tui/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, rustPlatform
+, steamcmd
+, fetchFromGitHub
+, steam-run
+, 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 ]
+    ++ 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}/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; [ lom ];
+    # steam only supports that platform
+    platforms = [ "x86_64-linux" ];
+    mainProgram = "steam-tui";
+  };
+}
diff --git a/nixpkgs/pkgs/games/steam/build-wrapped.sh b/nixpkgs/pkgs/games/steam/build-wrapped.sh
new file mode 100644
index 000000000000..ddf974671a03
--- /dev/null
+++ b/nixpkgs/pkgs/games/steam/build-wrapped.sh
@@ -0,0 +1,47 @@
+source $stdenv/setup
+
+outp=$out/lib/steam-runtime
+
+buildDir() {
+  paths="$1"
+  pkgs="$2"
+
+  for pkg in $pkgs; do
+    echo "adding package $pkg"
+    for path in $paths; do
+      if [ -d $pkg/$path ]; then
+        cd $pkg/$path
+        for file in *; do
+          found=""
+          for i in $paths; do
+            if [ -e "$outp/$i/$file" ]; then
+              found=1
+              break
+            fi
+          done
+          if [ -z "$found" ]; then
+            mkdir -p $outp/$path
+            ln -s "$pkg/$path/$file" $outp/$path
+            sovers=$(echo $file | perl -ne 'print if s/.*?\.so\.(.*)/\1/')
+            if [ ! -z "$sovers" ]; then
+              fname=''${file%.''${sovers}}
+              for ver in ''${sovers//./ }; do
+                found=""
+                for i in $paths; do
+                  if [ -e "$outp/$i/$fname" ]; then
+                    found=1
+                    break
+                  fi
+                done
+                [ -n "$found" ] || ln -s "$pkg/$path/$file" "$outp/$path/$fname"
+                fname="$fname.$ver"
+              done
+            fi
+          fi
+        done
+      fi
+    done
+  done
+}
+
+eval "$installPhase"
diff --git a/nixpkgs/pkgs/games/steam/default.nix b/nixpkgs/pkgs/games/steam/default.nix
new file mode 100644
index 000000000000..651c20491844
--- /dev/null
+++ b/nixpkgs/pkgs/games/steam/default.nix
@@ -0,0 +1,38 @@
+{ makeScopeWithSplicing', generateSplicesForMkScope
+, stdenv, buildFHSEnv, pkgsi686Linux, glxinfo
+}:
+
+let
+  steamPackagesFun = self: let
+    inherit (self) callPackage;
+  in rec {
+    steamArch = if stdenv.hostPlatform.system == "x86_64-linux" then "amd64"
+                else if stdenv.hostPlatform.system == "i686-linux" then "i386"
+                else throw "Unsupported platform: ${stdenv.hostPlatform.system}";
+
+    steam-runtime = callPackage ./runtime.nix { };
+    steam-runtime-wrapped = callPackage ./runtime-wrapped.nix { };
+    steam = callPackage ./steam.nix { };
+    steam-fhsenv = callPackage ./fhsenv.nix {
+      glxinfo-i686 =
+        if self.steamArch == "amd64"
+        then pkgsi686Linux.glxinfo
+        else glxinfo;
+      steam-runtime-wrapped-i686 =
+        if self.steamArch == "amd64"
+        then pkgsi686Linux.steamPackages.steam-runtime-wrapped
+        else null;
+      inherit buildFHSEnv;
+    };
+    steam-fhsenv-small = steam-fhsenv.override { withGameSpecificLibraries = false; };
+
+    # This has to exist so Hydra tries to build all of Steam's dependencies.
+    # FIXME: Maybe we should expose it as something more generic?
+    steam-fhsenv-without-steam = steam-fhsenv.override { steam = null; };
+
+    steamcmd = callPackage ./steamcmd.nix { };
+  };
+in makeScopeWithSplicing' {
+  otherSplices = generateSplicesForMkScope "steamPackages";
+  f = steamPackagesFun;
+}
diff --git a/nixpkgs/pkgs/games/steam/fhsenv.nix b/nixpkgs/pkgs/games/steam/fhsenv.nix
new file mode 100644
index 000000000000..d5b266cece37
--- /dev/null
+++ b/nixpkgs/pkgs/games/steam/fhsenv.nix
@@ -0,0 +1,341 @@
+{ lib, stdenv, writeShellScript, buildFHSEnv, steam, glxinfo-i686
+, steam-runtime-wrapped, steam-runtime-wrapped-i686 ? null
+, extraPkgs ? pkgs: [ ] # extra packages to add to targetPkgs
+, extraLibraries ? pkgs: [ ] # extra packages to add to multiPkgs
+, extraProfile ? "" # string to append to profile
+, extraPreBwrapCmds ? "" # extra commands to run before calling bubblewrap (real default is at usage site)
+, extraBwrapArgs ? [ ] # extra arguments to pass to bubblewrap (real default is at usage site)
+, extraArgs ? "" # arguments to always pass to steam
+, extraEnv ? { } # Environment variables to pass to Steam
+
+# steamwebhelper deletes unrelated electron programs' singleton cookies from /tmp on startup:
+# https://github.com/ValveSoftware/steam-for-linux/issues/9121
+, privateTmp ? true # Whether to separate steam's /tmp from the host system
+
+, withGameSpecificLibraries ? true # include game specific libraries
+}@args:
+
+let
+  commonTargetPkgs = pkgs: with pkgs; [
+    # Needed for operating system detection until
+    # https://github.com/ValveSoftware/steam-for-linux/issues/5909 is resolved
+    lsb-release
+    # Errors in output without those
+    pciutils
+    # run.sh wants ldconfig
+    glibc.bin
+    # Games' dependencies
+    xorg.xrandr
+    which
+    # Needed by gdialog, including in the steam-runtime
+    perl
+    # Open URLs
+    xdg-utils
+    iana-etc
+    # Steam Play / Proton
+    python3
+    # Steam VR
+    procps
+    usbutils
+
+    # It tries to execute xdg-user-dir and spams the log with command not founds
+    xdg-user-dirs
+
+    # electron based launchers need newer versions of these libraries than what runtime provides
+    mesa
+    sqlite
+  ] ++ extraPkgs pkgs;
+
+  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=${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
+  '';
+
+  envScript = ''
+    # prevents various error messages
+    unset GIO_EXTRA_MODULES
+  '' + lib.toShellVars extraEnv;
+
+in buildFHSEnv rec {
+  name = "steam";
+
+  # Steam still needs 32bit and various native games do too
+  multiArch = true;
+
+  targetPkgs = pkgs: with pkgs; [
+    steam
+    # License agreement
+    gnome.zenity
+  ] ++ commonTargetPkgs pkgs;
+
+  multiPkgs = pkgs: with pkgs; [
+    # These are required by steam with proper errors
+    xorg.libXcomposite
+    xorg.libXtst
+    xorg.libXrandr
+    xorg.libXext
+    xorg.libX11
+    xorg.libXfixes
+    libGL
+    libva
+    pipewire
+
+    # steamwebhelper
+    harfbuzz
+    libthai
+    pango
+
+    lsof # friends options won't display "Launch Game" without it
+    file # called by steam's setup.sh
+
+    # dependencies for mesa drivers, needed inside pressure-vessel
+    mesa.llvmPackages.llvm.lib
+    vulkan-loader
+    expat
+    wayland
+    xorg.libxcb
+    xorg.libXdamage
+    xorg.libxshmfence
+    xorg.libXxf86vm
+    libelf
+    (lib.getLib elfutils)
+
+    # Without these it silently fails
+    xorg.libXinerama
+    xorg.libXcursor
+    xorg.libXrender
+    xorg.libXScrnSaver
+    xorg.libXi
+    xorg.libSM
+    xorg.libICE
+    gnome2.GConf
+    curlWithGnuTls
+    nspr
+    nss
+    cups
+    libcap
+    SDL2
+    libusb1
+    dbus-glib
+    gsettings-desktop-schemas
+    ffmpeg
+    libudev0-shim
+
+    # Verified games requirements
+    fontconfig
+    freetype
+    xorg.libXt
+    xorg.libXmu
+    libogg
+    libvorbis
+    SDL
+    SDL2_image
+    glew110
+    libdrm
+    libidn
+    tbb
+    zlib
+
+    # SteamVR
+    udev
+    dbus
+
+    # Other things from runtime
+    glib
+    gtk2
+    bzip2
+    flac
+    freeglut
+    libjpeg
+    libpng
+    libpng12
+    libsamplerate
+    libmikmod
+    libtheora
+    libtiff
+    pixman
+    speex
+    SDL_image
+    SDL_ttf
+    SDL_mixer
+    SDL2_ttf
+    SDL2_mixer
+    libappindicator-gtk2
+    libdbusmenu-gtk2
+    libindicator-gtk2
+    libcaca
+    libcanberra
+    libgcrypt
+    libunwind
+    libvpx
+    librsvg
+    xorg.libXft
+    libvdpau
+
+    # required by coreutils stuff to run correctly
+    # Steam ends up with LD_LIBRARY_PATH=<bunch of runtime stuff>:/usr/lib:<etc>
+    # which overrides DT_RUNPATH in our binaries, so it tries to dynload the
+    # very old versions of stuff from the runtime.
+    # FIXME: how do we even fix this correctly
+    attr
+  ] ++ lib.optionals withGameSpecificLibraries [
+    # 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
+    libvorbis # Dead Cells
+    libxcrypt # Alien Isolation, XCOM 2, Company of Heroes 2
+    mono
+    ncurses # Crusader Kings III
+    openssl
+    xorg.xkeyboardconfig
+    xorg.libpciaccess
+    xorg.libXScrnSaver # Dead Cells
+    icu # dotnet runtime, e.g. Stardew Valley
+
+    # screeps dependencies
+    gtk3
+    zlib
+    atk
+    cairo
+    freetype
+    gdk-pixbuf
+    fontconfig
+
+    # Prison Architect
+    libGLU
+    libuuid
+    libbsd
+    alsa-lib
+
+    # Loop Hero
+    # FIXME: Also requires openssl_1_1, which is EOL. Either find an alternative solution, or remove these dependencies (if not needed by other games)
+    libidn2
+    libpsl
+    nghttp2.lib
+    rtmpdump
+  ]
+  # This needs to come from pkgs as the passed-in steam-runtime-wrapped may not be the same architecture
+  ++ pkgs.steamPackages.steam-runtime-wrapped.overridePkgs
+  ++ extraLibraries pkgs;
+
+  extraInstallCommands = lib.optionalString (steam != null) ''
+    mkdir -p $out/share/applications
+    ln -s ${steam}/share/icons $out/share
+    ln -s ${steam}/share/pixmaps $out/share
+    ln -s ${steam}/share/applications/steam.desktop $out/share/applications/steam.desktop
+  '';
+
+  profile = ''
+    # Workaround for issue #44254 (Steam cannot connect to friends network)
+    # https://github.com/NixOS/nixpkgs/issues/44254
+    if [ -z ''${TZ+x} ]; then
+      new_TZ="$(readlink -f /etc/localtime | grep -P -o '(?<=/zoneinfo/).*$')"
+      if [ $? -eq 0 ]; then
+        export TZ="$new_TZ"
+      fi
+    fi
+
+    # udev event notifications don't work reliably inside containers.
+    # SDL2 already tries to automatically detect flatpak and pressure-vessel
+    # and falls back to inotify-based discovery [1]. We make SDL2 do the
+    # same by telling it explicitly.
+    #
+    # [1] <https://github.com/libsdl-org/SDL/commit/8e2746cfb6e1f1a1da5088241a1440fd2535e321>
+    export SDL_JOYSTICK_DISABLE_UDEV=1
+  '' + extraProfile;
+
+  runScript = writeShellScript "steam-wrapper.sh" ''
+    if [ -f /host/etc/NIXOS ]; then   # Check only useful on NixOS
+      ${glxinfo-i686}/bin/glxinfo >/dev/null 2>&1
+      # If there was an error running glxinfo, we know something is wrong with the configuration
+      if [ $? -ne 0 ]; then
+        cat <<EOF > /dev/stderr
+    **
+    WARNING: Steam is not set up. Add the following options to /etc/nixos/configuration.nix
+    and then run \`sudo nixos-rebuild switch\`:
+    {
+      hardware.opengl.driSupport32Bit = true;
+      hardware.pulseaudio.support32Bit = true;
+    }
+    **
+    EOF
+      fi
+    fi
+
+    ${exportLDPath}
+    ${fixBootstrap}
+
+    set -o allexport # Export the following env vars
+    ${envScript}
+    exec steam ${extraArgs} "$@"
+  '';
+
+  inherit privateTmp;
+
+  extraPreBwrapCmds = ''
+    install -m 1777 -d /tmp/dumps
+  '' + args.extraPreBwrapCmds or "";
+
+  extraBwrapArgs = [
+    "--bind-try /tmp/dumps /tmp/dumps"
+  ] ++ args.extraBwrapArgs or [];
+
+  meta =
+    if steam != null
+    then
+      steam.meta // lib.optionalAttrs (!withGameSpecificLibraries) {
+        description = steam.meta.description + " (without game specific libraries)";
+      }
+    else {
+      description = "Steam dependencies (dummy package, do not use)";
+    };
+
+  passthru.run = buildFHSEnv {
+    name = "steam-run";
+
+    targetPkgs = commonTargetPkgs;
+    inherit multiArch multiPkgs profile extraInstallCommands extraBwrapArgs;
+
+    runScript = writeShellScript "steam-run" ''
+      run="$1"
+      if [ "$run" = "" ]; then
+        echo "Usage: steam-run command-to-run args..." >&2
+        exit 1
+      fi
+      shift
+
+      ${exportLDPath}
+      ${fixBootstrap}
+
+      set -o allexport # Export the following env vars
+      ${envScript}
+      exec -- "$run" "$@"
+    '';
+
+    meta = (steam.meta or {}) // {
+      description = "Run commands in the same FHS environment that is used for Steam";
+      mainProgram = "steam-run";
+      name = "steam-run";
+    };
+  };
+}
diff --git a/nixpkgs/pkgs/games/steam/runtime-wrapped.nix b/nixpkgs/pkgs/games/steam/runtime-wrapped.nix
new file mode 100644
index 000000000000..648e012d3fe5
--- /dev/null
+++ b/nixpkgs/pkgs/games/steam/runtime-wrapped.nix
@@ -0,0 +1,45 @@
+{ stdenv, steamArch, lib, perl, pkgs, steam-runtime
+, runtimeOnly ? false
+}:
+
+let
+  overridePkgs = lib.optionals (!runtimeOnly) (with pkgs; [
+    libgpg-error
+    libpulseaudio
+    alsa-lib
+    openalSoft
+    libva1
+    libvdpau
+    vulkan-loader
+    gcc.cc.lib
+    nss
+    nspr
+    xorg.libxcb
+  ]);
+
+  allPkgs = overridePkgs ++ [ steam-runtime ];
+
+  gnuArch = if steamArch == "amd64" then "x86_64-linux-gnu"
+            else if steamArch == "i386" then "i386-linux-gnu"
+            else throw "Unsupported architecture";
+
+  libs = [ "lib/${gnuArch}" "lib" "usr/lib/${gnuArch}" "usr/lib" ];
+  bins = [ "bin" "usr/bin" ];
+
+in stdenv.mkDerivation {
+  name = "steam-runtime-wrapped";
+
+  nativeBuildInputs = [ perl ];
+
+  builder = ./build-wrapped.sh;
+
+  passthru = {
+    inherit gnuArch libs bins overridePkgs;
+    arch = steamArch;
+  };
+
+  installPhase = ''
+    buildDir "${toString libs}" "${toString (map lib.getLib allPkgs)}"
+    buildDir "${toString bins}" "${toString (map lib.getBin allPkgs)}"
+  '';
+}
diff --git a/nixpkgs/pkgs/games/steam/runtime.nix b/nixpkgs/pkgs/games/steam/runtime.nix
new file mode 100644
index 000000000000..593d78afe0cc
--- /dev/null
+++ b/nixpkgs/pkgs/games/steam/runtime.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv, fetchurl
+
+# for update script
+, writeShellScript, curl, nix-update
+}:
+
+stdenv.mkDerivation rec {
+
+  pname = "steam-runtime";
+  # from https://repo.steampowered.com/steamrt-images-scout/snapshots/latest-steam-client-general-availability/VERSION.txt
+  version = "0.20220601.1";
+
+  src = fetchurl {
+    url = "https://repo.steampowered.com/steamrt-images-scout/snapshots/${version}/steam-runtime.tar.xz";
+    sha256 = "sha256-uYauNtbUlvrnATGks7hWy1zt4Y7AEeADrCr1eVylPbY=";
+    name = "scout-runtime-${version}.tar.gz";
+  };
+
+  buildCommand = ''
+    mkdir -p $out
+    tar -C $out --strip=1 -x -f $src
+  '';
+
+  passthru = {
+    updateScript = writeShellScript "update.sh" ''
+      version=$(${curl}/bin/curl https://repo.steampowered.com/steamrt-images-scout/snapshots/latest-steam-client-general-availability/VERSION.txt)
+      ${lib.getExe 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
+    maintainers = with maintainers; [ hrdinka abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/steam/steam.nix b/nixpkgs/pkgs/games/steam/steam.nix
new file mode 100644
index 000000000000..2687ee7febdd
--- /dev/null
+++ b/nixpkgs/pkgs/games/steam/steam.nix
@@ -0,0 +1,54 @@
+{ lib, stdenv, fetchurl, runtimeShell, traceDeps ? false, bash }:
+
+let
+  traceLog = "/tmp/steam-trace-dependencies.log";
+  version = "1.0.0.74";
+
+in stdenv.mkDerivation {
+  pname = "steam-original";
+  inherit version;
+
+  src = fetchurl {
+    # use archive url so the tarball doesn't 404 on a new release
+    url = "https://repo.steampowered.com/steam/archive/stable/steam_${version}.tar.gz";
+    sha256 = "sha256-sO07g3j1Qejato2LWJ2FrW3AzfMCcBz46HEw7aKxojQ=";
+  };
+
+  makeFlags = [ "DESTDIR=$(out)" "PREFIX=" ];
+
+  postInstall = ''
+    rm $out/bin/steamdeps
+    ${lib.optionalString traceDeps ''
+      cat > $out/bin/steamdeps <<EOF
+      #!${runtimeShell}
+      echo \$1 >> ${traceLog}
+      cat \$1 >> ${traceLog}
+      echo >> ${traceLog}
+      EOF
+      chmod +x $out/bin/steamdeps
+    ''}
+
+    # 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 lib; {
+    description = "A digital distribution platform";
+    longDescription = ''
+      Steam is a video game digital distribution service and storefront from Valve.
+
+      To install on NixOS, please use the option `programs.steam.enable = true`.
+    '';
+    homepage = "https://store.steampowered.com/";
+    license = licenses.unfreeRedistributable;
+    maintainers = with maintainers; [ jagajaga jonringer ];
+    mainProgram = "steam";
+  };
+}
diff --git a/nixpkgs/pkgs/games/steam/steamcmd.nix b/nixpkgs/pkgs/games/steam/steamcmd.nix
new file mode 100644
index 000000000000..1c834f1c2ea6
--- /dev/null
+++ b/nixpkgs/pkgs/games/steam/steamcmd.nix
@@ -0,0 +1,46 @@
+{ lib, stdenv, fetchurl, steam-run, bash, coreutils
+, steamRoot ? "~/.local/share/Steam"
+}:
+
+stdenv.mkDerivation {
+  pname = "steamcmd";
+  version = "20180104"; # According to steamcmd_linux.tar.gz mtime
+
+  src = fetchurl {
+    url = "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz";
+    sha256 = "0z0y0zqvhydmfc9y9vg5am0vz7m3gbj4l2dwlrfz936hpx301gyf";
+  };
+
+  # The source tarball does not have a single top-level directory.
+  preUnpack = ''
+    mkdir $name
+    cd $name
+    sourceRoot=.
+  '';
+
+  buildInputs = [ bash steam-run ];
+
+  dontBuild = true;
+
+  installPhase = ''
+    mkdir -p $out/share/steamcmd/linux32
+    install -Dm755 steamcmd.sh $out/share/steamcmd/steamcmd.sh
+    install -Dm755 linux32/* $out/share/steamcmd/linux32
+
+    mkdir -p $out/bin
+    substitute ${./steamcmd.sh} $out/bin/steamcmd \
+      --subst-var out \
+      --subst-var-by coreutils ${coreutils} \
+      --subst-var-by steamRoot "${steamRoot}" \
+      --subst-var-by steamRun ${steam-run}
+    chmod 0755 $out/bin/steamcmd
+  '';
+
+  meta = with lib; {
+    description = "Steam command-line tools";
+    homepage = "https://developer.valvesoftware.com/wiki/SteamCMD";
+    platforms = platforms.linux;
+    license = licenses.unfreeRedistributable;
+    maintainers = with maintainers; [ tadfisher ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/steam/steamcmd.sh b/nixpkgs/pkgs/games/steam/steamcmd.sh
new file mode 100644
index 000000000000..588badb41a1a
--- /dev/null
+++ b/nixpkgs/pkgs/games/steam/steamcmd.sh
@@ -0,0 +1,27 @@
+#!@bash@/bin/bash -e
+
+# Always run steamcmd in the user's Steam root.
+STEAMROOT=@steamRoot@
+
+# Add coreutils to PATH for mkdir, ln and cp used below
+PATH=$PATH${PATH:+:}@coreutils@/bin
+
+# Create a facsimile Steam root if it doesn't exist.
+if [ ! -e "$STEAMROOT" ]; then
+  mkdir -p "$STEAMROOT"/{appcache,config,logs,Steamapps/common}
+  mkdir -p ~/.steam
+  ln -sf "$STEAMROOT" ~/.steam/root
+  ln -sf "$STEAMROOT" ~/.steam/steam
+fi
+
+# Copy the system steamcmd install to the Steam root. If we don't do
+# this, steamcmd assumes the path to `steamcmd` is the Steam root.
+# Note that symlinks don't work here.
+if [ ! -e "$STEAMROOT/steamcmd.sh" ]; then
+  mkdir -p "$STEAMROOT/linux32"
+  # steamcmd.sh will replace these on first use
+  cp @out@/share/steamcmd/steamcmd.sh "$STEAMROOT/."
+  cp @out@/share/steamcmd/linux32/* "$STEAMROOT/linux32/."
+fi
+
+@steamRun@/bin/steam-run "$STEAMROOT/steamcmd.sh" "$@"
diff --git a/nixpkgs/pkgs/games/stepmania/default.nix b/nixpkgs/pkgs/games/stepmania/default.nix
new file mode 100644
index 000000000000..bfd871a2a1c1
--- /dev/null
+++ b/nixpkgs/pkgs/games/stepmania/default.nix
@@ -0,0 +1,86 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, fetchpatch
+, cmake
+, nasm
+, alsa-lib
+, ffmpeg_6
+, glew
+, glib
+, gtk2
+, libmad
+, libogg
+, libpulseaudio
+, libvorbis
+, udev
+, xorg
+}:
+
+stdenv.mkDerivation {
+  pname = "stepmania";
+  version = "5.1.0-b2-unstable-2022-11-14";
+
+  src = fetchFromGitHub {
+    owner = "stepmania";
+    repo  = "stepmania";
+    rev   = "d55acb1ba26f1c5b5e3048d6d6c0bd116625216f";
+    hash = "sha256-49H2Q61R4l/G0fWsjCjiAUXeWwG3lcsDpV5XvR3l3QE=";
+  };
+
+  patches = [
+    # https://github.com/stepmania/stepmania/pull/2247
+    (fetchpatch {
+      name = "fix-building-with-ffmpeg6.patch";
+      url = "https://github.com/stepmania/stepmania/commit/3fef5ef60b7674d6431f4e1e4ba8c69b0c21c023.patch";
+      hash = "sha256-m+5sP+mIpcSjioRBdzChqja5zwNcwdSNAfvSJ2Lww+g=";
+    })
+  ];
+
+  postPatch = ''
+    sed '1i#include <ctime>' -i src/arch/ArchHooks/ArchHooks.h # gcc12
+  '';
+
+  nativeBuildInputs = [ cmake nasm ];
+
+  buildInputs = [
+    alsa-lib
+    ffmpeg_6
+    glew
+    glib
+    gtk2
+    libmad
+    libogg
+    libpulseaudio
+    libvorbis
+    udev
+    xorg.libXtst
+  ];
+
+  cmakeFlags = [
+    "-DWITH_SYSTEM_FFMPEG=1"
+    "-DGTK2_GDKCONFIG_INCLUDE_DIR=${gtk2.out}/lib/gtk-2.0/include"
+    "-DGTK2_GLIBCONFIG_INCLUDE_DIR=${glib.out}/lib/glib-2.0/include"
+  ];
+
+  postInstall = ''
+    mkdir -p $out/bin
+    ln -s $out/stepmania-5.1/stepmania $out/bin/stepmania
+
+    mkdir -p $out/share/
+    cp -r $src/icons $out/share/
+
+    install -Dm444 $src/stepmania.desktop -t $out/share/applications
+  '';
+
+  meta = with lib; {
+    homepage = "https://www.stepmania.com/";
+    description = "Free dance and rhythm game for Windows, Mac, and Linux";
+    platforms = platforms.linux;
+    license = licenses.mit; # expat version
+    maintainers = with maintainers; [ h7x4 ];
+    # never built on aarch64-linux since first introduction in nixpkgs
+    broken = stdenv.isLinux && stdenv.isAarch64;
+    mainProgram = "stepmania";
+  };
+}
diff --git a/nixpkgs/pkgs/games/stockfish/default.nix b/nixpkgs/pkgs/games/stockfish/default.nix
new file mode 100644
index 000000000000..bd42da9c7028
--- /dev/null
+++ b/nixpkgs/pkgs/games/stockfish/default.nix
@@ -0,0 +1,62 @@
+{ 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";
+
+    nnueFile = "nn-5af11540bbfe.nnue";
+    nnue = fetchurl {
+      name = nnueFile;
+      url = "https://tests.stockfishchess.org/api/nn/${nnueFile}";
+      sha256 = "sha256-WvEVQLv+/LVOOMXdAAyrS0ad+nWZodVb5dJyLCCokps=";
+    };
+in
+
+stdenv.mkDerivation rec {
+  pname = "stockfish";
+  version = "16";
+
+  src = fetchFromGitHub {
+    owner = "official-stockfish";
+    repo = "Stockfish";
+    rev = "sf_${version}";
+    sha256 = "sha256-ASy2vIP94lnSKgxixK1GoC84yAysaJpxeyuggV4MrP4=";
+  };
+
+  # 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 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 siraben ];
+    platforms = ["x86_64-linux" "i686-linux" "x86_64-darwin" "aarch64-linux"];
+    license = licenses.gpl3Only;
+  };
+
+}
diff --git a/nixpkgs/pkgs/games/stone-kingdoms/default.nix b/nixpkgs/pkgs/games/stone-kingdoms/default.nix
new file mode 100644
index 000000000000..e49db727b9e8
--- /dev/null
+++ b/nixpkgs/pkgs/games/stone-kingdoms/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, stdenvNoCC
+, fetchFromGitLab
+, copyDesktopItems
+, love
+, makeDesktopItem
+, makeWrapper
+, strip-nondeterminism
+, zip
+}:
+
+stdenvNoCC.mkDerivation rec {
+  pname = "stone-kingdoms";
+  version = "0.5.0";
+
+  src = fetchFromGitLab {
+    owner = "stone-kingdoms";
+    repo = pname;
+    rev = version;
+    hash = "sha256-FQrg/1/nfFC/irCWSLbnb9GYSUv//ovvcjzvIg94oEI=";
+  };
+
+  nativeBuildInputs = [
+    copyDesktopItems
+    makeWrapper
+    strip-nondeterminism
+    zip
+  ];
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = pname;
+      exec = pname;
+      icon = pname;
+      comment = "A real-time strategy game made with LÖVE based on the original Stronghold by Firefly studios";
+      desktopName = "Stone Kingdoms";
+      genericName = pname;
+      categories = [ "Game" ];
+    })
+  ];
+
+  installPhase = ''
+    runHook preInstall
+    zip -9 -r stone-kingdoms.love ./*
+    strip-nondeterminism --type zip stone-kingdoms.love
+    install -Dm755 -t $out/share/games/lovegames/ stone-kingdoms.love
+    install -Dm644 assets/other/icon.png $out/share/icons/hicolor/256x256/apps/stone-kingdoms.png
+    makeWrapper ${love}/bin/love $out/bin/stone-kingdoms \
+      --add-flags $out/share/games/lovegames/stone-kingdoms.love
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "A real-time strategy game made with LÖVE based on the original Stronghold by Firefly studios";
+    homepage = "https://gitlab.com/stone-kingdoms/stone-kingdoms";
+    platforms = platforms.linux;
+    license = with licenses; [
+      asl20 # engine
+      unfree # game assets
+    ];
+    maintainers = with maintainers; [ hulr ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/stuntrally/default.nix b/nixpkgs/pkgs/games/stuntrally/default.nix
new file mode 100644
index 000000000000..b4b2268c33e9
--- /dev/null
+++ b/nixpkgs/pkgs/games/stuntrally/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, fetchFromGitHub
+, stdenv
+, cmake
+, boost
+, ogre_13
+, mygui
+, ois
+, SDL2
+, libvorbis
+, pkg-config
+, makeWrapper
+, enet
+, libXcursor
+, bullet
+, openal
+, tinyxml
+, tinyxml-2
+}:
+
+let
+  stuntrally_ogre = ogre_13.overrideAttrs (old: {
+    cmakeFlags = old.cmakeFlags ++ [
+      "-DOGRE_NODELESS_POSITIONING=ON"
+      "-DOGRE_RESOURCEMANAGER_STRICT=0"
+    ];
+  });
+  stuntrally_mygui = mygui.override {
+    withOgre = true;
+    ogre = stuntrally_ogre;
+  };
+in
+
+stdenv.mkDerivation rec {
+  pname = "stuntrally";
+  version = "2.7";
+
+  src = fetchFromGitHub {
+    owner = "stuntrally";
+    repo = "stuntrally";
+    rev = version;
+    hash = "sha256-0Eh9ilIHSh/Uz8TuPnXxLQfy7KF7qqNXUgBXQUCz9ys=";
+  };
+  tracks = fetchFromGitHub {
+    owner = "stuntrally";
+    repo = "tracks";
+    rev = version;
+    hash = "sha256-fglm1FetFGHM/qGTtpxDb8+k2iAREn5DQR5GPujuLms=";
+  };
+
+  preConfigure = ''
+    rmdir data/tracks
+    ln -s ${tracks}/ data/tracks
+  '';
+
+  nativeBuildInputs = [ cmake pkg-config makeWrapper ];
+  buildInputs = [
+    boost
+    stuntrally_ogre
+    stuntrally_mygui
+    ois
+    SDL2
+    libvorbis
+    enet
+    libXcursor
+    bullet
+    openal
+    tinyxml
+    tinyxml-2
+  ];
+
+  meta = with lib; {
+    description = "Stunt Rally game with Track Editor, based on VDrift and OGRE";
+    homepage = "http://stuntrally.tuxfamily.org/";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ pSub ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/super-tux-kart/default.nix b/nixpkgs/pkgs/games/super-tux-kart/default.nix
new file mode 100644
index 000000000000..d92f01cad37a
--- /dev/null
+++ b/nixpkgs/pkgs/games/super-tux-kart/default.nix
@@ -0,0 +1,152 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, fetchsvn
+, cmake
+, pkg-config
+, makeWrapper
+, SDL2
+, glew
+, openal
+, OpenAL
+, libvorbis
+, libogg
+, curl
+, freetype
+, libjpeg
+, libpng
+, harfbuzz
+, mcpp
+, wiiuse
+, angelscript
+, libopenglrecorder
+, sqlite
+, Cocoa
+, IOKit
+, IOBluetooth
+, libsamplerate
+, shaderc
+}:
+let
+  assets = fetchsvn {
+    url = "https://svn.code.sf.net/p/supertuxkart/code/stk-assets";
+    rev = "18464";
+    sha256 = "1a84j3psl4cxzkn5ynakpjill7i2f9ki2p729bpmbrvg8fki95aa";
+    name = "stk-assets";
+  };
+
+  # List of bundled libraries in stk-code/lib to keep
+  # Those are the libraries that cannot be replaced
+  # with system packages.
+  bundledLibraries = [
+    # Bullet 2.87 is incompatible (bullet 2.79 needed whereas 2.87 is packaged)
+    # The api changed in a lot of classes, too much work to adapt
+    "bullet"
+    # Upstream Libenet doesn't yet support IPv6,
+    # So we will use the bundled libenet which
+    # has been fixed to support it.
+    "enet"
+    # Internal library of STK, nothing to do about it
+    "graphics_engine"
+    # Internal library of STK, nothing to do about it
+    "graphics_utils"
+    # Internal library.
+    "simd_wrapper"
+    # This irrlicht is bundled with cmake
+    # whereas upstream irrlicht still uses
+    # archaic Makefiles, too complicated to switch to.
+    "irrlicht"
+    # Not packaged to this date
+    "libsquish"
+    # Not packaged to this date
+    "sheenbidi"
+    # Not packaged to this date
+    "tinygettext"
+    # Not packaged to this date (needed on Darwin)
+    "mojoal"
+  ];
+in
+stdenv.mkDerivation rec {
+
+  pname = "supertuxkart";
+  version = "1.4";
+
+  src = fetchFromGitHub {
+    owner = "supertuxkart";
+    repo = "stk-code";
+    rev = version;
+    hash = "sha256-gqdaVvgNfCN40ZO/9y8+vTeIJPSq6udKxYZ/MAi4ZMM=";
+  };
+
+  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
+    pkg-config
+    makeWrapper
+  ];
+
+  buildInputs = [
+    shaderc
+    SDL2
+    glew
+    libvorbis
+    libogg
+    freetype
+    curl
+    libjpeg
+    libpng
+    harfbuzz
+    mcpp
+    wiiuse
+    angelscript
+    sqlite
+  ]
+  ++ lib.optional (stdenv.hostPlatform.isWindows || stdenv.hostPlatform.isLinux) libopenglrecorder
+  ++ lib.optional stdenv.hostPlatform.isLinux openal
+  ++ lib.optionals stdenv.hostPlatform.isDarwin [ OpenAL IOKit Cocoa IOBluetooth libsamplerate ];
+
+  cmakeFlags = [
+    "-DBUILD_RECORDER=${if (stdenv.hostPlatform.isWindows || stdenv.hostPlatform.isLinux) then "ON" else "OFF"}"
+    "-DUSE_SYSTEM_ANGELSCRIPT=ON"
+    "-DCHECK_ASSETS=OFF"
+    "-DUSE_SYSTEM_WIIUSE=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}" \
+      --set-default SUPERTUXKART_DATADIR "$out/share/supertuxkart" \
+  '';
+
+  meta = with lib; {
+    description = "A Free 3D kart racing game";
+    longDescription = ''
+      SuperTuxKart is a Free 3D kart racing game, with many tracks,
+      characters and items for you to try, similar in spirit to Mario
+      Kart.
+    '';
+    homepage = "https://supertuxkart.net/";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ pyrolagus peterhoeg ];
+    platforms = with platforms; unix;
+    changelog = "https://github.com/supertuxkart/stk-code/blob/${version}/CHANGELOG.md";
+  };
+}
diff --git a/nixpkgs/pkgs/games/supertux/default.nix b/nixpkgs/pkgs/games/supertux/default.nix
new file mode 100644
index 000000000000..857617bc4bfa
--- /dev/null
+++ b/nixpkgs/pkgs/games/supertux/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, stdenv
+, fetchurl
+, cmake
+, pkg-config
+, boost
+, curl
+, SDL2
+, SDL2_image
+, libSM
+, libXext
+, libpng
+, freetype
+, libGLU
+, libGL
+, glew
+, glm
+, openal
+, libogg
+, libvorbis
+}:
+
+stdenv.mkDerivation rec {
+  pname = "supertux";
+  version = "0.6.3";
+
+  src = fetchurl {
+    url = "https://github.com/SuperTux/supertux/releases/download/v${version}/SuperTux-v${version}-Source.tar.gz";
+    sha256 = "1xkr3ka2sxp5s0spp84iv294i29s1vxqzazb6kmjc0n415h0x57p";
+  };
+
+  postPatch = ''
+    sed '1i#include <memory>' -i external/partio_zip/zip_manager.hpp # gcc12
+  '';
+
+  nativeBuildInputs = [ pkg-config cmake ];
+
+  buildInputs = [
+    boost
+    curl
+    SDL2
+    SDL2_image
+    libSM
+    libXext
+    libpng
+    freetype
+    libGL
+    libGLU
+    glew
+    glm
+    openal
+    libogg
+    libvorbis
+  ];
+
+  cmakeFlags = [ "-DENABLE_BOOST_STATIC_LIBS=OFF" ];
+
+  postInstall = ''
+    mkdir $out/bin
+    ln -s $out/games/supertux2 $out/bin
+  '';
+
+  meta = with lib; {
+    description = "Classic 2D jump'n run sidescroller game";
+    homepage = "https://supertux.github.io/";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ pSub ];
+    platforms = with platforms; linux;
+    mainProgram = "supertux2";
+  };
+}
diff --git a/nixpkgs/pkgs/games/system-syzygy/Cargo.lock b/nixpkgs/pkgs/games/system-syzygy/Cargo.lock
new file mode 100644
index 000000000000..9c08a1c193dc
--- /dev/null
+++ b/nixpkgs/pkgs/games/system-syzygy/Cargo.lock
@@ -0,0 +1,325 @@
+[[package]]
+name = "adler32"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "ahi"
+version = "0.1.0"
+source = "git+https://github.com/mdsteele/ahi?tag=v0.1.0#8dfd2b39ba35d77a3260d95d53369c149e875ecf"
+
+[[package]]
+name = "app_dirs"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "ole32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "shell32-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "xdg 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "bitflags"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "bitflags"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "byteorder"
+version = "1.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "cfg-if"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "deflate"
+version = "0.7.19"
+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.2.6 (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.1 (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 = "gcc"
+version = "0.3.54"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "getopts"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "glob"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "ico"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "png 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "inflate"
+version = "0.3.4"
+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 = "itersynth"
+version = "0.1.0"
+source = "git+https://github.com/mdsteele/itersynth?tag=v0.1.0#bc1e3ffe726c80e3a931bf9e58f4a98f213c2bf5"
+
+[[package]]
+name = "lazy_static"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "libc"
+version = "0.2.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "num"
+version = "0.1.42"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "num-integer 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-iter 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.36"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "num-iter"
+version = "0.1.35"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "num-integer 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "ole32-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 = "png"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "deflate 0.7.19 (registry+https://github.com/rust-lang/crates.io-index)",
+ "inflate 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-iter 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "rand"
+version = "0.3.22"
+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.40 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand 0.4.2 (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.40 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "sdl2"
+version = "0.31.0"
+source = "git+https://github.com/mdsteele/rust-sdl2?branch=hash#f277981d55f68be33a64c33871b23c4c405e0763"
+dependencies = [
+ "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.40 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
+ "sdl2-sys 0.31.0 (git+https://github.com/mdsteele/rust-sdl2?branch=hash)",
+]
+
+[[package]]
+name = "sdl2-sys"
+version = "0.31.0"
+source = "git+https://github.com/mdsteele/rust-sdl2?branch=hash#f277981d55f68be33a64c33871b23c4c405e0763"
+dependencies = [
+ "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "serde"
+version = "1.0.36"
+source = "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 = "syzygy"
+version = "1.0.1"
+dependencies = [
+ "ahi 0.1.0 (git+https://github.com/mdsteele/ahi?tag=v0.1.0)",
+ "app_dirs 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)",
+ "getopts 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
+ "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "ico 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "itersynth 0.1.0 (git+https://github.com/mdsteele/itersynth?tag=v0.1.0)",
+ "num-integer 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "sdl2 0.31.0 (git+https://github.com/mdsteele/rust-sdl2?branch=hash)",
+ "toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winres 0.1.6 (git+https://github.com/mdsteele/winres?branch=escape)",
+]
+
+[[package]]
+name = "toml"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "serde 1.0.36 (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.4"
+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"
+
+[[package]]
+name = "winres"
+version = "0.1.6"
+source = "git+https://github.com/mdsteele/winres?branch=escape#d88139c3e1c2592bf14d1a4323c18103a21fe190"
+dependencies = [
+ "toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "xdg"
+version = "2.1.0"
+source = "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 ahi 0.1.0 (git+https://github.com/mdsteele/ahi?tag=v0.1.0)" = "<none>"
+"checksum app_dirs 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e73a24bad9bd6a94d6395382a6c69fe071708ae4409f763c5475e14ee896313d"
+"checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d"
+"checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf"
+"checksum byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "90492c5858dd7d2e78691cfb89f90d273a2800fc11d98f60786e5d87e2f83781"
+"checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de"
+"checksum deflate 0.7.19 (registry+https://github.com/rust-lang/crates.io-index)" = "8a6abb26e16e8d419b5c78662aa9f82857c2386a073da266840e474d5055ec86"
+"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 gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb"
+"checksum getopts 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)" = "b900c08c1939860ce8b54dc6a89e26e00c04c380fd0e09796799bd7f12861e05"
+"checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb"
+"checksum ico 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6a4b3331534254a9b64095ae60d3dc2a8225a7a70229cd5888be127cdc1f6804"
+"checksum inflate 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f5f9f47468e9a76a6452271efadc88fe865a82be91fe75e6c0c57b87ccea59d4"
+"checksum itersynth 0.1.0 (git+https://github.com/mdsteele/itersynth?tag=v0.1.0)" = "<none>"
+"checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73"
+"checksum libc 0.2.40 (registry+https://github.com/rust-lang/crates.io-index)" = "6fd41f331ac7c5b8ac259b8bf82c75c0fb2e469bbf37d2becbba9a6a2221965b"
+"checksum num 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "4703ad64153382334aa8db57c637364c322d3372e097840c72000dabdcf6156e"
+"checksum num-integer 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)" = "f8d26da319fb45674985c78f1d1caf99aa4941f785d384a2ae36d0740bc3e2fe"
+"checksum num-iter 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "4b226df12c5a59b63569dd57fafb926d91b385dfce33d8074a412411b689d593"
+"checksum num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dee092fcdf725aee04dd7da1d21debff559237d49ef1cb3e69bcb8ece44c7364"
+"checksum ole32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2c49021782e5233cd243168edfa8037574afed4eba4bbaf538b3d8d1789d8c"
+"checksum png 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f0b0cabbbd20c2d7f06dbf015e06aad59b6ca3d9ed14848783e98af9aaf19925"
+"checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1"
+"checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5"
+"checksum sdl2 0.31.0 (git+https://github.com/mdsteele/rust-sdl2?branch=hash)" = "<none>"
+"checksum sdl2-sys 0.31.0 (git+https://github.com/mdsteele/rust-sdl2?branch=hash)" = "<none>"
+"checksum serde 1.0.36 (registry+https://github.com/rust-lang/crates.io-index)" = "c70142ae874a42c70e03c63c6a49abe2ea0079b090bf6e136e99252fc1974bd6"
+"checksum shell32-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9ee04b46101f57121c9da2b151988283b6beb79b34f5bb29a58ee48cb695122c"
+"checksum toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a7540f4ffc193e0d3c94121edb19b055670d369f77d5804db11ae053a45b6e7e"
+"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
+"checksum winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "04e3bd221fcbe8a271359c04f21a76db7d0c6028862d1bb5512d85e1e2eb5bb3"
+"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"
+"checksum winres 0.1.6 (git+https://github.com/mdsteele/winres?branch=escape)" = "<none>"
+"checksum xdg 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a66b7c2281ebde13cf4391d70d4c7e5946c3c25e72a7b859ca8f677dcd0b0c61"
diff --git a/nixpkgs/pkgs/games/system-syzygy/default.nix b/nixpkgs/pkgs/games/system-syzygy/default.nix
new file mode 100644
index 000000000000..c6591749a69b
--- /dev/null
+++ b/nixpkgs/pkgs/games/system-syzygy/default.nix
@@ -0,0 +1,52 @@
+{ stdenv, lib, rustPlatform, fetchFromGitHub, fetchurl, SDL2, makeWrapper, makeDesktopItem}:
+
+let
+  desktopFile = makeDesktopItem {
+    name = "system-syzygy";
+    exec = "@out@/bin/syzygy";
+    comment = "A puzzle game";
+    desktopName = "System Syzygy";
+    categories = [ "Game" ];
+  };
+in
+rustPlatform.buildRustPackage rec {
+  pname = "system-syzygy";
+  version = "1.0.1";
+
+  src = fetchFromGitHub {
+    owner = "mdsteele";
+    repo = "syzygy";
+    rev = "5ba148fed7aae14bf35108d7303e4194e8ffe5e8";
+    sha256 = "07mzwx8ql33q865snnw4gm3dgf0mnm60lnq1f5fgas2yjy9g9vwa";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ SDL2 ];
+
+  cargoLock = {
+    lockFile = ./Cargo.lock;
+    outputHashes = {
+      "ahi-0.1.0" = "sha256-EliAObznLP1wkk8r3c3hhB300HYnEd9N6CJW+xG6bxE=";
+      "itersynth-0.1.0" = "sha256-dXQ+uBFchcnOjKF/CcS+AwhzFzejk2JCvvKMfS64RRQ=";
+      "sdl2-0.31.0" = "sha256-wTam0hwiajdw/ub2yM6q7+50Y3AueStcK5HLa65Y2XQ=";
+      "winres-0.1.6" = "sha256-7jYrgc3BV2UmzfACc/xyYsTkaXBPfn+bLmwdrcBe1O0=";
+    };
+  };
+
+  postInstall = ''
+    mkdir -p $out/share/syzygy/
+    cp -r ${src}/data/* $out/share/syzygy/
+    wrapProgram $out/bin/syzygy --set SYZYGY_DATA_DIR $out/share/syzygy
+    mkdir -p $out/share/applications
+    substituteAll ${desktopFile}/share/applications/system-syzygy.desktop $out/share/applications/system-syzygy.desktop
+  '';
+
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "A story and a puzzle game, where you solve a variety of puzzle";
+    homepage = "https://mdsteele.games/syzygy";
+    license = licenses.gpl3Plus;
+    maintainers = [ maintainers.marius851000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/t4kcommon/default.nix b/nixpkgs/pkgs/games/t4kcommon/default.nix
new file mode 100644
index 000000000000..b9f9635321b8
--- /dev/null
+++ b/nixpkgs/pkgs/games/t4kcommon/default.nix
@@ -0,0 +1,39 @@
+{ 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";
+  pname = "t4kcommon";
+
+  src = fetchFromGitHub {
+    owner = "tux4kids";
+    repo = "t4kcommon";
+    rev = "upstream/${version}";
+    sha256 = "13q02xpmps9qg8zrzzy2gzv4a6afgi28lxk4z242j780v0gphchp";
+  };
+
+  patches = [
+    # patch from debian to support libpng16 instead of libpng12
+    (fetchurl {
+      url = "https://salsa.debian.org/tux4kids-pkg-team/t4kcommon/raw/f7073fa384f5a725139f54844e59b57338b69dc7/debian/patches/libpng16.patch";
+      sha256 = "1lcpkdy5gvxgljg1vkrxych74amq0gramb1snj2831dam48is054";
+    })
+  ];
+
+  # Workaround build failure on -fno-common toolchains like upstream
+  # gcc-10. Otherwise build fails as:
+  #   ld: CMakeFiles/t4k_common.dir/t4k_throttle.c.o:(.bss+0x0): multiple definition of
+  #     `wrapped_lines'; CMakeFiles/t4k_common.dir/t4k_audio.c.o:(.bss+0x0): first defined here
+  # TODO: revisit https://github.com/tux4kids/t4kcommon/pull/10 when merged.
+  env.NIX_CFLAGS_COMPILE = "-fcommon";
+
+  nativeBuildInputs = [ cmake pkg-config ];
+  buildInputs = [ SDL SDL_image SDL_mixer SDL_net SDL_ttf libpng librsvg libxml2 ];
+
+  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 ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/taisei/0001-lto-fix.patch b/nixpkgs/pkgs/games/taisei/0001-lto-fix.patch
new file mode 100644
index 000000000000..eed7b845f53c
--- /dev/null
+++ b/nixpkgs/pkgs/games/taisei/0001-lto-fix.patch
@@ -0,0 +1,13 @@
+diff --git a/meson.build b/meson.build
+index 80aa58d..c7e9d0a 100644
+--- a/meson.build
++++ b/meson.build
+@@ -17,7 +17,7 @@ project('taisei', 'c',
+         # You may want to change these for a debug build dir
+         'buildtype=release',
+         'strip=true',
+-        'b_lto=true',
++        'b_lto=false',
+         'b_ndebug=if-release',
+     ]
+ )
diff --git a/nixpkgs/pkgs/games/taisei/default.nix b/nixpkgs/pkgs/games/taisei/default.nix
new file mode 100644
index 000000000000..886768786c10
--- /dev/null
+++ b/nixpkgs/pkgs/games/taisei/default.nix
@@ -0,0 +1,46 @@
+{ lib, stdenv, fetchurl
+# Build depends
+, docutils, meson, ninja, pkg-config, python3
+# Runtime depends
+, glfw, SDL2, SDL2_mixer
+, cglm, freetype, libpng, libwebp, libzip, zlib
+}:
+
+stdenv.mkDerivation rec {
+  pname = "taisei";
+  version = "1.3.2";
+
+  src = fetchurl {
+    url = "https://github.com/taisei-project/${pname}/releases/download/v${version}/${pname}-v${version}.tar.xz";
+    sha256 = "1g53fcyrlzmvlsb40pw90gaglysv6n1w42hk263iv61ibhdmzh6v";
+  };
+
+  nativeBuildInputs = [
+    docutils meson ninja pkg-config python3
+  ];
+
+  buildInputs = [
+    glfw SDL2 SDL2_mixer
+    cglm freetype libpng libwebp libzip zlib
+  ];
+
+  patches = [ ./0001-lto-fix.patch ];
+
+  preConfigure = ''
+    patchShebangs .
+  '';
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    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
+      project of shoot-em-up games set in an isolated world full of Japanese
+      folklore.
+    '';
+    homepage = "https://taisei-project.org/";
+    license = [ licenses.mit licenses.cc-by-40 ];
+    maintainers = [ maintainers.lambda-11235 ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/games/tcl2048/default.nix b/nixpkgs/pkgs/games/tcl2048/default.nix
new file mode 100644
index 000000000000..b74d3630e0e6
--- /dev/null
+++ b/nixpkgs/pkgs/games/tcl2048/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, fetchurl, tcl, tcllib, runtimeShell }:
+
+tcl.mkTclDerivation rec {
+  pname = "tcl2048";
+  version = "0.4.0";
+
+  src = fetchurl {
+    url = "https://raw.githubusercontent.com/dbohdan/2048.tcl/v${version}/2048.tcl";
+    sha256 = "53f5503efd7f029b2614b0f9b1e3aac6c0342735a3c9b811d74a5135fee3e89e";
+  };
+
+  buildInputs = [ tcllib ];
+  dontUnpack = true;
+
+  installPhase = ''
+    mkdir -pv $out/bin
+    install -m 755 $src $out/bin/2048
+  '';
+
+  meta = {
+    homepage = "https://github.com/dbohdan/2048.tcl";
+    description = "The game of 2048 implemented in Tcl";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dbohdan ];
+    mainProgram = "2048";
+    platforms = lib.platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/games/tecnoballz/default.nix b/nixpkgs/pkgs/games/tecnoballz/default.nix
new file mode 100644
index 000000000000..6366e0ab06a5
--- /dev/null
+++ b/nixpkgs/pkgs/games/tecnoballz/default.nix
@@ -0,0 +1,69 @@
+{ 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;
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/games/teetertorture/default.nix b/nixpkgs/pkgs/games/teetertorture/default.nix
new file mode 100644
index 000000000000..b87faf6cea0b
--- /dev/null
+++ b/nixpkgs/pkgs/games/teetertorture/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, fetchurl, SDL, SDL_image, SDL_mixer }:
+
+stdenv.mkDerivation rec {
+  pname = "teeter-torture";
+  version = "2005-10-18";
+  src = fetchurl {
+    url = "ftp://ftp.tuxpaint.org/unix/x/teetertorture/source/teetertorture-${version}.tar.gz";
+    sha256 = "175gdbkx3m82icyzvwpyzs4v2fd69c695k5n8ca0lnjv81wnw2hr";
+  };
+
+  buildInputs = [ SDL SDL_image SDL_mixer];
+
+  configurePhase = ''
+    sed -i s,data/,$out/share/teetertorture/, src/teetertorture.c
+  '';
+
+  patchPhase = ''
+    sed -i '/free(home)/d' src/teetertorture.c
+  '';
+
+  installPhase = ''
+    mkdir -p $out/bin $out/share/teetertorture
+    cp teetertorture $out/bin
+    cp -R data/* $out/share/teetertorture
+  '';
+
+  meta = {
+    homepage = "http://www.newbreedsoftware.com/teetertorture/";
+    description = "Simple shooting game with your cannon is sitting atop a teeter totter";
+    license = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.linux;
+    mainProgram = "teetertorture";
+  };
+}
diff --git a/nixpkgs/pkgs/games/teeworlds/default.nix b/nixpkgs/pkgs/games/teeworlds/default.nix
new file mode 100644
index 000000000000..30e4833d0666
--- /dev/null
+++ b/nixpkgs/pkgs/games/teeworlds/default.nix
@@ -0,0 +1,122 @@
+{ fetchFromGitHub, fetchpatch, lib, stdenv, cmake, pkg-config, python3, alsa-lib
+, libX11, libGLU, SDL2, lua5_3, zlib, freetype, wavpack, icoutils
+, nixosTests
+, Cocoa
+, buildClient ? true
+}:
+
+stdenv.mkDerivation rec {
+  pname = "teeworlds";
+  version = "0.7.5";
+
+  src = fetchFromGitHub {
+    owner = "teeworlds";
+    repo = "teeworlds";
+    rev = version;
+    sha256 = "1l19ksmimg6b8zzjy0skyhh7z11ql7n5gvilkv7ay5x2b9ndbqwz";
+    fetchSubmodules = true;
+  };
+
+  patches = [
+    # Can't use fetchpatch or fetchpatch2 because of https://github.com/NixOS/nixpkgs/issues/32084
+    # Using fetchurl instead is also not a good idea, see https://github.com/NixOS/nixpkgs/issues/32084#issuecomment-727223713
+    ./rename-VERSION-to-VERSION.txt.patch
+    (fetchpatch {
+      name = "CVE-2021-43518.patch";
+      url = "https://salsa.debian.org/games-team/teeworlds/-/raw/a6c4b23c1ce73466e6d89bccbede70e61e8c9cba/debian/patches/CVE-2021-43518.patch";
+      hash = "sha256-2MmsucaaYjqLgMww1492gNmHmvBJm/NED+VV5pZDnBY=";
+    })
+  ];
+
+  postPatch = ''
+    # set compiled-in DATA_DIR so resources can be found
+    substituteInPlace src/engine/shared/storage.cpp \
+      --replace '#define DATA_DIR "data"' \
+                '#define DATA_DIR "${placeholder "out"}/share/teeworlds/data"'
+
+    # Quote nonsense is a workaround for https://github.com/NixOS/nix/issues/661
+    substituteInPlace 'other/bundle/client/Info.plist.in' \
+      --replace ${"'"}''${TARGET_CLIENT}' 'teeworlds' \
+      --replace ${"'"}''${PROJECT_VERSION}' '${version}'
+
+    # Make sure some bundled dependencies are actually unbundled.
+    # This will fail compilation if one of these dependencies could not
+    # be found, instead of falling back to the bundled version.
+    rm -rf 'src/engine/external/wavpack/'
+    rm -rf 'src/engine/external/zlib/'
+    # md5, pnglite and json-parser (https://github.com/udp/json-parser)
+    # don't seem to be packaged in Nixpkgs, so don't unbundle them.
+  '';
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+  ] ++ lib.optionals (buildClient && stdenv.isLinux) [
+    icoutils
+  ];
+
+  buildInputs = [
+    python3 lua5_3 zlib
+    wavpack
+  ] ++ lib.optionals stdenv.isDarwin [
+    Cocoa
+  ] ++ lib.optionals buildClient ([
+    SDL2
+    freetype
+  ] ++ lib.optionals stdenv.isLinux [
+    libGLU
+    alsa-lib
+    libX11
+  ]);
+
+  cmakeFlags = [
+    "-DCLIENT=${if buildClient then "ON" else "OFF"}"
+  ];
+
+  postInstall = lib.optionalString buildClient (lib.optionalString stdenv.isLinux ''
+    # Convert and install desktop icon
+    mkdir -p $out/share/pixmaps
+    icotool --extract --index 1 --output $out/share/pixmaps/teeworlds.png $src/other/icons/teeworlds.ico
+
+    # Install menu item
+    install -D $src/other/teeworlds.desktop $out/share/applications/teeworlds.desktop
+  '' + lib.optionalString stdenv.isDarwin ''
+    mkdir -p "$out/Applications/teeworlds.app/Contents/MacOS"
+    mkdir -p "$out/Applications/teeworlds.app/Contents/Resources"
+
+    cp '../other/icons/teeworlds.icns' "$out/Applications/teeworlds.app/Contents/Resources/"
+    cp '../other/bundle/client/Info.plist.in' "$out/Applications/teeworlds.app/Contents/Info.plist"
+    cp '../other/bundle/client/PkgInfo' "$out/Applications/teeworlds.app/Contents/"
+    ln -s "$out/bin/teeworlds" "$out/Applications/teeworlds.app/Contents/MacOS/"
+    ln -s "$out/share/teeworlds/data" "$out/Applications/teeworlds.app/Contents/Resources/data"
+  '');
+
+  passthru.tests.teeworlds = nixosTests.teeworlds;
+
+  meta = {
+    description = "Retro multiplayer shooter game";
+
+    longDescription = ''
+      Teeworlds is a free online multiplayer game, available for all
+      major operating systems.  Battle with up to 12 players in a
+      variety of game modes, including Team Deathmatch and Capture The
+      Flag.  You can even design your own maps!
+    '';
+
+    homepage = "https://teeworlds.com/";
+    license = with lib.licenses; [
+      # See https://github.com/teeworlds/teeworlds/blob/master/license.txt
+      lib.licenses.zlib # Main license
+      cc-by-sa-30 # All content under 'datasrc' except the fonts
+      ofl  # datasrc/fonts/SourceHanSans.ttc
+      free # datasrc/fonts/DejaVuSans.ttf
+      bsd2 # src/engine/external/json-parser/
+      bsd3 # src/engine/external/wavpack
+      # zlib src/engine/external/md5/
+      # zlib src/engine/external/pnglite/
+      # zlib src/engine/external/zlib/
+    ];
+    maintainers = with lib.maintainers; [ astsmtl Luflosi ];
+    platforms = lib.platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/games/teeworlds/rename-VERSION-to-VERSION.txt.patch b/nixpkgs/pkgs/games/teeworlds/rename-VERSION-to-VERSION.txt.patch
new file mode 100644
index 000000000000..4d56286cb40a
--- /dev/null
+++ b/nixpkgs/pkgs/games/teeworlds/rename-VERSION-to-VERSION.txt.patch
@@ -0,0 +1,33 @@
+From 86d6687ef07f7f05457a7f67537b650656b13820 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Robert=20M=C3=BCller?= <robert.mueller@uni-siegen.de>
+Date: Fri, 15 Oct 2021 23:45:50 +0200
+Subject: [PATCH] rename VERSION to VERSION.txt:
+
+Fixes compilation on systems with case insensitive file names where the standard library includes the version file source code.
+---
+ src/engine/external/json-parser/{VERSION => VERSION.txt} | 0
+ src/engine/external/pnglite/{VERSION => VERSION.txt}     | 0
+ src/engine/external/wavpack/{VERSION => VERSION.txt}     | 0
+ src/engine/external/zlib/{VERSION => VERSION.txt}        | 0
+ 4 files changed, 0 insertions(+), 0 deletions(-)
+ rename src/engine/external/json-parser/{VERSION => VERSION.txt} (100%)
+ rename src/engine/external/pnglite/{VERSION => VERSION.txt} (100%)
+ rename src/engine/external/wavpack/{VERSION => VERSION.txt} (100%)
+ rename src/engine/external/zlib/{VERSION => VERSION.txt} (100%)
+
+diff --git a/src/engine/external/json-parser/VERSION b/src/engine/external/json-parser/VERSION.txt
+similarity index 100%
+rename from src/engine/external/json-parser/VERSION
+rename to src/engine/external/json-parser/VERSION.txt
+diff --git a/src/engine/external/pnglite/VERSION b/src/engine/external/pnglite/VERSION.txt
+similarity index 100%
+rename from src/engine/external/pnglite/VERSION
+rename to src/engine/external/pnglite/VERSION.txt
+diff --git a/src/engine/external/wavpack/VERSION b/src/engine/external/wavpack/VERSION.txt
+similarity index 100%
+rename from src/engine/external/wavpack/VERSION
+rename to src/engine/external/wavpack/VERSION.txt
+diff --git a/src/engine/external/zlib/VERSION b/src/engine/external/zlib/VERSION.txt
+similarity index 100%
+rename from src/engine/external/zlib/VERSION
+rename to src/engine/external/zlib/VERSION.txt
diff --git a/nixpkgs/pkgs/games/tennix/default.nix b/nixpkgs/pkgs/games/tennix/default.nix
new file mode 100644
index 000000000000..e5b2b358f329
--- /dev/null
+++ b/nixpkgs/pkgs/games/tennix/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, fetchgit, which, SDL, SDL_mixer, SDL_image, SDL_ttf, SDL_net, python3 } :
+
+stdenv.mkDerivation rec {
+  pname = "tennix";
+  version = "1.3.1";
+
+  src = fetchgit {
+    url = "git://repo.or.cz/tennix.git";
+    rev = "refs/tags/tennix-${version}";
+    sha256 = "sha256-U5+S1jEeg+7gdM1++dln6ePTqxZu2Zt0oUrH3DIlkgk=";
+  };
+
+  nativeBuildInputs = [ which ];
+
+  buildInputs = [ python3 SDL SDL_mixer SDL_image SDL_ttf SDL_net ];
+
+  configurePhase = ''
+    ./configure --prefix $out
+  '';
+
+  meta = with lib; {
+    homepage = "http://icculus.org/tennix/";
+    description = "Classic Championship Tour 2011";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ pSub ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/terraria-server/default.nix b/nixpkgs/pkgs/games/terraria-server/default.nix
new file mode 100644
index 000000000000..c1e48f259d79
--- /dev/null
+++ b/nixpkgs/pkgs/games/terraria-server/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, stdenv
+, fetchurl
+
+, autoPatchelfHook
+, unzip
+, zlib
+}:
+
+stdenv.mkDerivation rec {
+  pname = "terraria-server";
+  version = "1.4.4.9";
+  urlVersion = lib.replaceStrings [ "." ] [ "" ] version;
+
+  src = fetchurl {
+    url = "https://terraria.org/api/download/pc-dedicated-server/terraria-server-${urlVersion}.zip";
+    sha256 = "sha256-Mk+5s9OlkyTLXZYVT0+8Qcjy2Sb5uy2hcC8CML0biNY=";
+  };
+
+  nativeBuildInputs = [ autoPatchelfHook unzip ];
+  buildInputs = [ stdenv.cc.cc.libgcc zlib ];
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/bin
+    cp -r Linux $out/
+    chmod +x "$out/Linux/TerrariaServer.bin.x86_64"
+    ln -s "$out/Linux/TerrariaServer.bin.x86_64" $out/bin/TerrariaServer
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    homepage = "https://terraria.org";
+    description = "Dedicated server for Terraria, a 2D action-adventure sandbox";
+    platforms = [ "x86_64-linux" ];
+    license = licenses.unfree;
+    mainProgram = "TerrariaServer";
+    maintainers = with maintainers; [ ncfavier tomasajt ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/tes3cmd/default.nix b/nixpkgs/pkgs/games/tes3cmd/default.nix
new file mode 100644
index 000000000000..3778aadda9c5
--- /dev/null
+++ b/nixpkgs/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/nixpkgs/pkgs/games/tetrio-desktop/default.nix b/nixpkgs/pkgs/games/tetrio-desktop/default.nix
new file mode 100644
index 000000000000..e31491e94c90
--- /dev/null
+++ b/nixpkgs/pkgs/games/tetrio-desktop/default.nix
@@ -0,0 +1,97 @@
+{ stdenv
+, lib
+, fetchurl
+, dpkg
+, autoPatchelfHook
+, wrapGAppsHook
+, alsa-lib
+, cups
+, libGL
+, libX11
+, libXScrnSaver
+, libXtst
+, mesa
+, nss
+, gtk3
+, libpulseaudio
+, systemd
+, callPackage
+, withTetrioPlus ? false
+, tetrio-plus ? callPackage ./tetrio-plus.nix { }
+}:
+
+stdenv.mkDerivation rec {
+  pname = "tetrio-desktop";
+  version = "8.0.0";
+
+  src = fetchurl {
+    url = "https://web.archive.org/web/20211228025517if_/https://tetr.io/about/desktop/builds/TETR.IO%20Setup.deb";
+    name = "tetrio-desktop.deb";
+    sha256 = "1nlblfhrph4cw8rpic9icrs78mzrxyskl7ggyy2i8bk9i07i21xf";
+  };
+
+  nativeBuildInputs = [
+    dpkg
+    autoPatchelfHook
+    wrapGAppsHook
+  ];
+
+  dontWrapGApps = true;
+
+  buildInputs = [
+    alsa-lib
+    cups
+    libX11
+    libXScrnSaver
+    libXtst
+    mesa
+    nss
+    gtk3
+  ];
+
+  libPath = lib.makeLibraryPath [
+    libGL
+    libpulseaudio
+    systemd
+  ];
+
+  unpackCmd = "dpkg -x $curSrc src";
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir $out
+    cp -r opt/ usr/share/ $out
+
+    mkdir $out/bin
+    ln -s $out/opt/TETR.IO/tetrio-desktop $out/bin/
+
+    substituteInPlace $out/share/applications/tetrio-desktop.desktop \
+      --replace "Exec=\"/opt/TETR.IO/tetrio-desktop\"" "Exec=\"$out/opt/TETR.IO/tetrio-desktop\""
+
+    runHook postInstall
+  '';
+
+  postInstall = lib.strings.optionalString withTetrioPlus ''
+    cp ${tetrio-plus} $out/opt/TETR.IO/resources/app.asar
+  '';
+
+  postFixup = ''
+    wrapProgram $out/opt/TETR.IO/tetrio-desktop \
+      --prefix LD_LIBRARY_PATH : ${libPath}:$out/opt/TETR.IO \
+      ''${gappsWrapperArgs[@]}
+  '';
+
+  meta = with lib; {
+    homepage = "https://tetr.io";
+    downloadPage = "https://tetr.io/about/desktop/";
+    description = "TETR.IO desktop client";
+    longDescription = ''
+      TETR.IO is a modern yet familiar online stacker.
+      Play against friends and foes all over the world, or claim a spot on the leaderboards - the stacker future is yours!
+    '';
+    platforms = [ "x86_64-linux" ];
+    license = licenses.unfree;
+    maintainers = with maintainers; [ wackbyte ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/tetrio-desktop/tetrio-plus.nix b/nixpkgs/pkgs/games/tetrio-desktop/tetrio-plus.nix
new file mode 100644
index 000000000000..64f5dd5d85cc
--- /dev/null
+++ b/nixpkgs/pkgs/games/tetrio-desktop/tetrio-plus.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, fetchzip }:
+
+stdenv.mkDerivation rec {
+  pname = "tetrio-plus";
+  version = "0.25.3";
+
+  src = fetchzip {
+    url = "https://gitlab.com/UniQMG/tetrio-plus/uploads/684477053451cd0819e2c84e145966eb/tetrio-plus_0.25.3_app.asar.zip";
+    sha256 = "sha256-GQgt4GZNeKx/uzmVsuKppW2zg8AAiGqsk2JYJIkqfVE=";
+  };
+
+  installPhase = ''
+    runHook preInstall
+
+    install app.asar $out
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "TETR.IO customization toolkit";
+    homepage = "https://gitlab.com/UniQMG/tetrio-plus";
+    license = licenses.mit;
+    maintainers = with maintainers; [ huantian ];
+    platforms = [ "x86_64-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/the-butterfly-effect/default.nix b/nixpkgs/pkgs/games/the-butterfly-effect/default.nix
new file mode 100644
index 000000000000..021dedc17bd9
--- /dev/null
+++ b/nixpkgs/pkgs/games/the-butterfly-effect/default.nix
@@ -0,0 +1,39 @@
+{ lib, mkDerivation, fetchFromGitHub, cmake, qttools, wrapQtAppsHook, qtbase, qtsvg }:
+
+mkDerivation rec {
+  pname = "tbe";
+  version = "0.9.3.1";
+
+  src = fetchFromGitHub {
+    owner = "kaa-ching";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "1ag2cp346f9bz9qy6za6q54id44d2ypvkyhvnjha14qzzapwaysj";
+  };
+
+  postPatch = ''
+    sed '1i#include <vector>' -i src/model/World.h
+
+    # fix translations not building: https://gitlab.kitware.com/cmake/cmake/-/issues/21931
+    substituteInPlace i18n/CMakeLists.txt --replace qt5_create_translation qt_add_translation
+  '';
+
+  nativeBuildInputs = [ cmake qttools wrapQtAppsHook ];
+  buildInputs = [ qtbase qtsvg ];
+  strictDeps = true;
+
+  installPhase = ''
+    make DESTDIR=.. install
+    mkdir -p $out/bin
+    cp ../usr/games/tbe $out/bin
+    cp -r ../usr/share $out/
+  '';
+
+  meta = with lib; {
+    description = "A physics-based game vaguely similar to Incredible Machine";
+    homepage = "http://the-butterfly-effect.org/";
+    maintainers = [ maintainers.raskin ];
+    platforms = platforms.linux;
+    license = licenses.gpl2;
+  };
+}
diff --git a/nixpkgs/pkgs/games/the-powder-toy/default.nix b/nixpkgs/pkgs/games/the-powder-toy/default.nix
new file mode 100644
index 000000000000..c1c9415b90df
--- /dev/null
+++ b/nixpkgs/pkgs/games/the-powder-toy/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, meson
+, ninja
+, pkg-config
+, python3
+, SDL2
+, bzip2
+, curl
+, fftwFloat
+, lua
+, luajit
+, zlib
+, jsoncpp
+, libpng
+, Cocoa }:
+
+stdenv.mkDerivation rec {
+  pname = "the-powder-toy";
+  version = "97.0.352";
+
+  src = fetchFromGitHub {
+    owner = "The-Powder-Toy";
+    repo = "The-Powder-Toy";
+    rev = "v${version}";
+    sha256 = "sha256-LYohsqFU9LBgTXMaV6cf8/zf3fBvT+s5A1JBpPHekH8=";
+  };
+
+  nativeBuildInputs = [ meson ninja pkg-config python3 ];
+
+  buildInputs = [ SDL2 bzip2 curl fftwFloat lua luajit zlib jsoncpp libpng ]
+  ++ lib.optionals stdenv.isDarwin [ Cocoa ];
+
+  mesonFlags = [ "-Dworkaround_elusive_bzip2=false" ];
+
+  installPhase = ''
+    install -Dm 755 powder $out/bin/powder
+
+    mkdir -p $out/share/applications
+    mv ../resources $out/share
+  '' + lib.optionalString stdenv.isLinux ''
+    mv ./resources/powder.desktop $out/share/applications
+  '';
+
+  meta = with lib; {
+    description = "A free 2D physics sandbox game";
+    homepage = "https://powdertoy.co.uk/";
+    platforms = platforms.unix;
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ abbradar siraben ];
+    mainProgram = "powder";
+  };
+}
diff --git a/nixpkgs/pkgs/games/theforceengine/default.nix b/nixpkgs/pkgs/games/theforceengine/default.nix
new file mode 100644
index 000000000000..788fdc30794f
--- /dev/null
+++ b/nixpkgs/pkgs/games/theforceengine/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, SDL2
+, SDL2_image
+, rtaudio
+, rtmidi
+, glew
+, alsa-lib
+, cmake
+, pkg-config
+}:
+
+stdenv.mkDerivation rec {
+  pname = "theforceengine";
+  version = "1.09.540";
+
+  src = fetchFromGitHub {
+    owner = "luciusDXL";
+    repo = "TheForceEngine";
+    rev = "v${version}";
+    sha256 = "sha256-s54X6LZdk7daIlQPHyRBxc8MLS6bzkkypi4m1m+xK80=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+  ];
+
+  buildInputs = [
+    SDL2
+    SDL2_image
+    rtaudio
+    rtmidi
+    glew
+    alsa-lib
+  ];
+
+  prePatch = ''
+    # use nix store path instead of hardcoded /usr/share for support data
+    substituteInPlace TheForceEngine/TFE_FileSystem/paths-posix.cpp \
+      --replace "/usr/share" "$out/share"
+  '';
+
+  meta = with lib; {
+    description = "Modern \"Jedi Engine\" replacement supporting Dark Forces, mods, and in the future Outlaws.";
+    homepage = "https://theforceengine.github.io";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ devusb ];
+    platforms = [ "x86_64-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/tibia/default.nix b/nixpkgs/pkgs/games/tibia/default.nix
new file mode 100644
index 000000000000..0fee9ce6c6cb
--- /dev/null
+++ b/nixpkgs/pkgs/games/tibia/default.nix
@@ -0,0 +1,57 @@
+{ lib, stdenv, fetchurl, glibc, libX11, runtimeShell, libGLU, libGL }:
+
+stdenv.mkDerivation rec {
+  pname = "tibia";
+  version = "10.90";
+
+  src = fetchurl {
+    url = "http://static.tibia.com/download/tibia${lib.replaceStrings ["."] [""] version}.tgz";
+    sha256 = "11mkh2dynmbpay51yfaxm5dmcys3rnpk579s9ypfkhblsrchbkhx";
+  };
+
+  shell = stdenv.shell;
+
+  # These binaries come stripped already and trying to strip after the
+  # files are in $out/res and after patchelf just breaks them.
+  # Strangely it works if the files are in $out but then nix doesn't
+  # put them in our PATH. We set all the files to $out/res because
+  # we'll be using a wrapper to start the program which will go into
+  # $out/bin.
+  dontStrip = true;
+
+  installPhase = ''
+    mkdir -pv $out/res
+    cp -r * $out/res
+
+    patchelf --set-interpreter ${glibc.out}/lib/ld-linux.so.2 \
+             --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
+    # dumb so it looks for ‘./Tibia.dat’. This requires us to be in
+    # the same directory as the file itself but that's very tedious,
+    # especially with nix which changes store hashes. Here we generate
+    # a simple wrapper that we put in $out/bin which will do the
+    # directory changing for us.
+
+    mkdir -pv $out/bin
+
+    # The wrapper script itself. We use $LD_LIBRARY_PATH for libGL.
+    cat << EOF > "$out/bin/Tibia"
+    #!${runtimeShell}
+    cd $out/res
+    ${glibc.out}/lib/ld-linux.so.2 --library-path \$LD_LIBRARY_PATH ./Tibia "\$@"
+    EOF
+
+    chmod +x $out/bin/Tibia
+
+  '';
+
+  meta = {
+    description = "Top-down MMORPG set in a fantasy world";
+    homepage = "http://tibia.com";
+    license = lib.licenses.unfree;
+    platforms = ["i686-linux"];
+    maintainers = with lib.maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/tintin/default.nix b/nixpkgs/pkgs/games/tintin/default.nix
new file mode 100644
index 000000000000..d2c1c0b4168c
--- /dev/null
+++ b/nixpkgs/pkgs/games/tintin/default.nix
@@ -0,0 +1,32 @@
+{ stdenv, fetchFromGitHub, lib, zlib, pcre
+, memorymappingHook, memstreamHook
+, gnutls
+}:
+
+stdenv.mkDerivation rec {
+  pname = "tintin";
+  version = "2.02.40";
+
+  src = fetchFromGitHub {
+    owner = "scandum";
+    repo = "tintin";
+    rev = version;
+    hash = "sha256-nJTxAAM5HOStYFjEopLA47ruM9uoVway+aH97AdXo/w=";
+  };
+
+  buildInputs = [ zlib pcre gnutls ]
+    ++ lib.optionals (stdenv.system == "x86_64-darwin") [ memorymappingHook memstreamHook ];
+
+  preConfigure = ''
+    cd src
+  '';
+
+  meta = with lib; {
+    description = "A free MUD client for macOS, Linux and Windows";
+    homepage    = "https://tintin.mudhalla.net/index.php";
+    license     = licenses.gpl3Plus;
+    maintainers = with maintainers; [ abathur ];
+    mainProgram = "tt++";
+    platforms   = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/games/tinyfugue/default.nix b/nixpkgs/pkgs/games/tinyfugue/default.nix
new file mode 100644
index 000000000000..a787d0b25bff
--- /dev/null
+++ b/nixpkgs/pkgs/games/tinyfugue/default.nix
@@ -0,0 +1,43 @@
+{ lib, stdenv, fetchurl, ncurses, zlib
+, openssl ? null
+, sslSupport ? true
+}:
+
+with lib;
+
+assert sslSupport -> openssl != null;
+
+stdenv.mkDerivation rec {
+  pname = "tinyfugue";
+  version = "50b8";
+  verUrl = "5.0%20beta%208";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/project/tinyfugue/tinyfugue/${verUrl}/tf-${version}.tar.gz";
+    sha256 = "12fra2fdwqj6ilv9wdkc33rkj343rdcf5jyff4yiwywlrwaa2l1p";
+  };
+
+  configureFlags = optional (!sslSupport) "--disable-ssl";
+
+  buildInputs =
+    [ ncurses zlib ]
+    ++ optional sslSupport openssl;
+
+  # Workaround build failure on -fno-common toolchains like upstream
+  # gcc-10. Otherwise build fails as:
+  #   ld: world.o:/build/tf-50b8/src/socket.h:24: multiple definition of
+  #     `world_decl'; command.o:/build/tf-50b8/src/socket.h:24: first defined here
+  env.NIX_CFLAGS_COMPILE = "-fcommon";
+
+  meta = {
+    homepage = "https://tinyfugue.sourceforge.net/";
+    description = "A terminal UI, screen-oriented MUD client";
+    longDescription = ''
+      TinyFugue, aka "tf", is a flexible, screen-oriented MUD client, for use
+      with any type of text MUD.
+    '';
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.KibaFox ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/titanion/default.nix b/nixpkgs/pkgs/games/titanion/default.nix
new file mode 100644
index 000000000000..47db68aa483e
--- /dev/null
+++ b/nixpkgs/pkgs/games/titanion/default.nix
@@ -0,0 +1,91 @@
+{ 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/titanion/0.3.dfsg1-7/debian/patches/${patchname}";
+  sha256 = hash;
+};
+
+in stdenv.mkDerivation rec {
+  pname = "titanion";
+  version = "0.3";
+
+  src = fetchurl {
+    url = "http://abagames.sakura.ne.jp/windows/ttn${lib.replaceStrings ["."] ["_"] version}.zip";
+    sha256 = "sha256-fR0cufi6dU898wP8KGl/vxbfQJzMmMxlYZ3QNGLajfM=";
+  };
+
+  patches = [
+    (debianPatch
+      "imports.patch"
+      "sha256-kSXpaTpYq6w9e0yLES2QGNQ8+vFIiOpw2P9MA8gZr8s=")
+    (debianPatch
+      "fix.diff"
+      "sha256-0WkkfuhJaAMY46VVyc3ldMQwgOVoQJDw/8zbm6H2sHU=")
+    (debianPatch
+      "directories.patch"
+      "sha256-fhQJuy2+r0YOQNwMqG85Gr7fJehmf00Scran+NPYQrw=")
+    (debianPatch
+      "windowed.patch"
+      "sha256-xouXIuIKfKFGsoOEJqL9jdsdnkX4nqwPGcoB+32Wvgo=")
+    (debianPatch
+      "dotfile.patch"
+      "sha256-sAml53Hh0ltbqN8xZDZuUJcaPfjK56jf4ymFXYD38v0=")
+    (debianPatch
+      "window-resize.patch"
+      "sha256-WwAi1aU4CmaX+O8fw0TfLhNSXFaObExrn7nuhesVkKM=")
+    (debianPatch
+      "makefile.patch"
+      "sha256-g0jDPmc0SWXkTLhiczeTse/WGCtgMUsbyPNZzwK3U+o=")
+    (debianPatch
+      "dlang_v2.patch"
+      "sha256-tfTAAKlPFSjbfAK1EjeB3unj9tbMlNaajJ+VVSMMiYw=")
+    (debianPatch
+      "gdc-8.patch"
+      "sha256-BxkPfSEymq7TDA+yjJHaYsjtGr0Tuu1/sWLwRBAMga4=")
+  ];
+
+  postPatch = ''
+    rm *.dll ttn.exe
+    rm -r lib
+    for f in src/abagames/ttn/screen.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 titanion $out/bin/titanion
+    mkdir -p $out/share/games/titanion
+    cp -r sounds images $out/share/games/titanion/
+  '';
+
+  meta = with lib; {
+    homepage = "http://www.asahi-net.or.jp/~cs8k-cyu/windows/ttn_e.html";
+    description = "Strike down super high-velocity swooping insects";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ fgaz ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/games/tome2/default.nix b/nixpkgs/pkgs/games/tome2/default.nix
new file mode 100644
index 000000000000..3440e183515c
--- /dev/null
+++ b/nixpkgs/pkgs/games/tome2/default.nix
@@ -0,0 +1,49 @@
+{ lib, stdenv, fetchFromGitHub, makeDesktopItem, ncurses, libX11, boost, cmake }:
+
+let
+  pname = "tome2";
+  description = "A dungeon crawler similar to Angband, based on the works of Tolkien";
+
+  desktopItem = makeDesktopItem {
+    desktopName = pname;
+    name = pname;
+    exec = "${pname}-x11";
+    icon = pname;
+    comment = description;
+    type = "Application";
+    categories = [ "Game" "RolePlaying" ];
+    genericName = pname;
+  };
+
+in stdenv.mkDerivation {
+  inherit pname;
+  version = "2.4";
+
+  src = fetchFromGitHub {
+    owner = "tome2";
+    repo = "tome2";
+    rev = "4e6a906c80ff07b75a6acf4ff585b47303805e46";
+    sha256 = "06bddj55y673d7bnzblk8n01z32l6k2rad3bpzr8dmw464hx4wwf";
+  };
+
+  buildInputs = [ ncurses libX11 boost ];
+
+  nativeBuildInputs = [ cmake ];
+
+  cmakeFlags = [
+    "-DSYSTEM_INSTALL=ON"
+  ];
+
+  postInstall = ''
+    mkdir -p $out/share/applications
+    cp ${desktopItem}/share/applications/*.desktop $out/share/applications
+  '';
+
+  meta = with lib; {
+    inherit description;
+    license = licenses.unfree;
+    maintainers = with maintainers; [ cizra ];
+    platforms = platforms.all;
+    homepage = "https://github.com/tome2/tome2";
+  };
+}
diff --git a/nixpkgs/pkgs/games/tome4/default.nix b/nixpkgs/pkgs/games/tome4/default.nix
new file mode 100644
index 000000000000..c05fd006aaac
--- /dev/null
+++ b/nixpkgs/pkgs/games/tome4/default.nix
@@ -0,0 +1,76 @@
+{ lib, stdenv, fetchurl, makeDesktopItem, makeWrapper, premake4, unzip
+, openal, libpng, libvorbis, libGLU, SDL2, SDL2_image, SDL2_ttf }:
+
+stdenv.mkDerivation rec {
+  pname = "tome4";
+  version = "1.7.6";
+
+  src = fetchurl {
+    url = "https://te4.org/dl/t-engine/t-engine4-src-${version}.tar.bz2";
+    sha256 = "sha256-mJ3qAIA/jNyt4CT0ZH1IC7GsDUN8JUKSwHVJwnKkaAw=";
+  };
+
+  desktop = makeDesktopItem {
+    desktopName = pname;
+    name = pname;
+    exec = "@out@/bin/${pname}";
+    icon = pname;
+    comment = "An open-source, single-player, role-playing roguelike game set in the world of Eyal.";
+    type = "Application";
+    categories = [ "Game" "RolePlaying" ];
+    genericName = pname;
+  };
+
+  prePatch = ''
+    # http://forums.te4.org/viewtopic.php?f=42&t=49478&view=next#p234354
+    sed -i 's|#include <GL/glext.h>||' src/tgl.h
+  '';
+
+  nativeBuildInputs = [ makeWrapper unzip premake4 ];
+
+  # tome4 vendors quite a few libraries so someone might want to look
+  # into avoiding that...
+  buildInputs = [
+    libGLU openal libpng libvorbis SDL2 SDL2_ttf SDL2_image
+  ];
+
+  # disable parallel building as it caused sporadic build failures
+  enableParallelBuilding = false;
+
+  env.NIX_CFLAGS_COMPILE = "-I${SDL2.dev}/include/SDL2 -I${SDL2_image}/include/SDL2 -I${SDL2_ttf}/include/SDL2";
+
+  makeFlags = [ "config=release" ];
+
+  # The wrapper needs to cd into the correct directory as tome4's detection of
+  # the game asset root directory is faulty.
+
+  installPhase = ''
+    runHook preInstall
+
+    dir=$out/share/${pname}
+
+    install -Dm755 t-engine $dir/t-engine
+    cp -r bootstrap game $dir
+    makeWrapper $dir/t-engine $out/bin/${pname} \
+      --chdir "$dir"
+
+    install -Dm755 ${desktop}/share/applications/${pname}.desktop $out/share/applications/${pname}.desktop
+    substituteInPlace $out/share/applications/${pname}.desktop \
+      --subst-var out
+
+    unzip -oj -qq game/engines/te4-${version}.teae data/gfx/te4-icon.png
+    install -Dm644 te4-icon.png $out/share/icons/hicolor/64x64/${pname}.png
+
+    install -Dm644 -t $out/share/doc/${pname} CONTRIBUTING COPYING COPYING-MEDIA CREDITS
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Tales of Maj'eyal (rogue-like game)";
+    homepage = "https://te4.org/";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ peterhoeg ];
+    platforms = [ "i686-linux" "x86_64-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/toppler/default.nix b/nixpkgs/pkgs/games/toppler/default.nix
new file mode 100644
index 000000000000..890e13498747
--- /dev/null
+++ b/nixpkgs/pkgs/games/toppler/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, stdenv
+, fetchFromGitLab
+
+, pkg-config
+, gettext
+, povray
+, imagemagick
+, gimp
+
+, SDL2
+, SDL2_mixer
+, SDL2_image
+, libpng
+, zlib
+}:
+
+stdenv.mkDerivation rec {
+  pname = "toppler";
+  version = "1.3";
+
+  src = fetchFromGitLab {
+    owner = "roever";
+    repo = "toppler";
+    rev = "v${version}";
+    sha256 = "sha256-ecEaELu52Nmov/BD9VzcUw6wyWeHJcsKQkEzTnaW330=";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+    gettext
+    povray
+    imagemagick
+    gimp
+  ];
+
+  buildInputs = [
+    SDL2
+    SDL2_mixer
+    SDL2_image
+    libpng
+    zlib
+  ];
+
+  # GIMP needs a writable home
+  preBuild = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  makeFlags = [ "PREFIX=$(out)" ];
+
+  hardeningDisable = [ "format" ];
+
+  meta = with lib; {
+    description = "Jump and run game, reimplementation of Tower Toppler/Nebulus";
+    homepage = "https://gitlab.com/roever/toppler";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ fgaz ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/games/torcs/default.nix b/nixpkgs/pkgs/games/torcs/default.nix
new file mode 100644
index 000000000000..4764db4413ed
--- /dev/null
+++ b/nixpkgs/pkgs/games/torcs/default.nix
@@ -0,0 +1,51 @@
+{ 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 {
+  pname = "torcs";
+  version = "1.3.7";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/torcs/torcs-${version}.tar.bz2";
+    sha256 = "0kdq0sc7dsfzlr0ggbxggcbkivc6yp30nqwjwcaxg9295s3b06wa";
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://salsa.debian.org/games-team/torcs/raw/fb0711c171b38c4648dc7c048249ec20f79eb8e2/debian/patches/gcc6-isnan.patch";
+      sha256 = "16scmq30vwb8429ah9d4ws0v1w6ai59lvn7hcgnvfzyap42ry876";
+    })
+    (fetchpatch {
+      url = "https://salsa.debian.org/games-team/torcs/raw/fb0711c171b38c4648dc7c048249ec20f79eb8e2/debian/patches/format-argument.patch";
+      sha256 = "04advcx88yh23ww767iysydzhp370x7cqp2wf9hk2y1qvw7mxsja";
+    })
+    (fetchpatch {
+      url = "https://salsa.debian.org/games-team/torcs/raw/fb0711c171b38c4648dc7c048249ec20f79eb8e2/debian/patches/glibc-default-source.patch";
+      sha256 = "0k4hgpddnhv68mdc9ics7ah8q54j60g394d7zmcmzg6l3bjd9pyp";
+    })
+    (fetchpatch {
+      url = "https://salsa.debian.org/games-team/torcs/raw/32bbe77c68b4de07b28c34497f3c0ad666ee618d/debian/patches/gcc7.patch";
+      sha256 = "09iilnvdv8h7b4nb1372arszkbz9hbzsck4rimzz1xjdh9ydniw9";
+    })
+  ];
+
+  postPatch = ''
+    sed -i -e s,/bin/bash,`type -P bash`, src/linux/torcs.in
+  '';
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ libGLU freeglut libX11 plib openal freealut libXrandr xorgproto
+    libXext libSM libICE libXi libXt libXrender libXxf86vm libpng zlib libvorbis ];
+
+  installTargets = "install datainstall";
+
+  meta = {
+    description = "Car racing game";
+    homepage = "https://torcs.sourceforge.net/";
+    license = lib.licenses.gpl2Plus;
+    maintainers = with lib.maintainers; [viric];
+    platforms = lib.platforms.linux;
+    hydraPlatforms = [];
+  };
+}
diff --git a/nixpkgs/pkgs/games/torus-trooper/default.nix b/nixpkgs/pkgs/games/torus-trooper/default.nix
new file mode 100644
index 000000000000..645abc76c807
--- /dev/null
+++ b/nixpkgs/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/nixpkgs/pkgs/games/tr-patcher/default.nix b/nixpkgs/pkgs/games/tr-patcher/default.nix
new file mode 100644
index 000000000000..0336ed1ac02f
--- /dev/null
+++ b/nixpkgs/pkgs/games/tr-patcher/default.nix
@@ -0,0 +1,37 @@
+{ 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";
+    sourceProvenance = with sourceTypes; [ binaryBytecode ];
+    license = licenses.gpl3;
+    maintainers = [ maintainers.marius851000 ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/trackballs/default.nix b/nixpkgs/pkgs/games/trackballs/default.nix
new file mode 100644
index 000000000000..9ce9ad3ffc5e
--- /dev/null
+++ b/nixpkgs/pkgs/games/trackballs/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, fetchFromGitHub, cmake, SDL2, SDL2_ttf, gettext, zlib, SDL2_mixer, SDL2_image, guile, libGLU, libGL }:
+
+stdenv.mkDerivation rec {
+  pname = "trackballs";
+  version = "1.3.4";
+
+  src = fetchFromGitHub {
+    owner = "trackballs";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-JKSiNe5mu8rRztUhduGFY6IsSMx6VyBqKcGO5EssI+8=";
+  };
+
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ zlib SDL2 SDL2_ttf SDL2_mixer SDL2_image guile gettext libGLU libGL ];
+
+  meta = with lib; {
+    homepage = "https://trackballs.github.io/";
+    description = "3D Marble Madness clone";
+    platforms = platforms.linux;
+    # Music is licensed under Ethymonics Free Music License.
+    license = licenses.gpl2Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/games/trigger/default.nix b/nixpkgs/pkgs/games/trigger/default.nix
new file mode 100644
index 000000000000..cb3227f24e3e
--- /dev/null
+++ b/nixpkgs/pkgs/games/trigger/default.nix
@@ -0,0 +1,54 @@
+{ lib, fetchurl, stdenv, runtimeShell, SDL2, freealut, SDL2_image, openal, physfs
+, zlib, libGLU, libGL, glew, tinyxml-2 }:
+
+stdenv.mkDerivation rec {
+  pname = "trigger-rally";
+  version = "0.6.6.1";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/trigger-rally/${pname}-${version}.tar.gz";
+    sha256 = "016bc2hczqscfmngacim870hjcsmwl8r3aq8x03vpf22s49nw23z";
+  };
+
+  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"
+  '';
+
+  enableParallelBuilding = true;
+
+  postInstall = ''
+    mkdir -p $out/bin
+    cat <<EOF > $out/bin/trigger-rally
+    #!${runtimeShell}
+    exec $out/games/trigger-rally "$@"
+    EOF
+    chmod +x $out/bin/trigger-rally
+  '';
+
+  meta = {
+    description = "A fast-paced single-player racing game";
+    homepage = "http://trigger-rally.sourceforge.net/";
+    license = lib.licenses.gpl2;
+    maintainers = with lib.maintainers; [viric];
+    platforms = with lib.platforms; linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/tumiki-fighters/default.nix b/nixpkgs/pkgs/games/tumiki-fighters/default.nix
new file mode 100644
index 000000000000..b4becea65756
--- /dev/null
+++ b/nixpkgs/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/nixpkgs/pkgs/games/tuxpaint/default.nix b/nixpkgs/pkgs/games/tuxpaint/default.nix
new file mode 100644
index 000000000000..e03079bf60dd
--- /dev/null
+++ b/nixpkgs/pkgs/games/tuxpaint/default.nix
@@ -0,0 +1,58 @@
+{ lib, stdenv, fetchurl, SDL, SDL_gfx, SDL_image, SDL_ttf, SDL_mixer, libpng
+, libimagequant, cairo, librsvg, gettext, libpaper, fribidi, pkg-config, gperf
+, imagemagick
+}:
+
+stdenv.mkDerivation rec {
+  version = "0.9.28";
+  pname = "tuxpaint";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/tuxpaint/${version}/${pname}-${version}-sdl1.tar.gz";
+    sha256 = "sha256-b4Ru9GqyGf2jMmM24szGXO2vbSxCwvPmA6tgEUWhhos=";
+  };
+
+  nativeBuildInputs = [
+    SDL SDL_gfx SDL_image SDL_ttf SDL_mixer libpng cairo libimagequant librsvg
+    gettext libpaper fribidi pkg-config gperf imagemagick
+  ];
+  hardeningDisable = [ "format" ];
+  makeFlags = [ "GPERF=${gperf}/bin/gperf"
+                "PREFIX=$$out"
+                "COMPLETIONDIR=$$out/share/bash-completion/completions"
+              ];
+
+  patches = [ ./tuxpaint-completion.diff ];
+  postPatch = ''
+    grep -Zlr include.*SDL . | xargs -0 sed -i -e 's,"SDL,"SDL/SDL,'
+  '';
+
+  # stamps
+  stamps = fetchurl {
+    url = "mirror://sourceforge/project/tuxpaint/tuxpaint-stamps/2022-06-04/tuxpaint-stamps-2022.06.04.tar.gz";
+    sha256 = "sha256-hCBlV2+uVUNY4A5R1xpJJhamSQsStZIigGdHfCh6C/g=";
+  };
+
+  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-*
+    make install-all PREFIX=$out
+    rm -rf $out/share/tuxpaint/stamps/military
+  '';
+
+  enableParallelBuilding = true;
+
+  meta = {
+    description = "Open Source Drawing Software for Children";
+    homepage = "http://www.tuxpaint.org/";
+    license = lib.licenses.gpl3Plus;
+    maintainers = with lib.maintainers; [ woffs ];
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/tuxpaint/tuxpaint-completion.diff b/nixpkgs/pkgs/games/tuxpaint/tuxpaint-completion.diff
new file mode 100644
index 000000000000..0824b2becf49
--- /dev/null
+++ b/nixpkgs/pkgs/games/tuxpaint/tuxpaint-completion.diff
@@ -0,0 +1,16 @@
+--- tuxpaint-0.9.22/src/tuxpaint-completion.bash~	1970-01-01 01:00:01.000000000 +0100
++++ tuxpaint-0.9.22/src/tuxpaint-completion.bash	2018-03-06 10:54:03.437560921 +0100
+@@ -8,7 +8,6 @@
+ # FIXME: See http://www.debian-administration.org/articles/316 for an intro
+ # to how we should be doing this... -bjk 2009.09.09
+ 
+-have tuxpaint &&
+ _tuxpaint()
+ {
+         local cur
+@@ -96,4 +95,4 @@
+         fi
+ 
+ }
+-[ "${have:-}" ] && complete -F _tuxpaint $filenames tuxpaint
++complete -F _tuxpaint $filenames tuxpaint
diff --git a/nixpkgs/pkgs/games/tuxtype/default.nix b/nixpkgs/pkgs/games/tuxtype/default.nix
new file mode 100644
index 000000000000..0e32ebfbab97
--- /dev/null
+++ b/nixpkgs/pkgs/games/tuxtype/default.nix
@@ -0,0 +1,43 @@
+{ 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";
+  pname = "tuxtype";
+
+  src = fetchFromGitHub {
+    owner = "tux4kids";
+    repo = "tuxtype";
+    rev = "upstream/${version}";
+    sha256 = "1i33rhi9gpzfml4hd73s18h6p2s8zcr26va2vwf2pqqd9fhdwpsg";
+  };
+
+  postPatch = ''
+    patchShebangs data/scripts/sed-linux.sh
+    patchShebangs data/themes/asturian/scripts/sed-linux.sh
+    patchShebangs data/themes/greek/scripts/sed-linux.sh
+    patchShebangs data/themes/hungarian/scripts/sed-linux.sh
+
+    substituteInPlace Makefile.am \
+      --replace "\$(MKDIR_P) -m 2755 " "\$(MKDIR_P) -m 755 " \
+      --replace "chown root:games \$(DESTDIR)\$(pkglocalstatedir)/words" " "
+
+    # required until the following has been merged:
+    # https://salsa.debian.org/tux4kids-pkg-team/tuxtype/merge_requests/1
+    substituteInPlace configure.ac \
+      --replace 'CFLAGS="$CFLAGS $SDL_IMAGE"' 'CFLAGS="$CFLAGS $SDL_IMAGE_CFLAGS"' \
+      --replace 'PKG_CHECK_MODULES([SDL_ttf],' 'PKG_CHECK_MODULES([SDL_TTF],'
+  '';
+
+  nativeBuildInputs = [ autoreconfHook pkg-config ];
+  buildInputs = [ librsvg libxml2 SDL SDL_image SDL_mixer SDL_net SDL_ttf t4kcommon ];
+
+  configureFlags = [ "--without-sdlpango" ];
+
+  meta = with lib; {
+    description = "An Educational Typing Tutor Game Starring Tux, the Linux Penguin";
+    homepage = "https://github.com/tux4kids/tuxtype";
+    license = licenses.gpl3Plus;
+    maintainers = [ maintainers.aanderse ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/typespeed/default.nix b/nixpkgs/pkgs/games/typespeed/default.nix
new file mode 100644
index 000000000000..92d8768e4ffd
--- /dev/null
+++ b/nixpkgs/pkgs/games/typespeed/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, fetchurl, ncurses }:
+
+stdenv.mkDerivation rec {
+  pname = "typespeed";
+  version = "0.6.5";
+  buildInputs = [ ncurses ];
+  src = fetchurl {
+    url = "https://typespeed.sourceforge.net/typespeed-${version}.tar.gz";
+    sha256 = "5c860385ceed8a60f13217cc0192c4c2b4705c3e80f9866f7d72ff306eb72961";
+  };
+
+  patches = [ ./typespeed-config-in-home.patch ];
+
+  # Workaround build failure on -fno-common toolchains like upstream
+  # gcc-10. Otherwise build fails as:
+  #   ld: typespeed-typespeed.o:/build/typespeed-0.6.5/src/typespeed.h:69: multiple definition of
+  #     `opt'; typespeed-file.o:/build/typespeed-0.6.5/src/typespeed.h:69: first defined here
+  env.NIX_CFLAGS_COMPILE = "-fcommon";
+
+  configureFlags = [ "--datadir=\${out}/share/" ];
+  makeFlags = [ "CC=${stdenv.cc.targetPrefix}cc" ];
+
+  meta = with lib; {
+    description = "A curses based typing game";
+    homepage = "https://typespeed.sourceforge.net/";
+    license = licenses.gpl2;
+    platforms = platforms.unix;
+    maintainers = [ maintainers.auntie ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/typespeed/typespeed-config-in-home.patch b/nixpkgs/pkgs/games/typespeed/typespeed-config-in-home.patch
new file mode 100644
index 000000000000..fe313a4392ed
--- /dev/null
+++ b/nixpkgs/pkgs/games/typespeed/typespeed-config-in-home.patch
@@ -0,0 +1,148 @@
+diff --git a/src/file.c b/src/file.c
+index d1d1982..1655f6f 100644
+--- a/src/file.c
++++ b/src/file.c
+@@ -125,6 +125,8 @@ int			 hcompar(const void *, const void *);
+ int			 loadscores(char *);
+ static int		 parseline(char *, char **, char **);
+ void			 readconfig(void);
++void			 mkconfig(char *filename);
++void			 mkscore(char *filename);
+ static void		 readfile(char *, int);
+ static void		 setoptions(char *, char *, int);
+ 
+@@ -1125,7 +1127,7 @@ void
+ readconfig(void)
+ {
+ 	char *envhome;
+-	char userhigh[MAXPATHLEN], userconf[MAXPATHLEN];
++	char userhigh[MAXPATHLEN], userconf[MAXPATHLEN], confdir[MAXPATHLEN];
+ 	struct stat sb;
+ 
+ 	if (xsnprintf(ruledir, sizeof(ruledir), "%s", RULEDIR)) {
+@@ -1140,18 +1142,33 @@ readconfig(void)
+ 	readfile(CONFIGFILE, 1);
+ 
+ 	if ((envhome = getenv("HOME")) == NULL)
+-		return;
++		xerr(1, "readconfig: environment variable HOME not set");
+ 
+ 	if (xsnprintf(userconf, sizeof(userconf), "%s/.typespeed/config",
+-	    envhome))
+-		return;
++				envhome))
++		xerr(1, "readconfig: string error");
++	if (xsnprintf(userhigh, sizeof(userhigh), "%s/.typespeed/score",
++				envhome))
++		xerr(1, "readconfig: string error");
+ 
+ 	if (stat(userconf, &sb) || (sb.st_mode & S_IFMT) != S_IFREG)
+-		return;
+-
+-	if (xsnprintf(userhigh, sizeof(userhigh), "%s/.typespeed/score",
+-	    envhome))
+-		return;
++	{
++		if (xsnprintf(confdir, sizeof(confdir), "%s/.typespeed",
++					envhome))
++			xerr(1, "readconfig: string error");
++		if(stat(confdir, &sb) == -1)
++			if(mkdir(confdir, S_IRWXU | S_IRWXG | S_IRWXO))
++				xerr(1, "readconfig: could not create config directory %s",
++					confdir);
++		/* create the user configuration with default values */
++		mkconfig(userconf);
++	}
++  /* check for the high score file */
++	if (stat(userhigh, &sb) || (sb.st_mode & S_IFMT) != S_IFREG)
++	{
++		/* create a blank high score file */
++		mkscore(userhigh);
++	}
+ 
+ 	/*
+ 	 * Open a user writable high score.
+@@ -1159,14 +1176,48 @@ readconfig(void)
+ 	 * file. Protect system-wide high score file with group
+ 	 * write permissions: privileged gid already dropped.
+ 	 */
+-	if (close(hfd) == -1)
+-		xerr(1, "readconfig: close");
+-	if ((hfd = open(userhigh, O_RDWR, 0)) == -1)
++	if ((hfd = open(userhigh, O_RDWR)) == -1)
+ 		xerr(1, "readconfig: open: %s", userhigh);
+ 
+ 	readfile(userconf, 1);
+ }
+ 
++#define DEFAULT_CONFIG	"cheat = no\n" \
++			"highorder = score cps tcps\n" \
++			"ruledir = " RULEDIR "\n" \
++			"worddir = " WORDDIR "\n"
++
++/*
++ * Create the user configuration, with default values, at the given path.
++ */
++void
++mkconfig(char *filename)
++{
++	int cfd;
++
++	if((cfd = open(filename, O_WRONLY | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO)) == -1)
++		xerr(1, "mkconfig: open: %s", filename);
++	if(write(cfd, DEFAULT_CONFIG, sizeof(DEFAULT_CONFIG)/sizeof(DEFAULT_CONFIG[0]) - 1) == -1)
++		xerr(1, "mkconfig: write: %s", filename);
++	if(close(cfd) == -1)
++		xerr(1, "mkconfig: close: %s", filename);
++}
++
++/*
++ * Create the user high score file, which is just a blank file.
++ */
++void
++mkscore(char *filename)
++{
++	int sfd;
++	if((sfd = open(filename, O_WRONLY | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO)) == -1)
++		xerr(1, "mkscore: open: %s", filename);
++	if(write(sfd, "", 0) == -1)
++		xerr(1, "mkconfig: write: %s", filename);
++	if(close(sfd) == -1)
++		xerr(1, "mkconfig: close: %s", filename);
++}
++
+ /*
+  * Function used to open configuration and game rule files and to
+  * set options with function setoptions.
+diff --git a/src/typespeed.c b/src/typespeed.c
+index 7ac5ee2..77e9acb 100644
+--- a/src/typespeed.c
++++ b/src/typespeed.c
+@@ -319,8 +319,13 @@ main(int argc, char **argv)
+ 		progname++;
+ 
+ 	/* just open high score file while being setgid games */
+-	if ((hfd = open(HIGHFILE, O_RDWR, 0)) == -1)
+-		xerr(1, "main: open: %s", HIGHFILE);
++  /*
++   * For NixOS, a global high score file doesn't make sense, so we just comment
++   * this out. A high score file in the user's home directory will be opened
++   * later in readconfig().
++   */
++/*	if ((hfd = open(HIGHFILE, O_RDWR, 0)) == -1)
++		xerr(1, "main: open: %s", HIGHFILE);  */
+ 
+ #ifndef WIN32
+ 	/* drop privileges */
+@@ -348,9 +353,9 @@ main(int argc, char **argv)
+ #endif /* WIN32 */
+ 
+ 	/* check file descriptors for consistency */
+-	if (hfd == STDIN_FILENO || hfd == STDOUT_FILENO ||
++/*	if (hfd == STDIN_FILENO || hfd == STDOUT_FILENO ||
+ 	    hfd == STDERR_FILENO)
+-		exit(1);
++		exit(1);  */
+ 	if (!isatty(STDIN_FILENO) || !isatty(STDOUT_FILENO) ||
+ 	    !isatty(STDERR_FILENO))
+ 		xerrx(1, "not fully connected to a terminal");
diff --git a/nixpkgs/pkgs/games/uchess/default.nix b/nixpkgs/pkgs/games/uchess/default.nix
new file mode 100644
index 000000000000..8cb49bf1e3fc
--- /dev/null
+++ b/nixpkgs/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";
+  };
+
+  vendorHash = "sha256-4yEE1AsSChayCBxaMXPsbls7xGmFeWRhfOMHyAAReDY=";
+
+  # 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/nixpkgs/pkgs/games/ue4demos/default.nix b/nixpkgs/pkgs/games/ue4demos/default.nix
new file mode 100644
index 000000000000..ce3f3ad38f8d
--- /dev/null
+++ b/nixpkgs/pkgs/games/ue4demos/default.nix
@@ -0,0 +1,195 @@
+{ lib, stdenv, fetchurl, unzip, patchelf, xorg, openal }:
+
+let
+  urls = file:
+    [
+      # Untrusted mirrors - do not update hashes
+      "https://ludios.org/mirror/ue4demos/${file}"
+      "https://web.archive.org/web/20140824192039/http://ue4linux.raxxy.com/${file}"
+    ];
+
+  buildDemo = { name, src }:
+    stdenv.mkDerivation rec {
+      inherit name src;
+
+      nativeBuildInputs = [ unzip patchelf ];
+
+      rtdeps = lib.makeLibraryPath
+        [ xorg.libXxf86vm xorg.libXext openal ]
+        + ":" + lib.makeSearchPathOutput "lib" "lib64" [ stdenv.cc.cc ];
+
+      buildCommand =
+      ''
+        mkdir -p "$out"
+        cd $out
+        unzip $src
+
+        interpreter=$(echo ${stdenv.cc.libc}/lib/ld-linux*.so.2)
+        binary=$(find . -executable -type f)
+        patchelf \
+          --set-interpreter $interpreter \
+          --set-rpath ${rtdeps} \
+          "$binary"
+
+        # Workaround on
+        # LogLinuxPlatformFile:Warning: open('/nix/store/hash-ue4demos-demo/demo/demo/Saved/Config/CleanSourceConfigs/Engine.ini', Flags=0x00080241) failed: errno=2 (No such file or directory)
+        # for Vehicle, Shooter and Strategy games.
+        ls | grep ' ' && $(
+          haxname=$(ls | grep ' ' | sed 's/ //g'); \
+          haxpath=$(ls | grep ' ')/$haxname/Saved; \
+          mkdir -p "$haxpath"/Config/CleanSourceConfigs; \
+          ln -s /dev/null "$haxpath"/Config/CleanSourceConfigs/Engine.ini; \
+          mkdir -p "$haxpath"/Logs; \
+          ln -s /dev/null "$haxpath"/Logs/$haxname.log)
+
+        # Executables are buried under a varied paths across demos.
+        mkdir bin
+        cd bin
+        ln -s "$out/$binary" $(basename "$out/$binary")
+      '';
+
+      meta = {
+        description = "Unreal Engine 4 Linux demos";
+        homepage = "https://wiki.unrealengine.com/Linux_Demos";
+        platforms = [ "x86_64-linux" ];
+        license = lib.licenses.unfree;
+      };
+    };
+
+in {
+  tappy_chicken = buildDemo {
+    name = "ue4demos-tappy_chicken";
+    src = fetchurl {
+      urls = urls "tappy_chicken.zip";
+      sha256 = "0lwhvk3lpb2r5ng2cnzk7fpjj5lwhy2sch1a8v154x1xfhfb3h4v";
+    };
+  };
+
+  swing_ninja = buildDemo {
+    name = "ue4demos-swing_ninja";
+    src = fetchurl {
+      urls = urls "swing_ninja.zip";
+      sha256 = "1bmgqqk3lda5h7nnqi59jgyrsn0clr3xs0k1jclnqf9fk0m8hjcv";
+    };
+  };
+
+  card_game = buildDemo {
+    name = "ue4demos-card_game";
+    src = fetchurl {
+      urls = urls "card_game.zip";
+      sha256 = "154baqias5q7kad0c89k35jbmnmlm865sll02mi7bk1yllcckz5z";
+    };
+  };
+
+  vehicle_game = buildDemo {
+    name = "ue4demos-vehicle_game";
+    src = fetchurl {
+      urls = urls "vehicle_game.zip";
+      sha256 = "03dlacf1iv7sgn7pl3sx9r6243wy8fsi2kd858syfm9slg0190bs";
+    };
+  };
+
+  shooter_game = buildDemo {
+    name = "ue4demos-shooter_game";
+    src = fetchurl {
+      urls = urls "shooter_game.zip";
+      sha256 = "1bk32k349iqbqk8x8jffnqq0pjiqmvrvv675xxmlvkkr8qrlhz98";
+    };
+  };
+
+  strategy_game = buildDemo {
+    name = "ue4demos-strategy_game";
+    src = fetchurl {
+      urls = urls "strategy_game.zip";
+      sha256 = "1p7i966v1ssm20y12g4wsccpgnky3szy19qyjlacynk7bgbk6lg7";
+    };
+  };
+
+  black_jack = buildDemo {
+    name = "ue4demos-black_jack";
+    src = fetchurl {
+      urls = urls "black_jack.zip";
+      sha256 = "0g52wkzn5isa3az32y25yx5b56wxks97pajqwkmm6gf4qpkfksxv";
+    };
+  };
+
+  landscape_mountains = buildDemo {
+    name = "ue4demos-landscape_mountains";
+    src = fetchurl {
+      urls = urls "landscape_mountains.zip";
+      sha256 = "14jzajhs3cpydvf3ag7lpj4hkpbjpwnn3xkdvdx92fi0pcl8cwym";
+    };
+  };
+
+  matinee_demo = buildDemo {
+    name = "ue4demos-matinee_demo";
+    src = fetchurl {
+      urls = urls "matinee_demo.zip";
+      sha256 = "0ib8k6fl15cxzdarar2sqq5v3g3c7p2jidkdjd00nym6cvkibb4d";
+    };
+  };
+
+  elemental_demo = buildDemo {
+    name = "ue4demos-elemental_demo";
+    src = fetchurl {
+      urls = urls "elemental_demo.zip";
+      sha256 = "1v4jdsy8jvv8wgc8dx17q17xigfrya5q0nfdzw4md7fzm3bg9z0v";
+    };
+  };
+
+  effects_cave_demo = buildDemo {
+    name = "ue4demos-effects_cave_demo";
+    src = fetchurl {
+      urls = urls "effects_cave_demo.zip";
+      sha256 = "0lvd3aaha2x9pnpkdmrzi6nf7hymr95834z3l8shygjf9kbbzsz4";
+    };
+  };
+
+  realistic_rendering = buildDemo {
+    name = "ue4demos-realistic_rendering";
+    src = fetchurl {
+      urls = urls "realistic_rendering_demo.zip";
+      sha256 = "0r16nznkv475hkw5rnngqsc69ch8vh86dppyyyr9nn43dkr2110a";
+    };
+  };
+
+  reflections_subway = buildDemo {
+    name = "ue4demos-reflections_subway";
+    src = fetchurl {
+      urls = urls "reflections_subway_demo.zip";
+      sha256 = "0dw5sm7405gxw9iqz0vpnhdprrb4wl5i14pvzl1381k973m8bd00";
+    };
+  };
+
+  scifi_hallway_demo = buildDemo {
+    name = "ue4demos-scifi_hallway_demo";
+    src = fetchurl {
+      urls = urls "sci-fi_hallway_demo.zip";
+      sha256 = "14qp9iwm47awn8d9j6ijh6cnds308x60xs4vi2fvz2666jlz1pq2";
+    };
+  };
+
+  mobile_temple_demo = buildDemo {
+    name = "ue4demos-mobile_temple_demo";
+    src = fetchurl {
+      urls = urls "mobile_temple_demo.zip";
+      sha256 = "12bz4h1b9lhmqglwsa6r8q48ijqbjdha9fql31540d01kigaka75";
+    };
+  };
+
+  stylized_demo = buildDemo {
+    name = "ue4demos-stylized_demo";
+    src = fetchurl {
+      urls = urls "stylized_demo.zip";
+      sha256 = "1676ridmj8rk4y4hbdscfnnka5l636av1xxl0qwvk236kq9j7v0l";
+    };
+  };
+
+  blueprint_examples_demo = buildDemo {
+    name = "ue4demos-blueprint_examples_demo";
+    src = fetchurl {
+      urls = urls "blueprint_examples_demo.zip";
+      sha256 = "076q33h2hy965fvr805hsprkpcmizf638lj2ik8k923v86b15nbv";
+    };
+  };
+}
diff --git a/nixpkgs/pkgs/games/ufoai/default.nix b/nixpkgs/pkgs/games/ufoai/default.nix
new file mode 100644
index 000000000000..1272097ecb93
--- /dev/null
+++ b/nixpkgs/pkgs/games/ufoai/default.nix
@@ -0,0 +1,50 @@
+{ lib, stdenv, fetchurl, libtheora, xvidcore, libGLU, libGL, SDL, SDL_ttf, SDL_mixer
+, curl, libjpeg, libpng, gettext, cunit, enableEditor?false }:
+
+stdenv.mkDerivation rec {
+  pname = "ufoai";
+  version = "2.4";
+  src = fetchurl {
+    url = "mirror://sourceforge/ufoai/ufoai-${version}-source.tar.bz2";
+    sha256 = "0kxrbcjrharcwz319s90m789i4my9285ihp5ax6kfhgif2vn2ji5";
+  };
+
+  srcData = fetchurl {
+    url = "mirror://sourceforge/ufoai/ufoai-${version}-data.tar";
+    sha256 = "1drhh08cqqkwv1yz3z4ngkplr23pqqrdx6cp8c3isy320gy25cvb";
+  };
+
+  # Workaround build failure on -fno-common toolchains:
+  #   ld: r_gl.h:52: multiple definition of `qglGenBuffers';
+  #     r_gl.h:52: first defined here
+  # TODO: drop once release contains upstream fix:
+  #   https://github.com/ufoai/ufoai/commit/8a3075fffdad294e
+  env.NIX_CFLAGS_COMPILE = "-fcommon";
+
+  preConfigure = ''tar xvf "${srcData}"'';
+
+  configureFlags = [ "--enable-release" "--enable-sse" ]
+    ++ lib.optional enableEditor "--enable-uforadiant";
+
+  buildInputs = [
+    libtheora xvidcore libGLU libGL SDL SDL_ttf SDL_mixer
+    curl libjpeg libpng gettext cunit
+  ];
+
+  NIX_CFLAGS_LINK = [
+    # to avoid occasional runtime error in finding libgcc_s.so.1
+    "-lgcc_s"
+    # tests are underlinked against libm:
+    # ld: release-linux-x86_64/testall/client/sound/s_mix.c.o: undefined reference to symbol 'acos@@GLIBC_2.2.5'
+    "-lm"
+  ];
+
+  meta = {
+    homepage = "http://ufoai.org";
+    description = "A squad-based tactical strategy game in the tradition of X-Com";
+    license = lib.licenses.gpl2Plus;
+    maintainers = with lib.maintainers; [viric];
+    platforms = lib.platforms.linux;
+    hydraPlatforms = [];
+  };
+}
diff --git a/nixpkgs/pkgs/games/uhexen2/default.nix b/nixpkgs/pkgs/games/uhexen2/default.nix
new file mode 100644
index 000000000000..1a43679bd127
--- /dev/null
+++ b/nixpkgs/pkgs/games/uhexen2/default.nix
@@ -0,0 +1,67 @@
+{ 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
+            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; {
+    broken = stdenv.isDarwin;
+    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 = "https://uhexen2.sourceforge.net/";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ xdhampus ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/games/ultimatestunts/default.nix b/nixpkgs/pkgs/games/ultimatestunts/default.nix
new file mode 100644
index 000000000000..0ffe86efee4c
--- /dev/null
+++ b/nixpkgs/pkgs/games/ultimatestunts/default.nix
@@ -0,0 +1,26 @@
+{lib, stdenv, fetchurl, SDL, libGLU, libGL, SDL_image, freealut, openal, libvorbis,
+pkg-config}:
+
+stdenv.mkDerivation rec {
+  pname = "ultimate-stunts";
+  version = "0.7.7.1";
+  src = fetchurl {
+    url = "mirror://sourceforge/ultimatestunts/ultimatestunts-srcdata-${lib.replaceStrings ["."] [""] version}.tar.gz";
+    sha256 = "sha256-/MBuSi/yxcG9k3ZwrNsHkUDzzg798AV462VZog67JtM=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ SDL libGLU libGL SDL_image freealut openal libvorbis ];
+
+  postPatch = ''
+    sed -e '1i#include <unistd.h>' -i $(find . -name '*.c' -o -name '*.cpp')
+  '';
+
+  meta = {
+    homepage = "http://www.ultimatestunts.nl/";
+    description = "Remake of the popular racing DOS-game Stunts";
+    license = lib.licenses.gpl2Plus;
+    maintainers = with lib.maintainers; [viric];
+    platforms = with lib.platforms; linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/ultrastardx/default.nix b/nixpkgs/pkgs/games/ultrastardx/default.nix
new file mode 100644
index 000000000000..40c2f54c601a
--- /dev/null
+++ b/nixpkgs/pkgs/games/ultrastardx/default.nix
@@ -0,0 +1,86 @@
+{ 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_4
+, sqlite
+, zlib
+, libX11
+, libGLU
+, libGL
+}:
+
+let
+  sharedLibs = [
+    pcre portaudio freetype
+    SDL2 SDL2_image SDL2_gfx SDL2_mixer SDL2_net SDL2_ttf
+    sqlite lua zlib libX11 libGLU libGL ffmpeg_4
+  ];
+
+in stdenv.mkDerivation rec {
+  pname = "ultrastardx";
+  version = "2023.12.0";
+
+  src = fetchFromGitHub {
+    owner = "UltraStar-Deluxe";
+    repo = "USDX";
+    rev = "v${version}";
+    hash = "sha256-BR2TZMg5Xr8K2IEpQBbkR3SkyBQUXdYABjVOoe6GnJc=";
+  };
+
+  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_4 won’t break any major ABI compatibility, since it's
+    # effectively EOL
+    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 lib;
+    let items = concatMapStringsSep " " (x: "-rpath ${getLib x}/lib") sharedLibs;
+    in ''
+      export NIX_LDFLAGS="$NIX_LDFLAGS ${items}"
+    '';
+
+  # dlopened libgcc requires the rpath not to be shrinked
+  dontPatchELF = true;
+
+  meta = with lib; {
+    homepage = "https://usdx.eu/";
+    description = "Free and open source karaoke game";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ Profpatsch ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/umoria/default.nix b/nixpkgs/pkgs/games/umoria/default.nix
new file mode 100644
index 000000000000..13ec037afba7
--- /dev/null
+++ b/nixpkgs/pkgs/games/umoria/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, gcc9Stdenv
+, fetchFromGitHub
+, autoreconfHook
+, cmake
+, ncurses6
+, runtimeShell
+}:
+
+let
+  savesDir = "~/.umoria";
+in
+gcc9Stdenv.mkDerivation rec {
+  pname = "umoria";
+  version = "5.7.15";
+
+  src = fetchFromGitHub {
+    owner = "dungeons-of-moria";
+    repo = "umoria";
+    rev = "v${version}";
+    sha256 = "sha256-1j4QkE33UcTzM06qAjk1/PyK5uNA7E/kyDe3bZcFKUM=";
+  };
+
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ ncurses6 ];
+  enableParallelBuilding = true;
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/data $out/bin
+    cp -r umoria/data/* $out/data
+    cp umoria/umoria $out/.umoria-unwrapped
+
+    mkdir -p $out/bin
+    cat <<EOF >$out/bin/umoria
+    #! ${runtimeShell} -e
+
+    RUNDIR=\$(mktemp -d)
+
+    # Print the directory, so users have access to dumps, and let the system
+    # take care of cleaning up temp files.
+    echo "Running umoria in \$RUNDIR"
+
+    cd \$RUNDIR
+    ln -sn $out/data \$RUNDIR/data
+
+    mkdir -p ${savesDir}
+    [[ ! -f ${savesDir}/scores.dat ]] && touch ${savesDir}/scores.dat
+    ln -s ${savesDir}/scores.dat scores.dat
+
+    if [ \$# -eq 0 ]; then
+       $out/.umoria-unwrapped ${savesDir}/game.sav
+    else
+       $out/.umoria-unwrapped "\$@"
+    fi
+    EOF
+
+    chmod +x $out/bin/umoria
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    homepage = "https://umoria.org/";
+    description = "The Dungeons of Moria - the original roguelike";
+    longDescription = ''
+      The Dungeons of Moria is a single player dungeon simulation originally written
+      by Robert Alan Koeneke, with its first public release in 1983.
+      The game was originally developed using VMS Pascal before being ported to the C
+      language by James E. Wilson in 1988, and released a Umoria.
+    '';
+    platforms = platforms.unix;
+    badPlatforms = [ "aarch64-darwin" ];
+    maintainers = with maintainers; [ aciceri kenran ];
+    license = licenses.gpl3Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/games/unciv/default.nix b/nixpkgs/pkgs/games/unciv/default.nix
new file mode 100644
index 000000000000..497954a093e0
--- /dev/null
+++ b/nixpkgs/pkgs/games/unciv/default.nix
@@ -0,0 +1,60 @@
+{ 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 = "4.9.13";
+
+  src = fetchurl {
+    url = "https://github.com/yairm210/Unciv/releases/download/${version}/Unciv.jar";
+    hash = "sha256-AQHhqxnNTNArXYlqpNcUMDRVb/IAR3dCYue+y0wPAw8=";
+  };
+
+  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 ];
+    sourceProvenance = with sourceTypes; [ binaryBytecode ];
+    license = licenses.mpl20;
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/games/unnethack/default.nix b/nixpkgs/pkgs/games/unnethack/default.nix
new file mode 100644
index 000000000000..af402a7de935
--- /dev/null
+++ b/nixpkgs/pkgs/games/unnethack/default.nix
@@ -0,0 +1,72 @@
+{ lib, stdenv, fetchFromGitHub, fetchpatch, util-linux, ncurses, flex, bison }:
+
+stdenv.mkDerivation rec {
+  pname = "unnethack";
+  version = "5.3.2";
+
+  src = fetchFromGitHub {
+    name = "UnNetHack";
+    owner = "UnNetHack";
+    repo = "UnNetHack";
+    rev = version;
+    sha256 = "1rg0mqyplgn3dfh3wz09a600qxk7aidqw4d84kyiincljvhyb7ps";
+  };
+
+  buildInputs = [ ncurses ];
+
+  nativeBuildInputs = [ util-linux flex bison ];
+
+  configureFlags = [ "--enable-curses-graphics"
+                     "--disable-tty-graphics"
+                     "--with-owner=no"
+                     "--with-group=no"
+                     "--with-gamesdir=/tmp/unnethack"
+                   ];
+
+  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";
+    })
+  ];
+
+  # Fails the build occasionally due to missing buid depends:
+  #   ./../sys/unix/unixmain.c:9:10: fatal error: date.h: No such file or directory
+  # TODO: remove once upstream issue is fixed:
+  #   https://github.com/UnNetHack/UnNetHack/issues/56
+  enableParallelBuilding = false;
+
+  postInstall = ''
+    cp -r /tmp/unnethack $out/share/unnethack/profile
+    mv $out/bin/unnethack $out/bin/.wrapped_unnethack
+    cat <<EOF >$out/bin/unnethack
+      #! ${stdenv.shell} -e
+      if [ ! -d ~/.unnethack ]; then
+        mkdir -p ~/.unnethack
+        cp -r $out/share/unnethack/profile/* ~/.unnethack
+        chmod -R +w ~/.unnethack
+      fi
+
+      ln -s ~/.unnethack /tmp/unnethack
+
+      cleanup() {
+        rm -rf /tmp/unnethack
+      }
+      trap cleanup EXIT
+
+      $out/bin/.wrapped_unnethack
+    EOF
+    chmod +x $out/bin/unnethack
+  '';
+
+  meta = with lib; {
+    description = "Fork of NetHack";
+    homepage = "https://unnethack.wordpress.com/";
+    license = "nethack";
+    platforms = platforms.all;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/unvanquished/default.nix b/nixpkgs/pkgs/games/unvanquished/default.nix
new file mode 100644
index 000000000000..a8ad86e11a9c
--- /dev/null
+++ b/nixpkgs/pkgs/games/unvanquished/default.nix
@@ -0,0 +1,237 @@
+{ lib
+, stdenv
+, fetchzip
+, fetchFromGitHub
+, fetchpatch
+, SDL2
+, buildFHSEnv
+, cmake
+, copyDesktopItems
+, curl
+, freetype
+, gcc
+, geoip
+, glew
+, gmp
+, libGL
+, libjpeg
+, libogg
+, libopus
+, libpng
+, libvorbis
+, libwebp
+, lua5
+, makeDesktopItem
+, ncurses
+, nettle
+, openal
+, opusfile
+, zlib
+# to download assets
+, aria2
+, cacert
+}:
+
+let
+  version = "0.54.0";
+  binary-deps-version = "8";
+
+  src = fetchFromGitHub {
+    owner = "Unvanquished";
+    repo = "Unvanquished";
+    rev = "v${version}";
+    fetchSubmodules = true;
+    sha256 = "sha256-X2c6BHI4W6fOurLiBWIBZzJrZ+7RHMEwN8GJGz6e350=";
+  };
+
+  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/linux-amd64-default_${version}.tar.xz ";
+      sha256 = "sha256-6r9j0HRMDC/7i8f4f5bBK4NmwsTpSChHrRWwz0ENAZo=";
+    };
+
+    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 = ''
+      # check it links correctly
+      pnacl/bin/clang -v
+    '';
+
+    installPhase = ''
+      runHook preInstall
+
+      mkdir -p $out
+      cp -R ./* $out/
+
+      runHook postInstall
+    '';
+  };
+
+  libstdcpp-preload-for-unvanquished-nacl = stdenv.mkDerivation {
+    name = "libstdcpp-preload-for-unvanquished-nacl";
+
+    propagatedBuildInputs = [ gcc.cc.lib ];
+
+    buildCommand = ''
+      mkdir $out/etc -p
+      echo ${gcc.cc.lib}/lib/libstdc++.so.6 > $out/etc/ld-nix.so.preload
+    '';
+  };
+
+  fhsEnv = buildFHSEnv {
+    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-ua9Q5E5C4t8z/yNQp6qn1i9NNDAk4ohzvgpMbCBxb8Q=";
+    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 = ''
+    TARGET="linux-amd64-default_${binary-deps-version}"
+    mkdir daemon/external_deps/"$TARGET"
+    cp -r ${unvanquished-binary-deps}/* daemon/external_deps/"$TARGET"/
+    chmod +w -R daemon/external_deps/"$TARGET"/
+  '';
+
+  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";
+      exec = "unvanquished";
+      categories = [ "Game" "ActionGame" "StrategyGame" ];
+      prefersNonDefaultGPU = true;
+    })
+    (makeDesktopItem {
+      name = "net.unvanquished.UnvanquishedProtocolHandler.desktop";
+      desktopName = "Unvanquished (protocol handler)";
+      noDisplay = true;
+      exec = "unvanquished -connect %u";
+      mimeTypes = [ "x-scheme-handler/unv" ];
+      prefersNonDefaultGPU = true;
+    })
+  ];
+
+  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-amd64.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 = {
+    homepage = "https://unvanquished.net/";
+    downloadPage = "https://unvanquished.net/download/";
+    description = "A fast paced, first person strategy game";
+    # 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
+    ];
+    sourceProvenance = with lib.sourceTypes; [
+      fromSource
+      binaryNativeCode  # unvanquished-binary-deps
+    ];
+    maintainers = with lib.maintainers; [ afontain ];
+    platforms = [ "x86_64-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/uqm/3dovideo.nix b/nixpkgs/pkgs/games/uqm/3dovideo.nix
new file mode 100644
index 000000000000..2281688949c8
--- /dev/null
+++ b/nixpkgs/pkgs/games/uqm/3dovideo.nix
@@ -0,0 +1,61 @@
+{ stdenv, lib, requireFile, writeText, fetchFromGitHub, haskellPackages }:
+
+let
+  makeSpin = num: let
+    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:" +
+     "addons/3dovideo/spins/ship${padded}.aif:89";
+
+  videoRMP = writeText "3dovideo.rmp" (''
+    slides.ending = 3DOVID:addons/3dovideo/ending/victory.duk
+    slides.intro = 3DOVID:addons/3dovideo/intro/intro.duk
+  '' + lib.concatMapStrings makeSpin (lib.range 0 24));
+
+  helper = with haskellPackages; mkDerivation rec {
+    pname = "uqm3donix";
+    version = "0.1.0.0";
+
+    src = fetchFromGitHub {
+      owner = "aszlig";
+      repo = "uqm3donix";
+      rev = "v${version}";
+      hash = "sha256-rK30u2PBysiSGSA9829F1Nom/wtoVN6rGTBneRKeWEw=";
+    };
+
+    isLibrary = false;
+    isExecutable = true;
+
+    buildDepends = [ base binary bytestring filepath tar ];
+
+    description = "Extract video files from a Star Control II 3DO image";
+    license = lib.licenses.bsd3;
+  };
+
+in stdenv.mkDerivation {
+  name = "uqm-3dovideo";
+
+  src = requireFile rec {
+    name = "videos.tar";
+    sha256 = "044h0cl69r0kc43vk4n0akk0prwzb7inq324h5yfqb38sd4zkds1";
+    message = ''
+      In order to get the intro and ending sequences from the 3DO version, you
+      need to have the original 3DO Star Control II CD. Create an image from
+      the CD and use uqm3donix* to extract a tarball with the videos from it.
+      The reason for this is because the 3DO uses its own proprietary disk
+      format.
+
+      Save the file as videos.tar and use "nix-prefetch-url file://\$PWD/${name}" to
+      add it to the Nix store.
+
+      [*] ${helper}/bin/uqm3donix CDIMAGE ${name}
+    '';
+  };
+
+  buildCommand = ''
+    mkdir -vp "$out"
+    tar xf "$src" -C "$out" --strip-components=3
+    cp "${videoRMP}" "$out/3dovideo.rmp"
+  '';
+}
diff --git a/nixpkgs/pkgs/games/uqm/default.nix b/nixpkgs/pkgs/games/uqm/default.nix
new file mode 100644
index 000000000000..7da4c1e597b5
--- /dev/null
+++ b/nixpkgs/pkgs/games/uqm/default.nix
@@ -0,0 +1,109 @@
+{ stdenv, lib, fetchurl, fetchFromGitHub, pkg-config, libGLU, libGL
+, SDL2, libpng, libvorbis, libogg, libmikmod
+
+, use3DOVideos ? false, requireFile ? null, writeText ? null
+, haskellPackages ? null
+
+, useRemixPacks ? false
+}:
+
+assert use3DOVideos -> requireFile != null && writeText != null
+                    && haskellPackages != null;
+
+let
+  videos = import ./3dovideo.nix {
+    inherit stdenv lib requireFile writeText fetchFromGitHub haskellPackages;
+  };
+
+  remixPacks = lib.imap1 (num: sha256: fetchurl rec {
+    name = "uqm-remix-disc${toString num}.uqm";
+    url = "mirror://sourceforge/sc2/${name}";
+    inherit sha256;
+  }) [
+    "1s470i6hm53l214f2rkrbp111q4jyvnxbzdziqg32ffr8m3nk5xn"
+    "1pmsq65k8gk4jcbyk3qjgi9yqlm0dlaimc2r8hz2fc9f2124gfvz"
+    "07g966ylvw9k5q9jdzqdczp7c5qv4s91xjlg4z5z27fgcs7rzn76"
+    "1l46k9aqlcp7d3fjkjb3n05cjfkxx8rjlypgqy0jmdx529vikj54"
+  ];
+
+in stdenv.mkDerivation rec {
+  pname = "uqm";
+  version = "0.8.0";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/sc2/uqm-${version}-src.tgz";
+    sha256 = "JPL325z3+vU7lfniWA5vWWIFqY7QwzXP6DTGR4WtT1o=";
+  };
+
+  content = fetchurl {
+    url = "mirror://sourceforge/sc2/uqm-${version}-content.uqm";
+    sha256 = "d9dawl5vt1WjPEujs4p7e8Qfy8AolokbDMmskhS3Lu8=";
+  };
+
+  voice = fetchurl {
+    url = "mirror://sourceforge/sc2/uqm-${version}-voice.uqm";
+    sha256 = "ntv1HXfYtTM5nF86+1STFKghDXqrccosUbTySDIzekU=";
+  };
+
+  music = fetchurl {
+    url = "mirror://sourceforge/sc2/uqm-${version}-3domusic.uqm";
+    sha256 = "RM087H6VabQRettNd/FSKJCXJWYmc5GuCWMUhdIx2Lk=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ SDL2 libpng libvorbis libogg libmikmod libGLU libGL ];
+
+  postUnpack = ''
+    mkdir -p uqm-${version}/content/packages
+    mkdir -p uqm-${version}/content/addons
+    ln -s "$content" "uqm-${version}/content/packages/uqm-${version}-content.uqm"
+    ln -s "$music" "uqm-${version}/content/addons/uqm-${version}-3domusic.uqm"
+    ln -s "$voice" "uqm-${version}/content/addons/uqm-${version}-voice.uqm"
+  '' + lib.optionalString useRemixPacks (lib.concatMapStrings (disc: ''
+    ln -s "${disc}" "uqm-$version/content/addons/${disc.name}"
+  '') remixPacks) + lib.optionalString use3DOVideos ''
+    ln -s "${videos}" "uqm-${version}/content/addons/3dovideo"
+  '';
+
+  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
+  # 'build.sh'.
+  configurePhase = ''
+    echo "INPUT_install_prefix_VALUE='$out'" >> config.state
+    echo "INPUT_install_bindir_VALUE='$out/bin'" >> config.state
+    echo "INPUT_install_libdir_VALUE='$out/lib'" >> config.state
+    echo "INPUT_install_sharedir_VALUE='$out/share'" >> config.state
+    PREFIX=$out ./build.sh uqm config
+  '';
+
+  buildPhase = ''
+    ./build.sh uqm
+  '';
+
+  installPhase = ''
+    ./build.sh uqm install
+    sed -i $out/bin/uqm -e "s%/usr/local/games/%$out%g"
+  '';
+
+  meta = {
+    description = "Remake of Star Control II";
+    longDescription = ''
+      The goals for the The Ur-Quan Masters project are:
+        - to bring Star Control II to modern platforms, thereby making a lot of
+          people happy
+        - to make game translations easy, thereby making even more people happy
+        - to adapt the code so that people can more easily make their own
+          spin-offs, thereby making zillions more people happy!
+    '';
+    homepage = "https://sc2.sourceforge.net/";
+    license = lib.licenses.gpl2;
+    maintainers = with lib.maintainers; [ jcumming aszlig ];
+    platforms = with lib.platforms; linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/urbanterror/Makefile.local b/nixpkgs/pkgs/games/urbanterror/Makefile.local
new file mode 100644
index 000000000000..aee08a8ade79
--- /dev/null
+++ b/nixpkgs/pkgs/games/urbanterror/Makefile.local
@@ -0,0 +1,5 @@
+USE_CURL = 1
+USE_CURL_DLOPEN = 0
+USE_FREETYPE = 1
+USE_OPENAL = 1
+USE_OPENAL_DLOPEN = 0
diff --git a/nixpkgs/pkgs/games/urbanterror/default.nix b/nixpkgs/pkgs/games/urbanterror/default.nix
new file mode 100644
index 000000000000..a1bf80784d03
--- /dev/null
+++ b/nixpkgs/pkgs/games/urbanterror/default.nix
@@ -0,0 +1,115 @@
+{ lib
+, fetchzip
+, stdenv
+, copyDesktopItems
+, imagemagick
+, libicns
+, makeBinaryWrapper
+, curl
+, libGL
+, libGLU
+, openal
+, libXxf86vm
+, SDL
+, makeDesktopItem
+}:
+
+let
+  version = "4.3.4";
+
+  urbanterror-maps = fetchzip {
+    name = "urbanterror-maps";
+    url = "http://cdn.urbanterror.info/urt/43/releases/zips/UrbanTerror${builtins.replaceStrings ["."] [""] version}_full.zip";
+    hash = "sha256-C6Gb5PPECAOjQhmkrzkV6dpY/zHVtUj9oq3507o2PUI=";
+  };
+
+  urbanterror-source = fetchzip {
+    name = "urbanterror-source";
+    url = "https://github.com/FrozenSand/ioq3-for-UrbanTerror-4/archive/release-${version}.zip";
+    hash = "sha256-zF6Tkaj5WYkFU66VwpBFr1P18OJGrGgxnc/jvcvt8hA=";
+  };
+in
+stdenv.mkDerivation {
+  pname = "urbanterror";
+  inherit version;
+
+  srcs = [
+    urbanterror-maps
+    urbanterror-source
+  ];
+
+  sourceRoot = "urbanterror-source";
+
+  nativeBuildInputs = [
+    copyDesktopItems
+    imagemagick
+    libicns
+    makeBinaryWrapper
+  ];
+
+  buildInputs = [
+    curl
+    libGL
+    libGLU
+    openal
+    libXxf86vm
+    SDL
+  ];
+
+  preConfigure = ''
+    cp ${./Makefile.local} ./Makefile.local
+  '';
+
+  installTargets = [ "copyfiles" ];
+  installFlags = [ "COPYDIR=$(out)/share/urbanterror" ];
+
+  preInstall = ''
+    mkdir -p $out/share/urbanterror
+  '';
+
+  postInstall = ''
+    icns2png --extract ${urbanterror-maps}/Quake3-UrT.app/Contents/Resources/quake3-urt.icns
+
+    for size in 16 24 32 48 64 128 256 512 1024; do
+      mkdir -pv $out/share/icons/hicolor/"$size"x"$size"/apps
+      if [ ! -e quake3-urt_"$size"x"$size"x32.png ] ; then
+        convert -resize "$size"x"$size" quake3-urt_512x512x32.png quake3-urt_"$size"x"$size"x32.png
+      fi
+      install -Dm644 quake3-urt_"$size"x"$size"x32.png $out/share/icons/hicolor/"$size"x"$size"/apps/urbanterror.png
+    done;
+
+    makeWrapper $out/share/urbanterror/Quake3-UrT.* $out/bin/urbanterror
+    makeWrapper $out/share/urbanterror/Quake3-UrT-Ded.* $out/bin/urbanterror-ded
+
+    ln -s ${urbanterror-maps}/q3ut4 $out/share/urbanterror/
+  '';
+
+  hardeningDisable = [ "format" ];
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "urbanterror";
+      exec = "urbanterror";
+      icon = "urbanterror";
+      comment = "A multiplayer tactical FPS on top of Quake 3 engine";
+      desktopName = "Urban Terror";
+      categories = [ "Game" "ActionGame" ];
+    })
+  ];
+
+  meta = {
+    description = "A multiplayer tactical FPS on top of Quake 3 engine";
+    homepage = "https://www.urbanterror.info";
+    license = lib.licenses.unfreeRedistributable;
+    longDescription = ''
+      Urban Terror is a free multiplayer first person shooter developed by
+      FrozenSand, that (thanks to the ioquake3-code) does not require
+      Quake III Arena anymore. Urban Terror can be described as a Hollywood
+      tactical shooter; somewhat realism based, but the motto is "fun over
+      realism". This results in a very unique, enjoyable and addictive game.
+    '';
+    mainProgram = "urbanterror";
+    maintainers = with lib.maintainers; [ astsmtl drupol ];
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/ut2004/default.nix b/nixpkgs/pkgs/games/ut2004/default.nix
new file mode 100644
index 000000000000..3f306ac6eb54
--- /dev/null
+++ b/nixpkgs/pkgs/games/ut2004/default.nix
@@ -0,0 +1,9 @@
+{ callPackage }:
+
+{
+  ut2004-demo = callPackage ./demo.nix { };
+
+  ut2004 = gamePacks: callPackage ./wrapper.nix {
+    inherit gamePacks;
+  };
+}
diff --git a/nixpkgs/pkgs/games/ut2004/demo.nix b/nixpkgs/pkgs/games/ut2004/demo.nix
new file mode 100644
index 000000000000..5203453cc601
--- /dev/null
+++ b/nixpkgs/pkgs/games/ut2004/demo.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv, fetchurl }:
+
+let
+  arch =
+    if stdenv.hostPlatform.system == "x86_64-linux" then "amd64"
+    else if stdenv.hostPlatform.system == "i686-linux" then "x86"
+    else throw "Unsupported architecture";
+
+in stdenv.mkDerivation rec {
+  pname = "ut2004-demo";
+  version = "3334";
+
+  src = fetchurl {
+    url = "http://ftp.snt.utwente.nl/pub/games/UT2004/demo/UT2004-LNX-Demo${version}.run.gz";
+    sha256 = "0d5f84qz8l1rg16yzx2k4ikr46n9iwj68na1bqi87wrww7ck6jh7";
+  };
+
+  buildCommand = ''
+    cat $src | gunzip > setup.run
+    chmod +x setup.run
+    ./setup.run --noexec --target .
+    mkdir $out
+    tar -xaf ut2004demo.tar.bz2 -C $out
+    tar -xaf linux-${arch}.tar.bz2 -C $out
+
+    rm $out/System/libSDL-1.2.so.0
+    rm $out/System/openal.so
+  '';
+
+  dontStrip = true;
+  dontPatchELF = true;
+
+  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;
+    maintainers = with maintainers; [ abbradar ];
+    platforms = [ "x86_64-linux" "i686-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/ut2004/wrapper.nix b/nixpkgs/pkgs/games/ut2004/wrapper.nix
new file mode 100644
index 000000000000..cc5b0e400bc1
--- /dev/null
+++ b/nixpkgs/pkgs/games/ut2004/wrapper.nix
@@ -0,0 +1,46 @@
+{ stdenv, lib, runCommand, buildEnv, makeWrapper, makeDesktopItem, gamePacks, libstdcxx5, SDL, openal }:
+
+let
+  game = buildEnv {
+    name = "ut2004-game";
+    paths = gamePacks;
+    ignoreCollisions = true;
+    pathsToLink = [ "/" "/System" ];
+    postBuild = ''
+      ln -s ${lib.getLib SDL}/lib/libSDL-1.2.so.0 $out/System
+      ln -s ${lib.getLib openal}/lib/libopenal.so $out/System/openal.so
+      for i in $out/System/*-bin; do
+        path="$(readlink -f "$i")"
+        rm "$i"
+        cp "$path" "$i"
+        chmod +w "$i"
+        patchelf \
+          --set-interpreter $(cat ${stdenv.cc}/nix-support/dynamic-linker) \
+          --set-rpath "$out/System:${lib.makeLibraryPath [ libstdcxx5 ]}" \
+          "$i"
+      done
+    '';
+  };
+
+  desktop = makeDesktopItem {
+    name = "ut2004";
+    desktopName = "Unreal Tournament 2004";
+    comment = "A first-person shooter video game developed by Epic Games and Digital Extreme";
+    genericName = "First-person shooter";
+    categories = [ "Game" ];
+    exec = "ut2004";
+  };
+
+in runCommand "ut2004" {
+  nativeBuildInputs = [ makeWrapper ];
+} ''
+  mkdir -p $out/bin
+  for i in ${game}/System/*-bin; do
+    name="$(basename "$i")"
+    makeWrapper $i $out/bin/''${name%-bin} \
+      --chdir "${game}/System"
+  done
+
+  mkdir -p $out/share/applications
+  ln -s ${desktop}/share/applications/* $out/share/applications
+''
diff --git a/nixpkgs/pkgs/games/vassal/default.nix b/nixpkgs/pkgs/games/vassal/default.nix
new file mode 100644
index 000000000000..15453c8878ee
--- /dev/null
+++ b/nixpkgs/pkgs/games/vassal/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, stdenv
+, fetchzip
+, glib
+, jre
+, makeWrapper
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "VASSAL";
+  version = "3.7.6";
+
+  src = fetchzip {
+    url = "https://github.com/vassalengine/vassal/releases/download/${version}/${pname}-${version}-linux.tar.bz2";
+    sha256 = "sha256-t/GlLLokDxpHBO+ub1MOJ1yjK0tB/FSb6lCBMFVn0V8=";
+  };
+
+  buildInputs = [
+    glib
+  ];
+
+  nativeBuildInputs = [
+    makeWrapper
+    wrapGAppsHook
+  ];
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/bin $out/share/vassal $out/doc
+
+    cp CHANGES LICENSE README.md $out
+    cp -R lib/* $out/share/vassal
+    cp -R doc/* $out/doc
+
+    makeWrapper ${jre}/bin/java $out/bin/vassal \
+      --add-flags "-Duser.dir=$out -cp $out/share/vassal/Vengine.jar \
+      VASSAL.launch.ModuleManager"
+
+    runHook postInstall
+  '';
+
+  # Don't move doc to share/, VASSAL expects it to be in the root
+  forceShare = [ "man" "info" ];
+
+  meta = with lib; {
+      description = "A free, open-source boardgame engine";
+      homepage = "https://vassalengine.org/";
+      sourceProvenance = with sourceTypes; [ binaryBytecode ];
+      license = licenses.lgpl21Only;
+      maintainers = with maintainers; [ tvestelind ];
+      platforms = platforms.unix;
+      mainProgram = "vassal";
+  };
+}
diff --git a/nixpkgs/pkgs/games/vcmi/default.nix b/nixpkgs/pkgs/games/vcmi/default.nix
new file mode 100644
index 000000000000..fc4ac89fb1b9
--- /dev/null
+++ b/nixpkgs/pkgs/games/vcmi/default.nix
@@ -0,0 +1,99 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, SDL2
+, SDL2_image
+, SDL2_mixer
+, SDL2_ttf
+, boost
+, cmake
+, ffmpeg
+, fuzzylite
+, innoextract
+, luajit
+, minizip
+, ninja
+, pkg-config
+, python3
+, qtbase
+, qttools
+, tbb
+, unshield
+, wrapQtAppsHook
+, zlib
+, testers
+, vcmi
+}:
+
+stdenv.mkDerivation rec {
+  pname = "vcmi";
+  version = "1.4.2";
+
+  src = fetchFromGitHub {
+    owner = "vcmi";
+    repo = "vcmi";
+    rev = version;
+    hash = "sha256-C8WzEidTanWKPI/J2bEsi7sTMhn+FmykC55EsXZLLQ0=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    ninja
+    pkg-config
+    python3
+    wrapQtAppsHook
+  ];
+
+  buildInputs = [
+    SDL2
+    SDL2_image
+    SDL2_mixer
+    SDL2_ttf
+    boost
+    ffmpeg
+    fuzzylite
+    luajit
+    minizip
+    qtbase
+    qttools
+    tbb
+    zlib
+  ];
+
+  cmakeFlags = [
+    "-DENABLE_LUA:BOOL=ON"
+    "-DENABLE_ERM:BOOL=ON"
+    "-DENABLE_GITVERSION:BOOL=OFF"
+    "-DENABLE_PCH:BOOL=OFF"
+    "-DENABLE_TEST:BOOL=OFF" # Tests require HOMM3 data files.
+    "-DFORCE_BUNDLED_MINIZIP:BOOL=OFF"
+    "-DFORCE_BUNDLED_FL:BOOL=OFF"
+    "-DCMAKE_INSTALL_RPATH:STRING=$out/lib/vcmi"
+    "-DCMAKE_INSTALL_BINDIR:STRING=bin"
+    "-DCMAKE_INSTALL_LIBDIR:STRING=lib"
+    "-DCMAKE_INSTALL_DATAROOTDIR:STRING=share"
+  ];
+
+  postFixup = ''
+    wrapProgram $out/bin/vcmibuilder \
+      --prefix PATH : "${lib.makeBinPath [ innoextract ffmpeg unshield ]}"
+  '';
+
+  passthru.tests.version = testers.testVersion {
+    package = vcmi;
+    command = ''
+      XDG_DATA_HOME="$TMPDIR" XDG_CACHE_HOME="$TMPDIR" XDG_CONFIG_HOME="$TMPDIR" \
+        vcmiclient --version
+    '';
+  };
+
+  meta = with lib; {
+    description = "An open-source engine for Heroes of Might and Magic III";
+    homepage = "https://vcmi.eu";
+    changelog = "https://github.com/vcmi/vcmi/blob/${src.rev}/ChangeLog.md";
+    license = with licenses; [ gpl2Plus cc-by-sa-40 ];
+    maintainers = with maintainers; [ azahi ];
+    platforms = platforms.linux;
+    mainProgram = "vcmilauncher";
+  };
+}
diff --git a/nixpkgs/pkgs/games/vdrift/0001-Ignore-missing-data-for-installation.patch b/nixpkgs/pkgs/games/vdrift/0001-Ignore-missing-data-for-installation.patch
new file mode 100644
index 000000000000..6794e8018aff
--- /dev/null
+++ b/nixpkgs/pkgs/games/vdrift/0001-Ignore-missing-data-for-installation.patch
@@ -0,0 +1,27 @@
+From 7ebe252a8488a63675d1c50c0faa1bdc5ff97889 Mon Sep 17 00:00:00 2001
+From: Linus Heckemann <git@sphalerite.org>
+Date: Fri, 5 Jan 2018 21:27:28 +0100
+Subject: [PATCH] Ignore missing data for installation
+
+This is for packaging vdrift separately from its data in nixpkgs.
+---
+ SConstruct | 3 ---
+ 1 file changed, 3 deletions(-)
+
+diff --git a/SConstruct b/SConstruct
+index 4394de0b..beef29a4 100644
+--- a/SConstruct
++++ b/SConstruct
+@@ -511,9 +511,6 @@ env.Alias(target = 'bin-package', source = bin_archive)
+ #----------------#
+ Export(['env', 'version', 'src_dir', 'bin_dir'])
+ if 'install' in COMMAND_LINE_TARGETS:
+-    if not os.path.isfile('data/SConscript'):
+-        raise 'VDrift data not found. Please make sure data is placed in vdrift directory. See README.md and http://wiki.vdrift.net.' 
+-    SConscript('data/SConscript')
+     # desktop appdata installation
+     install_desktop = env.Install(env['destdir'] + env['prefix'] + '/share/applications', 'vdrift.desktop')
+     install_appdata = env.Install(env['destdir'] + env['prefix'] + '/share/appdata', 'vdrift.appdata.xml')
+-- 
+2.15.0
+
diff --git a/nixpkgs/pkgs/games/vdrift/default.nix b/nixpkgs/pkgs/games/vdrift/default.nix
new file mode 100644
index 000000000000..50fb4af1416a
--- /dev/null
+++ b/nixpkgs/pkgs/games/vdrift/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, fetchsvn
+, pkg-config
+, scons
+, libGLU
+, libGL
+, SDL2
+, SDL2_image
+, libvorbis
+, bullet
+, curl
+, gettext
+, writeShellScriptBin
+
+, data ? fetchsvn {
+    url = "svn://svn.code.sf.net/p/vdrift/code/vdrift-data";
+    rev = "1446";
+    sha256 = "sha256-KEu49GAOfenPyuaUItt6W9pkuqUNpXgmTSFuc7ThljQ=";
+  }
+}:
+let
+  version = "unstable-2021-09-05";
+  bin = stdenv.mkDerivation {
+    pname = "vdrift";
+    inherit version;
+
+    src = fetchFromGitHub {
+      owner = "vdrift";
+      repo = "vdrift";
+      rev = "7e9e00c8612b2014d491f026dd86b03f9fb04dcd";
+      sha256 = "sha256-DrzRF4WzwEXCNALq0jz8nHWZ1oYTEsdrvSYVYI1WkTI=";
+    };
+
+    nativeBuildInputs = [ pkg-config scons ];
+    buildInputs = [ libGLU libGL SDL2 SDL2_image libvorbis bullet curl gettext ];
+
+    patches = [
+      ./0001-Ignore-missing-data-for-installation.patch
+    ];
+
+    buildPhase = ''
+      sed -i -e s,/usr/local,$out, SConstruct
+      export CXXFLAGS="$(pkg-config --cflags SDL2_image)"
+      scons -j$NIX_BUILD_CORES
+    '';
+    installPhase = "scons install";
+
+    meta = {
+      description = "Car racing game";
+      homepage = "http://vdrift.net/";
+      license = lib.licenses.gpl2Plus;
+      maintainers = with lib.maintainers; [ viric ];
+      platforms = lib.platforms.linux;
+    };
+  };
+  wrappedName = "vdrift-${version}-with-data-${toString data.rev}";
+in
+(writeShellScriptBin "vdrift"  ''
+  export VDRIFT_DATA_DIRECTORY="${data}"
+  exec ${bin}/bin/vdrift "$@"
+'').overrideAttrs (_: {
+  name = wrappedName;
+  meta = bin.meta // {
+    hydraPlatforms = [ ];
+  };
+  unwrapped = bin;
+  inherit bin data;
+})
diff --git a/nixpkgs/pkgs/games/vectoroids/default.nix b/nixpkgs/pkgs/games/vectoroids/default.nix
new file mode 100644
index 000000000000..82c157104439
--- /dev/null
+++ b/nixpkgs/pkgs/games/vectoroids/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, stdenv
+, fetchurl
+, SDL
+, SDL_image
+, SDL_mixer
+}:
+
+stdenv.mkDerivation rec {
+  pname = "vectoroids";
+  version = "1.1.0";
+
+  src = fetchurl {
+    url = "ftp://ftp.tuxpaint.org/unix/x/vectoroids/src/vectoroids-${version}.tar.gz";
+    sha256 = "0bkvd4a1v496w0vlvqyi1a6p25ssgpkchxxxi8899sb72wlds54d";
+  };
+
+  buildInputs = [
+    SDL
+    SDL_image
+    SDL_mixer
+  ];
+
+  preConfigure = ''
+    sed -i s,/usr/local,$out, Makefile
+    mkdir -p $out/bin
+  '';
+
+  meta = {
+    homepage = "http://www.newbreedsoftware.com/vectoroids/";
+    description = "Clone of the classic arcade game Asteroids by Atari";
+    license = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/vessel/default.nix b/nixpkgs/pkgs/games/vessel/default.nix
new file mode 100644
index 000000000000..7c535cb323ec
--- /dev/null
+++ b/nixpkgs/pkgs/games/vessel/default.nix
@@ -0,0 +1,84 @@
+{ lib, stdenv, requireFile, SDL, libpulseaudio, alsa-lib, runtimeShell }:
+
+stdenv.mkDerivation rec {
+  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/vessel-${version}-bin" in the
+    directory where you saved it.
+  '';
+
+  src = if (stdenv.isi686) then
+    requireFile {
+      message = goBuyItNow;
+      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 = lib.makeLibraryPath [ stdenv.cc.cc stdenv.cc.libc ]
+    + ":" + lib.makeLibraryPath [ SDL libpulseaudio alsa-lib ] ;
+
+  installPhase = ''
+    mkdir -p $out/libexec/strangeloop/vessel/
+    mkdir -p $out/bin
+
+    # allow scripting of the mojoinstaller
+    gcc -fPIC -shared -o isatty.so $ld_preload
+
+    echo @@@
+    echo @@@ this next step appears to hang for a while
+    echo @@@
+
+    # if we call ld.so $(bin) we don't need to set the ELF interpreter, and save a patchelf step.
+    LD_PRELOAD=./isatty.so $(cat $NIX_CC/nix-support/dynamic-linker) $src << IM_A_BOT
+    n
+    $out/libexec/strangeloop/vessel/
+    IM_A_BOT
+
+    # use nix SDL libraries
+    rm $out/libexec/strangeloop/vessel/x86/libSDL*
+    rm $out/libexec/strangeloop/vessel/x86/libstdc++*
+
+    # props to Ethan Lee (the Vessel porter) for understanding
+    # how $ORIGIN works in rpath. There is hope for humanity.
+    patchelf \
+      --interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \
+      --set-rpath $libPath:$out/libexec/strangeloop/vessel/x86/ \
+      $out/libexec/strangeloop/vessel/x86/vessel.x86
+
+    # we need to libs to find their deps
+    for lib in $out/libexec/strangeloop/vessel/x86/lib* ; do
+    patchelf \
+      --set-rpath $libPath:$out/libexec/strangeloop/vessel/x86/ \
+      $lib
+    done
+
+    cat > $out/bin/Vessel << EOW
+    #!${runtimeShell}
+    cd $out/libexec/strangeloop/vessel/
+    exec ./x86/vessel.x86
+    EOW
+
+    chmod +x $out/bin/Vessel
+  '';
+
+  meta = with lib; {
+    description = "A fluid physics based puzzle game";
+    longDescription = ''
+      Living liquid machines have overrun this world of unstoppable progress,
+      and it is the role of their inventor, Arkwright, to stop the chaos they are
+      causing. Vessel is a game about a man with the power to bring ordinary matter
+      to life, and all the consequences that ensue.
+    '';
+    homepage = "http://www.strangeloopgames.com";
+    license = licenses.unfree;
+    maintainers = with maintainers; [ jcumming ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/games/vessel/isatty.c b/nixpkgs/pkgs/games/vessel/isatty.c
new file mode 100644
index 000000000000..38ee2b6ce2e8
--- /dev/null
+++ b/nixpkgs/pkgs/games/vessel/isatty.c
@@ -0,0 +1,6 @@
+// We override isatty to help 'automate' installers. 
+
+// Some installers (mojoinstall) have a stdio GUI that refuses to run if you
+// feed it a file on stdin. This should help that. 
+
+int isatty(int fd) { return 1; }
diff --git a/nixpkgs/pkgs/games/vimgolf/Gemfile b/nixpkgs/pkgs/games/vimgolf/Gemfile
new file mode 100644
index 000000000000..a375239ffc82
--- /dev/null
+++ b/nixpkgs/pkgs/games/vimgolf/Gemfile
@@ -0,0 +1,2 @@
+source 'https://rubygems.org'
+gem 'vimgolf'
diff --git a/nixpkgs/pkgs/games/vimgolf/Gemfile.lock b/nixpkgs/pkgs/games/vimgolf/Gemfile.lock
new file mode 100644
index 000000000000..9eaf1172d05e
--- /dev/null
+++ b/nixpkgs/pkgs/games/vimgolf/Gemfile.lock
@@ -0,0 +1,19 @@
+GEM
+  remote: https://rubygems.org/
+  specs:
+    highline (2.0.3)
+    json_pure (2.6.1)
+    thor (1.2.1)
+    vimgolf (0.5.0)
+      highline (~> 2.0, >= 2.0.3)
+      json_pure (~> 2.3, >= 2.3.1)
+      thor (~> 1.0, >= 1.0.1)
+
+PLATFORMS
+  ruby
+
+DEPENDENCIES
+  vimgolf
+
+BUNDLED WITH
+   2.1.4
diff --git a/nixpkgs/pkgs/games/vimgolf/default.nix b/nixpkgs/pkgs/games/vimgolf/default.nix
new file mode 100644
index 000000000000..2847ff7dd3bf
--- /dev/null
+++ b/nixpkgs/pkgs/games/vimgolf/default.nix
@@ -0,0 +1,17 @@
+{ lib, bundlerApp, bundlerUpdateScript }:
+
+bundlerApp {
+  pname = "vimgolf";
+  gemdir = ./.;
+  exes = [ "vimgolf" ];
+
+  passthru.updateScript = bundlerUpdateScript "vimgolf";
+
+  meta = with lib; {
+    description = "A game that tests Vim efficiency";
+    homepage = "https://vimgolf.com";
+    license = licenses.mit;
+    maintainers = with maintainers; [ leungbk ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/games/vimgolf/gemset.nix b/nixpkgs/pkgs/games/vimgolf/gemset.nix
new file mode 100644
index 000000000000..17d66b934b22
--- /dev/null
+++ b/nixpkgs/pkgs/games/vimgolf/gemset.nix
@@ -0,0 +1,43 @@
+{
+  highline = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0yclf57n2j3cw8144ania99h1zinf8q3f5zrhqa754j6gl95rp9d";
+      type = "gem";
+    };
+    version = "2.0.3";
+  };
+  json_pure = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "05ddn30jkpw6anfakfm7lffnrl2i0265ryrrwa4j0ivihjr95y82";
+      type = "gem";
+    };
+    version = "2.6.1";
+  };
+  thor = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0inl77jh4ia03jw3iqm5ipr76ghal3hyjrd6r8zqsswwvi9j2xdi";
+      type = "gem";
+    };
+    version = "1.2.1";
+  };
+  vimgolf = {
+    dependencies = ["highline" "json_pure" "thor"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "190dzqkvshd4i6jf30xnpm4sczraw6rdh4wvfh6qnmg0czmj0sny";
+      type = "gem";
+    };
+    version = "0.5.0";
+  };
+}
diff --git a/nixpkgs/pkgs/games/vintagestory/default.nix b/nixpkgs/pkgs/games/vintagestory/default.nix
new file mode 100644
index 000000000000..d2138759bca8
--- /dev/null
+++ b/nixpkgs/pkgs/games/vintagestory/default.nix
@@ -0,0 +1,91 @@
+{ lib
+, stdenv
+, fetchurl
+, makeWrapper
+, makeDesktopItem
+, copyDesktopItems
+, xorg
+, gtk2
+, sqlite
+, openal
+, cairo
+, libGLU
+, SDL2
+, freealut
+, libglvnd
+, pipewire
+, libpulseaudio
+, dotnet-runtime_7
+}:
+
+stdenv.mkDerivation rec {
+  pname = "vintagestory";
+  version = "1.18.15";
+
+  src = fetchurl {
+    url = "https://cdn.vintagestory.at/gamefiles/stable/vs_client_linux-x64_${version}.tar.gz";
+    hash = "sha256-luZwRKVptSd69tCaf6Jv0YOfwOeDOcuY7VoL+21tTEo=";
+  };
+
+
+  nativeBuildInputs = [ makeWrapper copyDesktopItems ];
+
+  buildInputs = [ dotnet-runtime_7 ];
+
+  runtimeLibs = lib.makeLibraryPath ([
+    gtk2
+    sqlite
+    openal
+    cairo
+    libGLU
+    SDL2
+    freealut
+    libglvnd
+    pipewire
+    libpulseaudio
+  ] ++ (with xorg; [
+    libX11
+    libXi
+  ]));
+
+  desktopItems = makeDesktopItem {
+    name = "vintagestory";
+    desktopName = "Vintage Story";
+    exec = "vintagestory";
+    icon = "vintagestory";
+    comment = "Innovate and explore in a sandbox world";
+    categories = [ "Game" ];
+  };
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/share/vintagestory $out/bin $out/share/pixmaps $out/share/fonts/truetype
+    cp -r * $out/share/vintagestory
+    cp $out/share/vintagestory/assets/gameicon.xpm $out/share/pixmaps/vintagestory.xpm
+    cp $out/share/vintagestory/assets/game/fonts/*.ttf $out/share/fonts/truetype
+
+    runHook postInstall
+  '';
+
+  preFixup = ''
+    makeWrapper ${dotnet-runtime_7}/bin/dotnet $out/bin/vintagestory \
+      --prefix LD_LIBRARY_PATH : "${runtimeLibs}" \
+      --add-flags $out/share/vintagestory/Vintagestory.dll
+    makeWrapper ${dotnet-runtime_7}/bin/dotnet $out/bin/vintagestory-server \
+      --prefix LD_LIBRARY_PATH : "${runtimeLibs}" \
+      --add-flags $out/share/vintagestory/VintagestoryServer.dll
+  '' + ''
+    find "$out/share/vintagestory/assets/" -not -path "*/fonts/*" -regex ".*/.*[A-Z].*" | while read -r file; do
+      local filename="$(basename -- "$file")"
+      ln -sf "$filename" "''${file%/*}"/"''${filename,,}"
+    done
+  '';
+
+  meta = with lib; {
+    description = "An in-development indie sandbox game about innovation and exploration";
+    homepage = "https://www.vintagestory.at/";
+    license = licenses.unfree;
+    maintainers = with maintainers; [ artturin gigglesquid ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/vitetris/default.nix b/nixpkgs/pkgs/games/vitetris/default.nix
new file mode 100644
index 000000000000..f7e566b22084
--- /dev/null
+++ b/nixpkgs/pkgs/games/vitetris/default.nix
@@ -0,0 +1,33 @@
+{ stdenv, fetchFromGitHub, lib }:
+
+stdenv.mkDerivation rec {
+  pname = "vitetris";
+  version = "0.59.1";
+
+  src = fetchFromGitHub {
+    owner = "vicgeralds";
+    repo = "vitetris";
+    rev = "v${version}";
+    sha256 = "sha256-Rbfa2hD67RGmInfWwYD4SthL8lm5bGSBi3oudV5hAao=";
+  };
+
+  hardeningDisable = [ "format" ];
+
+  makeFlags = [ "INSTALL=install" ];
+
+  meta = {
+    description = "Terminal-based Tetris clone by Victor Nilsson";
+    homepage = "http://www.victornils.net/tetris/";
+    license = lib.licenses.bsd2;
+    maintainers = with lib.maintainers; [ siers ];
+    mainProgram = "tetris";
+
+    longDescription = ''
+      vitetris is a terminal-based Tetris clone by Victor Nilsson. Gameplay is much
+      like the early Tetris games by Nintendo.
+
+      Features include: configurable keys, highscore table, two-player mode with
+      garbage, network play, joystick (gamepad) support on Linux or with Allegro.
+    '';
+  };
+}
diff --git a/nixpkgs/pkgs/games/vms-empire/default.nix b/nixpkgs/pkgs/games/vms-empire/default.nix
new file mode 100644
index 000000000000..b3e89617ef33
--- /dev/null
+++ b/nixpkgs/pkgs/games/vms-empire/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, stdenv
+, fetchurl
+, ncurses
+, xmlto
+, docbook_xml_dtd_44
+, docbook_xsl
+, installShellFiles
+}:
+
+stdenv.mkDerivation rec {
+  pname = "vms-empire";
+  version = "1.16";
+
+  src = fetchurl{
+    url = "http://www.catb.org/~esr/${pname}/${pname}-${version}.tar.gz";
+    hash = "sha256-XETIbt/qVU+TpamPc2WQynqqUuZqkTUnItBprjg+gPk=";
+  };
+
+  nativeBuildInputs = [ installShellFiles ];
+  buildInputs = [
+    ncurses
+    xmlto
+    docbook_xml_dtd_44
+    docbook_xsl
+  ];
+
+  postBuild = ''
+    xmlto man vms-empire.xml
+    xmlto html-nochunks vms-empire.xml
+  '';
+
+  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" ];
+
+  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
+      computer and you. Naturally, there is only room for one, so the object of
+      the game is to destroy the other. The computer plays by the same rules
+      that you do. This game was ancestral to all later
+      expand/explore/exploit/exterminate games, including Civilization and
+      Master of Orion.
+    '';
+    license = licenses.gpl2Only;
+    maintainers = [ maintainers.AndersonTorres ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/games/voxelands/default.nix b/nixpkgs/pkgs/games/voxelands/default.nix
new file mode 100644
index 000000000000..906c3b9bd36c
--- /dev/null
+++ b/nixpkgs/pkgs/games/voxelands/default.nix
@@ -0,0 +1,74 @@
+{ lib, stdenv
+, fetchFromGitLab
+, bzip2
+, cmake
+, expat
+, freetype
+, irrlicht
+, libICE
+, libGL
+, libGLU
+, libSM
+, libX11
+, libXext
+, libXxf86vm
+, libjpeg
+, libpng
+, libvorbis
+, openal
+, pkg-config
+, sqlite
+}:
+
+stdenv.mkDerivation rec {
+  pname = "voxelands";
+  version = "1704.00";
+
+  src = fetchFromGitLab {
+    owner = pname;
+    repo = pname;
+    rev = version;
+    sha256 = "0yj9z9nygpn0z63y739v72l3kg81wd71xgix5k045vfzhqsam5m0";
+  };
+
+  cmakeFlags = [
+    "-DIRRLICHT_INCLUDE_DIR=${irrlicht}/include/irrlicht"
+    "-DCMAKE_C_FLAGS_RELEASE=-DNDEBUG"
+    "-DCMAKE_CXX_FLAGS_RELEASE=-DNDEBUG"
+  ];
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+  ];
+
+  buildInputs = [
+    # has to go before others to override transitive libpng-1.6
+    libpng
+
+    bzip2
+    expat
+    freetype
+    irrlicht
+    libICE
+    libGL
+    libGLU
+    libSM
+    libX11
+    libXext
+    libXxf86vm
+    libjpeg
+    libvorbis
+    openal
+    sqlite
+  ];
+
+  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/nixpkgs/pkgs/games/vvvvvv/default.nix b/nixpkgs/pkgs/games/vvvvvv/default.nix
new file mode 100644
index 000000000000..909bfa430d70
--- /dev/null
+++ b/nixpkgs/pkgs/games/vvvvvv/default.nix
@@ -0,0 +1,102 @@
+{ stdenv
+, lib
+, fetchFromGitHub
+, fetchurl
+, cmake
+, makeWrapper
+, copyDesktopItems
+, makeDesktopItem
+, physfs
+, SDL2
+, SDL2_mixer
+, tinyxml-2
+, utf8cpp
+, Foundation
+, IOKit
+, makeAndPlay ? false
+}:
+
+stdenv.mkDerivation rec {
+  pname = "vvvvvv";
+  version = "2.3.6";
+
+  src = fetchFromGitHub {
+    owner = "TerryCavanagh";
+    repo = "VVVVVV";
+    rev = version;
+    sha256 = "sha256-sLNO4vkmlirsqJmCV9YWpyNnIiigU1KMls7rOgWgSmQ=";
+  };
+
+  patches = [
+    ./utf8cpp.patch
+  ];
+
+  dataZip = fetchurl {
+    url = "https://thelettervsixtim.es/makeandplay/data.zip";
+    name = "data.zip";
+    sha256 = "sha256-x2eAlZT2Ry2p9WE252ZX44ZA1YQWSkYRIlCsYpPswOo=";
+    meta.license = lib.licenses.unfree;
+  };
+
+  nativeBuildInputs = [
+    cmake
+    makeWrapper
+    copyDesktopItems
+  ];
+
+  buildInputs = [
+    physfs
+    SDL2
+    SDL2_mixer
+    tinyxml-2
+    utf8cpp
+  ] ++ lib.optionals stdenv.isDarwin [ Foundation IOKit ];
+
+  # Help CMake find SDL_mixer.h
+  env.NIX_CFLAGS_COMPILE = "-I${lib.getDev SDL2_mixer}/include/SDL2";
+
+  cmakeDir = "../desktop_version";
+
+  cmakeFlags = [
+    "-DBUNDLE_DEPENDENCIES=OFF"
+    "-DCMAKE_CXX_FLAGS='-I${lib.getDev utf8cpp}/include/utf8cpp'"
+  ] ++ lib.optional makeAndPlay "-DMAKEANDPLAY=ON";
+
+  desktopItems = [
+    (makeDesktopItem {
+      type = "Application";
+      name = "VVVVVV";
+      desktopName = "VVVVVV";
+      comment = meta.description;
+      exec = pname;
+      icon = "VVVVVV";
+      terminal = false;
+      categories = [ "Game" ];
+    })
+  ];
+
+  installPhase = ''
+    runHook preInstall
+
+    install -Dm755 VVVVVV $out/bin/${pname}
+    install -Dm644 "$src/desktop_version/icon.ico" "$out/share/pixmaps/VVVVVV.png"
+
+    wrapProgram $out/bin/${pname} --add-flags "-assets ${dataZip}"
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "A retro-styled platform game" + lib.optionalString makeAndPlay " (redistributable, without original levels)";
+    longDescription = ''
+      VVVVVV is a platform game all about exploring one simple mechanical
+      idea - what if you reversed gravity instead of jumping?
+    '' + lib.optionalString makeAndPlay ''
+      (Redistributable version, doesn't include the original levels.)
+    '';
+    homepage = "https://thelettervsixtim.es";
+    license = licenses.unfree;
+    maintainers = with maintainers; [ martfont ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/games/vvvvvv/utf8cpp.patch b/nixpkgs/pkgs/games/vvvvvv/utf8cpp.patch
new file mode 100644
index 000000000000..fc279564e759
--- /dev/null
+++ b/nixpkgs/pkgs/games/vvvvvv/utf8cpp.patch
@@ -0,0 +1,13 @@
+diff --git a/desktop_version/CMakeLists.txt b/desktop_version/CMakeLists.txt
+index 7405c122..68ba40e3 100644
+--- a/desktop_version/CMakeLists.txt
++++ b/desktop_version/CMakeLists.txt
+@@ -296,7 +296,7 @@ if(BUNDLE_DEPENDENCIES)
+ else()
+ 	find_package(utf8cpp CONFIG)
+ 
+-	target_link_libraries(VVVVVV physfs tinyxml2 utf8cpp lodepng-static)
++	target_link_libraries(VVVVVV physfs tinyxml2 utf8cpp::utf8cpp lodepng-static)
+ endif()
+ 
+ # SDL2 Dependency (Detection pulled from FAudio)
diff --git a/nixpkgs/pkgs/games/wargus/default.nix b/nixpkgs/pkgs/games/wargus/default.nix
new file mode 100644
index 000000000000..ca4b70923eca
--- /dev/null
+++ b/nixpkgs/pkgs/games/wargus/default.nix
@@ -0,0 +1,63 @@
+{ stdenv, lib, callPackage, fetchFromGitHub
+, fetchurl, runCommand, unzip, bchunk, p7zip
+, cmake, pkg-config, makeWrapper
+, zlib, bzip2, libpng
+, dialog, python3, cdparanoia, ffmpeg
+}:
+
+let
+  stratagus = callPackage ./stratagus.nix {};
+
+  dataDownload = fetchurl {
+    url = "https://archive.org/download/warcraft-ii-tides-of-darkness_202105/Warcess.zip";
+    sha256 = "0yxgvf8xpv1w2bjmny4a38pa3xcdgqckk9abj21ilkc5zqzqmm9b";
+  };
+
+  data = runCommand "warcraft2" {
+    buildInputs = [ unzip bchunk p7zip ];
+    meta.license = lib.licenses.unfree;
+  } ''
+    unzip ${dataDownload} "Warcraft.II.Tides.of.Darkness/Warcraft II - Tides of Darkness (1995)/games/WarcrafD/cd/"{WC2BTDP.img,WC2BTDP.cue}
+    bchunk "Warcraft.II.Tides.of.Darkness/Warcraft II - Tides of Darkness (1995)/games/WarcrafD/cd/"{WC2BTDP.img,WC2BTDP.cue} WC2BTDP
+    rm -r Warcraft.II.Tides.of.Darkness
+    7z x WC2BTDP01.iso
+    rm WC2BTDP*.{iso,cdr}
+    cp -r DATA $out
+  '';
+
+in
+stdenv.mkDerivation rec {
+  pname = "wargus";
+  inherit (stratagus) version;
+
+  src = fetchFromGitHub {
+    owner = "wargus";
+    repo = "wargus";
+    rev = "v${version}";
+    sha256 = "sha256-yJeMFxCD0ikwVPQApf+IBuMQ6eOjn1fVKNmqh6r760c=";
+  };
+
+  nativeBuildInputs = [ cmake pkg-config makeWrapper ffmpeg ];
+  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" ]}
+    substituteInPlace $out/share/applications/wargus.desktop \
+      --replace $out/games/wargus $out/bin/wargus
+
+    $out/bin/wartool -v -r ${data} $out/share/games/stratagus/wargus
+    ln -s $out/share/games/stratagus/wargus/{contrib/black_title.png,graphics/ui/black_title.png}
+  '';
+
+  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/nixpkgs/pkgs/games/wargus/stratagus.nix b/nixpkgs/pkgs/games/wargus/stratagus.nix
new file mode 100644
index 000000000000..fc4f23427994
--- /dev/null
+++ b/nixpkgs/pkgs/games/wargus/stratagus.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, fetchFromGitHub
+, cmake, pkg-config, makeWrapper
+, zlib, bzip2, libpng, lua5_1, toluapp
+, SDL2, SDL2_mixer, SDL2_image, libGL
+}:
+
+stdenv.mkDerivation rec {
+  pname = "stratagus";
+  version = "3.3.1";
+
+  src = fetchFromGitHub {
+    owner = "wargus";
+    repo = "stratagus";
+    rev = "v${version}";
+    sha256 = "sha256-q8AvIWr/bOzI0wV0D2emxIXYEKDYmFxbtwr2BS+xYfA=";
+  };
+
+  nativeBuildInputs = [ cmake pkg-config ];
+  buildInputs = [
+    zlib bzip2 libpng
+    lua5_1 toluapp
+    (lib.getDev SDL2) SDL2_image SDL2_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/nixpkgs/pkgs/games/warmux/default.nix b/nixpkgs/pkgs/games/warmux/default.nix
new file mode 100644
index 000000000000..6b52194ffcae
--- /dev/null
+++ b/nixpkgs/pkgs/games/warmux/default.nix
@@ -0,0 +1,37 @@
+{ 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, pkg-config
+, gettext, intltool, libtool, perl
+}:
+
+stdenv.mkDerivation {
+  pname = "warmux";
+  version = "unstable-2017-10-20";
+
+  src = fetchFromGitHub {
+    owner = "fluxer";
+    repo = "warmux";
+    rev = "8f81d4fc309a548ae89a068c2dde27b7e7ef8851";
+    sha256 = "1hvzglsmp75xiqqb0k75qjz4jwi8kl3fhn8zfsz53hhhqmbw6wkr";
+  };
+
+  preConfigure = "patchShebangs autogen.sh && ./autogen.sh";
+  configureFlagsArray = ("CFLAGS=-include ${zlib.dev}/include/zlib.h");
+
+  nativeBuildInputs = [
+    autoconf automake gettext intltool libtool pkg-config
+  ];
+  buildInputs = [
+    zlib curl gnutls fribidi libpng SDL SDL_gfx SDL_image SDL_mixer
+    SDL_net SDL_ttf libunwind libX11 xorgproto libxml2 perl
+  ];
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    description = "Ballistics turn-based battle game between teams - unofficial copy";
+    maintainers = with maintainers; [ raskin ];
+    platforms = platforms.linux;
+    license = with licenses; [ gpl2 ufl ];
+    homepage = "https://github.com/fluxer/warmux";
+  };
+}
diff --git a/nixpkgs/pkgs/games/warsow/default.nix b/nixpkgs/pkgs/games/warsow/default.nix
new file mode 100644
index 000000000000..007b124ba58c
--- /dev/null
+++ b/nixpkgs/pkgs/games/warsow/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv, fetchurl, warsow-engine, makeWrapper }:
+
+stdenv.mkDerivation rec {
+  pname = "warsow";
+  version = "2.1.2";
+
+  src = fetchurl {
+    url = "http://warsow.net/${pname}-${version}.tar.gz";
+    sha256 = "07y2airw5qg3s1bf1c63a6snjj22riz0mqhk62jmfm9nrarhavrc";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  installPhase = ''
+    mkdir -p $out/share/warsow
+    cp -r basewsw $out/share/warsow
+    ln -s ${warsow-engine}/lib/warsow $out/share/warsow/libs
+
+    mkdir -p $out/bin
+    for i in ${warsow-engine}/bin/*; do
+      makeWrapper "$i" "$out/bin/$(basename "$i")" --chdir "$out/share/warsow"
+    done
+  '';
+
+  meta = with lib; {
+    description = "Multiplayer FPS game designed for competitive gaming";
+    longDescription = ''
+      Set in a futuristic cartoon-like world where rocketlauncher-wielding
+      pigs and lasergun-carrying cyberpunks roam the streets, Warsow is a
+      completely free fast-paced first-person shooter (FPS) for Windows, Linux
+      and macOS.
+    '';
+    homepage = "http://www.warsow.net";
+    license = licenses.unfreeRedistributable;
+    maintainers = with maintainers; [ astsmtl abbradar ];
+    platforms = warsow-engine.meta.platforms;
+  };
+}
diff --git a/nixpkgs/pkgs/games/warsow/engine.nix b/nixpkgs/pkgs/games/warsow/engine.nix
new file mode 100644
index 000000000000..5bc2ef7dbd91
--- /dev/null
+++ b/nixpkgs/pkgs/games/warsow/engine.nix
@@ -0,0 +1,59 @@
+{ stdenv, lib, substituteAll, fetchurl, cmake, libogg, libvorbis, libtheora, curl, freetype
+, libjpeg, libpng, SDL2, libGL, openal, zlib
+}:
+
+stdenv.mkDerivation rec {
+  pname = "warsow-engine";
+  version = "2.1.0";
+
+  src = fetchurl {
+    url = "http://slice.sh/warsow/warsow_21_sdk.tar.gz";
+    sha256 = "0fj5k7qpf6far8i1xhqxlpfjch10zj26xpilhp95aq2yiz08pj4r";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./libpath.patch;
+      inherit zlib curl libpng libjpeg libogg libvorbis libtheora freetype;
+    })
+  ];
+
+  nativeBuildInputs = [ cmake ];
+
+  buildInputs = [
+    libogg libvorbis libtheora curl freetype libjpeg SDL2 libGL openal zlib
+    libpng
+  ];
+
+  # Workaround build failure on -fno-common toolchains:
+  #   ld: CMakeFiles/wswtv_server.dir/__/unix/unix_time.c.o:(.bss+0x8): multiple definition of
+  #     `c_pointcontents'; CMakeFiles/wswtv_server.dir/__/null/ascript_null.c.o:(.bss+0x8): first defined here
+  env.NIX_CFLAGS_COMPILE = "-fcommon";
+
+  cmakeFlags = [ "-DQFUSION_GAME=Warsow" ];
+
+  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 lib; {
+    description = "Multiplayer FPS game designed for competitive gaming (engine only)";
+    homepage = "http://www.warsow.net";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ astsmtl abbradar ];
+    platforms = platforms.linux;
+    broken = stdenv.isAarch64;
+  };
+}
diff --git a/nixpkgs/pkgs/games/warsow/libpath.patch b/nixpkgs/pkgs/games/warsow/libpath.patch
new file mode 100644
index 000000000000..ad2487102379
--- /dev/null
+++ b/nixpkgs/pkgs/games/warsow/libpath.patch
@@ -0,0 +1,28 @@
+diff -ru3 warsow_21_sdk_old/source/source/gameshared/q_arch.h warsow_21_sdk_new/source/source/gameshared/q_arch.h
+--- warsow_21_sdk_old/source/source/gameshared/q_arch.h	2016-03-26 22:22:10.000000000 +0300
++++ warsow_21_sdk_new/source/source/gameshared/q_arch.h	2018-03-13 00:37:29.907019953 +0300
+@@ -206,15 +206,15 @@
+ #endif
+ 
+ // FIXME: move these to CMakeLists.txt
+-#define LIBZ_LIBNAME "libz.so.1|libz.so"
+-#define LIBCURL_LIBNAME "libcurl.so.4|libcurl.so.3|libcurl.so"
+-#define LIBPNG_LIBNAME "libpng16.so.16|libpng15.so.15|libpng14.so.14|libpng12.so.0|libpng.so"
+-#define LIBJPEG_LIBNAME "libjpeg.so.8|libjpeg.so"
+-#define LIBOGG_LIBNAME "libogg.so.0|libogg.so"
+-#define LIBVORBIS_LIBNAME "libvorbis.so.0|libvorbis.so"
+-#define LIBVORBISFILE_LIBNAME "libvorbisfile.so.3|libvorbisfile.so"
+-#define LIBTHEORA_LIBNAME "libtheora.so.0|libtheora.so"
+-#define LIBFREETYPE_LIBNAME "libfreetype.so.6|libfreetype.so"
++#define LIBZ_LIBNAME "@zlib@/lib/libz.so"
++#define LIBCURL_LIBNAME "@curl@/lib/libcurl.so"
++#define LIBPNG_LIBNAME "@libpng@/lib/libpng.so"
++#define LIBJPEG_LIBNAME "@libjpeg@/lib/libjpeg.so"
++#define LIBOGG_LIBNAME "@libogg@/lib/libogg.so"
++#define LIBVORBIS_LIBNAME "@libvorbis@/lib/libvorbis.so"
++#define LIBVORBISFILE_LIBNAME "@libvorbis@/lib/libvorbisfile.so"
++#define LIBTHEORA_LIBNAME "@libtheora@/lib/libtheora.so"
++#define LIBFREETYPE_LIBNAME "@freetype@/lib/libfreetype.so"
+ 
+ #if defined ( __FreeBSD__ )
+ #define BUILDSTRING "FreeBSD"
diff --git a/nixpkgs/pkgs/games/warzone2100/default.nix b/nixpkgs/pkgs/games/warzone2100/default.nix
new file mode 100644
index 000000000000..be2525c98716
--- /dev/null
+++ b/nixpkgs/pkgs/games/warzone2100/default.nix
@@ -0,0 +1,145 @@
+{ lib
+, stdenv
+, fetchurl
+, cmake
+, ninja
+, p7zip
+, pkg-config
+, asciidoctor
+, gettext
+
+, SDL2
+, libtheora
+, libvorbis
+, libopus
+, openal
+, openalSoft
+, physfs
+, miniupnpc
+, libsodium
+, curl
+, libpng
+, freetype
+, harfbuzz
+, sqlite
+, which
+, vulkan-headers
+, vulkan-loader
+, shaderc
+
+, testers
+, warzone2100
+, nixosTests
+
+, gitUpdater
+
+, withVideos ? false
+}:
+
+let
+  pname = "warzone2100";
+  sequences_src = fetchurl {
+    url = "mirror://sourceforge/${pname}/warzone2100/Videos/high-quality-en/sequences.wz";
+    sha256 = "90ff552ca4a70e2537e027e22c5098ea4ed1bc11bb7fc94138c6c941a73d29fa";
+  };
+in
+
+stdenv.mkDerivation rec {
+  inherit pname;
+  version  = "4.4.2";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/project/warzone2100/releases/${version}/warzone2100_src.tar.xz";
+    hash = "sha256-O5Yqxqp1vKYr8uvAZ1SdsI/kocOzg0KRCirCqqvLrN4=";
+  };
+
+  buildInputs = [
+    SDL2
+    libtheora
+    libvorbis
+    libopus
+    openal
+    openalSoft
+    physfs
+    miniupnpc
+    libsodium
+    curl
+    libpng
+    freetype
+    harfbuzz
+    sqlite
+  ] ++ lib.optionals (!stdenv.isDarwin) [
+    vulkan-headers
+    vulkan-loader
+  ];
+
+  nativeBuildInputs = [
+    pkg-config
+    cmake
+    ninja
+    p7zip
+    asciidoctor
+    gettext
+    shaderc
+  ];
+
+  postPatch = ''
+    substituteInPlace lib/exceptionhandler/dumpinfo.cpp \
+                      --replace '"which "' '"${which}/bin/which "'
+    substituteInPlace lib/exceptionhandler/exceptionhandler.cpp \
+                      --replace "which %s" "${which}/bin/which %s"
+  '';
+
+  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"
+  ] ++ lib.optional stdenv.isDarwin "-P../configure_mac.cmake";
+
+  postInstall = lib.optionalString withVideos ''
+    cp ${sequences_src} $out/share/warzone2100/sequences.wz
+  '';
+
+  passthru.tests = {
+    version = testers.testVersion {
+      package = warzone2100;
+      # The command always exits with code 1
+      command = "(warzone2100 --version || [ $? -eq 1 ])";
+    };
+    nixosTest = nixosTests.warzone2100;
+  };
+
+  passthru.updateScript = gitUpdater {
+    url = "https://github.com/Warzone2100/warzone2100";
+  };
+
+  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
+      hybrid computer game, originally developed by Pumpkin Studios and
+      published by Eidos Interactive.
+        In Warzone 2100, you command the forces of The Project in a battle to
+      rebuild the world after mankind has almost been destroyed by nuclear
+      missiles. The game offers campaign, multi-player, and single-player
+      skirmish modes. An extensive tech tree with over 400 different
+      technologies, combined with the unit design system, allows for a wide
+      variety of possible units and tactics.
+    '';
+    homepage = "https://wz2100.net";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ astsmtl fgaz ];
+    platforms = platforms.all;
+    # configure_mac.cmake tries to download stuff
+    # https://github.com/Warzone2100/warzone2100/blob/master/macosx/README.md
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/games/wesnoth/default.nix b/nixpkgs/pkgs/games/wesnoth/default.nix
new file mode 100644
index 000000000000..df5b393ccded
--- /dev/null
+++ b/nixpkgs/pkgs/games/wesnoth/default.nix
@@ -0,0 +1,51 @@
+{ lib, stdenv, fetchFromGitHub, fetchpatch
+, cmake, pkg-config, SDL2, SDL2_image, SDL2_mixer, SDL2_net, SDL2_ttf
+, pango, gettext, boost, libvorbis, fribidi, dbus, libpng, pcre, openssl, icu
+, Cocoa, Foundation
+}:
+
+stdenv.mkDerivation rec {
+  pname = "wesnoth";
+  version = "1.16.9";
+
+  src = fetchFromGitHub {
+    rev = version;
+    owner = "wesnoth";
+    repo = "wesnoth";
+    hash = "sha256-KtAPc2nsqSoHNsLTLom/yaUECn+IWBdBFpiMclrUHxM=";
+  };
+
+  patches = [
+    # Pull upstream fix https://github.com/wesnoth/wesnoth/pull/6726
+    # for gcc-13 support.
+    (fetchpatch {
+      name = "gcc-134.patch";
+      url = "https://github.com/wesnoth/wesnoth/commit/f073493ebc279cefa391d364c48265058795e1d2.patch";
+      hash = "sha256-uTB65DEBZwHFRgDwNx/yVjzmnW3jRoiibadXhNcwMkI=";
+    })
+  ];
+
+  nativeBuildInputs = [ cmake pkg-config ];
+
+  buildInputs = [ SDL2 SDL2_image SDL2_mixer SDL2_net SDL2_ttf pango gettext boost
+                  libvorbis fribidi dbus libpng pcre openssl icu ]
+                ++ lib.optionals stdenv.isDarwin [ Cocoa Foundation];
+
+  NIX_LDFLAGS = lib.optionalString stdenv.isDarwin "-framework AppKit";
+
+  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
+      game with a high fantasy theme, featuring both single-player, and
+      online/hotseat multiplayer combat. Fight a desperate battle to
+      reclaim the throne of Wesnoth, or take hand in any number of other
+      adventures.
+    '';
+
+    homepage = "https://www.wesnoth.org/";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ abbradar ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/games/widelands/default.nix b/nixpkgs/pkgs/games/widelands/default.nix
new file mode 100644
index 000000000000..f49921024e45
--- /dev/null
+++ b/nixpkgs/pkgs/games/widelands/default.nix
@@ -0,0 +1,102 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, fetchpatch
+, pkg-config # needed to find minizip
+, SDL2
+, SDL2_image
+, SDL2_mixer
+, SDL2_net
+, SDL2_ttf
+, cmake
+, curl
+, doxygen
+, gettext
+, glew
+, graphviz
+, icu
+, installShellFiles
+, libpng
+, lua
+, python3
+, zlib
+, minizip
+, asio
+, libSM
+, libICE
+, libXext
+}:
+
+stdenv.mkDerivation rec {
+  pname = "widelands";
+  version = "1.1";
+
+  src = fetchFromGitHub {
+    owner = "widelands";
+    repo = "widelands";
+    rev = "v${version}";
+    sha256 = "sha256-fe1fey34b6T1+kqMa22STROu7dagQJtg24nW2jhVix8=";
+  };
+
+  postPatch = ''
+    substituteInPlace xdg/org.widelands.Widelands.desktop \
+      --replace 'Exec=widelands' "Exec=$out/bin/widelands"
+  '';
+
+  cmakeFlags = [
+    "-Wno-dev" # dev warnings are only needed for upstream development
+    "-DWL_INSTALL_BASEDIR=${placeholder "out"}/share/widelands" # for COPYING, Changelog, etc.
+    "-DWL_INSTALL_DATADIR=${placeholder "out"}/share/widelands" # for game data
+    "-DWL_INSTALL_BINDIR=${placeholder "out"}/bin"
+  ];
+
+  nativeBuildInputs = [ cmake doxygen gettext graphviz installShellFiles pkg-config ];
+
+  enableParallelBuilding = true;
+
+  buildInputs = [
+    SDL2
+    SDL2_image
+    SDL2_mixer
+    SDL2_net
+    SDL2_ttf
+    curl
+    glew
+    icu
+    libpng
+    lua
+    python3
+    zlib
+    minizip
+    asio
+    libSM  # XXX: these should be propagated by SDL2?
+    libICE
+    libXext
+  ];
+
+  postInstall = ''
+    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
+  '';
+
+  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.
+    '';
+    changelog = "https://github.com/widelands/widelands/releases/tag/v1.1";
+    mainProgram = "widelands";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ raskin jcumming ];
+    platforms = platforms.linux;
+    hydraPlatforms = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/wipeout-rewrite/default.nix b/nixpkgs/pkgs/games/wipeout-rewrite/default.nix
new file mode 100644
index 000000000000..16703fad517b
--- /dev/null
+++ b/nixpkgs/pkgs/games/wipeout-rewrite/default.nix
@@ -0,0 +1,71 @@
+{ stdenv
+, lib
+, fetchFromGitHub
+, makeWrapper
+, Foundation
+, glew
+, SDL2
+, writeShellScript
+}:
+
+let
+  datadir = "\"\${XDG_DATA_HOME:-$HOME/.local/share}\"/wipeout-rewrite";
+  datadirCheck = writeShellScript "wipeout-rewrite-check-datadir.sh" ''
+    datadir=${datadir}
+
+    if [ ! -d "$datadir" ]; then
+      echo "[Wrapper] Creating data directory $datadir"
+      mkdir -p "$datadir"
+    fi
+
+    echo "[Wrapper] Remember to put your game assets into $datadir/wipeout if you haven't done so yet!"
+    echo "[Wrapper] Check https://github.com/phoboslab/wipeout-rewrite#running for the required format."
+  '';
+in
+stdenv.mkDerivation (finalAttrs: {
+  pname = "wipeout-rewrite";
+  version = "unstable-2023-08-13";
+
+  src = fetchFromGitHub {
+    owner = "phoboslab";
+    repo = "wipeout-rewrite";
+    rev = "7a9f757a79d5c6806252cc1268bda5cdef463e23";
+    hash = "sha256-21IG9mZPGgRhVkT087G+Bz/zLkknkHKGmWjSpcLw8vE=";
+  };
+
+  enableParallelBuilding = true;
+
+  nativeBuildInputs = [
+    makeWrapper
+  ];
+
+  buildInputs = [
+    glew
+    SDL2
+  ] ++ lib.optionals stdenv.hostPlatform.isDarwin [
+    Foundation
+  ];
+
+  installPhase = ''
+    runHook preInstall
+
+    install -Dm755 wipegame $out/bin/wipegame
+
+    # I can't get --chdir to not expand the bash variables in datadir at build time (so they point to /homeless-shelter)
+    # or put them inside single quotes (breaking the expansion at runtime)
+    wrapProgram $out/bin/wipegame \
+      --run '${datadirCheck}' \
+      --run 'cd ${datadir}'
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    mainProgram = "wipegame";
+    description = "A re-implementation of the 1995 PSX game wipEout";
+    homepage = "https://github.com/phoboslab/wipeout-rewrite";
+    license = licenses.unfree;
+    maintainers = with maintainers; [ OPNA2608 ];
+    platforms = platforms.all;
+  };
+})
diff --git a/nixpkgs/pkgs/games/wireworld/default.nix b/nixpkgs/pkgs/games/wireworld/default.nix
new file mode 100644
index 000000000000..828d313d2a87
--- /dev/null
+++ b/nixpkgs/pkgs/games/wireworld/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, stdenv
+, fetchFromGitLab
+, zip
+, love
+, makeWrapper
+, makeDesktopItem
+, copyDesktopItems
+, strip-nondeterminism
+}:
+
+stdenv.mkDerivation rec {
+  pname = "wireworld";
+  version = "unstable-2023-05-09";
+
+  src = fetchFromGitLab {
+    owner = "blinry";
+    repo = pname;
+    rev = "03b82bf5d604d6d4ad3c07b224583de6c396fd17";
+    hash = "sha256-8BshnGLuA8lmG9g7FU349DWKP/fZvlvjrQBau/LSJ4E=";
+  };
+
+  nativeBuildInputs = [
+    copyDesktopItems
+    makeWrapper
+    strip-nondeterminism
+    zip
+  ];
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "Wireworld";
+      exec = pname;
+      comment = "";
+      desktopName = "Wireworld";
+      genericName = "Wireworld";
+      categories = [ "Game" ];
+    })
+  ];
+
+  installPhase = ''
+    runHook preInstall
+    zip -9 -r Wireworld.love ./*
+    strip-nondeterminism --type zip Wireworld.love
+    install -Dm444 -t $out/share/games/lovegames/ Wireworld.love
+    makeWrapper ${love}/bin/love $out/bin/Wireworld \
+      --add-flags $out/share/games/lovegames/Wireworld.love
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Fascinating electronics logic puzzles, game where you'll learn how to build clocks, diodes, and logic gates";
+    license = with licenses; [
+      mit
+      ofl
+      blueOak100
+      cc-by-sa-30
+      cc-by-sa-40
+    ];
+    downloadPage = "https://ldjam.com/events/ludum-dare/53/wireworld";
+    maintainers = with lib.maintainers; [ janik ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/games/wolfstoneextract/default.nix b/nixpkgs/pkgs/games/wolfstoneextract/default.nix
new file mode 100644
index 000000000000..159e6ae3f15c
--- /dev/null
+++ b/nixpkgs/pkgs/games/wolfstoneextract/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, stdenv
+, fetchFromBitbucket
+, cmake
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "wolfstoneextract";
+  version = "1.2";
+
+  src = fetchFromBitbucket {
+    owner = "ecwolf";
+    repo = "wolfstoneextract";
+    rev = finalAttrs.version;
+    hash = "sha256-yrYLP2ewOtiry+EgH1IEaxz2Q55mqQ6mRGSxzVUnJ8Q=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+  ];
+
+  meta = with lib; {
+    description = "Utility to extract Wolfstone data from Wolfenstein II";
+    homepage = "https://bitbucket.org/ecwolf/wolfstoneextract/src/master/";
+    platforms = [ "x86_64-linux" ];
+    license = with licenses; [ gpl3Only bsd3 ];
+    maintainers = with maintainers; [ keenanweaver ];
+  };
+})
diff --git a/nixpkgs/pkgs/games/worldofgoo/default.nix b/nixpkgs/pkgs/games/worldofgoo/default.nix
new file mode 100644
index 000000000000..4b38c86fbdce
--- /dev/null
+++ b/nixpkgs/pkgs/games/worldofgoo/default.nix
@@ -0,0 +1,75 @@
+{ lib, stdenv, requireFile, unzip, makeDesktopItem, SDL2, SDL2_mixer, libogg, libvorbis }:
+
+let
+  arch = if stdenv.system == "x86_64-linux"
+    then "x86_64"
+    else "x86";
+
+  desktopItem = makeDesktopItem {
+    desktopName = "World of Goo";
+    genericName = "World of Goo";
+    categories = [ "Game" ];
+    exec = "WorldOfGoo.bin.${arch}";
+    icon = "2dboy-worldofgoo";
+    name = "worldofgoo";
+  };
+
+in
+
+stdenv.mkDerivation rec {
+  pname = "WorldOfGoo";
+  version = "1.53";
+
+  helpMsg = ''
+    We cannot download the full version automatically, as you require a license.
+    Once you have 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/${pname}.Linux${version}.sh"
+    in the directory where you saved it.
+  '';
+
+  src = requireFile {
+    message = helpMsg;
+    name = "WorldOfGoo.Linux.1.53.sh";
+    sha256 = "175e4b0499a765f1564942da4bd65029f8aae1de8231749c56bec672187d53ee";
+  };
+
+  nativeBuildInputs = [ unzip ];
+  sourceRoot = pname;
+  phases = [ "unpackPhase installPhase" ];
+
+  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
+    # 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
+    unzip -q ${src}.zip -d ${pname}
+  '';
+
+  installPhase = ''
+    mkdir -p $out/bin $out/share/applications $out/share/icons/hicolor/256x256/apps
+
+    install -t $out/bin -m755 data/${arch}/WorldOfGoo.bin.${arch}
+    cp -R data/noarch/* $out/bin
+    cp data/noarch/game/gooicon.png $out/share/icons/hicolor/256x256/apps/2dboy-worldofgoo.png
+    cp ${desktopItem}/share/applications/worldofgoo.desktop \
+      $out/share/applications/worldofgoo.desktop
+
+    patchelf --interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" --set-rpath $libPath $out/bin/WorldOfGoo.bin.${arch}
+  '';
+
+  meta = with lib; {
+    description = "A physics based puzzle game";
+    longDescription = ''
+      World of Goo is a physics based puzzle / construction game. The millions of Goo
+      Balls who live in the beautiful World of Goo don't know that they are in a
+      game, or that they are extremely delicious.
+    '';
+    homepage = "https://worldofgoo.com";
+    license = licenses.unfree;
+    platforms = [ "i686-linux" "x86_64-linux" ];
+    maintainers = with maintainers; [ jcumming amaxine ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/wyvern/cargo-lock.patch b/nixpkgs/pkgs/games/wyvern/cargo-lock.patch
new file mode 100644
index 000000000000..13a0dbfb86e5
--- /dev/null
+++ b/nixpkgs/pkgs/games/wyvern/cargo-lock.patch
@@ -0,0 +1,4139 @@
+diff --git a/Cargo.lock b/Cargo.lock
+index f37a245..ef42a65 100644
+--- a/Cargo.lock
++++ b/Cargo.lock
+@@ -1,2500 +1,3020 @@
+ # This file is automatically @generated by Cargo.
+ # It is not intended for manual editing.
++version = 3
++
++[[package]]
++name = "addr2line"
++version = "0.19.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97"
++dependencies = [
++ "gimli",
++]
++
++[[package]]
++name = "adler"
++version = "1.0.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
++
+ [[package]]
+ name = "adler32"
+-version = "1.0.4"
++version = "1.2.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234"
+ 
+ [[package]]
+ name = "aho-corasick"
+ version = "0.6.10"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "81ce3d38065e618af2d7b77e10c5ad9a069859b4be3c2250f674af3840d9c8a5"
+ dependencies = [
+- "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "memchr",
+ ]
+ 
+ [[package]]
+ name = "aho-corasick"
+-version = "0.7.6"
++version = "1.0.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04"
+ dependencies = [
+- "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "memchr",
+ ]
+ 
+ [[package]]
+ name = "ansi_term"
+-version = "0.11.0"
++version = "0.12.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
+ dependencies = [
+- "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi 0.3.9",
++]
++
++[[package]]
++name = "anstream"
++version = "0.3.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163"
++dependencies = [
++ "anstyle",
++ "anstyle-parse",
++ "anstyle-query",
++ "anstyle-wincon",
++ "colorchoice",
++ "is-terminal",
++ "utf8parse",
++]
++
++[[package]]
++name = "anstyle"
++version = "1.0.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d"
++
++[[package]]
++name = "anstyle-parse"
++version = "0.2.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee"
++dependencies = [
++ "utf8parse",
++]
++
++[[package]]
++name = "anstyle-query"
++version = "1.0.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b"
++dependencies = [
++ "windows-sys 0.48.0",
++]
++
++[[package]]
++name = "anstyle-wincon"
++version = "1.0.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188"
++dependencies = [
++ "anstyle",
++ "windows-sys 0.48.0",
+ ]
+ 
+ [[package]]
+ name = "arrayref"
+-version = "0.3.5"
++version = "0.3.7"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545"
+ 
+ [[package]]
+ name = "arrayvec"
+-version = "0.4.12"
++version = "0.5.2"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
++
++[[package]]
++name = "atty"
++version = "0.2.14"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
+ dependencies = [
+- "nodrop 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)",
++ "hermit-abi 0.1.19",
++ "libc",
++ "winapi 0.3.9",
+ ]
+ 
+ [[package]]
+-name = "atty"
+-version = "0.2.13"
++name = "autocfg"
++version = "0.1.8"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78"
+ dependencies = [
+- "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+- "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "autocfg 1.1.0",
+ ]
+ 
+ [[package]]
+ name = "autocfg"
+-version = "0.1.7"
++version = "1.1.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+ 
+ [[package]]
+ name = "backtrace"
+-version = "0.3.40"
++version = "0.3.67"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca"
+ dependencies = [
+- "backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)",
+- "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+- "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+- "rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
++ "addr2line",
++ "cc",
++ "cfg-if 1.0.0",
++ "libc",
++ "miniz_oxide 0.6.2",
++ "object",
++ "rustc-demangle",
+ ]
+ 
+ [[package]]
+-name = "backtrace-sys"
+-version = "0.1.32"
++name = "base64"
++version = "0.10.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e"
+ dependencies = [
+- "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
+- "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
++ "byteorder",
+ ]
+ 
+ [[package]]
+ name = "base64"
+-version = "0.10.1"
++version = "0.13.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)",
+-]
++checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
+ 
+ [[package]]
+ name = "bit-set"
+-version = "0.5.1"
++version = "0.5.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1"
+ dependencies = [
+- "bit-vec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "bit-vec",
+ ]
+ 
+ [[package]]
+ name = "bit-vec"
+-version = "0.5.1"
++version = "0.6.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb"
+ 
+ [[package]]
+ name = "bitflags"
+-version = "1.2.1"
++version = "1.3.2"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+ 
+ [[package]]
+ name = "blake2b_simd"
+-version = "0.5.8"
++version = "0.5.11"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587"
+ dependencies = [
+- "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
+- "arrayvec 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
+- "constant_time_eq 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
++ "arrayref",
++ "arrayvec",
++ "constant_time_eq",
+ ]
+ 
+ [[package]]
+ name = "build_const"
+-version = "0.2.1"
++version = "0.2.2"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b4ae4235e6dac0694637c763029ecea1a2ec9e4e06ec2729bd21ba4d9c863eb7"
+ 
+ [[package]]
+ name = "butlerd"
+ version = "0.1.2"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "095899eb6b69e0a1c98215e51a44c67b8e3c902ebb9440afaafe2eb45e650a09"
+ dependencies = [
+- "hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)",
+- "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
+- "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
+- "reqwest 0.9.22 (registry+https://github.com/rust-lang/crates.io-index)",
+- "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)",
+- "serde_derive 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)",
+- "serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)",
++ "hyper",
++ "rand 0.5.6",
++ "regex 1.8.1",
++ "reqwest",
++ "serde",
++ "serde_derive",
++ "serde_json",
+ ]
+ 
+ [[package]]
+ name = "byteorder"
+-version = "1.3.2"
++version = "1.4.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+ 
+ [[package]]
+ name = "bytes"
+ version = "0.4.12"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c"
+ dependencies = [
+- "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
+- "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
+- "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
++ "byteorder",
++ "either",
++ "iovec",
+ ]
+ 
+ [[package]]
+ name = "bzip2"
+-version = "0.3.3"
++version = "0.4.4"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8"
+ dependencies = [
+- "bzip2-sys 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
+- "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
++ "bzip2-sys",
++ "libc",
+ ]
+ 
+ [[package]]
+ name = "bzip2-sys"
+-version = "0.1.7"
++version = "0.1.11+1.0.8"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc"
+ dependencies = [
+- "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
+- "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
++ "cc",
++ "libc",
++ "pkg-config",
+ ]
+ 
+ [[package]]
+-name = "c2-chacha"
+-version = "0.2.3"
++name = "cc"
++version = "1.0.79"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-dependencies = [
+- "ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
+-]
++checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
+ 
+ [[package]]
+-name = "cc"
+-version = "1.0.47"
++name = "cfg-if"
++version = "0.1.10"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
+ 
+ [[package]]
+ name = "cfg-if"
+-version = "0.1.10"
++version = "1.0.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+ 
+ [[package]]
+ name = "clap"
+-version = "2.33.0"
++version = "2.34.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
+ 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.2.1 (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.6 (registry+https://github.com/rust-lang/crates.io-index)",
+- "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "ansi_term",
++ "atty",
++ "bitflags",
++ "strsim",
++ "textwrap",
++ "unicode-width",
++ "vec_map",
+ ]
+ 
+ [[package]]
+ name = "clap-verbosity-flag"
+ version = "0.2.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "bda14f5323b2b747f52908c5b7b8af7790784088bc7c2957a11695e39ad476dc"
+ dependencies = [
+- "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)",
+- "failure 0.1.6 (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)",
++ "env_logger",
++ "failure",
++ "log",
++ "structopt",
+ ]
+ 
+ [[package]]
+ name = "clicolors-control"
+ version = "1.0.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "90082ee5dcdd64dc4e9e0d37fbf3ee325419e39c0092191e0393df65518f741e"
+ dependencies = [
+- "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
+- "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+- "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+- "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "atty",
++ "lazy_static",
++ "libc",
++ "winapi 0.3.9",
+ ]
+ 
+ [[package]]
+ name = "cloudabi"
+ version = "0.0.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
+ dependencies = [
+- "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "bitflags",
+ ]
+ 
++[[package]]
++name = "colorchoice"
++version = "1.0.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
++
+ [[package]]
+ name = "confy"
+ version = "0.3.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "4b1400cd0dae7f27d2c7ced9492e1398d2e2df614570092a4936c73b416dedea"
+ dependencies = [
+- "directories 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
+- "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)",
+- "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
++ "directories",
++ "serde",
++ "toml 0.4.10",
+ ]
+ 
+ [[package]]
+ name = "console"
+ version = "0.7.7"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "8ca57c2c14b8a2bf3105bc9d15574aad80babf6a9c44b1058034cdf8bd169628"
+ dependencies = [
+- "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
+- "clicolors-control 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
+- "encode_unicode 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
+- "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+- "libc 0.2.65 (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.3.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.6 (registry+https://github.com/rust-lang/crates.io-index)",
+- "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "atty",
++ "clicolors-control",
++ "encode_unicode",
++ "lazy_static",
++ "libc",
++ "parking_lot 0.12.1",
++ "regex 1.8.1",
++ "termios",
++ "unicode-width",
++ "winapi 0.3.9",
+ ]
+ 
+ [[package]]
+ name = "console"
+-version = "0.9.1"
++version = "0.15.5"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "c3d79fbe8970a77e3e34151cc13d3b3e248aa0faaecb9f6091fa07ebefe5ad60"
+ dependencies = [
+- "clicolors-control 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
+- "encode_unicode 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
+- "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+- "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+- "regex 1.3.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.6 (registry+https://github.com/rust-lang/crates.io-index)",
+- "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "encode_unicode",
++ "lazy_static",
++ "libc",
++ "unicode-width",
++ "windows-sys 0.42.0",
+ ]
+ 
+ [[package]]
+ name = "constant_time_eq"
+-version = "0.1.4"
++version = "0.1.5"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
+ 
+ [[package]]
+ name = "cookie"
+-version = "0.11.1"
++version = "0.11.5"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "be2018768ed1d848cc4d347d551546474025ba820e5db70e4c9aaa349f678bd7"
+ 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)",
++ "percent-encoding 2.2.0",
++ "time",
+ ]
+ 
+ [[package]]
+ name = "cookie"
+ version = "0.12.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "888604f00b3db336d2af898ec3c1d5d0ddf5e6d462220f2ededc33a87ac4bbd5"
+ 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)",
++ "time",
++ "url 1.7.2",
+ ]
+ 
+ [[package]]
+ name = "cookie_store"
+ version = "0.5.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b0d2f2ecb21dce00e2453268370312978af9b8024020c7a37ae2cc6dbbe64685"
+ dependencies = [
+- "cookie 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)",
+- "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+- "failure_derive 0.1.6 (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.3 (registry+https://github.com/rust-lang/crates.io-index)",
+- "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)",
+- "serde_derive 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)",
+- "serde_json 1.0.41 (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)",
++ "cookie 0.11.5",
++ "failure",
++ "failure_derive",
++ "idna 0.1.5",
++ "log",
++ "publicsuffix",
++ "serde",
++ "serde_derive",
++ "serde_json",
++ "time",
++ "try_from",
++ "url 1.7.2",
+ ]
+ 
+ [[package]]
+ name = "cookie_store"
+ version = "0.7.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "46750b3f362965f197996c4448e4a0935e791bf7d6631bfce9ee0af3d24c919c"
+ dependencies = [
+- "cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
+- "failure 0.1.6 (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.3 (registry+https://github.com/rust-lang/crates.io-index)",
+- "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)",
+- "serde_json 1.0.41 (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)",
++ "cookie 0.12.0",
++ "failure",
++ "idna 0.1.5",
++ "log",
++ "publicsuffix",
++ "serde",
++ "serde_json",
++ "time",
++ "try_from",
++ "url 1.7.2",
+ ]
+ 
+ [[package]]
+ name = "core-foundation"
+-version = "0.6.4"
++version = "0.9.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146"
+ dependencies = [
+- "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
+- "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
++ "core-foundation-sys",
++ "libc",
+ ]
+ 
+ [[package]]
+ name = "core-foundation-sys"
+-version = "0.6.2"
++version = "0.8.4"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"
+ 
+ [[package]]
+ name = "crc"
+ version = "1.8.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb"
+ dependencies = [
+- "build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "build_const",
+ ]
+ 
+ [[package]]
+ name = "crc32fast"
+-version = "1.2.0"
++version = "1.3.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
++dependencies = [
++ "cfg-if 1.0.0",
++]
++
++[[package]]
++name = "crossbeam-channel"
++version = "0.5.8"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
+ dependencies = [
+- "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
++ "cfg-if 1.0.0",
++ "crossbeam-utils 0.8.15",
+ ]
+ 
+ [[package]]
+ name = "crossbeam-deque"
+-version = "0.7.1"
++version = "0.7.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "c20ff29ded3204c5106278a81a38f4b482636ed4fa1e6cfbeef193291beb29ed"
++dependencies = [
++ "crossbeam-epoch 0.8.2",
++ "crossbeam-utils 0.7.2",
++ "maybe-uninit",
++]
++
++[[package]]
++name = "crossbeam-deque"
++version = "0.8.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef"
+ 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)",
++ "cfg-if 1.0.0",
++ "crossbeam-epoch 0.9.14",
++ "crossbeam-utils 0.8.15",
+ ]
+ 
+ [[package]]
+ name = "crossbeam-epoch"
+-version = "0.7.2"
++version = "0.8.2"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace"
+ dependencies = [
+- "arrayvec 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
+- "cfg-if 0.1.10 (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.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+- "memoffset 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
+- "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "autocfg 1.1.0",
++ "cfg-if 0.1.10",
++ "crossbeam-utils 0.7.2",
++ "lazy_static",
++ "maybe-uninit",
++ "memoffset 0.5.6",
++ "scopeguard",
++]
++
++[[package]]
++name = "crossbeam-epoch"
++version = "0.9.14"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695"
++dependencies = [
++ "autocfg 1.1.0",
++ "cfg-if 1.0.0",
++ "crossbeam-utils 0.8.15",
++ "memoffset 0.8.0",
++ "scopeguard",
+ ]
+ 
+ [[package]]
+ name = "crossbeam-queue"
+-version = "0.1.2"
++version = "0.2.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570"
+ dependencies = [
+- "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
++ "cfg-if 0.1.10",
++ "crossbeam-utils 0.7.2",
++ "maybe-uninit",
+ ]
+ 
+ [[package]]
+ name = "crossbeam-utils"
+-version = "0.6.6"
++version = "0.7.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
++dependencies = [
++ "autocfg 1.1.0",
++ "cfg-if 0.1.10",
++ "lazy_static",
++]
++
++[[package]]
++name = "crossbeam-utils"
++version = "0.8.15"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b"
+ dependencies = [
+- "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+- "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "cfg-if 1.0.0",
+ ]
+ 
+ [[package]]
+ name = "curl"
+-version = "0.4.25"
++version = "0.4.44"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "509bd11746c7ac09ebd19f0b17782eae80aadee26237658a6b4808afb5c11a22"
+ dependencies = [
+- "curl-sys 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)",
+- "libc 0.2.65 (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.52 (registry+https://github.com/rust-lang/crates.io-index)",
+- "schannel 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
+- "socket2 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)",
+- "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "curl-sys",
++ "libc",
++ "openssl-probe",
++ "openssl-sys",
++ "schannel",
++ "socket2",
++ "winapi 0.3.9",
+ ]
+ 
+ [[package]]
+ name = "curl-sys"
+-version = "0.4.24"
++version = "0.4.61+curl-8.0.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "14d05c10f541ae6f3bc5b3d923c20001f47db7d5f0b2bc6ad16490133842db79"
+ dependencies = [
+- "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
+- "libc 0.2.65 (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.52 (registry+https://github.com/rust-lang/crates.io-index)",
+- "pkg-config 0.3.17 (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.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "cc",
++ "libc",
++ "libz-sys",
++ "openssl-sys",
++ "pkg-config",
++ "vcpkg",
++ "winapi 0.3.9",
+ ]
+ 
+ [[package]]
+ name = "dialoguer"
+ version = "0.4.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "116f66c4e7b19af0d52857aa4ff710cc3b4781d9c16616e31540bc55ec57ba8c"
+ dependencies = [
+- "console 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
+- "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+- "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "console 0.15.5",
++ "lazy_static",
++ "tempfile 3.5.0",
+ ]
+ 
+ [[package]]
+ name = "directories"
+ version = "0.10.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "fc2561db021b6f1321d0f16b67ed28ce843ef4610dfaa432e3ffa2e8a3050ebf"
+ dependencies = [
+- "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi 0.3.9",
+ ]
+ 
+ [[package]]
+ name = "dirs"
+ version = "1.0.5"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901"
+ dependencies = [
+- "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+- "redox_users 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
+- "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc",
++ "redox_users",
++ "winapi 0.3.9",
+ ]
+ 
+ [[package]]
+ name = "dtoa"
+-version = "0.4.4"
++version = "0.4.8"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0"
+ 
+ [[package]]
+ name = "eidolon"
+ version = "1.4.6"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "8a501eef266fdb28e1414b6104ca799a216bce6dc4ae1217ad0f40d591351671"
+ 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.102 (registry+https://github.com/rust-lang/crates.io-index)",
+- "serde_derive 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)",
+- "serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)",
+- "structopt 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
++ "butlerd",
++ "dirs",
++ "human-panic",
++ "regex 0.2.11",
++ "serde",
++ "serde_derive",
++ "serde_json",
++ "structopt",
+ ]
+ 
+ [[package]]
+ name = "either"
+-version = "1.5.3"
++version = "1.8.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
+ 
+ [[package]]
+ name = "encode_unicode"
+ version = "0.3.6"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
+ 
+ [[package]]
+ name = "encoding_rs"
+-version = "0.8.20"
++version = "0.8.32"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394"
+ dependencies = [
+- "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
++ "cfg-if 1.0.0",
+ ]
+ 
+ [[package]]
+ name = "env_logger"
+ version = "0.5.13"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "15b0a4d2e39f8420210be8b27eeda28029729e2fd4291019455016c348240c38"
++dependencies = [
++ "atty",
++ "humantime",
++ "log",
++ "regex 1.8.1",
++ "termcolor",
++]
++
++[[package]]
++name = "errno"
++version = "0.3.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a"
++dependencies = [
++ "errno-dragonfly",
++ "libc",
++ "windows-sys 0.48.0",
++]
++
++[[package]]
++name = "errno-dragonfly"
++version = "0.1.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
+ dependencies = [
+- "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
+- "humantime 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)",
+- "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
+- "termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "cc",
++ "libc",
+ ]
+ 
+ [[package]]
+ name = "error-chain"
+-version = "0.12.1"
++version = "0.12.4"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc"
+ dependencies = [
+- "backtrace 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)",
+- "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "backtrace",
++ "version_check",
+ ]
+ 
+ [[package]]
+ name = "failure"
+-version = "0.1.6"
++version = "0.1.8"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86"
+ dependencies = [
+- "backtrace 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)",
+- "failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
++ "backtrace",
++ "failure_derive",
+ ]
+ 
+ [[package]]
+ name = "failure_derive"
+-version = "0.1.6"
++version = "0.1.8"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4"
+ dependencies = [
+- "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+- "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+- "syn 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
+- "synstructure 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "proc-macro2 1.0.56",
++ "quote 1.0.27",
++ "syn 1.0.109",
++ "synstructure",
++]
++
++[[package]]
++name = "fastrand"
++version = "1.9.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
++dependencies = [
++ "instant",
+ ]
+ 
+ [[package]]
+ name = "flate2"
+-version = "1.0.12"
++version = "1.0.26"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743"
+ dependencies = [
+- "cfg-if 0.1.10 (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.65 (registry+https://github.com/rust-lang/crates.io-index)",
+- "miniz_oxide 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "crc32fast",
++ "miniz_oxide 0.7.1",
+ ]
+ 
+ [[package]]
+ name = "fnv"
+-version = "1.0.6"
++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 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "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.1.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8"
++dependencies = [
++ "percent-encoding 2.2.0",
++]
+ 
+ [[package]]
+ name = "fuchsia-cprng"
+ version = "0.1.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
+ 
+ [[package]]
+ name = "fuchsia-zircon"
+ version = "0.3.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
+ dependencies = [
+- "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+- "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
++ "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 = "futf"
+-version = "0.1.4"
++version = "0.1.5"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843"
+ 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)",
++ "mac",
++ "new_debug_unreachable",
+ ]
+ 
+ [[package]]
+ name = "futures"
+-version = "0.1.29"
++version = "0.1.31"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678"
+ 
+ [[package]]
+ name = "futures-cpupool"
+ version = "0.1.8"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4"
+ dependencies = [
+- "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
+- "num_cpus 1.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "futures",
++ "num_cpus",
+ ]
+ 
+ [[package]]
+ name = "getrandom"
+-version = "0.1.13"
++version = "0.1.16"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
++dependencies = [
++ "cfg-if 1.0.0",
++ "libc",
++ "wasi 0.9.0+wasi-snapshot-preview1",
++]
++
++[[package]]
++name = "getrandom"
++version = "0.2.9"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4"
+ dependencies = [
+- "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+- "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+- "wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "cfg-if 1.0.0",
++ "libc",
++ "wasi 0.11.0+wasi-snapshot-preview1",
+ ]
+ 
++[[package]]
++name = "gimli"
++version = "0.27.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4"
++
+ [[package]]
+ name = "gog"
+ version = "0.4.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "19bfb6c45ea1fba86f5880b4f239ef8034230387d90a0dfea70e094caeabf0be"
+ dependencies = [
+- "cookie 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)",
+- "curl 0.4.25 (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.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
+- "reqwest 0.9.22 (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.102 (registry+https://github.com/rust-lang/crates.io-index)",
+- "serde_derive 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)",
+- "serde_json 1.0.41 (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)",
++ "cookie 0.11.5",
++ "curl",
++ "error-chain",
++ "log",
++ "regex 1.8.1",
++ "reqwest",
++ "select",
++ "serde",
++ "serde_derive",
++ "serde_json",
++ "time",
++ "user_agent",
+ ]
+ 
+ [[package]]
+ name = "h2"
+ version = "0.1.26"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462"
+ 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.29 (registry+https://github.com/rust-lang/crates.io-index)",
+- "http 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
+- "indexmap 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)",
+- "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)",
++ "byteorder",
++ "bytes",
++ "fnv",
++ "futures",
++ "http",
++ "indexmap",
++ "log",
++ "slab",
++ "string",
++ "tokio-io",
+ ]
+ 
++[[package]]
++name = "hashbrown"
++version = "0.12.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
++
+ [[package]]
+ name = "heck"
+-version = "0.3.1"
++version = "0.3.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c"
+ dependencies = [
+- "unicode-segmentation 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "unicode-segmentation",
+ ]
+ 
+ [[package]]
+ name = "hermit-abi"
+-version = "0.1.3"
++version = "0.1.19"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
+ dependencies = [
+- "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc",
+ ]
+ 
++[[package]]
++name = "hermit-abi"
++version = "0.2.6"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7"
++dependencies = [
++ "libc",
++]
++
++[[package]]
++name = "hermit-abi"
++version = "0.3.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286"
++
+ [[package]]
+ name = "html5ever"
+ version = "0.23.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "5ce65ac8028cf5a287a7dbf6c4e0a6cf2dcf022ed5b167a81bae66ebf599a8b7"
+ 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.44 (registry+https://github.com/rust-lang/crates.io-index)",
++ "log",
++ "mac",
++ "markup5ever",
++ "proc-macro2 0.4.30",
++ "quote 0.6.13",
++ "syn 0.15.44",
+ ]
+ 
+ [[package]]
+ name = "http"
+-version = "0.1.19"
++version = "0.1.21"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0"
+ 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)",
++ "bytes",
++ "fnv",
++ "itoa 0.4.8",
+ ]
+ 
+ [[package]]
+ name = "http-body"
+ version = "0.1.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d"
+ dependencies = [
+- "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
+- "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
+- "http 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
+- "tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "bytes",
++ "futures",
++ "http",
++ "tokio-buf",
+ ]
+ 
+ [[package]]
+ name = "httparse"
+-version = "1.3.4"
++version = "1.8.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
+ 
+ [[package]]
+ name = "human-panic"
+-version = "1.0.1"
++version = "1.1.4"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "c16465f6227e18e5a64eba488245d7b2974d4db0c4404ca5a69b550defa18d0a"
+ dependencies = [
+- "backtrace 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)",
+- "failure 0.1.6 (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.102 (registry+https://github.com/rust-lang/crates.io-index)",
+- "serde_derive 1.0.102 (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)",
++ "anstream",
++ "anstyle",
++ "backtrace",
++ "os_info",
++ "serde",
++ "serde_derive",
++ "toml 0.7.3",
++ "uuid 1.3.2",
+ ]
+ 
+ [[package]]
+ name = "humantime"
+ version = "1.3.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f"
+ dependencies = [
+- "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "quick-error",
+ ]
+ 
+ [[package]]
+ name = "hyper"
+-version = "0.12.35"
+-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.29 (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.19 (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.4 (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.10 (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.16 (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)",
++version = "0.12.36"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "5c843caf6296fc1f93444735205af9ed4e109a539005abb2564ae1d6fad34c52"
++dependencies = [
++ "bytes",
++ "futures",
++ "futures-cpupool",
++ "h2",
++ "http",
++ "http-body",
++ "httparse",
++ "iovec",
++ "itoa 0.4.8",
++ "log",
++ "net2",
++ "rustc_version",
++ "time",
++ "tokio",
++ "tokio-buf",
++ "tokio-executor",
++ "tokio-io",
++ "tokio-reactor",
++ "tokio-tcp",
++ "tokio-threadpool",
++ "tokio-timer",
++ "want",
+ ]
+ 
+ [[package]]
+ name = "hyper-tls"
+ version = "0.3.2"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "3a800d6aa50af4b5850b2b0f659625ce9504df908e9733b635720483be26174f"
+ dependencies = [
+- "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
+- "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
+- "hyper 0.12.35 (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)",
++ "bytes",
++ "futures",
++ "hyper",
++ "native-tls",
++ "tokio-io",
+ ]
+ 
+ [[package]]
+ name = "idna"
+ version = "0.1.5"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e"
+ 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)",
++ "matches",
++ "unicode-bidi",
++ "unicode-normalization",
+ ]
+ 
+ [[package]]
+ name = "idna"
+-version = "0.2.0"
++version = "0.2.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8"
++dependencies = [
++ "matches",
++ "unicode-bidi",
++ "unicode-normalization",
++]
++
++[[package]]
++name = "idna"
++version = "0.3.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6"
+ 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)",
++ "unicode-bidi",
++ "unicode-normalization",
+ ]
+ 
+ [[package]]
+ name = "indexmap"
+-version = "1.3.0"
++version = "1.9.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
+ dependencies = [
+- "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
++ "autocfg 1.1.0",
++ "hashbrown",
+ ]
+ 
+ [[package]]
+ name = "indicatif"
+ version = "0.10.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "40ecd1e2ee08e6c255ce890f5a99d17000850e664e7acf119fb03b25b0575bfe"
+ dependencies = [
+- "console 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
+- "lazy_static 1.4.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.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "console 0.15.5",
++ "lazy_static",
++ "number_prefix",
++ "parking_lot 0.12.1",
++ "regex 1.8.1",
+ ]
+ 
+ [[package]]
+ name = "inflate"
+ version = "0.4.5"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "1cdb29978cc5797bd8dcc8e5bf7de604891df2a8dc576973d71a281e916db2ff"
+ dependencies = [
+- "adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
++ "adler32",
++]
++
++[[package]]
++name = "instant"
++version = "0.1.12"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
++dependencies = [
++ "cfg-if 1.0.0",
++]
++
++[[package]]
++name = "io-lifetimes"
++version = "1.0.10"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220"
++dependencies = [
++ "hermit-abi 0.3.1",
++ "libc",
++ "windows-sys 0.48.0",
+ ]
+ 
+ [[package]]
+ name = "iovec"
+ version = "0.1.4"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e"
++dependencies = [
++ "libc",
++]
++
++[[package]]
++name = "is-terminal"
++version = "0.4.7"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f"
+ dependencies = [
+- "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
++ "hermit-abi 0.3.1",
++ "io-lifetimes",
++ "rustix",
++ "windows-sys 0.48.0",
+ ]
+ 
+ [[package]]
+ name = "itoa"
+-version = "0.4.4"
++version = "0.4.8"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4"
++
++[[package]]
++name = "itoa"
++version = "1.0.6"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6"
+ 
+ [[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 (registry+https://github.com/rust-lang/crates.io-index)",
+- "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "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.65"
++version = "0.2.144"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1"
+ 
+ [[package]]
+ name = "libz-sys"
+-version = "1.0.25"
++version = "1.1.9"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "56ee889ecc9568871456d42f603d6a0ce59ff328d291063a45cbdf0036baf6db"
+ dependencies = [
+- "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
+- "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+- "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)",
+- "vcpkg 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
++ "cc",
++ "libc",
++ "pkg-config",
++ "vcpkg",
+ ]
+ 
++[[package]]
++name = "linux-raw-sys"
++version = "0.3.7"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ece97ea872ece730aed82664c424eb4c8291e1ff2480247ccf7409044bc6479f"
++
+ [[package]]
+ name = "lock_api"
+-version = "0.3.1"
++version = "0.3.4"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75"
++dependencies = [
++ "scopeguard",
++]
++
++[[package]]
++name = "lock_api"
++version = "0.4.9"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df"
+ dependencies = [
+- "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "autocfg 1.1.0",
++ "scopeguard",
+ ]
+ 
+ [[package]]
+ name = "log"
+-version = "0.4.8"
++version = "0.4.17"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
+ dependencies = [
+- "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
++ "cfg-if 1.0.0",
+ ]
+ 
+ [[package]]
+ name = "mac"
+ version = "0.1.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
+ 
+ [[package]]
+ name = "markup5ever"
+ version = "0.8.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "f1af46a727284117e09780d05038b1ce6fc9c76cc6df183c3dae5a8955a25e21"
+ 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.102 (registry+https://github.com/rust-lang/crates.io-index)",
+- "serde_derive 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)",
+- "serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)",
+- "string_cache 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)",
+- "string_cache_codegen 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
+- "tendril 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "log",
++ "phf",
++ "phf_codegen",
++ "serde",
++ "serde_derive",
++ "serde_json",
++ "string_cache",
++ "string_cache_codegen",
++ "tendril",
+ ]
+ 
+ [[package]]
+ name = "matches"
+-version = "0.1.8"
++version = "0.1.10"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5"
+ 
+ [[package]]
+ name = "maybe-uninit"
+ version = "2.0.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
+ 
+ [[package]]
+ name = "memchr"
+-version = "2.2.1"
++version = "2.5.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+ 
+ [[package]]
+ name = "memoffset"
+-version = "0.5.2"
++version = "0.5.6"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa"
+ dependencies = [
+- "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
++ "autocfg 1.1.0",
++]
++
++[[package]]
++name = "memoffset"
++version = "0.8.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1"
++dependencies = [
++ "autocfg 1.1.0",
+ ]
+ 
+ [[package]]
+ name = "mime"
+-version = "0.3.14"
++version = "0.3.17"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
+ 
+ [[package]]
+ name = "mime_guess"
+-version = "2.0.1"
++version = "2.0.4"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef"
+ dependencies = [
+- "mime 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
+- "unicase 2.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "mime",
++ "unicase",
+ ]
+ 
+ [[package]]
+ name = "miniz_oxide"
+-version = "0.3.5"
++version = "0.6.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa"
++dependencies = [
++ "adler",
++]
++
++[[package]]
++name = "miniz_oxide"
++version = "0.7.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
+ dependencies = [
+- "adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
++ "adler",
+ ]
+ 
+ [[package]]
+ name = "mio"
+-version = "0.6.19"
++version = "0.6.23"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4"
+ 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.4 (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.65 (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)",
++ "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.1"
++version = "0.2.2"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d"
+ 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)",
++ "kernel32-sys",
++ "net2",
++ "winapi 0.2.8",
++ "ws2_32-sys",
+ ]
+ 
+ [[package]]
+ name = "native-tls"
+-version = "0.2.3"
++version = "0.2.11"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e"
+ dependencies = [
+- "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+- "libc 0.2.65 (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.25 (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.52 (registry+https://github.com/rust-lang/crates.io-index)",
+- "schannel 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
+- "security-framework 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
+- "security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
+- "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "lazy_static",
++ "libc",
++ "log",
++ "openssl",
++ "openssl-probe",
++ "openssl-sys",
++ "schannel",
++ "security-framework",
++ "security-framework-sys",
++ "tempfile 3.5.0",
+ ]
+ 
+ [[package]]
+ name = "net2"
+-version = "0.2.33"
++version = "0.2.38"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "74d0df99cfcd2530b2e694f6e17e7f37b8e26bb23983ac530c0c97408837c631"
+ dependencies = [
+- "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+- "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+- "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "cfg-if 0.1.10",
++ "libc",
++ "winapi 0.3.9",
+ ]
+ 
+ [[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.14"
++version = "1.0.4"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
+ 
+ [[package]]
+ name = "num-traits"
+-version = "0.2.8"
++version = "0.2.15"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
+ dependencies = [
+- "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
++ "autocfg 1.1.0",
+ ]
+ 
+ [[package]]
+ name = "num_cpus"
+-version = "1.11.0"
++version = "1.15.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b"
+ dependencies = [
+- "hermit-abi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+- "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
++ "hermit-abi 0.2.6",
++ "libc",
+ ]
+ 
+ [[package]]
+ name = "number_prefix"
+ version = "0.2.8"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "dbf9993e59c894e3c08aa1c2712914e9e6bf1fcbfc6bef283e2183df345a4fee"
++dependencies = [
++ "num-traits",
++]
++
++[[package]]
++name = "object"
++version = "0.30.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439"
+ dependencies = [
+- "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "memchr",
+ ]
+ 
++[[package]]
++name = "once_cell"
++version = "1.17.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3"
++
+ [[package]]
+ name = "openssl"
+-version = "0.10.25"
++version = "0.10.52"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "01b8574602df80f7b85fdfc5392fa884a4e3b3f4f35402c070ab34c3d3f78d56"
++dependencies = [
++ "bitflags",
++ "cfg-if 1.0.0",
++ "foreign-types",
++ "libc",
++ "once_cell",
++ "openssl-macros",
++ "openssl-sys",
++]
++
++[[package]]
++name = "openssl-macros"
++version = "0.1.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
+ dependencies = [
+- "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+- "cfg-if 0.1.10 (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.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+- "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+- "openssl-sys 0.9.52 (registry+https://github.com/rust-lang/crates.io-index)",
++ "proc-macro2 1.0.56",
++ "quote 1.0.27",
++ "syn 2.0.15",
+ ]
+ 
+ [[package]]
+ name = "openssl-probe"
+-version = "0.1.2"
++version = "0.1.5"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
+ 
+ [[package]]
+ name = "openssl-sys"
+-version = "0.9.52"
++version = "0.9.87"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "8e17f59264b2809d77ae94f0e1ebabc434773f370d6ca667bd223ea10e06cc7e"
+ dependencies = [
+- "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
+- "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
+- "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+- "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)",
+- "vcpkg 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
++ "cc",
++ "libc",
++ "pkg-config",
++ "vcpkg",
+ ]
+ 
+ [[package]]
+-name = "os_type"
+-version = "2.2.0"
++name = "os_info"
++version = "3.7.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "006e42d5b888366f1880eda20371fedde764ed2213dc8496f49622fa0c99cd5e"
+ dependencies = [
+- "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "log",
++ "serde",
++ "winapi 0.3.9",
+ ]
+ 
+ [[package]]
+ name = "parking_lot"
+ version = "0.9.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252"
++dependencies = [
++ "lock_api 0.3.4",
++ "parking_lot_core 0.6.3",
++ "rustc_version",
++]
++
++[[package]]
++name = "parking_lot"
++version = "0.12.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+ 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)",
++ "lock_api 0.4.9",
++ "parking_lot_core 0.9.7",
+ ]
+ 
+ [[package]]
+ name = "parking_lot_core"
+-version = "0.6.2"
++version = "0.6.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "bda66b810a62be75176a80873726630147a5ca780cd33921e0b5709033e66b0a"
++dependencies = [
++ "cfg-if 0.1.10",
++ "cloudabi",
++ "libc",
++ "redox_syscall 0.1.57",
++ "rustc_version",
++ "smallvec 0.6.14",
++ "winapi 0.3.9",
++]
++
++[[package]]
++name = "parking_lot_core"
++version = "0.9.7"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521"
+ dependencies = [
+- "cfg-if 0.1.10 (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.65 (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.13 (registry+https://github.com/rust-lang/crates.io-index)",
+- "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "cfg-if 1.0.0",
++ "libc",
++ "redox_syscall 0.2.16",
++ "smallvec 1.10.0",
++ "windows-sys 0.45.0",
+ ]
+ 
+ [[package]]
+ name = "percent-encoding"
+ version = "1.0.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831"
+ 
+ [[package]]
+ name = "percent-encoding"
+-version = "2.1.0"
++version = "2.2.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e"
+ 
+ [[package]]
+ name = "phf"
+ version = "0.7.24"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b3da44b85f8e8dfaec21adae67f95d93244b2ecf6ad2a692320598dcc8e6dd18"
+ dependencies = [
+- "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)",
++ "phf_shared",
+ ]
+ 
+ [[package]]
+ name = "phf_codegen"
+ version = "0.7.24"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b03e85129e324ad4166b06b2c7491ae27fe3ec353af72e72cd1654c7225d517e"
+ 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)",
++ "phf_generator",
++ "phf_shared",
+ ]
+ 
+ [[package]]
+ name = "phf_generator"
+ version = "0.7.24"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "09364cc93c159b8b06b1f4dd8a4398984503483891b0c26b867cf431fb132662"
+ 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)",
++ "phf_shared",
++ "rand 0.6.5",
+ ]
+ 
+ [[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)",
+-]
+-
+-[[package]]
+-name = "pkg-config"
+-version = "0.3.17"
+-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"
++checksum = "234f71a15de2288bcb7e3b6515828d22af7ec8598ee6d24c3b526fa0a80b67a0"
++dependencies = [
++ "siphasher",
++]
+ 
+ [[package]]
+-name = "ppv-lite86"
+-version = "0.2.6"
++name = "pkg-config"
++version = "0.3.27"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
+ 
+ [[package]]
+ name = "precomputed-hash"
+ version = "0.1.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
+ 
+ [[package]]
+ name = "proc-macro2"
+ version = "0.4.30"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759"
+ dependencies = [
+- "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "unicode-xid 0.1.0",
+ ]
+ 
+ [[package]]
+ name = "proc-macro2"
+-version = "1.0.6"
++version = "1.0.56"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435"
+ dependencies = [
+- "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "unicode-ident",
+ ]
+ 
+ [[package]]
+ name = "publicsuffix"
+-version = "1.5.3"
++version = "1.5.6"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "95b4ce31ff0a27d93c8de1849cf58162283752f065a90d508f1105fa6c9a213f"
+ dependencies = [
+- "error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)",
+- "idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+- "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+- "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
+- "url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "idna 0.2.3",
++ "url 2.3.1",
+ ]
+ 
+ [[package]]
+ name = "quick-error"
+-version = "1.2.2"
++version = "1.2.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
+ 
+ [[package]]
+ name = "quote"
+ version = "0.6.13"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1"
+ dependencies = [
+- "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
++ "proc-macro2 0.4.30",
+ ]
+ 
+ [[package]]
+ name = "quote"
+-version = "1.0.2"
++version = "1.0.27"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500"
+ dependencies = [
+- "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
++ "proc-macro2 1.0.56",
+ ]
+ 
+ [[package]]
+ name = "rand"
+ version = "0.3.23"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c"
+ dependencies = [
+- "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+- "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc",
++ "rand 0.4.6",
+ ]
+ 
+ [[package]]
+ name = "rand"
+ version = "0.4.6"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293"
+ dependencies = [
+- "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+- "libc 0.2.65 (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.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "fuchsia-cprng",
++ "libc",
++ "rand_core 0.3.1",
++ "rdrand",
++ "winapi 0.3.9",
+ ]
+ 
+ [[package]]
+ name = "rand"
+ version = "0.5.6"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9"
+ 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.65 (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.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "cloudabi",
++ "fuchsia-cprng",
++ "libc",
++ "rand_core 0.3.1",
++ "winapi 0.3.9",
+ ]
+ 
+ [[package]]
+ name = "rand"
+ version = "0.6.5"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca"
+ dependencies = [
+- "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
+- "libc 0.2.65 (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.2 (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.8 (registry+https://github.com/rust-lang/crates.io-index)",
+-]
+-
+-[[package]]
+-name = "rand"
+-version = "0.7.2"
+-source = "registry+https://github.com/rust-lang/crates.io-index"
+-dependencies = [
+- "getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
+- "libc 0.2.65 (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.1 (registry+https://github.com/rust-lang/crates.io-index)",
+- "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "autocfg 0.1.8",
++ "libc",
++ "rand_chacha",
++ "rand_core 0.4.2",
++ "rand_hc",
++ "rand_isaac",
++ "rand_jitter",
++ "rand_os",
++ "rand_pcg",
++ "rand_xorshift",
++ "winapi 0.3.9",
+ ]
+ 
+ [[package]]
+ name = "rand_chacha"
+ version = "0.1.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef"
+ dependencies = [
+- "autocfg 0.1.7 (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.3 (registry+https://github.com/rust-lang/crates.io-index)",
+- "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "autocfg 0.1.8",
++ "rand_core 0.3.1",
+ ]
+ 
+ [[package]]
+ name = "rand_core"
+ version = "0.3.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
+ dependencies = [
+- "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand_core 0.4.2",
+ ]
+ 
+ [[package]]
+ name = "rand_core"
+ version = "0.4.2"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-
+-[[package]]
+-name = "rand_core"
+-version = "0.5.1"
+-source = "registry+https://github.com/rust-lang/crates.io-index"
+-dependencies = [
+- "getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
+-]
++checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
+ 
+ [[package]]
+ name = "rand_hc"
+ version = "0.1.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4"
+ 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.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand_core 0.3.1",
+ ]
+ 
+ [[package]]
+ name = "rand_isaac"
+ version = "0.1.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08"
+ dependencies = [
+- "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand_core 0.3.1",
+ ]
+ 
+ [[package]]
+ name = "rand_jitter"
+ version = "0.1.4"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b"
+ dependencies = [
+- "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+- "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
+- "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc",
++ "rand_core 0.4.2",
++ "winapi 0.3.9",
+ ]
+ 
+ [[package]]
+ name = "rand_os"
+ version = "0.1.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071"
+ 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.65 (registry+https://github.com/rust-lang/crates.io-index)",
+- "rand_core 0.4.2 (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.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "cloudabi",
++ "fuchsia-cprng",
++ "libc",
++ "rand_core 0.4.2",
++ "rdrand",
++ "winapi 0.3.9",
+ ]
+ 
+ [[package]]
+ name = "rand_pcg"
+ version = "0.1.2"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44"
+ dependencies = [
+- "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
+- "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "autocfg 0.1.8",
++ "rand_core 0.4.2",
+ ]
+ 
+ [[package]]
+ name = "rand_xorshift"
+ version = "0.1.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c"
+ dependencies = [
+- "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand_core 0.3.1",
+ ]
+ 
+ [[package]]
+ name = "rayon"
+-version = "1.2.0"
++version = "1.7.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b"
+ dependencies = [
+- "crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
+- "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
+- "rayon-core 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "either",
++ "rayon-core",
+ ]
+ 
+ [[package]]
+ name = "rayon-core"
+-version = "1.6.0"
++version = "1.11.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d"
+ 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)",
+- "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+- "num_cpus 1.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "crossbeam-channel",
++ "crossbeam-deque 0.8.3",
++ "crossbeam-utils 0.8.15",
++ "num_cpus",
+ ]
+ 
+ [[package]]
+ name = "rdrand"
+ version = "0.4.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
++dependencies = [
++ "rand_core 0.3.1",
++]
++
++[[package]]
++name = "redox_syscall"
++version = "0.1.57"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"
++
++[[package]]
++name = "redox_syscall"
++version = "0.2.16"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+ dependencies = [
+- "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "bitflags",
+ ]
+ 
+ [[package]]
+ name = "redox_syscall"
+-version = "0.1.56"
++version = "0.3.5"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
++dependencies = [
++ "bitflags",
++]
+ 
+ [[package]]
+ name = "redox_users"
+-version = "0.3.1"
++version = "0.3.5"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d"
+ dependencies = [
+- "failure 0.1.6 (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)",
+- "rust-argon2 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "getrandom 0.1.16",
++ "redox_syscall 0.1.57",
++ "rust-argon2",
+ ]
+ 
+ [[package]]
+ name = "regex"
+ version = "0.2.11"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "9329abc99e39129fcceabd24cf5d85b4671ef7c29c50e972bc5afe32438ec384"
+ 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)",
++ "aho-corasick 0.6.10",
++ "memchr",
++ "regex-syntax 0.5.6",
++ "thread_local",
++ "utf8-ranges",
+ ]
+ 
+ [[package]]
+ name = "regex"
+-version = "1.3.1"
++version = "1.8.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370"
+ 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.12 (registry+https://github.com/rust-lang/crates.io-index)",
+- "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
++ "aho-corasick 1.0.1",
++ "memchr",
++ "regex-syntax 0.7.1",
+ ]
+ 
+ [[package]]
+ name = "regex-syntax"
+ version = "0.5.6"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "7d707a4fa2637f2dca2ef9fd02225ec7661fe01a53623c1e6515b6916511f7a7"
+ dependencies = [
+- "ucd-util 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "ucd-util",
+ ]
+ 
+ [[package]]
+ name = "regex-syntax"
+-version = "0.6.12"
+-source = "registry+https://github.com/rust-lang/crates.io-index"
+-
+-[[package]]
+-name = "remove_dir_all"
+-version = "0.5.2"
++version = "0.7.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-dependencies = [
+- "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
+-]
++checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c"
+ 
+ [[package]]
+ name = "reqwest"
+-version = "0.9.22"
+-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.20 (registry+https://github.com/rust-lang/crates.io-index)",
+- "flate2 1.0.12 (registry+https://github.com/rust-lang/crates.io-index)",
+- "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
+- "http 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
+- "hyper 0.12.35 (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.14 (registry+https://github.com/rust-lang/crates.io-index)",
+- "mime_guess 2.0.1 (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.102 (registry+https://github.com/rust-lang/crates.io-index)",
+- "serde_json 1.0.41 (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.16 (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)",
++version = "0.9.24"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "f88643aea3c1343c804950d7bf983bd2067f5ab59db6d613a08e05572f2714ab"
++dependencies = [
++ "base64 0.10.1",
++ "bytes",
++ "cookie 0.12.0",
++ "cookie_store 0.7.0",
++ "encoding_rs",
++ "flate2",
++ "futures",
++ "http",
++ "hyper",
++ "hyper-tls",
++ "log",
++ "mime",
++ "mime_guess",
++ "native-tls",
++ "serde",
++ "serde_json",
++ "serde_urlencoded",
++ "time",
++ "tokio",
++ "tokio-executor",
++ "tokio-io",
++ "tokio-threadpool",
++ "tokio-timer",
++ "url 1.7.2",
++ "uuid 0.7.4",
++ "winreg",
+ ]
+ 
+ [[package]]
+ name = "rust-argon2"
+-version = "0.5.1"
++version = "0.8.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb"
+ dependencies = [
+- "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
+- "blake2b_simd 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)",
+- "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
++ "base64 0.13.1",
++ "blake2b_simd",
++ "constant_time_eq",
++ "crossbeam-utils 0.8.15",
+ ]
+ 
+ [[package]]
+ name = "rustc-demangle"
+-version = "0.1.16"
++version = "0.1.23"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
+ 
+ [[package]]
+ name = "rustc_version"
+ version = "0.2.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
++dependencies = [
++ "semver",
++]
++
++[[package]]
++name = "rustix"
++version = "0.37.19"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d"
+ dependencies = [
+- "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "bitflags",
++ "errno",
++ "io-lifetimes",
++ "libc",
++ "linux-raw-sys",
++ "windows-sys 0.48.0",
+ ]
+ 
+ [[package]]
+ name = "ryu"
+-version = "1.0.2"
++version = "1.0.13"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041"
+ 
+ [[package]]
+ name = "same-file"
+-version = "1.0.5"
++version = "1.0.6"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+ dependencies = [
+- "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi-util",
+ ]
+ 
+ [[package]]
+ name = "schannel"
+-version = "0.1.16"
++version = "0.1.21"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3"
+ dependencies = [
+- "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+- "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "windows-sys 0.42.0",
+ ]
+ 
+ [[package]]
+ name = "scopeguard"
+-version = "1.0.0"
++version = "1.1.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+ 
+ [[package]]
+ name = "security-framework"
+-version = "0.3.3"
++version = "2.8.2"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254"
+ 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.65 (registry+https://github.com/rust-lang/crates.io-index)",
+- "security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
++ "bitflags",
++ "core-foundation",
++ "core-foundation-sys",
++ "libc",
++ "security-framework-sys",
+ ]
+ 
+ [[package]]
+ name = "security-framework-sys"
+-version = "0.3.3"
++version = "2.8.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4"
+ dependencies = [
+- "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "core-foundation-sys",
++ "libc",
+ ]
+ 
+ [[package]]
+ name = "select"
+ version = "0.4.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ac645958c62108d11f90f8d34e4dc2799c838fc995ed4c2075867a2a8d5be76b"
+ 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)",
++ "bit-set",
++ "html5ever",
+ ]
+ 
+ [[package]]
+ name = "semver"
+ version = "0.9.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
+ dependencies = [
+- "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "semver-parser",
+ ]
+ 
+ [[package]]
+ name = "semver-parser"
+ version = "0.7.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
+ 
+ [[package]]
+ name = "serde"
+-version = "1.0.102"
++version = "1.0.162"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "71b2f6e1ab5c2b98c05f0f35b236b22e8df7ead6ffbf51d7808da7f8817e7ab6"
+ dependencies = [
+- "serde_derive 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde_derive",
+ ]
+ 
+ [[package]]
+ name = "serde_derive"
+-version = "1.0.102"
++version = "1.0.162"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "a2a0814352fd64b58489904a44ea8d90cb1a91dcb6b4f5ebabc32c8318e93cb6"
+ dependencies = [
+- "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+- "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+- "syn 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
++ "proc-macro2 1.0.56",
++ "quote 1.0.27",
++ "syn 2.0.15",
+ ]
+ 
+ [[package]]
+ name = "serde_json"
+-version = "1.0.41"
++version = "1.0.96"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1"
++dependencies = [
++ "itoa 1.0.6",
++ "ryu",
++ "serde",
++]
++
++[[package]]
++name = "serde_spanned"
++version = "0.6.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "0efd8caf556a6cebd3b285caf480045fcc1ac04f6bd786b09a6f11af30c4fcf4"
+ dependencies = [
+- "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
+- "ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+- "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)",
++ "serde",
+ ]
+ 
+ [[package]]
+ name = "serde_urlencoded"
+ version = "0.5.5"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "642dd69105886af2efd227f75a520ec9b44a820d65bc133a9131f7d229fd165a"
+ 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.102 (registry+https://github.com/rust-lang/crates.io-index)",
+- "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "dtoa",
++ "itoa 0.4.8",
++ "serde",
++ "url 1.7.2",
+ ]
+ 
+ [[package]]
+ name = "siphasher"
+ version = "0.2.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac"
+ 
+ [[package]]
+ name = "slab"
+-version = "0.4.2"
++version = "0.4.8"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d"
++dependencies = [
++ "autocfg 1.1.0",
++]
+ 
+ [[package]]
+ name = "smallvec"
+-version = "0.6.13"
++version = "0.6.14"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b97fcaeba89edba30f044a10c6a3cc39df9c3f17d7cd829dd1446cab35f890e0"
+ dependencies = [
+- "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "maybe-uninit",
+ ]
+ 
++[[package]]
++name = "smallvec"
++version = "1.10.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
++
+ [[package]]
+ name = "socket2"
+-version = "0.3.11"
++version = "0.4.9"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662"
+ dependencies = [
+- "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+- "libc 0.2.65 (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.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc",
++ "winapi 0.3.9",
+ ]
+ 
+ [[package]]
+ name = "string"
+ version = "0.2.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d"
+ dependencies = [
+- "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
++ "bytes",
+ ]
+ 
+ [[package]]
+ name = "string_cache"
+ version = "0.7.5"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "89c058a82f9fd69b1becf8c274f412281038877c553182f1d02eb027045a2d67"
+ dependencies = [
+- "lazy_static 1.4.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.102 (registry+https://github.com/rust-lang/crates.io-index)",
+- "string_cache_codegen 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
+- "string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "lazy_static",
++ "new_debug_unreachable",
++ "phf_shared",
++ "precomputed-hash",
++ "serde",
++ "string_cache_codegen",
++ "string_cache_shared",
+ ]
+ 
+ [[package]]
+ name = "string_cache_codegen"
+ version = "0.4.4"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "f0f45ed1b65bf9a4bf2f7b7dc59212d1926e9eaf00fa998988e420fd124467c6"
+ 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 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+- "quote 1.0.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)",
++ "phf_generator",
++ "phf_shared",
++ "proc-macro2 1.0.56",
++ "quote 1.0.27",
++ "string_cache_shared",
+ ]
+ 
+ [[package]]
+ name = "string_cache_shared"
+ version = "0.3.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b1884d1bc09741d466d9b14e6d37ac89d6909cbcac41dd9ae982d4d063bbedfc"
+ 
+ [[package]]
+ name = "strsim"
+ version = "0.8.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
+ 
+ [[package]]
+ name = "structopt"
+ version = "0.2.18"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "16c2cdbf9cc375f15d1b4141bc48aeef444806655cd0e904207edc8d68d86ed7"
+ 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)",
++ "clap",
++ "structopt-derive",
+ ]
+ 
+ [[package]]
+ name = "structopt-derive"
+ version = "0.2.18"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "53010261a84b37689f9ed7d395165029f9cc7abb9f56bbfe86bee2597ed25107"
+ 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.44 (registry+https://github.com/rust-lang/crates.io-index)",
++ "heck",
++ "proc-macro2 0.4.30",
++ "quote 0.6.13",
++ "syn 0.15.44",
+ ]
+ 
+ [[package]]
+ name = "syn"
+ version = "0.15.44"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5"
+ 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)",
++ "proc-macro2 0.4.30",
++ "quote 0.6.13",
++ "unicode-xid 0.1.0",
+ ]
+ 
+ [[package]]
+ name = "syn"
+-version = "1.0.7"
++version = "1.0.109"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+ dependencies = [
+- "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+- "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+- "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "proc-macro2 1.0.56",
++ "quote 1.0.27",
++ "unicode-ident",
+ ]
+ 
+ [[package]]
+-name = "synstructure"
+-version = "0.12.2"
++name = "syn"
++version = "2.0.15"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822"
+ dependencies = [
+- "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+- "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+- "syn 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
+- "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "proc-macro2 1.0.56",
++ "quote 1.0.27",
++ "unicode-ident",
+ ]
+ 
+ [[package]]
+-name = "tempdir"
+-version = "0.3.7"
++name = "synstructure"
++version = "0.12.6"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f"
+ 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)",
++ "proc-macro2 1.0.56",
++ "quote 1.0.27",
++ "syn 1.0.109",
++ "unicode-xid 0.2.4",
+ ]
+ 
+ [[package]]
+ name = "tempfile"
+ version = "2.2.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "11ce2fe9db64b842314052e2421ac61a73ce41b898dc8e3750398b219c5fc1e0"
+ dependencies = [
+- "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+- "libc 0.2.65 (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)",
++ "kernel32-sys",
++ "libc",
++ "rand 0.3.23",
++ "redox_syscall 0.1.57",
++ "winapi 0.2.8",
+ ]
+ 
+ [[package]]
+ name = "tempfile"
+-version = "3.1.0"
++version = "3.5.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998"
+ dependencies = [
+- "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+- "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+- "rand 0.7.2 (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.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "cfg-if 1.0.0",
++ "fastrand",
++ "redox_syscall 0.3.5",
++ "rustix",
++ "windows-sys 0.45.0",
+ ]
+ 
+ [[package]]
+ name = "tendril"
+-version = "0.4.1"
++version = "0.4.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0"
+ 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)",
++ "futf",
++ "mac",
++ "utf-8",
+ ]
+ 
+ [[package]]
+ name = "termcolor"
+-version = "0.3.6"
++version = "1.2.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6"
+ dependencies = [
+- "wincolor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi-util",
+ ]
+ 
+ [[package]]
+-name = "termcolor"
+-version = "1.0.5"
++name = "termios"
++version = "0.3.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "411c5bf740737c7918b8b1fe232dca4dc9f8e754b8ad5e20966814001ed0ac6b"
+ dependencies = [
+- "wincolor 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "libc",
+ ]
+ 
+ [[package]]
+-name = "termios"
+-version = "0.3.1"
++name = "textwrap"
++version = "0.11.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
+ dependencies = [
+- "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
++ "unicode-width",
+ ]
+ 
+ [[package]]
+-name = "textwrap"
+-version = "0.11.0"
++name = "thiserror"
++version = "1.0.40"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac"
++dependencies = [
++ "thiserror-impl",
++]
++
++[[package]]
++name = "thiserror-impl"
++version = "1.0.40"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
+ dependencies = [
+- "unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
++ "proc-macro2 1.0.56",
++ "quote 1.0.27",
++ "syn 2.0.15",
+ ]
+ 
+ [[package]]
+ name = "thread_local"
+ version = "0.3.6"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b"
+ dependencies = [
+- "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "lazy_static",
+ ]
+ 
+ [[package]]
+ name = "time"
+-version = "0.1.42"
++version = "0.1.45"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a"
++dependencies = [
++ "libc",
++ "wasi 0.10.0+wasi-snapshot-preview1",
++ "winapi 0.3.9",
++]
++
++[[package]]
++name = "tinyvec"
++version = "1.6.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+ dependencies = [
+- "libc 0.2.65 (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.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tinyvec_macros",
+ ]
+ 
++[[package]]
++name = "tinyvec_macros"
++version = "0.1.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
++
+ [[package]]
+ name = "tokio"
+ version = "0.1.22"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6"
+ dependencies = [
+- "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
+- "futures 0.1.29 (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.11.0 (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.10 (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.16 (registry+https://github.com/rust-lang/crates.io-index)",
+- "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
++ "bytes",
++ "futures",
++ "mio",
++ "num_cpus",
++ "tokio-current-thread",
++ "tokio-executor",
++ "tokio-io",
++ "tokio-reactor",
++ "tokio-tcp",
++ "tokio-threadpool",
++ "tokio-timer",
+ ]
+ 
+ [[package]]
+ name = "tokio-buf"
+ version = "0.1.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "8fb220f46c53859a4b7ec083e41dec9778ff0b1851c0942b211edb89e0ccdc46"
+ dependencies = [
+- "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
+- "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
+- "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
++ "bytes",
++ "either",
++ "futures",
+ ]
+ 
+ [[package]]
+ name = "tokio-current-thread"
+-version = "0.1.6"
++version = "0.1.7"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b1de0e32a83f131e002238d7ccde18211c0a5397f60cbfffcb112868c2e0e20e"
+ dependencies = [
+- "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
+- "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "futures",
++ "tokio-executor",
+ ]
+ 
+ [[package]]
+ name = "tokio-executor"
+-version = "0.1.8"
++version = "0.1.10"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "fb2d1b8f4548dbf5e1f7818512e9c406860678f29c300cdf0ebac72d1a3a1671"
+ dependencies = [
+- "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
+- "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
++ "crossbeam-utils 0.7.2",
++ "futures",
+ ]
+ 
+ [[package]]
+ name = "tokio-io"
+-version = "0.1.12"
++version = "0.1.13"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674"
+ dependencies = [
+- "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
+- "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
+- "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "bytes",
++ "futures",
++ "log",
+ ]
+ 
+ [[package]]
+ name = "tokio-reactor"
+-version = "0.1.10"
++version = "0.1.12"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "09bc590ec4ba8ba87652da2068d150dcada2cfa2e07faae270a5e0409aa51351"
+ dependencies = [
+- "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
+- "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
+- "lazy_static 1.4.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.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
+- "parking_lot 0.9.0 (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.7 (registry+https://github.com/rust-lang/crates.io-index)",
++ "crossbeam-utils 0.7.2",
++ "futures",
++ "lazy_static",
++ "log",
++ "mio",
++ "num_cpus",
++ "parking_lot 0.9.0",
++ "slab",
++ "tokio-executor",
++ "tokio-io",
++ "tokio-sync",
+ ]
+ 
+ [[package]]
+ name = "tokio-sync"
+-version = "0.1.7"
++version = "0.1.8"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "edfe50152bc8164fcc456dab7891fa9bf8beaf01c5ee7e1dd43a397c3cf87dee"
+ dependencies = [
+- "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+- "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
++ "fnv",
++ "futures",
+ ]
+ 
+ [[package]]
+ name = "tokio-tcp"
+-version = "0.1.3"
++version = "0.1.4"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "98df18ed66e3b72e742f185882a9e201892407957e45fbff8da17ae7a7c51f72"
+ dependencies = [
+- "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
+- "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
+- "iovec 0.1.4 (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.10 (registry+https://github.com/rust-lang/crates.io-index)",
++ "bytes",
++ "futures",
++ "iovec",
++ "mio",
++ "tokio-io",
++ "tokio-reactor",
+ ]
+ 
+ [[package]]
+ name = "tokio-threadpool"
+-version = "0.1.16"
++version = "0.1.18"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "df720b6581784c118f0eb4310796b12b1d242a7eb95f716a8367855325c25f89"
+ 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.29 (registry+https://github.com/rust-lang/crates.io-index)",
+- "lazy_static 1.4.0 (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.11.0 (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)",
++ "crossbeam-deque 0.7.4",
++ "crossbeam-queue",
++ "crossbeam-utils 0.7.2",
++ "futures",
++ "lazy_static",
++ "log",
++ "num_cpus",
++ "slab",
++ "tokio-executor",
+ ]
+ 
+ [[package]]
+ name = "tokio-timer"
+-version = "0.2.11"
++version = "0.2.13"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "93044f2d313c95ff1cb7809ce9a7a05735b012288a888b62d4434fd58c94f296"
+ dependencies = [
+- "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
+- "futures 0.1.29 (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)",
++ "crossbeam-utils 0.7.2",
++ "futures",
++ "slab",
++ "tokio-executor",
+ ]
+ 
+ [[package]]
+ name = "toml"
+ version = "0.4.10"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f"
++dependencies = [
++ "serde",
++]
++
++[[package]]
++name = "toml"
++version = "0.7.3"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b403acf6f2bb0859c93c7f0d967cb4a75a7ac552100f9322faf64dc047669b21"
++dependencies = [
++ "serde",
++ "serde_spanned",
++ "toml_datetime",
++ "toml_edit",
++]
++
++[[package]]
++name = "toml_datetime"
++version = "0.6.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622"
++dependencies = [
++ "serde",
++]
++
++[[package]]
++name = "toml_edit"
++version = "0.19.8"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13"
+ dependencies = [
+- "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)",
++ "indexmap",
++ "serde",
++ "serde_spanned",
++ "toml_datetime",
++ "winnow",
+ ]
+ 
+ [[package]]
+ name = "try-lock"
+-version = "0.2.2"
++version = "0.2.4"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed"
+ 
+ [[package]]
+ name = "try_from"
+ version = "0.3.2"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "283d3b89e1368717881a9d51dad843cc435380d8109c9e47d38780a324698d8b"
+ dependencies = [
+- "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
++ "cfg-if 0.1.10",
+ ]
+ 
+ [[package]]
+ name = "ucd-util"
+-version = "0.1.5"
++version = "0.1.10"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "abd2fc5d32b590614af8b0a20d837f32eca055edd0bbead59a9cfe80858be003"
+ 
+ [[package]]
+ name = "unicase"
+-version = "2.5.1"
++version = "2.6.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6"
+ dependencies = [
+- "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "version_check",
+ ]
+ 
+ [[package]]
+ name = "unicode-bidi"
+-version = "0.3.4"
++version = "0.3.13"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-dependencies = [
+- "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
+-]
++checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
++
++[[package]]
++name = "unicode-ident"
++version = "1.0.8"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4"
+ 
+ [[package]]
+ name = "unicode-normalization"
+-version = "0.1.8"
++version = "0.1.22"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
+ dependencies = [
+- "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
++ "tinyvec",
+ ]
+ 
+ [[package]]
+ name = "unicode-segmentation"
+-version = "1.5.0"
++version = "1.10.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
+ 
+ [[package]]
+ name = "unicode-width"
+-version = "0.1.6"
++version = "0.1.10"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
+ 
+ [[package]]
+ name = "unicode-xid"
+ version = "0.1.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
+ 
+ [[package]]
+ name = "unicode-xid"
+-version = "0.2.0"
++version = "0.2.4"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
+ 
+ [[package]]
+ name = "url"
+ version = "1.7.2"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a"
+ 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)",
++ "idna 0.1.5",
++ "matches",
++ "percent-encoding 1.0.1",
+ ]
+ 
+ [[package]]
+ name = "url"
+-version = "2.1.0"
++version = "2.3.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643"
+ dependencies = [
+- "idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+- "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
+- "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
++ "form_urlencoded",
++ "idna 0.3.0",
++ "percent-encoding 2.2.0",
+ ]
+ 
+ [[package]]
+ name = "user_agent"
+ version = "0.6.6"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "970a778e2284bd68e55ca4e93b858da333cd85c3d5d8b4eab2c6e729cd6f47c4"
+ 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.6 (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.22 (registry+https://github.com/rust-lang/crates.io-index)",
+- "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "cookie 0.11.5",
++ "cookie_store 0.5.1",
++ "failure",
++ "log",
++ "reqwest",
++ "url 1.7.2",
+ ]
+ 
+ [[package]]
+ name = "utf-8"
+-version = "0.7.5"
++version = "0.7.6"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
+ 
+ [[package]]
+ name = "utf8-ranges"
+-version = "1.0.4"
++version = "1.0.5"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "7fcfc827f90e53a02eaef5e535ee14266c1d569214c6aa70133a624d8a3164ba"
++
++[[package]]
++name = "utf8parse"
++version = "0.2.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
+ 
+ [[package]]
+ name = "uuid"
+-version = "0.6.5"
++version = "0.7.4"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "90dbc611eb48397705a6b0f6e917da23ae517e4d127123d2cf7674206627d32a"
+ dependencies = [
+- "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+- "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
++ "rand 0.6.5",
+ ]
+ 
+ [[package]]
+ name = "uuid"
+-version = "0.7.4"
++version = "1.3.2"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "4dad5567ad0cf5b760e5665964bec1b47dfd077ba8a2544b513f3556d3d239a2"
+ dependencies = [
+- "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
++ "getrandom 0.2.9",
+ ]
+ 
+ [[package]]
+ name = "vcpkg"
+-version = "0.2.7"
++version = "0.2.15"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+ 
+ [[package]]
+ name = "vec_map"
+-version = "0.8.1"
++version = "0.8.2"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
+ 
+ [[package]]
+ name = "version_check"
+-version = "0.1.5"
++version = "0.9.4"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+ 
+ [[package]]
+ name = "walkdir"
+-version = "2.2.9"
++version = "2.3.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698"
+ dependencies = [
+- "same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
+- "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
+- "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "same-file",
++ "winapi-util",
+ ]
+ 
+ [[package]]
+ name = "want"
+ version = "0.2.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230"
+ dependencies = [
+- "futures 0.1.29 (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)",
++ "futures",
++ "log",
++ "try-lock",
+ ]
+ 
+ [[package]]
+ name = "wasi"
+-version = "0.7.0"
++version = "0.9.0+wasi-snapshot-preview1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
++
++[[package]]
++name = "wasi"
++version = "0.10.0+wasi-snapshot-preview1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
++
++[[package]]
++name = "wasi"
++version = "0.11.0+wasi-snapshot-preview1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+ 
+ [[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.8"
++version = "0.3.9"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+ 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)",
++ "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-util"
+-version = "0.1.2"
++version = "0.1.5"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+ dependencies = [
+- "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi 0.3.9",
+ ]
+ 
+ [[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 = "wincolor"
+-version = "0.1.6"
++name = "windows-sys"
++version = "0.42.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
+ dependencies = [
+- "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "windows_aarch64_gnullvm 0.42.2",
++ "windows_aarch64_msvc 0.42.2",
++ "windows_i686_gnu 0.42.2",
++ "windows_i686_msvc 0.42.2",
++ "windows_x86_64_gnu 0.42.2",
++ "windows_x86_64_gnullvm 0.42.2",
++ "windows_x86_64_msvc 0.42.2",
+ ]
+ 
+ [[package]]
+-name = "wincolor"
+-version = "1.0.2"
++name = "windows-sys"
++version = "0.45.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
++dependencies = [
++ "windows-targets 0.42.2",
++]
++
++[[package]]
++name = "windows-sys"
++version = "0.48.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
++dependencies = [
++ "windows-targets 0.48.0",
++]
++
++[[package]]
++name = "windows-targets"
++version = "0.42.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
++dependencies = [
++ "windows_aarch64_gnullvm 0.42.2",
++ "windows_aarch64_msvc 0.42.2",
++ "windows_i686_gnu 0.42.2",
++ "windows_i686_msvc 0.42.2",
++ "windows_x86_64_gnu 0.42.2",
++ "windows_x86_64_gnullvm 0.42.2",
++ "windows_x86_64_msvc 0.42.2",
++]
++
++[[package]]
++name = "windows-targets"
++version = "0.48.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5"
++dependencies = [
++ "windows_aarch64_gnullvm 0.48.0",
++ "windows_aarch64_msvc 0.48.0",
++ "windows_i686_gnu 0.48.0",
++ "windows_i686_msvc 0.48.0",
++ "windows_x86_64_gnu 0.48.0",
++ "windows_x86_64_gnullvm 0.48.0",
++ "windows_x86_64_msvc 0.48.0",
++]
++
++[[package]]
++name = "windows_aarch64_gnullvm"
++version = "0.42.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
++
++[[package]]
++name = "windows_aarch64_gnullvm"
++version = "0.48.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
++
++[[package]]
++name = "windows_aarch64_msvc"
++version = "0.42.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
++
++[[package]]
++name = "windows_aarch64_msvc"
++version = "0.48.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
++
++[[package]]
++name = "windows_i686_gnu"
++version = "0.42.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
++
++[[package]]
++name = "windows_i686_gnu"
++version = "0.48.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
++
++[[package]]
++name = "windows_i686_msvc"
++version = "0.42.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
++
++[[package]]
++name = "windows_i686_msvc"
++version = "0.48.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
++
++[[package]]
++name = "windows_x86_64_gnu"
++version = "0.42.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
++
++[[package]]
++name = "windows_x86_64_gnu"
++version = "0.48.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
++
++[[package]]
++name = "windows_x86_64_gnullvm"
++version = "0.42.2"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
++
++[[package]]
++name = "windows_x86_64_gnullvm"
++version = "0.48.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
++
++[[package]]
++name = "windows_x86_64_msvc"
++version = "0.42.2"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
++
++[[package]]
++name = "windows_x86_64_msvc"
++version = "0.48.0"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
++
++[[package]]
++name = "winnow"
++version = "0.4.6"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "61de7bac303dc551fe038e2b3cef0f571087a47571ea6e79a87692ac99b99699"
+ dependencies = [
+- "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
+- "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "memchr",
+ ]
+ 
+ [[package]]
+ name = "winreg"
+ version = "0.6.2"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9"
+ dependencies = [
+- "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
++ "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 (registry+https://github.com/rust-lang/crates.io-index)",
+- "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
++ "winapi 0.2.8",
++ "winapi-build",
+ ]
+ 
+ [[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.25 (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.4.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.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+- "reqwest 0.9.22 (registry+https://github.com/rust-lang/crates.io-index)",
+- "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)",
+- "serde_derive 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)",
+- "serde_json 1.0.41 (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.3 (registry+https://github.com/rust-lang/crates.io-index)",
++ "clap-verbosity-flag",
++ "confy",
++ "console 0.7.7",
++ "crc",
++ "curl",
++ "dialoguer",
++ "dirs",
++ "eidolon",
++ "gog",
++ "human-panic",
++ "indicatif",
++ "inflate",
++ "lazy_static",
++ "log",
++ "rayon",
++ "reqwest",
++ "serde",
++ "serde_derive",
++ "serde_json",
++ "structopt",
++ "tempfile 2.2.0",
++ "toml 0.4.10",
++ "url 1.7.2",
++ "walkdir",
++ "zip",
+ ]
+ 
+ [[package]]
+ name = "zip"
+-version = "0.5.3"
++version = "0.5.13"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "93ab48844d61251bb3835145c521d88aa4031d7139e8485990f60ca911fa0815"
+ 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)",
+- "flate2 1.0.12 (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.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2"
+-"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 arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee"
+-"checksum arrayvec 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "cd9fd44efafa8690358b7408d253adf110036b88f55672a933f01d616ad9b1b9"
+-"checksum atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1803c647a3ec87095e7ae7acfca019e98de5ec9a7d01343f611cf3152ed71a90"
+-"checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2"
+-"checksum backtrace 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)" = "924c76597f0d9ca25d762c25a4d369d51267536465dc5064bdf0eb073ed477ea"
+-"checksum backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6575f128516de27e3ce99689419835fce9643a9b215a14d2b5b685be018491"
+-"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.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
+-"checksum blake2b_simd 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)" = "5850aeee1552f495dd0250014cf64b82b7c8879a89d83b33bbdace2cc4f63182"
+-"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.3 (registry+https://github.com/rust-lang/crates.io-index)" = "214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb"
+-"checksum cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)" = "aa87058dce70a3ff5621797f1506cb837edd02ac4c0ae642b4542dce802908b8"
+-"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
+-"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.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90082ee5dcdd64dc4e9e0d37fbf3ee325419e39c0092191e0393df65518f741e"
+-"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 console 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f5d540c2d34ac9dd0deb5f3b5f54c36c79efa78f6b3ad19106a554d07a7b5d9f"
+-"checksum constant_time_eq 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "995a44c877f9212528ccc74b21a232f66ad69001e40ede5bcee2ac9ef2657120"
+-"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.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.25 (registry+https://github.com/rust-lang/crates.io-index)" = "06aa71e9208a54def20792d877bc663d6aae0732b9852e612c4a933177c31283"
+-"checksum curl-sys 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)" = "f659f3ffac9582d6177bb86d1d2aa649f4eb9d0d4de9d03ccc08b402832ea340"
+-"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.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3"
+-"checksum encode_unicode 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
+-"checksum encoding_rs 0.8.20 (registry+https://github.com/rust-lang/crates.io-index)" = "87240518927716f79692c2ed85bfe6e98196d18c6401ec75355760233a7e12e9"
+-"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.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f8273f13c977665c5db7eb2b99ae520952fe5ac831ae4cd09d80c4c7042b5ed9"
+-"checksum failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0bc225b78e0391e4b8683440bf2e63c2deeeb2ce5189eab46e2b68c6d3725d08"
+-"checksum flate2 1.0.12 (registry+https://github.com/rust-lang/crates.io-index)" = "ad3c5233c9a940c8719031b423d7e6c16af66e031cb0420b0896f5245bf181d3"
+-"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.29 (registry+https://github.com/rust-lang/crates.io-index)" = "1b980f2816d6ee8673b6517b52cb0e808a180efc92e5c19d02cdda79066703ef"
+-"checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4"
+-"checksum getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "e7db7ca94ed4cd01190ceee0d8a8052f08a247aa1b469a7f68c6a3b71afcf407"
+-"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 hermit-abi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "307c3c9f937f38e3534b1d6447ecf090cafcc9744e4a6360e8b037b2cf5af120"
+-"checksum html5ever 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5ce65ac8028cf5a287a7dbf6c4e0a6cf2dcf022ed5b167a81bae66ebf599a8b7"
+-"checksum http 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)" = "d7e06e336150b178206af098a055e3621e8336027e2b4d126bda0bc64824baaf"
+-"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.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f"
+-"checksum hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)" = "9dbe6ed1438e1f8ad955a4701e9a944938e9519f6888d12d8558b645e247d5f6"
+-"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 idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9"
+-"checksum indexmap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d7b3ea5827fcb9d4fda14bf4da5f136f0db2ae9c8f4bd4e2d1c6fde4e6db2"
+-"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.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e"
+-"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.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+-"checksum libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)" = "1a31a0627fdf1f6a39ec0dd577e101440b7db22672c0901fe00a9a6fbb5c24e8"
+-"checksum libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "2eb5e43362e38e2bca2fd5f5134c4d4564a23a5c28e9b95411652021a8675ebe"
+-"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 maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
+-"checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e"
+-"checksum memoffset 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a85c1a8c329f11437034d7313dca647c79096523533a1c79e86f1d0f657c7cc"
+-"checksum mime 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "dd1d63acd1b78403cc0c325605908475dd9b9a3acbf65ed8bcab97e27014afcf"
+-"checksum mime_guess 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1a0ed03949aef72dbdf3116a383d7b38b4768e6f960528cd6a6044aa9ed68599"
+-"checksum miniz_oxide 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6f3f74f726ae935c3f514300cc6773a0c9492abc5e972d42ba0c0ebb88757625"
+-"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.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb"
+-"checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32"
+-"checksum num_cpus 1.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "155394f924cdddf08149da25bfb932d226b4a593ca7468b08191ff6335941af5"
+-"checksum number_prefix 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "dbf9993e59c894e3c08aa1c2712914e9e6bf1fcbfc6bef283e2183df345a4fee"
+-"checksum openssl 0.10.25 (registry+https://github.com/rust-lang/crates.io-index)" = "2f372b2b53ce10fb823a337aaa674e3a7d072b957c6264d0f4ff0bd86e657449"
+-"checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de"
+-"checksum openssl-sys 0.9.52 (registry+https://github.com/rust-lang/crates.io-index)" = "c977d08e1312e2f7e4b86f9ebaa0ed3b19d1daff75fae88bbb88108afbd801fc"
+-"checksum os_type 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7edc011af0ae98b7f88cf7e4a83b70a54a75d2b8cb013d6efd02e5956207e9eb"
+-"checksum parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252"
+-"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 percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
+-"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.17 (registry+https://github.com/rust-lang/crates.io-index)" = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677"
+-"checksum podio 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "780fb4b6698bbf9cf2444ea5d22411cef2953f0824b98f33cf454ec5615645bd"
+-"checksum ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b"
+-"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 proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9c9e470a8dc4aeae2dee2f335e8f533e2d4b347e1434e5671afc49b054592f27"
+-"checksum publicsuffix 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9bf259a81de2b2eb9850ec990ec78e6a25319715584fd7652b9b26f96fcb1510"
+-"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 quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
+-"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.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3ae1b169243eaf61759b8475a998f0a385e42042370f3a7dbaf35246eacc8412"
+-"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.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
+-"checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
+-"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.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "83a27732a533a1be0a0035a111fe76db89ad312f6f0347004c220c57f209a123"
+-"checksum rayon-core 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "98dcf634205083b17d0861252431eb2acbfb698ab7478a2d20de07954f47ec7b"
+-"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.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ecedbca3bf205f8d8f5c2b44d83cd0690e39ee84b951ed649e9f1841132b66d"
+-"checksum regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9329abc99e39129fcceabd24cf5d85b4671ef7c29c50e972bc5afe32438ec384"
+-"checksum regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dc220bd33bdce8f093101afe22a037b8eb0e5af33592e6a9caafff0d4cb81cbd"
+-"checksum regex-syntax 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7d707a4fa2637f2dca2ef9fd02225ec7661fe01a53623c1e6515b6916511f7a7"
+-"checksum regex-syntax 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "11a7e20d1cce64ef2fed88b66d347f88bd9babb82845b2b858f3edbf59a4f716"
+-"checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e"
+-"checksum reqwest 0.9.22 (registry+https://github.com/rust-lang/crates.io-index)" = "2c2064233e442ce85c77231ebd67d9eca395207dec2127fe0bbedde4bd29a650"
+-"checksum rust-argon2 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ca4eaef519b494d1f2848fc602d18816fed808a981aedf4f1f00ceb7c9d32cf"
+-"checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783"
+-"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
+-"checksum ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8"
+-"checksum same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "585e8ddcedc187886a30fa705c47985c3fa88d06624095856b36ca0b82ff4421"
+-"checksum schannel 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "87f550b06b6cba9c8b8be3ee73f391990116bf527450d2556e9b9ce263b9a021"
+-"checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d"
+-"checksum security-framework 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "301c862a6d0ee78f124c5e1710205965fc5c553100dcda6d98f13ef87a763f04"
+-"checksum security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e31493fc37615debb8c5090a7aeb4a9730bc61e77ab10b9af59f1a202284f895"
+-"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.102 (registry+https://github.com/rust-lang/crates.io-index)" = "0c4b39bd9b0b087684013a792c59e3e07a46a01d2322518d8a1104641a0b1be0"
+-"checksum serde_derive 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)" = "ca13fc1a832f793322228923fbb3aba9f3f44444898f835d31ad1b74fa0a2bf8"
+-"checksum serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)" = "2f72eb2a68a7dc3f9a691bfda9305a1c017a6215e5a4545c258500d2099a37c2"
+-"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.13 (registry+https://github.com/rust-lang/crates.io-index)" = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6"
+-"checksum socket2 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "e8b74de517221a2cb01a53349cf54182acdc31a074727d3079068448c0676d85"
+-"checksum string 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d"
+-"checksum string_cache 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)" = "89c058a82f9fd69b1becf8c274f412281038877c553182f1d02eb027045a2d67"
+-"checksum string_cache_codegen 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0f45ed1b65bf9a4bf2f7b7dc59212d1926e9eaf00fa998988e420fd124467c6"
+-"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.44 (registry+https://github.com/rust-lang/crates.io-index)" = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5"
+-"checksum syn 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "0e7bedb3320d0f3035594b0b723c8a28d7d336a3eda3881db79e61d676fb644c"
+-"checksum synstructure 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "575be94ccb86e8da37efb894a87e2b660be299b41d8ef347f9d6d79fbe61b1ba"
+-"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.10 (registry+https://github.com/rust-lang/crates.io-index)" = "c56391be9805bc80163151c0b9e5164ee64f4b0200962c346fea12773158f22d"
+-"checksum tokio-sync 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "d06554cce1ae4a50f42fba8023918afa931413aded705b560e29600ccf7c6d76"
+-"checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119"
+-"checksum tokio-threadpool 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "2bd2c6a3885302581f4401c82af70d792bb9df1700e7437b0aeb4ada94d5388c"
+-"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 2.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2e2e6bd1e59e56598518beb94fd6db628ded570326f0a98c679a304bd9f00150"
+-"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.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49f5526225fd8b77342d5986ab5f6055552e9c0776193b5b63fd53b46debfad7"
+-"checksum unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7007dbd421b92cc6e28410fe7362e2e0a2503394908f417b68ec8d1c364c4e20"
+-"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
+-"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
+-"checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a"
+-"checksum url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "75b414f6c464c879d7f9babf951f23bc3743fb7313c081b2e6ca719067ea9d61"
+-"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 wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b89c3ce4ce14bdc6fb6beaf9ec7928ca331de5df7e5ea278375642a2f478570d"
+-"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
+-"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6"
+-"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.2 (registry+https://github.com/rust-lang/crates.io-index)" = "96f5016b18804d24db43cebf3c77269e7569b8954a8464501c216cc5e070eaa9"
+-"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.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3c21bb410afa2bd823a047f5bda3adb62f51074ac7e06263b2c97ecdd47e9fc6"
++ "byteorder",
++ "bzip2",
++ "crc32fast",
++ "flate2",
++ "thiserror",
++ "time",
++]
diff --git a/nixpkgs/pkgs/games/wyvern/default.nix b/nixpkgs/pkgs/games/wyvern/default.nix
new file mode 100644
index 000000000000..6eae1a4e71b2
--- /dev/null
+++ b/nixpkgs/pkgs/games/wyvern/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, fetchCrate
+, rustPlatform
+, cmake
+, pkg-config
+, openssl
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "wyvern";
+  version = "1.4.1";
+
+  src = fetchCrate {
+    inherit pname version;
+    hash = "sha256-OjL3wEoh4fT2nKqb7lMefP5B0vYyUaTRj09OXPEVfW4=";
+  };
+
+  cargoPatches = [ ./cargo-lock.patch ];
+
+  cargoHash = "sha256-cwk8yFt8JrYkYlNUW9n/bgMUA6jyOpG0TSh5C+eERLY=";
+
+  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/nixpkgs/pkgs/games/xbill/default.nix b/nixpkgs/pkgs/games/xbill/default.nix
new file mode 100644
index 000000000000..05314e6911b9
--- /dev/null
+++ b/nixpkgs/pkgs/games/xbill/default.nix
@@ -0,0 +1,49 @@
+{ 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";
+
+  configureFlags = [
+    "--with-x"
+    "--enable-motif"
+  ];
+
+  src = fetchurl {
+    url = "http://www.xbill.org/download/${pname}-${version}.tar.gz";
+    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";
+    homepage = "http://www.xbill.org/";
+    license = lib.licenses.gpl1Only;
+    maintainers = with lib.maintainers; [ aw ];
+    longDescription = ''
+      Ever get the feeling that nothing is going right? You're a sysadmin,
+      and someone's trying to destroy your computers. The little people
+      running around the screen are trying to infect your computers with
+      Wingdows [TM], a virus cleverly designed to resemble a popular
+      operating system.
+    '';
+    mainProgram = "xbill";
+  };
+}
diff --git a/nixpkgs/pkgs/games/xboard/default.nix b/nixpkgs/pkgs/games/xboard/default.nix
new file mode 100644
index 000000000000..af75ec79e730
--- /dev/null
+++ b/nixpkgs/pkgs/games/xboard/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, stdenv
+, fetchurl
+, fetchpatch
+, libX11
+, xorgproto
+, libXt
+, libXaw
+, libSM
+, libICE
+, libXmu
+, libXext
+, gnuchess
+, texinfo
+, libXpm
+, pkg-config
+, librsvg
+, cairo
+, pango
+, gtk2
+}:
+
+stdenv.mkDerivation rec {
+  pname = "xboard";
+  version = "4.9.1";
+
+  src = fetchurl {
+    url = "mirror://gnu/xboard/xboard-${version}.tar.gz";
+    sha256 = "sha256-Ky5T6EKK2bbo3IpVs6UYM4GRGk2uLABy+pYpa7sZcNY=";
+  };
+
+  patches = [
+    # Pull patch pending upstream inclusion for -fno-common toolchain support:
+    #   https://savannah.gnu.org/patch/index.php?10211
+    (fetchpatch {
+      name = "fno-common.patch";
+      url = "https://savannah.gnu.org/patch/download.php?file_id=53275";
+      sha256 = "sha256-ZOo9jAy1plFjhC5HXJQvXL+Zf7FL14asV3G4AwfgqTY=";
+    })
+  ];
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [
+    libX11
+    xorgproto
+    libXt
+    libXaw
+    libSM
+    libICE
+    libXmu
+    libXext
+    gnuchess
+    texinfo
+    libXpm
+    librsvg
+    cairo
+    pango
+    gtk2
+  ];
+
+  meta = with lib; {
+    description = "GUI for chess engines";
+    homepage = "https://www.gnu.org/software/xboard/";
+    maintainers = with maintainers; [ raskin ];
+    platforms = platforms.unix;
+    license = licenses.gpl3Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/games/xbomb/default.nix b/nixpkgs/pkgs/games/xbomb/default.nix
new file mode 100644
index 000000000000..093f822a7e31
--- /dev/null
+++ b/nixpkgs/pkgs/games/xbomb/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, fetchurl, libX11, libXaw }:
+
+stdenv.mkDerivation rec {
+  pname = "xbomb";
+  version = "2.2b";
+  src = fetchurl {
+    url    = "https://www.gedanken.org.uk/software/xbomb/download/xbomb-${version}.tgz";
+    sha256 = "0692gjw28qvh8wj9l58scjw6kxj7jdyb3yzgcgs9wcznq11q839m";
+  };
+
+  buildInputs = [ libX11 libXaw ];
+
+  makeFlags = [
+    "INSTDIR=${placeholder "out"}"
+  ];
+
+  meta = with lib; {
+    homepage = "http://www.gedanken.org.uk/software/xbomb/";
+    description = "Minesweeper for X11 with various grid sizes and shapes";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/xconq/default.nix b/nixpkgs/pkgs/games/xconq/default.nix
new file mode 100644
index 000000000000..78a7949d1a91
--- /dev/null
+++ b/nixpkgs/pkgs/games/xconq/default.nix
@@ -0,0 +1,61 @@
+{ lib, stdenv, fetchurl, cpio, xorgproto, libX11, libXmu, libXaw, libXt, tcl, tk
+, libXext, fontconfig, makeWrapper }:
+
+stdenv.mkDerivation rec {
+  pname = "xconq";
+  version = "7.5.0-0pre.0.20050612";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/project/xconq/xconq/xconq-${version}/xconq-${version}.tar.gz";
+    sha256 = "1za78yx57mgwcmmi33wx3533yz1x093dnqis8q2qmqivxav51lca";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ cpio xorgproto libX11 libXmu libXaw libXt tcl tk libXext fontconfig ];
+
+  configureFlags = [
+    "--enable-alternate-scoresdir=scores"
+    "--with-tclconfig=${tcl}/lib"
+    "--with-tkconfig=${tk}/lib"
+  ];
+
+  env.CXXFLAGS = toString [
+    "-std=c++11"
+    "-DUSE_INTERP_RESULT"
+    "-Wno-writable-strings"
+  ];
+
+  enableParallelBuilding = true;
+
+  hardeningDisable = [ "format" ];
+
+  patchPhase = ''
+    # Fix Makefiles
+    find . -name 'Makefile.in' -exec sed -re 's@^        ( *)(cd|[&][&])@	\1\2@' -i '{}' ';'
+    find . -name 'Makefile.in' -exec sed -e '/chown/d; /chgrp/d' -i '{}' ';'
+    # do not set sticky bit in nix store
+    find . -name 'Makefile.in' -exec sed -e 's/04755/755/g' -i '{}' ';'
+    sed -e '/^			* *[$][(]tcltkdir[)]\/[*][.][*]/d' -i tcltk/Makefile.in
+
+    # Fix C files
+    sed -re 's@[(]int[)]color@(long)color@' -i tcltk/tkmap.c
+    sed -re '/unitp = view_unit[(]uview[)]/aelse *unitp = NULL\;' -i tcltk/tkmap.c
+    sed -re 's@BMAP_BYTE char@BMAP_BYTE unsigned char@' -i kernel/ui.h
+
+    # Fix TCL files
+    sed -re 's@MediumBlue@LightBlue@g' -i tcltk/tkconq.tcl
+  '';
+
+  postInstall = ''
+    for file in $out/bin/*; do
+      wrapProgram $file --prefix TCLLIBPATH ' ' "${tk}/lib"
+    done
+  '';
+
+  meta = with lib; {
+    description = "A programmable turn-based strategy game";
+    maintainers = with maintainers; [ raskin ];
+    platforms = platforms.unix;
+    license = licenses.gpl2;
+  };
+}
diff --git a/nixpkgs/pkgs/games/xcowsay/default.nix b/nixpkgs/pkgs/games/xcowsay/default.nix
new file mode 100644
index 000000000000..52569e044f06
--- /dev/null
+++ b/nixpkgs/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.6";
+
+  src = fetchurl {
+    url = "http://www.nickg.me.uk/files/xcowsay-${version}.tar.gz";
+    sha256 = "sha256-RqzoZP8o0tIfS3BY8CleGNAEGhIMEHipUfpDxOD1yMU=";
+  };
+
+  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/nixpkgs/pkgs/games/xgalaga++/default.nix b/nixpkgs/pkgs/games/xgalaga++/default.nix
new file mode 100644
index 000000000000..ba78e2864414
--- /dev/null
+++ b/nixpkgs/pkgs/games/xgalaga++/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, stdenv
+, fetchurl
+, libX11
+, libXpm
+}:
+
+stdenv.mkDerivation rec {
+  pname = "xgalaga++";
+  version = "0.9";
+  src = fetchurl {
+    url    = "https://marc.mongenet.ch/OSS/XGalaga/xgalaga++_${version}.tar.gz";
+    sha256 = "sha256-yNtLuYCMHLvQAVM7CDGPardrh3q27TE9l31qhUbMf8k=";
+  };
+
+  buildInputs = [
+    libX11
+    libXpm
+  ];
+
+  buildPhase = ''
+    make all HIGH_SCORES_FILE=.xgalaga++.scores
+  '';
+
+  installPhase = ''
+    mkdir -p $out/bin $out/share/man
+    mv xgalaga++ $out/bin
+    mv xgalaga++.6x $out/share/man
+  '';
+
+  meta = with lib; {
+    homepage = "https://marc.mongenet.ch/OSS/XGalaga/";
+    description = "XGalaga++ is a classic single screen vertical shoot ’em up. It is inspired by XGalaga and reuses most of its sprites.";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/xivlauncher/default.nix b/nixpkgs/pkgs/games/xivlauncher/default.nix
new file mode 100644
index 000000000000..0a621f625e88
--- /dev/null
+++ b/nixpkgs/pkgs/games/xivlauncher/default.nix
@@ -0,0 +1,80 @@
+{ lib, buildDotnetModule, fetchFromGitHub, dotnetCorePackages, SDL2, libsecret, glib, gnutls, aria2, steam, gst_all_1
+, copyDesktopItems, makeDesktopItem, makeWrapper
+, useSteamRun ? true }:
+
+let
+  rev = "1.0.6";
+in
+  buildDotnetModule rec {
+    pname = "XIVLauncher";
+    version = rev;
+
+    src = fetchFromGitHub {
+      owner = "goatcorp";
+      repo = "XIVLauncher.Core";
+      inherit rev;
+      hash = "sha256-P1i12vw9KQOTL7QBxjKPSlda5rvoyl7DGmuuD5iVEQs=";
+      fetchSubmodules = true;
+    };
+
+    nativeBuildInputs = [ copyDesktopItems makeWrapper ];
+
+    buildInputs = with gst_all_1; [ gstreamer gst-plugins-base gst-plugins-good gst-plugins-bad gst-plugins-ugly gst-libav ];
+
+    projectFile = "src/XIVLauncher.Core/XIVLauncher.Core.csproj";
+    nugetDeps = ./deps.nix; # File generated with `nix-build -A xivlauncher.passthru.fetch-deps`
+
+    dotnetFlags = [
+      "-p:BuildHash=${rev}"
+      "-p:PublishSingleFile=false"
+    ];
+
+    postPatch = ''
+      substituteInPlace lib/FFXIVQuickLauncher/src/XIVLauncher.Common/Game/Patch/Acquisition/Aria/AriaHttpPatchAcquisition.cs \
+        --replace 'ariaPath = "aria2c"' 'ariaPath = "${aria2}/bin/aria2c"'
+    '';
+
+    postInstall = ''
+      mkdir -p $out/share/pixmaps
+      cp src/XIVLauncher.Core/Resources/logo.png $out/share/pixmaps/xivlauncher.png
+    '';
+
+    postFixup = lib.optionalString useSteamRun (let
+      steam-run = (steam.override {
+        extraPkgs = pkgs: [ pkgs.libunwind ];
+      }).run;
+    in ''
+      substituteInPlace $out/bin/XIVLauncher.Core \
+        --replace 'exec' 'exec ${steam-run}/bin/steam-run'
+    '') + ''
+      wrapProgram $out/bin/XIVLauncher.Core --prefix GST_PLUGIN_SYSTEM_PATH_1_0 ":" "$GST_PLUGIN_SYSTEM_PATH_1_0"
+      # the reference to aria2 gets mangled as UTF-16LE and isn't detectable by nix: https://github.com/NixOS/nixpkgs/issues/220065
+      mkdir -p $out/nix-support
+      echo ${aria2} >> $out/nix-support/depends
+    '';
+
+    executables = [ "XIVLauncher.Core" ];
+
+    runtimeDeps = [ SDL2 libsecret glib gnutls ];
+
+    desktopItems = [
+      (makeDesktopItem {
+        name = "xivlauncher";
+        exec = "XIVLauncher.Core";
+        icon = "xivlauncher";
+        desktopName = "XIVLauncher";
+        comment = meta.description;
+        categories = [ "Game" ];
+        startupWMClass = "XIVLauncher.Core";
+      })
+    ];
+
+    meta = with lib; {
+      description = "Custom launcher for FFXIV";
+      homepage = "https://github.com/goatcorp/XIVLauncher.Core";
+      license = licenses.gpl3;
+      maintainers = with maintainers; [ sersorrel witchof0x20 ];
+      platforms = [ "x86_64-linux" ];
+      mainProgram = "XIVLauncher.Core";
+    };
+  }
diff --git a/nixpkgs/pkgs/games/xivlauncher/deps.nix b/nixpkgs/pkgs/games/xivlauncher/deps.nix
new file mode 100644
index 000000000000..10b646fc8c41
--- /dev/null
+++ b/nixpkgs/pkgs/games/xivlauncher/deps.nix
@@ -0,0 +1,191 @@
+# This file was automatically generated by passthru.fetch-deps.
+# Please dont edit it manually, your changes might get overwritten!
+
+{ fetchNuGet }: [
+  (fetchNuGet { pname = "Castle.Core"; version = "4.4.1"; sha256 = "13dja1jxl5zwhi0ghkgvgmqdrixn57f9hk52jy5vpaaakzr550r7"; })
+  (fetchNuGet { pname = "CheapLoc"; version = "1.1.6"; sha256 = "1m6cgx9yh7h3vrq2d4f99xyvsxc9jvz8zjq1q14qgylfmyq4hx4l"; })
+  (fetchNuGet { pname = "CommandLineParser"; version = "2.9.1"; sha256 = "1sldkj8lakggn4hnyabjj1fppqh50fkdrr1k99d4gswpbk5kv582"; })
+  (fetchNuGet { pname = "Config.Net"; version = "4.19.0"; sha256 = "17iv0vy0693s6d8626lbz3w1ppn5abn77aaki7h4qi4izysizgim"; })
+  (fetchNuGet { pname = "Downloader"; version = "2.2.8"; sha256 = "0farwh3pc6m8hsgqywigdpcb4gr2m9myyxm2idzjmhhkzfqghj28"; })
+  (fetchNuGet { pname = "goaaats.NativeLibraryLoader"; version = "4.9.0-beta1-g70f642e82e"; sha256 = "1bjjgsw4ry9cz8dzsgwx428hn06wms194pqz8nclwrqcwfx7gmxk"; })
+  (fetchNuGet { pname = "goaaats.Steamworks"; version = "2.3.4"; sha256 = "1khxkkjvh6af60rxc13bacxn85amdfzr8z0b9a6gfg6m1fnmlkss"; })
+  (fetchNuGet { pname = "goaaats.Veldrid"; version = "4.9.0-beta1-g70f642e82e"; sha256 = "0b35bn4190hxbvrwsygpbpg00gnrj6crxyk8b0d7ian611v4jj0m"; })
+  (fetchNuGet { pname = "goaaats.Veldrid.ImageSharp"; version = "4.9.0-beta1-g70f642e82e"; sha256 = "1zihi2n9qz18kfkz4qnj3412bfsqvx49809hqkknixdrgn8323i2"; })
+  (fetchNuGet { pname = "goaaats.Veldrid.MetalBindings"; version = "4.9.0-beta1-g70f642e82e"; sha256 = "13cs5jr8bpkrkzziz8b71l3npr14shxryrpsiw0zm7jcx69vg2qf"; })
+  (fetchNuGet { pname = "goaaats.Veldrid.OpenGLBindings"; version = "4.9.0-beta1-g70f642e82e"; sha256 = "1p7gv2234r3f1pskcr1ah7p3ak6zn1rrmvxy5xqc9d5y4zdrnzlb"; })
+  (fetchNuGet { pname = "goaaats.Veldrid.SDL2"; version = "4.9.0-beta1-g70f642e82e"; sha256 = "14xj3z0yc25vq17bvv2193cbqxj7k9iimxbaqk2rpvlpmrbg20xi"; })
+  (fetchNuGet { pname = "goaaats.Veldrid.StartupUtilities"; version = "4.9.0-beta1-g70f642e82e"; sha256 = "03r3x9h0fyb07d6d28ny6r5s688m50xc0lgc6zf2cy684kfnvmp5"; })
+  (fetchNuGet { pname = "ImGui.NET"; version = "1.87.2"; sha256 = "0rv0n18fvz1gbh45crhzn1f8xw8zkc8qyiyj91vajjcry8mq1x7q"; })
+  (fetchNuGet { pname = "KeySharp"; version = "1.0.5"; sha256 = "1ic10v0a174fw6w89iyg4yzji36bsj15573y676cj5n09n6s75d4"; })
+  (fetchNuGet { pname = "Microsoft.Bcl.AsyncInterfaces"; version = "6.0.0"; sha256 = "15gqy2m14fdlvy1g59207h5kisznm355kbw010gy19vh47z8gpz3"; })
+  (fetchNuGet { pname = "Microsoft.CodeAnalysis.Analyzers"; version = "3.3.3"; sha256 = "09m4cpry8ivm9ga1abrxmvw16sslxhy2k5sl14zckhqb1j164im6"; })
+  (fetchNuGet { pname = "Microsoft.CodeAnalysis.BannedApiAnalyzers"; version = "3.3.3"; sha256 = "1z6x0d8lpcfjr3sxy25493i17vvcg5bsay6c03qan6mnj5aqzw2k"; })
+  (fetchNuGet { pname = "Microsoft.CodeAnalysis.Common"; version = "4.0.1"; sha256 = "0axjv1nhk1z9d4c51d9yxdp09l8yqqnqaifhqcwnxnv0r4y5cka9"; })
+  (fetchNuGet { pname = "Microsoft.CodeAnalysis.CSharp"; version = "4.0.1"; sha256 = "1h6jfifg7pw2vacpdds4v4jqnaydg9b108irf315wzx6rh8yv9cb"; })
+  (fetchNuGet { pname = "Microsoft.CodeAnalysis.NetAnalyzers"; version = "6.0.0"; sha256 = "06zy947m5lrbwb684g42ijb07r5jsqycvfnphc6cqfdrfnzqv6k9"; })
+  (fetchNuGet { pname = "Microsoft.CodeAnalysis.NetAnalyzers"; version = "7.0.0"; sha256 = "1rl5zi8s213g70nvqfacf50ff8vqvaj8i7jxv0gjw2hkz73dg4h1"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Platforms"; version = "1.1.0"; sha256 = "08vh1r12g6ykjygq5d3vq09zylgb84l63k49jc4v8faw9g93iqqm"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Targets"; version = "1.1.0"; sha256 = "193xwf33fbm0ni3idxzbr5fdq3i2dlfgihsac9jj7whj0gd902nh"; })
+  (fetchNuGet { pname = "Microsoft.Win32.Primitives"; version = "4.3.0"; sha256 = "0j0c1wj4ndj21zsgivsc24whiya605603kxrbiw6wkfdync464wq"; })
+  (fetchNuGet { pname = "Microsoft.Win32.Registry"; version = "6.0.0-preview.5.21301.5"; sha256 = "02712s86n2i8s5j6vxdayqwcc7r538yw3frhf1gfrc6ah6hvqnzc"; })
+  (fetchNuGet { pname = "Microsoft.Win32.SystemEvents"; version = "6.0.0"; sha256 = "0c6pcj088g1yd1vs529q3ybgsd2vjlk5y1ic6dkmbhvrp5jibl9p"; })
+  (fetchNuGet { pname = "Mono.Cecil"; version = "0.9.6.1"; sha256 = "1fr7969h5q611l5227xw6nvv5rzap76vbpk0wg9hxbcxk3hn7szf"; })
+  (fetchNuGet { pname = "NETStandard.Library"; version = "1.6.1"; sha256 = "1z70wvsx2d847a2cjfii7b83pjfs34q05gb037fdjikv5kbagml8"; })
+  (fetchNuGet { pname = "NETStandard.Library"; version = "2.0.3"; sha256 = "1fn9fxppfcg4jgypp2pmrpr6awl3qz1xmnri0cygpkwvyx27df1y"; })
+  (fetchNuGet { pname = "Newtonsoft.Json"; version = "12.0.2"; sha256 = "0w2fbji1smd2y7x25qqibf1qrznmv4s6s0jvrbvr6alb7mfyqvh5"; })
+  (fetchNuGet { pname = "PInvoke.Kernel32"; version = "0.7.124"; sha256 = "0n1245s2p5735n8xgmahrx7g8mw32pxdn4rr9dydb9r6mvgm9bhk"; })
+  (fetchNuGet { pname = "PInvoke.Windows.Core"; version = "0.7.124"; sha256 = "16qkn91gh3aiab2330q5j1vlx2ni4m4kkz04dvsqlm8lr7ldizlz"; })
+  (fetchNuGet { pname = "runtime.any.System.Collections"; version = "4.3.0"; sha256 = "0bv5qgm6vr47ynxqbnkc7i797fdi8gbjjxii173syrx14nmrkwg0"; })
+  (fetchNuGet { pname = "runtime.any.System.Diagnostics.Tools"; version = "4.3.0"; sha256 = "1wl76vk12zhdh66vmagni66h5xbhgqq7zkdpgw21jhxhvlbcl8pk"; })
+  (fetchNuGet { pname = "runtime.any.System.Diagnostics.Tracing"; version = "4.3.0"; sha256 = "00j6nv2xgmd3bi347k00m7wr542wjlig53rmj28pmw7ddcn97jbn"; })
+  (fetchNuGet { pname = "runtime.any.System.Globalization"; version = "4.3.0"; sha256 = "1daqf33hssad94lamzg01y49xwndy2q97i2lrb7mgn28656qia1x"; })
+  (fetchNuGet { pname = "runtime.any.System.Globalization.Calendars"; version = "4.3.0"; sha256 = "1ghhhk5psqxcg6w88sxkqrc35bxcz27zbqm2y5p5298pv3v7g201"; })
+  (fetchNuGet { pname = "runtime.any.System.IO"; version = "4.3.0"; sha256 = "0l8xz8zn46w4d10bcn3l4yyn4vhb3lrj2zw8llvz7jk14k4zps5x"; })
+  (fetchNuGet { pname = "runtime.any.System.Reflection"; version = "4.3.0"; sha256 = "02c9h3y35pylc0zfq3wcsvc5nqci95nrkq0mszifc0sjx7xrzkly"; })
+  (fetchNuGet { pname = "runtime.any.System.Reflection.Extensions"; version = "4.3.0"; sha256 = "0zyri97dfc5vyaz9ba65hjj1zbcrzaffhsdlpxc9bh09wy22fq33"; })
+  (fetchNuGet { pname = "runtime.any.System.Reflection.Primitives"; version = "4.3.0"; sha256 = "0x1mm8c6iy8rlxm8w9vqw7gb7s1ljadrn049fmf70cyh42vdfhrf"; })
+  (fetchNuGet { pname = "runtime.any.System.Resources.ResourceManager"; version = "4.3.0"; sha256 = "03kickal0iiby82wa5flar18kyv82s9s6d4xhk5h4bi5kfcyfjzl"; })
+  (fetchNuGet { pname = "runtime.any.System.Runtime"; version = "4.3.0"; sha256 = "1cqh1sv3h5j7ixyb7axxbdkqx6cxy00p4np4j91kpm492rf4s25b"; })
+  (fetchNuGet { pname = "runtime.any.System.Runtime.Handles"; version = "4.3.0"; sha256 = "0bh5bi25nk9w9xi8z23ws45q5yia6k7dg3i4axhfqlnj145l011x"; })
+  (fetchNuGet { pname = "runtime.any.System.Runtime.InteropServices"; version = "4.3.0"; sha256 = "0c3g3g3jmhlhw4klrc86ka9fjbl7i59ds1fadsb2l8nqf8z3kb19"; })
+  (fetchNuGet { pname = "runtime.any.System.Text.Encoding"; version = "4.3.0"; sha256 = "0aqqi1v4wx51h51mk956y783wzags13wa7mgqyclacmsmpv02ps3"; })
+  (fetchNuGet { pname = "runtime.any.System.Text.Encoding.Extensions"; version = "4.3.0"; sha256 = "0lqhgqi0i8194ryqq6v2gqx0fb86db2gqknbm0aq31wb378j7ip8"; })
+  (fetchNuGet { pname = "runtime.any.System.Threading.Tasks"; version = "4.3.0"; sha256 = "03mnvkhskbzxddz4hm113zsch1jyzh2cs450dk3rgfjp8crlw1va"; })
+  (fetchNuGet { pname = "runtime.any.System.Threading.Timer"; version = "4.3.0"; sha256 = "0aw4phrhwqz9m61r79vyfl5la64bjxj8l34qnrcwb28v49fg2086"; })
+  (fetchNuGet { pname = "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "16rnxzpk5dpbbl1x354yrlsbvwylrq456xzpsha1n9y3glnhyx9d"; })
+  (fetchNuGet { pname = "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "0hkg03sgm2wyq8nqk6dbm9jh5vcq57ry42lkqdmfklrw89lsmr59"; })
+  (fetchNuGet { pname = "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "0c2p354hjx58xhhz7wv6div8xpi90sc6ibdm40qin21bvi7ymcaa"; })
+  (fetchNuGet { pname = "runtime.native.System"; version = "4.3.0"; sha256 = "15hgf6zaq9b8br2wi1i3x0zvmk410nlmsmva9p0bbg73v6hml5k4"; })
+  (fetchNuGet { pname = "runtime.native.System.IO.Compression"; version = "4.3.0"; sha256 = "1vvivbqsk6y4hzcid27pqpm5bsi6sc50hvqwbcx8aap5ifrxfs8d"; })
+  (fetchNuGet { pname = "runtime.native.System.Net.Http"; version = "4.3.0"; sha256 = "1n6rgz5132lcibbch1qlf0g9jk60r0kqv087hxc0lisy50zpm7kk"; })
+  (fetchNuGet { pname = "runtime.native.System.Security.Cryptography.Apple"; version = "4.3.0"; sha256 = "1b61p6gw1m02cc1ry996fl49liiwky6181dzr873g9ds92zl326q"; })
+  (fetchNuGet { pname = "runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "18pzfdlwsg2nb1jjjjzyb5qlgy6xjxzmhnfaijq5s2jw3cm3ab97"; })
+  (fetchNuGet { pname = "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "0qyynf9nz5i7pc26cwhgi8j62ps27sqmf78ijcfgzab50z9g8ay3"; })
+  (fetchNuGet { pname = "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "1klrs545awhayryma6l7g2pvnp9xy4z0r1i40r80zb45q3i9nbyf"; })
+  (fetchNuGet { pname = "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple"; version = "4.3.0"; sha256 = "10yc8jdrwgcl44b4g93f1ds76b176bajd3zqi2faf5rvh1vy9smi"; })
+  (fetchNuGet { pname = "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "0zcxjv5pckplvkg0r6mw3asggm7aqzbdjimhvsasb0cgm59x09l3"; })
+  (fetchNuGet { pname = "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "0vhynn79ih7hw7cwjazn87rm9z9fj0rvxgzlab36jybgcpcgphsn"; })
+  (fetchNuGet { pname = "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "160p68l2c7cqmyqjwxydcvgw7lvl1cr0znkw8fp24d1by9mqc8p3"; })
+  (fetchNuGet { pname = "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "15zrc8fgd8zx28hdghcj5f5i34wf3l6bq5177075m2bc2j34jrqy"; })
+  (fetchNuGet { pname = "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "1p4dgxax6p7rlgj4q73k73rslcnz4wdcv8q2flg1s8ygwcm58ld5"; })
+  (fetchNuGet { pname = "runtime.unix.Microsoft.Win32.Primitives"; version = "4.3.0"; sha256 = "0y61k9zbxhdi0glg154v30kkq7f8646nif8lnnxbvkjpakggd5id"; })
+  (fetchNuGet { pname = "runtime.unix.System.Console"; version = "4.3.0"; sha256 = "1pfpkvc6x2if8zbdzg9rnc5fx51yllprl8zkm5npni2k50lisy80"; })
+  (fetchNuGet { pname = "runtime.unix.System.Diagnostics.Debug"; version = "4.3.0"; sha256 = "1lps7fbnw34bnh3lm31gs5c0g0dh7548wfmb8zz62v0zqz71msj5"; })
+  (fetchNuGet { pname = "runtime.unix.System.IO.FileSystem"; version = "4.3.0"; sha256 = "14nbkhvs7sji5r1saj2x8daz82rnf9kx28d3v2qss34qbr32dzix"; })
+  (fetchNuGet { pname = "runtime.unix.System.Net.Primitives"; version = "4.3.0"; sha256 = "0bdnglg59pzx9394sy4ic66kmxhqp8q8bvmykdxcbs5mm0ipwwm4"; })
+  (fetchNuGet { pname = "runtime.unix.System.Net.Sockets"; version = "4.3.0"; sha256 = "03npdxzy8gfv035bv1b9rz7c7hv0rxl5904wjz51if491mw0xy12"; })
+  (fetchNuGet { pname = "runtime.unix.System.Private.Uri"; version = "4.3.0"; sha256 = "1jx02q6kiwlvfksq1q9qr17fj78y5v6mwsszav4qcz9z25d5g6vk"; })
+  (fetchNuGet { pname = "runtime.unix.System.Runtime.Extensions"; version = "4.3.0"; sha256 = "0pnxxmm8whx38dp6yvwgmh22smknxmqs5n513fc7m4wxvs1bvi4p"; })
+  (fetchNuGet { pname = "Serilog"; version = "2.12.0"; sha256 = "0lqxpc96qcjkv9pr1rln7mi4y7n7jdi4vb36c2fv3845w1vswgr4"; })
+  (fetchNuGet { pname = "Serilog.Enrichers.Sensitive"; version = "1.7.2"; sha256 = "1f3r4jrfiz47vnvy7m0w6d8280nhhna67xwbagx1i557m9qvjssg"; })
+  (fetchNuGet { pname = "Serilog.Enrichers.Thread"; version = "3.1.0"; sha256 = "1y75aiv2k1sxnh012ixkx92fq1yl8srqggy8l439igg4p223hcqi"; })
+  (fetchNuGet { pname = "Serilog.Sinks.Async"; version = "1.5.0"; sha256 = "0bcb3n6lmg5wfj806mziybfmbb8gyiszrivs3swf0msy8w505gyg"; })
+  (fetchNuGet { pname = "Serilog.Sinks.Console"; version = "3.1.1"; sha256 = "0j99as641y1k6havwwkhyr0n08vibiblmfjj6nz051mz8g3864fn"; })
+  (fetchNuGet { pname = "Serilog.Sinks.Console"; version = "4.0.1"; sha256 = "080vh9kcyn9lx4j7p34146kp9byvhqlaz5jn9wzx70ql9cwd0hlz"; })
+  (fetchNuGet { pname = "Serilog.Sinks.Debug"; version = "1.0.1"; sha256 = "0969mb254kr59bgkq01ybyzca89z3f4n9ng5mdj8m53d5653zf22"; })
+  (fetchNuGet { pname = "Serilog.Sinks.File"; version = "5.0.0"; sha256 = "097rngmgcrdfy7jy8j7dq3xaq2qky8ijwg0ws6bfv5lx0f3vvb0q"; })
+  (fetchNuGet { pname = "SharedMemory"; version = "2.3.2"; sha256 = "078qaab0j8p2fjcc9n7r4sr5pr7567a9bspfiikkc85bsx7vfm8w"; })
+  (fetchNuGet { pname = "SharpGen.Runtime"; version = "2.0.0-beta.10"; sha256 = "0yxq0b4m96z71afc7sywfrlwz2pgr5nilacmssjk803v70f0ydr1"; })
+  (fetchNuGet { pname = "SharpGen.Runtime.COM"; version = "2.0.0-beta.10"; sha256 = "1qvpphja72x9r3yi96bnmwwy30b1n155v2yy2gzlxjil6qg3xjmb"; })
+  (fetchNuGet { pname = "SixLabors.ImageSharp"; version = "1.0.4"; sha256 = "0fmgn414my76gjgp89qlc210a0lqvnvkvk2fcwnpwxdhqpfvyilr"; })
+  (fetchNuGet { pname = "System.AppContext"; version = "4.3.0"; sha256 = "1649qvy3dar900z3g817h17nl8jp4ka5vcfmsr05kh0fshn7j3ya"; })
+  (fetchNuGet { pname = "System.Buffers"; version = "4.3.0"; sha256 = "0fgns20ispwrfqll4q1zc1waqcmylb3zc50ys9x8zlwxh9pmd9jy"; })
+  (fetchNuGet { pname = "System.Buffers"; version = "4.4.0"; sha256 = "183f8063w8zqn99pv0ni0nnwh7fgx46qzxamwnans55hhs2l0g19"; })
+  (fetchNuGet { pname = "System.Buffers"; version = "4.5.1"; sha256 = "04kb1mdrlcixj9zh1xdi5as0k0qi8byr5mi3p3jcxx72qz93s2y3"; })
+  (fetchNuGet { pname = "System.Collections"; version = "4.3.0"; sha256 = "19r4y64dqyrq6k4706dnyhhw7fs24kpp3awak7whzss39dakpxk9"; })
+  (fetchNuGet { pname = "System.Collections.Concurrent"; version = "4.3.0"; sha256 = "0wi10md9aq33jrkh2c24wr2n9hrpyamsdhsxdcnf43b7y86kkii8"; })
+  (fetchNuGet { pname = "System.Collections.Immutable"; version = "5.0.0"; sha256 = "1kvcllagxz2q92g81zkz81djkn2lid25ayjfgjalncyc68i15p0r"; })
+  (fetchNuGet { pname = "System.Collections.NonGeneric"; version = "4.3.0"; sha256 = "07q3k0hf3mrcjzwj8fwk6gv3n51cb513w4mgkfxzm3i37sc9kz7k"; })
+  (fetchNuGet { pname = "System.Collections.Specialized"; version = "4.3.0"; sha256 = "1sdwkma4f6j85m3dpb53v9vcgd0zyc9jb33f8g63byvijcj39n20"; })
+  (fetchNuGet { pname = "System.ComponentModel"; version = "4.3.0"; sha256 = "0986b10ww3nshy30x9sjyzm0jx339dkjxjj3401r3q0f6fx2wkcb"; })
+  (fetchNuGet { pname = "System.ComponentModel.Primitives"; version = "4.3.0"; sha256 = "1svfmcmgs0w0z9xdw2f2ps05rdxmkxxhf0l17xk9l1l8xfahkqr0"; })
+  (fetchNuGet { pname = "System.ComponentModel.TypeConverter"; version = "4.3.0"; sha256 = "17ng0p7v3nbrg3kycz10aqrrlw4lz9hzhws09pfh8gkwicyy481x"; })
+  (fetchNuGet { pname = "System.Configuration.ConfigurationManager"; version = "6.0.0"; sha256 = "0sqapr697jbb4ljkq46msg0xx1qpmc31ivva6llyz2wzq3mpmxbw"; })
+  (fetchNuGet { pname = "System.Console"; version = "4.3.0"; sha256 = "1flr7a9x920mr5cjsqmsy9wgnv3lvd0h1g521pdr1lkb2qycy7ay"; })
+  (fetchNuGet { pname = "System.Diagnostics.Debug"; version = "4.3.0"; sha256 = "00yjlf19wjydyr6cfviaph3vsjzg3d5nvnya26i2fvfg53sknh3y"; })
+  (fetchNuGet { pname = "System.Diagnostics.DiagnosticSource"; version = "4.3.0"; sha256 = "0z6m3pbiy0qw6rn3n209rrzf9x1k4002zh90vwcrsym09ipm2liq"; })
+  (fetchNuGet { pname = "System.Diagnostics.Tools"; version = "4.3.0"; sha256 = "0in3pic3s2ddyibi8cvgl102zmvp9r9mchh82ns9f0ms4basylw1"; })
+  (fetchNuGet { pname = "System.Diagnostics.TraceSource"; version = "4.3.0"; sha256 = "1kyw4d7dpjczhw6634nrmg7yyyzq72k75x38y0l0nwhigdlp1766"; })
+  (fetchNuGet { pname = "System.Diagnostics.Tracing"; version = "4.3.0"; sha256 = "1m3bx6c2s958qligl67q7grkwfz3w53hpy7nc97mh6f7j5k168c4"; })
+  (fetchNuGet { pname = "System.Drawing.Common"; version = "6.0.0"; sha256 = "02n8rzm58dac2np8b3xw8ychbvylja4nh6938l5k2fhyn40imlgz"; })
+  (fetchNuGet { pname = "System.Dynamic.Runtime"; version = "4.3.0"; sha256 = "1d951hrvrpndk7insiag80qxjbf2y0y39y8h5hnq9612ws661glk"; })
+  (fetchNuGet { pname = "System.Globalization"; version = "4.3.0"; sha256 = "1cp68vv683n6ic2zqh2s1fn4c2sd87g5hpp6l4d4nj4536jz98ki"; })
+  (fetchNuGet { pname = "System.Globalization.Calendars"; version = "4.3.0"; sha256 = "1xwl230bkakzzkrggy1l1lxmm3xlhk4bq2pkv790j5lm8g887lxq"; })
+  (fetchNuGet { pname = "System.Globalization.Extensions"; version = "4.3.0"; sha256 = "02a5zfxavhv3jd437bsncbhd2fp1zv4gxzakp1an9l6kdq1mcqls"; })
+  (fetchNuGet { pname = "System.IO"; version = "4.3.0"; sha256 = "05l9qdrzhm4s5dixmx68kxwif4l99ll5gqmh7rqgw554fx0agv5f"; })
+  (fetchNuGet { pname = "System.IO.Compression"; version = "4.3.0"; sha256 = "084zc82yi6yllgda0zkgl2ys48sypiswbiwrv7irb3r0ai1fp4vz"; })
+  (fetchNuGet { pname = "System.IO.Compression.ZipFile"; version = "4.3.0"; sha256 = "1yxy5pq4dnsm9hlkg9ysh5f6bf3fahqqb6p8668ndy5c0lk7w2ar"; })
+  (fetchNuGet { pname = "System.IO.FileSystem"; version = "4.3.0"; sha256 = "0z2dfrbra9i6y16mm9v1v6k47f0fm617vlb7s5iybjjsz6g1ilmw"; })
+  (fetchNuGet { pname = "System.IO.FileSystem.Primitives"; version = "4.3.0"; sha256 = "0j6ndgglcf4brg2lz4wzsh1av1gh8xrzdsn9f0yznskhqn1xzj9c"; })
+  (fetchNuGet { pname = "System.Linq"; version = "4.3.0"; sha256 = "1w0gmba695rbr80l1k2h4mrwzbzsyfl2z4klmpbsvsg5pm4a56s7"; })
+  (fetchNuGet { pname = "System.Linq.Expressions"; version = "4.3.0"; sha256 = "0ky2nrcvh70rqq88m9a5yqabsl4fyd17bpr63iy2mbivjs2nyypv"; })
+  (fetchNuGet { pname = "System.Memory"; version = "4.5.4"; sha256 = "14gbbs22mcxwggn0fcfs1b062521azb9fbb7c113x0mq6dzq9h6y"; })
+  (fetchNuGet { pname = "System.Net.Http"; version = "4.3.0"; sha256 = "1i4gc757xqrzflbk7kc5ksn20kwwfjhw9w7pgdkn19y3cgnl302j"; })
+  (fetchNuGet { pname = "System.Net.NameResolution"; version = "4.3.0"; sha256 = "15r75pwc0rm3vvwsn8rvm2krf929mjfwliv0mpicjnii24470rkq"; })
+  (fetchNuGet { pname = "System.Net.Primitives"; version = "4.3.0"; sha256 = "0c87k50rmdgmxx7df2khd9qj7q35j9rzdmm2572cc55dygmdk3ii"; })
+  (fetchNuGet { pname = "System.Net.Sockets"; version = "4.3.0"; sha256 = "1ssa65k6chcgi6mfmzrznvqaxk8jp0gvl77xhf1hbzakjnpxspla"; })
+  (fetchNuGet { pname = "System.Numerics.Vectors"; version = "4.4.0"; sha256 = "0rdvma399070b0i46c4qq1h2yvjj3k013sqzkilz4bz5cwmx1rba"; })
+  (fetchNuGet { pname = "System.Numerics.Vectors"; version = "4.5.0"; sha256 = "1kzrj37yzawf1b19jq0253rcs8hsq1l2q8g69d7ipnhzb0h97m59"; })
+  (fetchNuGet { pname = "System.ObjectModel"; version = "4.3.0"; sha256 = "191p63zy5rpqx7dnrb3h7prvgixmk168fhvvkkvhlazncf8r3nc2"; })
+  (fetchNuGet { pname = "System.Private.Uri"; version = "4.3.0"; sha256 = "04r1lkdnsznin0fj4ya1zikxiqr0h6r6a1ww2dsm60gqhdrf0mvx"; })
+  (fetchNuGet { pname = "System.Reflection"; version = "4.3.0"; sha256 = "0xl55k0mw8cd8ra6dxzh974nxif58s3k1rjv1vbd7gjbjr39j11m"; })
+  (fetchNuGet { pname = "System.Reflection.Emit"; version = "4.3.0"; sha256 = "11f8y3qfysfcrscjpjym9msk7lsfxkk4fmz9qq95kn3jd0769f74"; })
+  (fetchNuGet { pname = "System.Reflection.Emit.ILGeneration"; version = "4.3.0"; sha256 = "0w1n67glpv8241vnpz1kl14sy7zlnw414aqwj4hcx5nd86f6994q"; })
+  (fetchNuGet { pname = "System.Reflection.Emit.ILGeneration"; version = "4.7.0"; sha256 = "0l8jpxhpgjlf1nkz5lvp61r4kfdbhr29qi8aapcxn3izd9wd0j8r"; })
+  (fetchNuGet { pname = "System.Reflection.Emit.Lightweight"; version = "4.3.0"; sha256 = "0ql7lcakycrvzgi9kxz1b3lljd990az1x6c4jsiwcacrvimpib5c"; })
+  (fetchNuGet { pname = "System.Reflection.Emit.Lightweight"; version = "4.7.0"; sha256 = "0mbjfajmafkca47zr8v36brvknzks5a7pgb49kfq2d188pyv6iap"; })
+  (fetchNuGet { pname = "System.Reflection.Extensions"; version = "4.3.0"; sha256 = "02bly8bdc98gs22lqsfx9xicblszr2yan7v2mmw3g7hy6miq5hwq"; })
+  (fetchNuGet { pname = "System.Reflection.Metadata"; version = "5.0.0"; sha256 = "17qsl5nanlqk9iz0l5wijdn6ka632fs1m1fvx18dfgswm258r3ss"; })
+  (fetchNuGet { pname = "System.Reflection.Primitives"; version = "4.3.0"; sha256 = "04xqa33bld78yv5r93a8n76shvc8wwcdgr1qvvjh959g3rc31276"; })
+  (fetchNuGet { pname = "System.Reflection.TypeExtensions"; version = "4.3.0"; sha256 = "0y2ssg08d817p0vdag98vn238gyrrynjdj4181hdg780sif3ykp1"; })
+  (fetchNuGet { pname = "System.Resources.ResourceManager"; version = "4.3.0"; sha256 = "0sjqlzsryb0mg4y4xzf35xi523s4is4hz9q4qgdvlvgivl7qxn49"; })
+  (fetchNuGet { pname = "System.Runtime"; version = "4.3.0"; sha256 = "066ixvgbf2c929kgknshcxqj6539ax7b9m570cp8n179cpfkapz7"; })
+  (fetchNuGet { pname = "System.Runtime.CompilerServices.Unsafe"; version = "4.4.0"; sha256 = "0a6ahgi5b148sl5qyfpyw383p3cb4yrkm802k29fsi4mxkiwir29"; })
+  (fetchNuGet { pname = "System.Runtime.CompilerServices.Unsafe"; version = "4.5.0"; sha256 = "17labczwqk3jng3kkky73m0jhi8wc21vbl7cz5c0hj2p1dswin43"; })
+  (fetchNuGet { pname = "System.Runtime.CompilerServices.Unsafe"; version = "4.5.3"; sha256 = "1afi6s2r1mh1kygbjmfba6l4f87pi5sg13p4a48idqafli94qxln"; })
+  (fetchNuGet { pname = "System.Runtime.CompilerServices.Unsafe"; version = "5.0.0"; sha256 = "02k25ivn50dmqx5jn8hawwmz24yf0454fjd823qk6lygj9513q4x"; })
+  (fetchNuGet { pname = "System.Runtime.CompilerServices.Unsafe"; version = "6.0.0"; sha256 = "0qm741kh4rh57wky16sq4m0v05fxmkjjr87krycf5vp9f0zbahbc"; })
+  (fetchNuGet { pname = "System.Runtime.Extensions"; version = "4.3.0"; sha256 = "1ykp3dnhwvm48nap8q23893hagf665k0kn3cbgsqpwzbijdcgc60"; })
+  (fetchNuGet { pname = "System.Runtime.Handles"; version = "4.3.0"; sha256 = "0sw2gfj2xr7sw9qjn0j3l9yw07x73lcs97p8xfc9w1x9h5g5m7i8"; })
+  (fetchNuGet { pname = "System.Runtime.InteropServices"; version = "4.3.0"; sha256 = "00hywrn4g7hva1b2qri2s6rabzwgxnbpw9zfxmz28z09cpwwgh7j"; })
+  (fetchNuGet { pname = "System.Runtime.InteropServices.RuntimeInformation"; version = "4.3.0"; sha256 = "0q18r1sh4vn7bvqgd6dmqlw5v28flbpj349mkdish2vjyvmnb2ii"; })
+  (fetchNuGet { pname = "System.Runtime.Numerics"; version = "4.3.0"; sha256 = "19rav39sr5dky7afygh309qamqqmi9kcwvz3i0c5700v0c5cg61z"; })
+  (fetchNuGet { pname = "System.Security.AccessControl"; version = "6.0.0"; sha256 = "0a678bzj8yxxiffyzy60z2w1nczzpi8v97igr4ip3byd2q89dv58"; })
+  (fetchNuGet { pname = "System.Security.AccessControl"; version = "6.0.0-preview.5.21301.5"; sha256 = "131f3z3ikv3n8442chr11nj4x46amq00mb53pb2ds42dabldkdgy"; })
+  (fetchNuGet { pname = "System.Security.Claims"; version = "4.3.0"; sha256 = "0jvfn7j22l3mm28qjy3rcw287y9h65ha4m940waaxah07jnbzrhn"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.Algorithms"; version = "4.3.0"; sha256 = "03sq183pfl5kp7gkvq77myv7kbpdnq3y0xj7vi4q1kaw54sny0ml"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.Cng"; version = "4.3.0"; sha256 = "1k468aswafdgf56ab6yrn7649kfqx2wm9aslywjam1hdmk5yypmv"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.Csp"; version = "4.3.0"; sha256 = "1x5wcrddf2s3hb8j78cry7yalca4lb5vfnkrysagbn6r9x6xvrx1"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.Encoding"; version = "4.3.0"; sha256 = "1jr6w70igqn07k5zs1ph6xja97hxnb3mqbspdrff6cvssgrixs32"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "0givpvvj8yc7gv4lhb6s1prq6p2c4147204a0wib89inqzd87gqc"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.Primitives"; version = "4.3.0"; sha256 = "0pyzncsv48zwly3lw4f2dayqswcfvdwq2nz0dgwmi7fj3pn64wby"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.ProtectedData"; version = "6.0.0"; sha256 = "05kd3a8w7658hjxq9vvszxip30a479fjmfq4bq1r95nrsvs4hbss"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.X509Certificates"; version = "4.3.0"; sha256 = "0valjcz5wksbvijylxijjxb1mp38mdhv03r533vnx1q3ikzdav9h"; })
+  (fetchNuGet { pname = "System.Security.Permissions"; version = "6.0.0"; sha256 = "0jsl4xdrkqi11iwmisi1r2f2qn5pbvl79mzq877gndw6ans2zhzw"; })
+  (fetchNuGet { pname = "System.Security.Principal"; version = "4.3.0"; sha256 = "12cm2zws06z4lfc4dn31iqv7072zyi4m910d4r6wm8yx85arsfxf"; })
+  (fetchNuGet { pname = "System.Security.Principal.Windows"; version = "4.3.0"; sha256 = "00a0a7c40i3v4cb20s2cmh9csb5jv2l0frvnlzyfxh848xalpdwr"; })
+  (fetchNuGet { pname = "System.Security.Principal.Windows"; version = "5.0.0"; sha256 = "1mpk7xj76lxgz97a5yg93wi8lj0l8p157a5d50mmjy3gbz1904q8"; })
+  (fetchNuGet { pname = "System.Security.Principal.Windows"; version = "6.0.0-preview.5.21301.5"; sha256 = "1q3iikvjcfrm5p89p1j7qlw1szvryq680qypk023wgy9phmlwi57"; })
+  (fetchNuGet { pname = "System.Text.Encoding"; version = "4.3.0"; sha256 = "1f04lkir4iladpp51sdgmis9dj4y8v08cka0mbmsy0frc9a4gjqr"; })
+  (fetchNuGet { pname = "System.Text.Encoding.CodePages"; version = "4.5.1"; sha256 = "1z21qyfs6sg76rp68qdx0c9iy57naan89pg7p6i3qpj8kyzn921w"; })
+  (fetchNuGet { pname = "System.Text.Encoding.Extensions"; version = "4.3.0"; sha256 = "11q1y8hh5hrp5a3kw25cb6l00v5l5dvirkz8jr3sq00h1xgcgrxy"; })
+  (fetchNuGet { pname = "System.Text.Encodings.Web"; version = "6.0.0"; sha256 = "06n9ql3fmhpjl32g3492sj181zjml5dlcc5l76xq2h38c4f87sai"; })
+  (fetchNuGet { pname = "System.Text.Json"; version = "6.0.6"; sha256 = "0bkfrnr9618brbl1gvhyqrf5720syawf9dvpk8xfvkxbg7imlpjx"; })
+  (fetchNuGet { pname = "System.Text.RegularExpressions"; version = "4.3.0"; sha256 = "1bgq51k7fwld0njylfn7qc5fmwrk2137gdq7djqdsw347paa9c2l"; })
+  (fetchNuGet { pname = "System.Threading"; version = "4.3.0"; sha256 = "0rw9wfamvhayp5zh3j7p1yfmx9b5khbf4q50d8k5rk993rskfd34"; })
+  (fetchNuGet { pname = "System.Threading.Tasks"; version = "4.3.0"; sha256 = "134z3v9abw3a6jsw17xl3f6hqjpak5l682k2vz39spj4kmydg6k7"; })
+  (fetchNuGet { pname = "System.Threading.Tasks.Extensions"; version = "4.3.0"; sha256 = "1xxcx2xh8jin360yjwm4x4cf5y3a2bwpn2ygkfkwkicz7zk50s2z"; })
+  (fetchNuGet { pname = "System.Threading.Tasks.Extensions"; version = "4.5.4"; sha256 = "0y6ncasgfcgnjrhynaf0lwpkpkmv4a07sswwkwbwb5h7riisj153"; })
+  (fetchNuGet { pname = "System.Threading.ThreadPool"; version = "4.3.0"; sha256 = "027s1f4sbx0y1xqw2irqn6x161lzj8qwvnh2gn78ciiczdv10vf1"; })
+  (fetchNuGet { pname = "System.Threading.Timer"; version = "4.3.0"; sha256 = "1nx773nsx6z5whv8kaa1wjh037id2f1cxhb69pvgv12hd2b6qs56"; })
+  (fetchNuGet { pname = "System.Windows.Extensions"; version = "6.0.0"; sha256 = "1wy9pq9vn1bqg5qnv53iqrbx04yzdmjw4x5yyi09y3459vaa1sip"; })
+  (fetchNuGet { pname = "System.Xml.ReaderWriter"; version = "4.3.0"; sha256 = "0c47yllxifzmh8gq6rq6l36zzvw4kjvlszkqa9wq3fr59n0hl3s1"; })
+  (fetchNuGet { pname = "System.Xml.XDocument"; version = "4.3.0"; sha256 = "08h8fm4l77n0nd4i4fk2386y809bfbwqb7ih9d7564ifcxr5ssxd"; })
+  (fetchNuGet { pname = "System.Xml.XmlDocument"; version = "4.3.0"; sha256 = "0bmz1l06dihx52jxjr22dyv5mxv6pj4852lx68grjm7bivhrbfwi"; })
+  (fetchNuGet { pname = "Vk"; version = "1.0.25"; sha256 = "18kx3g088215803yznnmf6621wgwvgakj8hlmrb726b7zwb3x53l"; })
+  (fetchNuGet { pname = "Vortice.D3DCompiler"; version = "2.1.0"; sha256 = "1ikw4k40m1vhl6q3v4lacbvmz09prqkk8zz0dms49hxjrpi0gfdh"; })
+  (fetchNuGet { pname = "Vortice.Direct3D11"; version = "2.1.0"; sha256 = "05hzmkk32agbk2617yhv3wm1zjkv25w57395an4vkp14rvsz82vf"; })
+  (fetchNuGet { pname = "Vortice.DirectX"; version = "2.1.0"; sha256 = "0mv3p7rs2p9rh4vylz24gmiqj0q63rmfa7mjvsqk1j1zlrkyyhlk"; })
+  (fetchNuGet { pname = "Vortice.DXGI"; version = "2.1.0"; sha256 = "1d7rmqf7q287w3l7clfvp66kd0giy4n6087n9r8jj0w5r65416ls"; })
+  (fetchNuGet { pname = "Vortice.Mathematics"; version = "1.3.24"; sha256 = "1fqni3lhaxddpdz060zbjjhkn5fgg7458ajxfrj3df3wjbld3bc3"; })
+]
diff --git a/nixpkgs/pkgs/games/xjump/darwin.patch b/nixpkgs/pkgs/games/xjump/darwin.patch
new file mode 100644
index 000000000000..8221677658e3
--- /dev/null
+++ b/nixpkgs/pkgs/games/xjump/darwin.patch
@@ -0,0 +1,21 @@
+--- xjump/src/main.c	2018-02-20 09:15:15.608807657 +0100
++++ xjump-patched/src/main.c	2018-02-20 09:15:34.148949100 +0100
+@@ -604,18 +604,6 @@
+    * optimistic privilege dropping function. */
+   setgroups(0, NULL);
+ 
+-  if (setresgid(-1, realgid, realgid) != 0) {
+-    perror("Could not drop setgid privileges.  Aborting.");
+-    exit(1);
+-  }
+-
+-  /* Dropping user privileges must come last.
+-   * Otherwise we won't be able to drop group privileges anymore */
+-  if (setresuid(-1, realuid, realuid) != 0) {
+-    perror("Could not drop setuid privileges.  Aborting.");
+-    exit(1);
+-  }
+-
+   /* From now on we run with regular user privileges */
+ 
+   static XtActionsRec a_table[] = {
diff --git a/nixpkgs/pkgs/games/xjump/default.nix b/nixpkgs/pkgs/games/xjump/default.nix
new file mode 100644
index 000000000000..2c56e0bba4f6
--- /dev/null
+++ b/nixpkgs/pkgs/games/xjump/default.nix
@@ -0,0 +1,23 @@
+{ lib, stdenv, fetchFromGitHub, autoconf, automake, libX11, libXt, libXpm, libXaw, localStateDir?null }:
+
+stdenv.mkDerivation {
+  pname = "xjump";
+  version = "2.9.3";
+  src = fetchFromGitHub {
+    owner = "hugomg";
+    repo = "xjump";
+    rev = "e7f20fb8c2c456bed70abb046c1a966462192b80";
+    sha256 = "0hq4739cvi5a47pxdc0wwkj2lmlqbf1xigq0v85qs5bq3ixmq2f7";
+  };
+  nativeBuildInputs = [ autoconf automake ];
+  buildInputs = [ libX11 libXt libXpm libXaw ];
+  preConfigure = "autoreconf --install";
+  patches = lib.optionals stdenv.buildPlatform.isDarwin [ ./darwin.patch ];
+  configureFlags = lib.optionals (localStateDir != null) ["--localstatedir=${localStateDir}"];
+
+  meta = with lib; {
+    description = "The falling tower game";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ pmeunier ];
+  };
+}
diff --git a/nixpkgs/pkgs/games/xmage/default.nix b/nixpkgs/pkgs/games/xmage/default.nix
new file mode 100644
index 000000000000..b6aa8e22afd2
--- /dev/null
+++ b/nixpkgs/pkgs/games/xmage/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, stdenv
+, fetchurl
+, jdk8
+, unzip
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "xmage";
+  version = "1.4.50V2";
+
+  src = fetchurl {
+    url =
+      "https://github.com/magefree/mage/releases/download/xmage_${finalAttrs.version}/xmage_${finalAttrs.version}.zip";
+    sha256 = "sha256-t1peHYwCRy3wiIIwOD3nUyoxSOxbw6B/g++A1ofIbmg=";
+  };
+
+  preferLocalBuild = true;
+
+  unpackPhase = ''
+    ${unzip}/bin/unzip $src
+  '';
+
+  installPhase = let
+    strVersion = lib.substring 0 6 finalAttrs.version;
+  in ''
+    mkdir -p $out/bin
+    cp -rv ./* $out
+
+    cat << EOS > $out/bin/xmage
+    exec ${jdk8}/bin/java -Xms256m -Xmx512m -XX:MaxPermSize=384m -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -jar $out/mage-client/lib/mage-client-${strVersion}.jar
+    EOS
+
+    chmod +x $out/bin/xmage
+  '';
+
+  meta = with lib; {
+    description = "Magic Another Game Engine";
+    sourceProvenance = with sourceTypes; [ binaryBytecode ];
+    license = licenses.mit;
+    maintainers = with maintainers; [ matthiasbeyer ];
+    homepage = "http://xmage.de/";
+  };
+
+})
+
diff --git a/nixpkgs/pkgs/games/xmoto/default.nix b/nixpkgs/pkgs/games/xmoto/default.nix
new file mode 100644
index 000000000000..5909c3f20ee4
--- /dev/null
+++ b/nixpkgs/pkgs/games/xmoto/default.nix
@@ -0,0 +1,65 @@
+{ 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.6.1";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = version;
+    sha256 = "00f5ha79lfa2iiaz66wl0hl5dapa1l15qdr7m7knzi0ll7j6z66n";
+  };
+
+  patches = [
+    # Fix build with Nix
+    (fetchpatch {
+      url = "https://github.com/xmoto/xmoto/commit/536dcc7ec77a4c4c454b86220e85b1cb3cd1c7f7.patch";
+      sha256 = "0h9lld668jrbmrqva89zqwp63jiagjj86prkxzx6372p3kk9y7g7";
+    })
+  ];
+
+  nativeBuildInputs = [
+    cmake
+    gettext
+    makeWrapper
+  ];
+
+  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 = "https://xmoto.tuxfamily.org";
+    maintainers = with maintainers; [ raskin pSub ];
+    platforms = platforms.all;
+    license = licenses.gpl2Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/games/xonotic/default.nix b/nixpkgs/pkgs/games/xonotic/default.nix
new file mode 100644
index 000000000000..60eb1189391d
--- /dev/null
+++ b/nixpkgs/pkgs/games/xonotic/default.nix
@@ -0,0 +1,193 @@
+{ lib, stdenv, fetchurl, fetchzip, makeWrapper, runCommand, makeDesktopItem
+, xonotic-data, copyDesktopItems
+, # required for both
+  unzip, libjpeg, zlib, libvorbis, curl, freetype, libpng, libtheora
+, # glx
+  libX11, libGLU, libGL, libXpm, libXext, libXxf86vm, alsa-lib
+, # sdl
+  SDL2
+, # blind
+  gmp
+
+, withSDL ? true
+, withGLX ? false
+, withDedicated ? true
+}:
+
+let
+  pname = "xonotic";
+  version = "0.8.6";
+  name = "${pname}-${version}";
+  variant =
+    if withSDL && withGLX then
+      ""
+    else if withSDL then
+      "-sdl"
+    else if withGLX then
+      "-glx"
+    else if withDedicated then
+      "-dedicated"
+    else "-what-even-am-i";
+
+  meta = {
+    description = "A free fast-paced first-person shooter";
+    longDescription = ''
+      Xonotic is a free, fast-paced first-person shooter that works on
+      Windows, macOS and Linux. The project is geared towards providing
+      addictive arena shooter gameplay which is all spawned and driven
+      by the community itself. Xonotic is a direct successor of the
+      Nexuiz project with years of development between them, and it
+      aims to become the best possible open-source FPS of its kind.
+    '';
+    homepage = "https://www.xonotic.org/";
+    license = lib.licenses.gpl2Plus;
+    maintainers = with lib.maintainers; [ astsmtl zalakain ];
+    platforms = lib.platforms.linux;
+  };
+
+  desktopItem = makeDesktopItem {
+    name = "xonotic";
+    exec = "xonotic";
+    comment = meta.description;
+    desktopName = "Xonotic";
+    categories = [ "Game" "Shooter" ];
+    icon = "xonotic";
+    startupNotify = false;
+  };
+
+  xonotic-unwrapped = stdenv.mkDerivation rec {
+    pname = "xonotic${variant}-unwrapped";
+    inherit version;
+
+    src = fetchurl {
+      url = "https://dl.xonotic.org/xonotic-${version}-source.zip";
+      hash = "sha256-i5KseBz/SuicEhoj6s197AWiqr7azMI6GdGglYtAEqg=";
+    };
+
+    nativeBuildInputs = [ unzip ];
+    buildInputs = [ libjpeg zlib libvorbis curl gmp ]
+      ++ lib.optionals withGLX [ libX11.dev libGLU.dev libGL.dev libXpm.dev libXext.dev libXxf86vm.dev alsa-lib.dev ]
+      ++ lib.optionals withSDL [ SDL2.dev ];
+
+    sourceRoot = "Xonotic/source/darkplaces";
+
+    # "debug", "release", "profile"
+    target = "release";
+
+    dontStrip = target != "release";
+
+    postConfigure = ''
+      pushd ../d0_blind_id
+      ./configure $configureFlags
+      popd
+    '';
+
+    buildPhase = (lib.optionalString withDedicated ''
+      make -j $NIX_BUILD_CORES sv-${target}
+    '' + lib.optionalString withGLX ''
+      make -j $NIX_BUILD_CORES cl-${target}
+    '' + lib.optionalString withSDL ''
+      make -j $NIX_BUILD_CORES sdl-${target}
+    '') + ''
+      pushd ../d0_blind_id
+      make -j $NIX_BUILD_CORES
+      popd
+    '';
+
+    enableParallelBuilding = true;
+
+    installPhase = (''
+      install -Dm644 ../../misc/logos/xonotic_icon.svg \
+        $out/share/icons/hicolor/scalable/apps/xonotic.svg
+      pushd ../../misc/logos/icons_png
+      for img in *.png; do
+        size=''${img#xonotic_}
+        size=''${size%.png}
+        dimensions="''${size}x''${size}"
+        install -Dm644 $img \
+          $out/share/icons/hicolor/$dimensions/apps/xonotic.png
+      done
+      popd
+    '' + lib.optionalString withDedicated ''
+      install -Dm755 darkplaces-dedicated "$out/bin/xonotic-dedicated"
+    '' + lib.optionalString withGLX ''
+      install -Dm755 darkplaces-glx "$out/bin/xonotic-glx"
+    '' + lib.optionalString withSDL ''
+      install -Dm755 darkplaces-sdl "$out/bin/xonotic-sdl"
+    '') + ''
+      pushd ../d0_blind_id
+      make install
+      popd
+    '';
+
+    # Xonotic needs to find libcurl.so at runtime for map downloads
+    dontPatchELF = true;
+    postFixup = lib.optionalString withDedicated ''
+      patchelf --add-needed ${curl.out}/lib/libcurl.so $out/bin/xonotic-dedicated
+    '' + lib.optionalString withGLX ''
+      patchelf \
+          --add-needed ${curl.out}/lib/libcurl.so \
+          --add-needed ${libvorbis}/lib/libvorbisfile.so \
+          --add-needed ${libvorbis}/lib/libvorbisenc.so \
+          --add-needed ${libvorbis}/lib/libvorbis.so \
+          --add-needed ${libGL.out}/lib/libGL.so \
+          --add-needed ${freetype}/lib/libfreetype.so \
+          --add-needed ${libpng}/lib/libpng.so \
+          --add-needed ${libtheora}/lib/libtheora.so \
+          $out/bin/xonotic-glx
+    '' + lib.optionalString withSDL ''
+      patchelf \
+          --add-needed ${curl.out}/lib/libcurl.so \
+          --add-needed ${libvorbis}/lib/libvorbisfile.so \
+          --add-needed ${libvorbis}/lib/libvorbisenc.so \
+          --add-needed ${libvorbis}/lib/libvorbis.so \
+          --add-needed ${freetype}/lib/libfreetype.so \
+          --add-needed ${libpng}/lib/libpng.so \
+          --add-needed ${libtheora}/lib/libtheora.so \
+          $out/bin/xonotic-sdl
+    '';
+  };
+
+in rec {
+  xonotic-data = fetchzip {
+    name = "xonotic-data";
+    url = "https://dl.xonotic.org/xonotic-${version}.zip";
+    hash = "sha256-Lhjpyk7idmfQAVn4YUb7diGyyKZQBfwNXxk2zMOqiZQ=";
+    postFetch = ''
+      cd $out
+      rm -rf $(ls | grep -v "^data$" | grep -v "^key_0.d0pk$")
+    '';
+    meta.hydraPlatforms = [];
+    passthru.version = version;
+  };
+
+  xonotic = runCommand "xonotic${variant}-${version}" {
+    inherit xonotic-unwrapped;
+    nativeBuildInputs = [ makeWrapper copyDesktopItems ];
+    desktopItems = [ desktopItem ];
+    passthru = {
+      inherit version;
+      meta = meta // {
+        hydraPlatforms = [];
+      };
+    };
+  } (''
+    mkdir -p $out/bin
+  '' + lib.optionalString withDedicated ''
+    ln -s ${xonotic-unwrapped}/bin/xonotic-dedicated $out/bin/
+  '' + lib.optionalString withGLX ''
+    ln -s ${xonotic-unwrapped}/bin/xonotic-glx $out/bin/xonotic-glx
+    ln -s $out/bin/xonotic-glx $out/bin/xonotic
+  '' + lib.optionalString withSDL ''
+    ln -s ${xonotic-unwrapped}/bin/xonotic-sdl $out/bin/xonotic-sdl
+    ln -sf $out/bin/xonotic-sdl $out/bin/xonotic
+  '' + lib.optionalString (withSDL || withGLX) ''
+    mkdir -p $out/share
+    ln -s ${xonotic-unwrapped}/share/icons $out/share/icons
+    copyDesktopItems
+  '' + ''
+    for binary in $out/bin/xonotic-*; do
+      wrapProgram $binary --add-flags "-basedir ${xonotic-data}" --prefix LD_LIBRARY_PATH : "${xonotic-unwrapped}/lib"
+    done
+  '');
+}
diff --git a/nixpkgs/pkgs/games/xpilot/bloodspilot-client.nix b/nixpkgs/pkgs/games/xpilot/bloodspilot-client.nix
new file mode 100644
index 000000000000..8e603ef53f78
--- /dev/null
+++ b/nixpkgs/pkgs/games/xpilot/bloodspilot-client.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, fetchurl, libX11, SDL, libGLU, libGL, expat, zlib, SDL_ttf, SDL_image }:
+
+stdenv.mkDerivation rec {
+  version = "1.5.0";
+  pname = "bloodspilot-client";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/project/bloodspilot/client-sdl/v${version}/bloodspilot-client-sdl-${version}.tar.gz";
+    sha256 = "1qwl95av5an2zl01m7saj6fyy49xpixga7gbn4lwbpgpqs1rbwxj";
+  };
+
+  buildInputs = [
+    libX11 SDL SDL_ttf SDL_image libGLU libGL expat zlib
+  ];
+
+  NIX_LDFLAGS = "-lX11";
+
+  meta = {
+    description = "A multiplayer space combat game (client part)";
+    homepage = "http://bloodspilot.sf.net/";
+    license = lib.licenses.gpl2Plus ;
+    maintainers = [lib.maintainers.raskin];
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/xpilot/bloodspilot-server.nix b/nixpkgs/pkgs/games/xpilot/bloodspilot-server.nix
new file mode 100644
index 000000000000..a860c4e1d5ff
--- /dev/null
+++ b/nixpkgs/pkgs/games/xpilot/bloodspilot-server.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, fetchurl, expat }:
+
+stdenv.mkDerivation rec {
+  pname = "bloodspilot-xpilot-fxi-server";
+  version = "1.4.6";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/project/bloodspilot/server/server%20v${version}/xpilot-${version}fxi.tar.gz";
+    sha256 = "0d7hnpshifq6gy9a0g6il6h1hgqqjyys36n8w84hr8d4nhg4d1ji";
+  };
+
+  buildInputs = [
+    expat
+  ];
+
+  patches = [
+    ./server-gcc5.patch
+  ];
+
+  meta = with lib; {
+    description = "A multiplayer X11 space combat game (server part)";
+    homepage = "http://bloodspilot.sf.net/";
+    license = licenses.gpl2Plus ;
+    maintainers = [ maintainers.raskin ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/xpilot/default.nix b/nixpkgs/pkgs/games/xpilot/default.nix
new file mode 100644
index 000000000000..bd86538d99ec
--- /dev/null
+++ b/nixpkgs/pkgs/games/xpilot/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, fetchurl, libX11, libSM, SDL, libGLU, libGL, expat, SDL_ttf
+, SDL_image, zlib, libXxf86misc }:
+stdenv.mkDerivation rec {
+  pname = "xpilot-ng";
+  version = "4.7.3";
+  src = fetchurl {
+    url = "mirror://sourceforge/xpilot/xpilot_ng/${pname}-${version}/${pname}-${version}.tar.gz";
+    sha256 = "02a7pnp88kh88fzda5q8mzlckk6y9r5fw47j00h26wbsfly0k1zj";
+  };
+  buildInputs = [
+    libX11 libSM SDL SDL_ttf SDL_image libGLU libGL expat zlib libXxf86misc
+  ];
+  meta = with lib; {
+    description = "A multiplayer X11 space combat game";
+    homepage = "http://xpilot.sf.net/";
+    license = licenses.gpl2Plus;
+    maintainers = [ maintainers.raskin ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/xpilot/server-gcc5.patch b/nixpkgs/pkgs/games/xpilot/server-gcc5.patch
new file mode 100644
index 000000000000..5618399bfecd
--- /dev/null
+++ b/nixpkgs/pkgs/games/xpilot/server-gcc5.patch
@@ -0,0 +1,65 @@
+--- xpilot-1.4.6fxi/src/common/net.c	2016-02-09 00:20:43.531714342 +0000
++++ xpilot-1.4.6fxi/src/common/net.c	2016-02-09 00:21:15.301331053 +0000
+@@ -608,9 +608,9 @@
+ }
+ 
+ #if STDVA
+-inline int32_t Packet_scanf(sockbuf_t *sbuf, const char *fmt, ...)
++extern int32_t Packet_scanf(sockbuf_t *sbuf, const char *fmt, ...)
+ #else
+-inline int32_t Packet_scanf(va_alist)
++extern int32_t Packet_scanf(va_alist)
+ va_dcl
+ #endif
+ {
+--- xpilot-1.4.6fxi/src/server/collision.c	2016-02-09 00:22:29.581784405 +0000
++++ xpilot-1.4.6fxi/src/server/collision.c	2016-02-09 00:22:38.152952500 +0000
+@@ -71,7 +71,7 @@
+  * p: first object, q: second object
+  */
+ 
+-inline int32_t Collision_occured(int32_t p1x, int32_t p1y, int32_t p2x, int32_t p2y,
++extern int32_t Collision_occured(int32_t p1x, int32_t p1y, int32_t p2x, int32_t p2y,
+ 		int32_t q1x, int32_t q1y, int32_t q2x, int32_t q2y, int32_t r)
+ {
+ 	int32_t fac1, fac2;	/* contraction between the distance between the x and y coordinates of objects */
+--- xpilot-1.4.6fxi/src/server/player.c	2016-02-09 00:25:29.546313808 +0000
++++ xpilot-1.4.6fxi/src/server/player.c	2016-02-09 00:25:40.464527932 +0000
+@@ -1411,12 +1411,12 @@
+ 	return NULL;
+ }
+ 
+-inline bool Player_idle_timed_out(player_t *pl)
++extern bool Player_idle_timed_out(player_t *pl)
+ {
+ 	return (frame_loops - pl->frame_last_busy > MAX_PLAYER_IDLE_TICKS && (NumPlayers > 1)) ? true : false;
+ }
+ 
+-inline bool Player_is_recovered(player_t *pl)
++extern bool Player_is_recovered(player_t *pl)
+ {
+ 	return (pl->recovery_count <= 0.0) ? true : false;
+ }
+--- xpilot-1.4.6fxi/src/server/score.c	2016-02-09 00:21:45.659923025 +0000
++++ xpilot-1.4.6fxi/src/server/score.c	2016-02-09 00:22:07.224345939 +0000
+@@ -24,17 +24,17 @@
+ char msg[MSG_LEN];
+ 
+ 
+-inline double Get_Score(player_t *pl)
++extern double Get_Score(player_t *pl)
+ {
+     return pl->score;
+ }
+ 
+-inline void Score_set(player_t * pl, double score)
++extern void Score_set(player_t * pl, double score)
+ {
+     pl->score = score;
+ }
+ 
+-inline void Score_add(player_t * pl, double score)
++extern void Score_add(player_t * pl, double score)
+ {
+     pl->score += score;
+ }
diff --git a/nixpkgs/pkgs/games/xskat/default.nix b/nixpkgs/pkgs/games/xskat/default.nix
new file mode 100644
index 000000000000..6baf397ad678
--- /dev/null
+++ b/nixpkgs/pkgs/games/xskat/default.nix
@@ -0,0 +1,30 @@
+{lib, stdenv, fetchurl, libX11, imake, gccmakedep}:
+
+stdenv.mkDerivation rec {
+  pname = "xskat";
+  version = "4.0";
+
+  nativeBuildInputs = [ gccmakedep ];
+  buildInputs = [ libX11 imake ];
+
+  src = fetchurl {
+    url = "https://web.archive.org/web/20220331112433if_/https://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 = 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 = "https://web.archive.org/web/20221003060115/https://www.xskat.de/xskat.html";
+  };
+}
diff --git a/nixpkgs/pkgs/games/xsnow/default.nix b/nixpkgs/pkgs/games/xsnow/default.nix
new file mode 100644
index 000000000000..ff34bfe729ba
--- /dev/null
+++ b/nixpkgs/pkgs/games/xsnow/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, fetchurl, pkg-config, libxml2, gtk3-x11, libXt, libXpm }:
+
+stdenv.mkDerivation rec {
+  pname = "xsnow";
+  version = "3.4.4";
+
+  src = fetchurl {
+    url = "https://ratrabbit.nl/downloads/xsnow/xsnow-${version}.tar.gz";
+    sha256 = "sha256-fPMy5AxKspFkcWphf/IjMc/ZQtayljThKxbcMtvOjRc=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ gtk3-x11 libxml2 libXt libXpm ];
+
+  makeFlags = [ "gamesdir=$(out)/bin" ];
+
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    description = "An X-windows application that will let it snow on the root, in between and on windows";
+    homepage = "https://ratrabbit.nl/ratrabbit/xsnow/";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ robberer ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/games/xsok/default.nix b/nixpkgs/pkgs/games/xsok/default.nix
new file mode 100644
index 000000000000..53254ba98f91
--- /dev/null
+++ b/nixpkgs/pkgs/games/xsok/default.nix
@@ -0,0 +1,46 @@
+{lib, stdenv, fetchurl, libX11, imake, libXt, libXaw, libXpm, libXext
+, withNethackLevels ? true
+}:
+stdenv.mkDerivation rec {
+  pname = "xsok";
+  version = "1.02";
+
+  src = fetchurl {
+    url = "http://http.debian.net/debian/pool/main/x/xsok/xsok_1.02.orig.tar.gz";
+    sha256 = "0f4z53xsy4w8x8zp5jya689xp3rcfpi5wri2ip0qa8nk3sw7zj73";
+  };
+
+  nethackLevels = fetchurl {
+    url = "https://www.electricmonk.nl/data/nethack/nethack.def";
+    sha256 = "057ircp13hfpy513c7wpyp986hsvhqs7km98w4k39f5wkvp3dj02";
+  };
+
+  buildInputs = [libX11 libXt libXaw libXpm libXext];
+  nativeBuildInputs = [imake];
+
+  env.NIX_CFLAGS_COMPILE = " -isystem ${libXpm.dev}/include/X11 ";
+
+  preConfigure = ''
+    sed -e "s@/usr/@$out/share/@g" -i src/Imakefile
+    sed -e "s@/var/games/xsok@./.xsok/@g" -i src/Imakefile
+    sed -e '/chown /d' -i src/Imakefile
+    sed -e '/chmod /d' -i src/Imakefile
+    sed -e '/InstallAppDefaults/d' -i src/Imakefile
+    sed -e 's/CC = gcc/CC = cc/g' -i src/Imakefile
+  '';
+
+  makeFlags = ["BINDIR=$(out)/bin"];
+
+  postInstall = lib.optionalString withNethackLevels ''
+    gzip < ${nethackLevels} > "$out/share/games/lib/xsok/Nethack.def.gz"
+    echo Nethack > "$out/share/games/lib/xsok/gametypes"
+  '';
+
+  meta = {
+    description = "A generic Sokoban game for X11";
+    license = lib.licenses.gpl2Plus;
+    maintainers = [lib.maintainers.raskin];
+    platforms = lib.platforms.unix;
+    homepage = "https://tracker.debian.org/pkg/xsok";
+  };
+}
diff --git a/nixpkgs/pkgs/games/xsokoban/default.nix b/nixpkgs/pkgs/games/xsokoban/default.nix
new file mode 100644
index 000000000000..4d8a6fa05056
--- /dev/null
+++ b/nixpkgs/pkgs/games/xsokoban/default.nix
@@ -0,0 +1,54 @@
+{ lib, stdenv, fetchurl, libX11, xorgproto, libXpm, libXt }:
+
+stdenv.mkDerivation rec {
+  pname = "xsokoban";
+  version = "3.3c";
+
+  src = fetchurl {
+    url = "https://www.cs.cornell.edu/andru/release/${pname}-${version}.tar.gz";
+    sha256 = "006lp8y22b9pi81x1a9ldfgkl1fbmkdzfw0lqw5y9svmisbafbr9";
+  };
+
+  buildInputs = [ libX11 xorgproto libXpm libXt ];
+
+  env.NIX_CFLAGS_COMPILE = "-I${libXpm.dev}/include/X11";
+
+  hardeningDisable = [ "format" ];
+
+  prePatch = ''
+    substituteInPlace Makefile.in --replace 4755 0755
+  '';
+
+  preConfigure = ''
+    sed -e 's/getline/my_getline/' -i score.c
+
+    chmod a+rw config.h
+    cat >>config.h <<EOF
+    #define HERE "@nixos-packaged"
+    #define WWW 0
+    #define OWNER "$(whoami)"
+    #define ROOTDIR "$out/lib/xsokoban"
+    #define ANYLEVEL 1
+    #define SCOREFILE ".xsokoban-score"
+    #define LOCKFILE ".xsokoban-score-lock"
+    EOF
+
+    sed -i main.c \
+      -e 's/getpass[(][^)]*[)]/PASSWORD/' \
+      -e '/if [(]owner[)]/iowner=1;'
+  '';
+
+  preBuild = ''
+    sed -i Makefile \
+      -e "s@/usr/local/@$out/@" \
+      -e "s@ /bin/@ @"
+    mkdir -p $out/bin $out/share $out/man/man1 $out/lib
+  '';
+
+  meta = with lib; {
+    description = "X sokoban";
+    license = licenses.publicDomain;
+    maintainers = [ maintainers.raskin ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/games/xtris/default.nix b/nixpkgs/pkgs/games/xtris/default.nix
new file mode 100644
index 000000000000..2263a46187e9
--- /dev/null
+++ b/nixpkgs/pkgs/games/xtris/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, fetchzip, xorg }:
+stdenv.mkDerivation rec {
+  pname = "xtris";
+  version = "1.15";
+
+  src = fetchzip {
+    url = "https://web.archive.org/web/20120315061213/http://www.iagora.com/~espel/xtris/xtris-${version}.tar.gz";
+    sha256 = "1vqva99lyv7r6f9c7yikk8ahcfh9aq3clvwm4pz964wlbr9mj1v6";
+  };
+
+  patchPhase = ''
+    sed -i '
+      s:/usr/local/bin:'$out'/bin:
+      s:/usr/local/man:'$out'/share/man:
+      s:mkdir:mkdir -p:g
+      s:^CFLAGS:#CFLAGS:
+    ' Makefile
+  '';
+  buildInputs = [ xorg.libX11 ];
+
+  makeFlags = [ "CC=${stdenv.cc.targetPrefix}cc" ];
+
+  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;
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/games/zaz/default.nix b/nixpkgs/pkgs/games/zaz/default.nix
new file mode 100644
index 000000000000..3b6c7244507c
--- /dev/null
+++ b/nixpkgs/pkgs/games/zaz/default.nix
@@ -0,0 +1,60 @@
+{ lib, stdenv
+, fetchurl
+, pkg-config
+, SDL
+, SDL_image
+, mesa
+, libtheora
+, libvorbis
+, libogg
+, ftgl
+, freetype
+}:
+
+stdenv.mkDerivation rec {
+  pname = "zaz";
+  version = "1.0.1";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/${pname}/${pname}-${version}.tar.gz";
+    sha256 = "1r3bmwny05zzmdalxm5ah2rray0nnsg1w00r30p47q6x2lpwj8ml";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+  ];
+  buildInputs = [
+    (lib.getDev SDL)
+    SDL_image
+    mesa
+    libtheora
+    libvorbis.dev
+    libogg
+    ftgl
+    freetype
+  ];
+
+  # Fix SDL include problems
+  env.NIX_CFLAGS_COMPILE = "-I${lib.getDev SDL}/include/SDL -I${SDL_image}/include/SDL";
+  # Fix linking errors
+  makeFlags = [
+    "ZAZ_LIBS+=-lSDL"
+    "ZAZ_LIBS+=-lvorbis"
+    "ZAZ_LIBS+=-ltheora"
+    "ZAZ_LIBS+=-logg"
+    "ZAZ_LIBS+=-ltheoraenc"
+    "ZAZ_LIBS+=-ltheoradec"
+    "ZAZ_LIBS+=-lvorbisfile"
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "A puzzle game about arranging balls in triplets, like Luxor, Zuma, or Puzzle Bobble";
+    homepage = "https://zaz.sourceforge.net/";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ fgaz ];
+    platforms = platforms.all;
+    mainProgram = "zaz";
+  };
+}
+
diff --git a/nixpkgs/pkgs/games/zod/0002-add-scaling-factor-to-source.patch b/nixpkgs/pkgs/games/zod/0002-add-scaling-factor-to-source.patch
new file mode 100644
index 000000000000..bdcaddaabbb1
--- /dev/null
+++ b/nixpkgs/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/nixpkgs/pkgs/games/zod/default.nix b/nixpkgs/pkgs/games/zod/default.nix
new file mode 100644
index 000000000000..e0c2031dde25
--- /dev/null
+++ b/nixpkgs/pkgs/games/zod/default.nix
@@ -0,0 +1,115 @@
+{ lib
+, config
+, fetchzip
+, stdenv
+, SDL
+, SDL_image
+, SDL_ttf
+, SDL_mixer
+, libmysqlclient
+, wxGTK32
+, 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";
+  };
+  postPatch = ''
+    sed '1i#include <ctime>' -i zod_src/common.cpp # gcc12
+  '';
+  nativeBuildInputs = [
+    makeWrapper
+  ];
+  buildInputs = [
+    SDL
+    SDL_image
+    SDL_ttf
+    SDL_mixer
+    libmysqlclient
+    wxGTK32
+    coreutils
+  ];
+  hardeningDisable = [ "format" ];
+  NIX_LDFLAGS = "-L${libmysqlclient}/lib/mysql";
+  zod_engine = stdenv.mkDerivation {
+    inherit version src postPatch 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 --chdir "${zod_assets}/usr/lib/commander-zod"
+    '';
+  };
+  zod_map_editor = stdenv.mkDerivation {
+    inherit version src postPatch 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 --chdir "${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");' \
+          --replace "check.replace(i,1,1,'_');" "check.replace(i,1,1,(wxUniChar)'_');"
+      '';
+      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 */
+      platforms = platforms.linux;
+    };
+  }
diff --git a/nixpkgs/pkgs/games/zoom/default.nix b/nixpkgs/pkgs/games/zoom/default.nix
new file mode 100644
index 000000000000..275aca235209
--- /dev/null
+++ b/nixpkgs/pkgs/games/zoom/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, stdenv
+, fetchurl
+, perl
+, expat
+, fontconfig
+, freetype
+, xorg
+}:
+
+# !!! assert freetype == xorg.freetype
+
+stdenv.mkDerivation rec {
+  pname = "zoom";
+  version = "1.1.5";
+
+  src = fetchurl {
+    url = "https://www.logicalshift.co.uk/unix/zoom/zoom-${version}.tar.gz";
+    hash = "sha256-8pZ/HAVV341K6QRDUC0UzzO2rGW2AvSZ++Pp445V27w=";
+  };
+
+  buildInputs = [
+    perl
+    expat
+    fontconfig
+    freetype
+    xorg.libICE
+    xorg.libSM
+    xorg.libX11
+    xorg.libXext
+    xorg.libXrender
+  ];
+
+  env.NIX_CFLAGS_COMPILE = "-I${freetype}/include/freetype2 -fgnu89-inline";
+
+  meta = with lib; {
+    homepage = "https://www.logicalshift.co.uk/unix/zoom/";
+    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
+      usually text adventures ('interactive fiction'), and were first created
+      by Infocom with the Zork series of games. Throughout the 80's, Infocom
+      released many interactive fiction stories before their ambitions to enter
+      the database market finally brought them low.
+    '';
+    license = licenses.gpl3;
+    platforms = platforms.linux;
+    mainProgram = "zoom";
+  };
+}