├── .envrc ├── .gitignore ├── README.md ├── default.nix ├── deps ├── default.nix ├── dir.patch ├── file.patch ├── pass.patch ├── python-packages-overrides.nix └── python-packages.nix ├── examples └── default.nix ├── flake.lock ├── flake.nix ├── games ├── linux │ ├── amorous │ │ ├── default.nix │ │ └── wrapper.nix │ ├── antichamber │ │ ├── default.nix │ │ └── wrapper.nix │ ├── helltaker │ │ ├── default.nix │ │ └── wrapper.nix │ ├── higurashiCh6 │ │ ├── default.nix │ │ └── wrapper.nix │ ├── oxenfree │ │ ├── default.nix │ │ └── wrapper.nix │ ├── payday2 │ │ ├── default.nix │ │ └── wrapper.nix │ ├── portal2 │ │ ├── default.nix │ │ └── wrapper.nix │ ├── shenzhenIO │ │ ├── default.nix │ │ └── wrapper.nix │ ├── theStanleyParable │ │ ├── default.nix │ │ └── wrapper.nix │ ├── top-level.nix │ ├── uminekoAnswer │ │ ├── default.nix │ │ └── wrapper.nix │ └── uminekoQuestion │ │ ├── default.nix │ │ └── wrapper.nix ├── proton │ ├── 6.10-GE │ │ ├── default.nix │ │ └── wrapper.nix │ ├── 6.3 │ │ ├── default.nix │ │ └── wrapper.nix │ └── top-level.nix ├── top-level.nix └── windows │ ├── alanWake │ ├── default.nix │ ├── optional.nix │ └── wrapper.nix │ ├── bleachBraveSouls │ ├── default.nix │ └── wrapper.nix │ ├── brawlhalla │ ├── default.nix │ └── wrapper.nix │ ├── conanExiles │ ├── default.nix │ └── wrapper.nix │ ├── eiyuSenkiGold │ ├── default.nix │ └── wrapper.nix │ ├── houseParty │ ├── default.nix │ ├── optional.nix │ └── wrapper.nix │ ├── justCause │ ├── default.nix │ └── wrapper.nix │ ├── katana-zero │ ├── default.nix │ └── wrapper.nix │ ├── offworld │ ├── default.nix │ └── wrapper.nix │ ├── payday │ ├── default.nix │ └── wrapper.nix │ ├── projectWingman │ ├── default.nix │ └── wrapper.nix │ ├── rocketLeague │ ├── default.nix │ └── wrapper.nix │ ├── sleepingDogs │ ├── DisplaySettings.xml │ ├── default.nix │ └── wrapper.nix │ ├── sonicGenerations │ ├── default.nix │ └── wrapper.nix │ ├── steinsGate │ ├── default.nix │ └── wrapper.nix │ ├── steinsGate0 │ ├── default.nix │ └── wrapper.nix │ ├── steinsGateElite │ ├── default.nix │ └── wrapper.nix │ ├── steinsGateLBP │ ├── default.nix │ └── wrapper.nix │ ├── thereIsNoGame │ ├── default.nix │ └── wrapper.nix │ ├── top-level.nix │ ├── uminekoGoldenFantasia │ ├── default.nix │ └── wrapper.nix │ └── warframe │ ├── default.nix │ └── wrapper.nix └── lib ├── game-file-info.nix ├── game-files-fetcher.nix ├── game-info.nix ├── make-steam-game.nix ├── steam-user.nix └── top-level.nix /.envrc: -------------------------------------------------------------------------------- 1 | use flake 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | steamFiles/ 2 | .direnv/ 3 | result 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Nix Steam System 2 | 3 | ## What is Nix-Steam 4 | 5 | nix-steam is a nix repo that contains steam games in both Linux and Windows(via proton) to install and run declaratively in Linux distros(both nixos, and non-nixos) 6 | 7 | **It is experimental and constant improvement will be happening** 8 | 9 | ## Requirements 10 | 11 | - it needs to support cgroup due to steam-run 12 | 13 | - it need sandbox to be off, hopefully in the future we can enable sandbox for everything 14 | 15 | ## Note 16 | 17 | this can be run under non-nixos, same restriction apply to the above 18 | 19 | ## Logging in for Steam 20 | 21 | ### No SteamGuard 22 | 23 | without steamguard it's pretty straightforward 24 | 25 | ```nix 26 | let 27 | defaultNix = (import ../default.nix {}).defaultNix; 28 | in (defaultNix.makeSteamStore.x86_64-linux { 29 | username = ""; 30 | 31 | # Both of these need to be created beforehand, and targetStore need a a+rwx permission(only the dir itself) 32 | outputStore = ""; # this is where you will store the prefixes and various stuff 33 | targetStore = ""; # this is where you will store the games 34 | 35 | passwordFile = ""; 36 | useGuardFiles = false; 37 | }) 38 | ``` 39 | 40 | ### With SteamGuard 41 | 42 | with steamguard enabled, you will need to get two file sets(one time per machine) 43 | 44 | 1. files from running a basic steamcmd +login 45 | 46 | ``` 47 | $HOME/.steam/steam/config/config.vdf 48 | $HOME/.steam/steam/config/libraryfolders.vdf 49 | $HOME/.steam/steam/ssfn* 50 | ``` 51 | 52 | 2. folder from running a basic steamctl depot info or apps info 53 | 54 | ``` 55 | $HOME/.local/share/steamctl 56 | ``` 57 | 58 | after you have these files, you can login via this 59 | 60 | ```nix 61 | let 62 | defaultNix = (import ../nix-steam/default.nix {}).defaultNix; 63 | in (defaultNix.makeSteamStore.x86_64-linux { 64 | username = ""; 65 | 66 | # Both of these need to be created beforehand, and targetStore need a a+rwx permission(only the dir itself) 67 | outputStore = ""; # this is where you will store the prefixes and various stuff 68 | targetStore = ""; # this is where you will store the games 69 | 70 | passwordFile = ""; 71 | useGuardFiles = true; 72 | cachedFileDir = /steamFiles; 73 | steamctlFiles = /steamctlFiles; 74 | }) 75 | ``` 76 | 77 | ## Adding a Game(Linux/Windows) 78 | 79 | ### Step 1: SteamDB is your friend 80 | 81 | Steam games are made from single/multiple depots, this normally happens in the background for both normal steam downloads and steamcmd +app_update command, however, since we want locking, we have to construct the games ourself. 82 | 83 | #### Find info of game and depot 84 | 85 | we will use [Helltaker](https://steamdb.info/app/1289310) as a example 86 | 87 | first we need to find out what depots it has, which can be found under the [Depots](https://steamdb.info/app/1289310/depots/) section, where there are two depots that we need(logically), `Helltaker Content Linux` and `Helltaker Local`. 88 | 89 | we will have the following template 90 | 91 | ```nix 92 | { makeSteamGame, steamUserInfo, gameInfo, gameFileInfo }: 93 | 94 | let 95 | mainGameName = "Helltaker"; 96 | in makeSteamGame { 97 | inherit steamUserInfo; 98 | 99 | game = gameInfo { 100 | name = mainGameName; 101 | appId = "1289310"; # You can findout the appId from the steamdb page 102 | }; 103 | 104 | gameFiles = [ 105 | ]; 106 | 107 | drvPath = ./wrapper.nix; 108 | 109 | # proton = proton. # This option is only for Windows game 110 | } 111 | ``` 112 | 113 | #### Construct Depots 114 | 115 | the `gameFiles` param accepts either a list or a single entry for games with a singular or multiple depots 116 | 117 | now lets construct with depots 118 | 119 | both depotid and manifestid can be found on their own page 120 | 121 | - [Helltaker Content Linux](https://steamdb.info/depot/1289314/) DepotId: 1289314, ManifestId: 8723838119065609357 122 | - [Helltaker Local](https://steamdb.info/depot/1289315/) DepotId: 1289315, ManifestId: 8723838119065609357 123 | 124 | ```nix 125 | { makeSteamGame, steamUserInfo, gameInfo, gameFileInfo }: 126 | 127 | let 128 | mainGameName = "Helltaker"; 129 | in makeSteamGame { 130 | inherit steamUserInfo; 131 | 132 | 133 | game = gameInfo { 134 | name = mainGameName; 135 | appId = "1289310"; 136 | }; 137 | 138 | gameFiles = [ 139 | (gameFileInfo { 140 | inherit mainGameName; 141 | name = "Helltaker"; 142 | appId = "1289310"; # same AppId from above 143 | depotId = "1289314"; 144 | manifestId = "8723838119065609357"; 145 | # platform = "windows"; # This option is only for Windows game 146 | }) 147 | 148 | (gameFileInfo { 149 | inherit mainGameName; 150 | name = "Helltaker-Local"; 151 | appId = "1289310"; # same AppId from above 152 | depotId = "1289315"; 153 | manifestId = "6394422377711576735"; 154 | # platform = "windows"; # This option is only for Windows game 155 | }) 156 | ]; 157 | 158 | drvPath = ./wrapper.nix; 159 | # proton = proton. # This option is only for Windows game 160 | } 161 | ``` 162 | 163 | #### Build the Game 164 | 165 | now we are ready to build the game 166 | 167 | run it with `nix-build --max-jobs 1`, to build the game 168 | 169 | ### Step 2: Wrapper time 170 | 171 | for most games, the wrapper follows a similar template to these 172 | 173 | the information about the launcher can be found under the [Configuration](https://steamdb.info/app/1289310/config/) section 174 | 175 | **Windows uses protonWrapperScript and Linux uses linuxWrapperScript** 176 | 177 | #### Linux Games 178 | 179 | ```nix 180 | { game, lib, steamcmd, steam-run-native, writeScript, writeScriptBin, gameFiles, steamUserInfo, lndir, ... }: 181 | 182 | 183 | writeScriptBin game.name '' 184 | ${ 185 | linuxWrapperScript { 186 | inherit game gameFiles lndir lib steamUserInfo steamcmd realGameLocation; 187 | } 188 | } 189 | 190 | rm $HOME/games/${game.name}/ 191 | cp -L ${gameFiles}/ $HOME/games/${game.name}/ 192 | chmod +rwx $HOME/games/${game.name}/ 193 | 194 | ${steam-run-native}/bin/steam-run ${writeScript "fix-${game.name}" '' 195 | cd $HOME/games/${game.name}/ 196 | exec ./ 197 | ''} 198 | '' 199 | ``` 200 | 201 | #### Windows Games 202 | 203 | ```nix 204 | { game, proton, lib, steamcmd, steam, steam-run, writeScript, writeScriptBin, gameFiles, lndir, steamUserInfo, protonWrapperScript, ... }: 205 | 206 | writeScriptBin game.name '' 207 | ${ 208 | protonWrapperScript { 209 | inherit game gameFiles proton lndir lib steamUserInfo steamcmd steam; 210 | } 211 | } 212 | 213 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 214 | cd $HOME/games/${game.name} 215 | export WINEDLLOVERRIDES="dxgi=n" 216 | export DXVK_HUD=1 217 | export WINEPREFIX=$HOME/.proton/pfx 218 | export STEAM_COMPAT_DATA_PATH=$HOME/.proton 219 | export STEAM_COMPAT_CLIENT_INSTALL_PATH=$HOME/.steam/steam 220 | 221 | $PROTON_HOME/proton waitforexitandrun ./ 222 | ''} 223 | '' 224 | ``` 225 | 226 | Of course, you can do anything you want in the wrapper for game-specific fixes or feature settings 227 | 228 | ### Step 3: Add it to packages list 229 | 230 | Lastly, make sure you have the new game under the platform's top-level.nix 231 | 232 | ## Caveats 233 | 234 | - right now the password is plaintext in the running process, is not in the scripts, but would shown if you do a `ps` command 235 | 236 | - some games, especially multiplayer/mmo games will use the `targetStore` directly due to the update nature 237 | 238 | - due to steam restrictions, it needs to be run with --max-jobs 1 239 | -------------------------------------------------------------------------------- /default.nix: -------------------------------------------------------------------------------- 1 | { system ? builtins.currentSystem }: 2 | let 3 | flake-compat = builtins.fetchurl { 4 | url = "https://raw.githubusercontent.com/edolstra/flake-compat/99f1c2157fba4bfe6211a321fd0ee43199025dbf/default.nix"; 5 | sha256 = "1vas5z58901gavy5d53n1ima482yvly405jp9l8g07nr4abmzsyb"; 6 | }; 7 | in import flake-compat { 8 | src = ./.; 9 | inherit system; 10 | } 11 | -------------------------------------------------------------------------------- /deps/default.nix: -------------------------------------------------------------------------------- 1 | # Scaffold generated by pip2nix 0.8.0.dev1 2 | 3 | { pkgs ? (import {}) 4 | , pythonPackages ? "python38Packages" 5 | }: 6 | 7 | let 8 | inherit (pkgs.lib) fix composeExtensions; 9 | basePythonPackages = with builtins; if isAttrs pythonPackages 10 | then pythonPackages 11 | else getAttr pythonPackages pkgs; 12 | 13 | elem = builtins.elem; 14 | basename = path: with pkgs.lib; last (splitString "/" path); 15 | startsWith = prefix: full: let 16 | actualPrefix = builtins.substring 0 (builtins.stringLength prefix) full; 17 | in actualPrefix == prefix; 18 | 19 | pythonPackagesGenerated = import ./python-packages.nix { 20 | inherit pkgs; 21 | inherit (pkgs) fetchurl fetchgit fetchhg; 22 | }; 23 | 24 | pythonPackagesOverrides = import ./python-packages-overrides.nix { 25 | inherit basePythonPackages pkgs; 26 | }; 27 | 28 | composedOverrides = (composeExtensions pythonPackagesOverrides pythonPackagesGenerated); 29 | 30 | myPythonPackages = basePythonPackages.python.override { packageOverrides = composedOverrides; }; 31 | 32 | in myPythonPackages.pkgs.steamctl 33 | -------------------------------------------------------------------------------- /deps/dir.patch: -------------------------------------------------------------------------------- 1 | --- a/steamctl/utils/storage.py 2021-07-03 09:54:20.745268694 -0400 2 | +++ b/steamctl/utils/storage.py 2021-07-03 10:27:33.188275338 -0400 3 | @@ -16,12 +16,17 @@ 4 | _LOG = logging.getLogger(__name__) 5 | _appdirs = AppDirs(__appname__) 6 | 7 | -def ensure_dir(path, mode=0o750): 8 | +def ensure_dir(path, mode=0o775): 9 | dirpath = os.path.dirname(path) 10 | 11 | if not os.path.exists(dirpath): 12 | _LOG.debug("Making dirs: %s", dirpath) 13 | - os.makedirs(dirpath, mode) 14 | + try: 15 | + original_umask = os.umask(0) 16 | + os.makedirs(dirpath, 0o775) 17 | + finally: 18 | + os.umask(original_umask) 19 | + 20 | 21 | def normpath(path): 22 | if os.sep == '/': 23 | @@ -58,7 +63,8 @@ 24 | 25 | def open(self, mode): 26 | _LOG.debug("Opening file (%s): %s", mode, self.path) 27 | - ensure_dir(self.path, 0o700) 28 | + 29 | + ensure_dir(self.path, 0o775) 30 | return open(self.path, mode) 31 | 32 | def read_text(self): 33 | -------------------------------------------------------------------------------- /deps/file.patch: -------------------------------------------------------------------------------- 1 | --- a/steamctl/clients.py 2021-07-03 10:30:42.027766519 -0400 2 | +++ b/steamctl/clients.py 2021-07-03 10:37:42.270265767 -0400 3 | @@ -193,47 +193,52 @@ 4 | if not os.path.exists(filepath): 5 | verify = False 6 | 7 | - with open(filepath, 'r+b' if verify else 'wb') as fp: 8 | - fp.seek(0, 2) 9 | + try: 10 | + original_umask = os.umask(0) 11 | + with os.fdopen(os.open(filepath, os.O_CREAT | os.O_RDWR, 0o664), 'r+b' if verify else 'wb') as fp: 12 | + fp.seek(0, 2) 13 | + 14 | + # pre-allocate space 15 | + if fp.tell() != self.size: 16 | + newsize = fp.truncate(self.size) 17 | + 18 | + if newsize != self.size: 19 | + raise SteamError("Failed allocating space for {}".format(filepath)) 20 | + 21 | + # self._LOG.info('{} {} ({}, sha1:{})'.format( 22 | + # 'Verifying' if verify else 'Downloading', 23 | + # relpath, 24 | + # fmt_size(self.size), 25 | + # checksum 26 | + # )) 27 | + 28 | + fp.seek(0) 29 | + for chunk in self.chunks: 30 | + # verify chunk sha hash 31 | + if verify: 32 | + cur_data = fp.read(chunk.cb_original) 33 | + 34 | + if sha1_hash(cur_data) == chunk.sha: 35 | + if pbar: 36 | + pbar.update(chunk.cb_original) 37 | + continue 38 | + 39 | + fp.seek(chunk.offset) # rewind before write 40 | + 41 | + # download and write chunk 42 | + data = self.manifest.cdn_client.get_chunk( 43 | + self.manifest.app_id, 44 | + self.manifest.depot_id, 45 | + chunk.sha.hex(), 46 | + ) 47 | + 48 | + fp.write(data) 49 | + 50 | + if pbar: 51 | + pbar.update(chunk.cb_original) 52 | + finally: 53 | + os.umask(original_umask) 54 | 55 | - # pre-allocate space 56 | - if fp.tell() != self.size: 57 | - newsize = fp.truncate(self.size) 58 | - 59 | - if newsize != self.size: 60 | - raise SteamError("Failed allocating space for {}".format(filepath)) 61 | - 62 | -# self._LOG.info('{} {} ({}, sha1:{})'.format( 63 | -# 'Verifying' if verify else 'Downloading', 64 | -# relpath, 65 | -# fmt_size(self.size), 66 | -# checksum 67 | -# )) 68 | - 69 | - fp.seek(0) 70 | - for chunk in self.chunks: 71 | - # verify chunk sha hash 72 | - if verify: 73 | - cur_data = fp.read(chunk.cb_original) 74 | - 75 | - if sha1_hash(cur_data) == chunk.sha: 76 | - if pbar: 77 | - pbar.update(chunk.cb_original) 78 | - continue 79 | - 80 | - fp.seek(chunk.offset) # rewind before write 81 | - 82 | - # download and write chunk 83 | - data = self.manifest.cdn_client.get_chunk( 84 | - self.manifest.app_id, 85 | - self.manifest.depot_id, 86 | - chunk.sha.hex(), 87 | - ) 88 | - 89 | - fp.write(data) 90 | - 91 | - if pbar: 92 | - pbar.update(chunk.cb_original) 93 | 94 | class CTLDepotManifest(CDNDepotManifest): 95 | DepotFileClass = CTLDepotFile 96 | -------------------------------------------------------------------------------- /deps/pass.patch: -------------------------------------------------------------------------------- 1 | diff --git a/steamctl/argparser.py b/steamctl/argparser.py 2 | index b484f45..f023422 100644 3 | --- a/steamctl/argparser.py 4 | +++ b/steamctl/argparser.py 5 | @@ -62,6 +62,7 @@ def generate_parser(pre=False): 6 | 7 | parser.add_argument('--anonymous', action='store_true', help='Anonymous Steam login') 8 | parser.add_argument('--user', type=str, help='Username for Steam login') 9 | + parser.add_argument('--password_file', type=str, help='Password File') 10 | parser.set_defaults(_cmd_func=print_help) 11 | 12 | if _subcommands: 13 | diff --git a/steamctl/clients.py b/steamctl/clients.py 14 | index 2deedc2..0398bb8 100644 15 | --- a/steamctl/clients.py 16 | +++ b/steamctl/clients.py 17 | @@ -93,7 +93,10 @@ class CachingSteamClient(SteamClient): 18 | else: 19 | self._LOG.info("Enter Steam login") 20 | 21 | - result = self.cli_login(self.username) 22 | + 23 | + passwordFile = open(args.password_file, "r") 24 | + password = passwordFile.read().rstrip() 25 | + result = self.cli_login(self.username, password) 26 | 27 | if not lastFile.exists() or lastFile.read_text() != self.username: 28 | lastFile.write_text(self.username) 29 | -------------------------------------------------------------------------------- /deps/python-packages-overrides.nix: -------------------------------------------------------------------------------- 1 | # Generated by pip2nix 0.8.0.dev1 2 | # Adjust to your needs, e.g. to provide C libraries. 3 | 4 | { pkgs, basePythonPackages }: 5 | 6 | self: super: { 7 | } 8 | -------------------------------------------------------------------------------- /deps/python-packages.nix: -------------------------------------------------------------------------------- 1 | # Generated by pip2nix 0.8.0.dev1 2 | # See https://github.com/nix-community/pip2nix 3 | 4 | { pkgs, fetchurl, fetchgit, fetchhg }: 5 | 6 | self: super: { 7 | "appdirs" = super.buildPythonPackage rec { 8 | pname = "appdirs"; 9 | version = "1.4.4"; 10 | src = fetchurl { 11 | url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl"; 12 | sha256 = "0a5ib82s2335nhvq5rjh8hkimrwyw43xnshn3ds8lccrdg6xlhd8"; 13 | }; 14 | format = "wheel"; 15 | doCheck = false; 16 | buildInputs = []; 17 | checkInputs = []; 18 | nativeBuildInputs = []; 19 | propagatedBuildInputs = []; 20 | meta = { 21 | license = [ pkgs.lib.licenses.mit ]; 22 | }; 23 | }; 24 | "argcomplete" = super.buildPythonPackage rec { 25 | pname = "argcomplete"; 26 | version = "1.12.3"; 27 | src = fetchurl { 28 | url = "https://files.pythonhosted.org/packages/b7/9e/9dc74d330c07866d72f62d553fe8bdbe32786ff247a14e68b5659963e6bd/argcomplete-1.12.3-py2.py3-none-any.whl"; 29 | sha256 = "108dig4gxh7h9pjjvvryhb7n153yqz0y841gbllcwjgxlzn0n7r9"; 30 | }; 31 | format = "wheel"; 32 | doCheck = false; 33 | buildInputs = []; 34 | checkInputs = []; 35 | nativeBuildInputs = []; 36 | propagatedBuildInputs = []; 37 | meta = { 38 | license = [ pkgs.lib.licenses.asl20 ]; 39 | }; 40 | }; 41 | "arrow" = super.buildPythonPackage rec { 42 | pname = "arrow"; 43 | version = "1.1.1"; 44 | src = fetchurl { 45 | url = "https://files.pythonhosted.org/packages/e8/59/4c21f8c501b43e2aabc82ad62e20f3730c273057c56f8731319980dec5ff/arrow-1.1.1-py3-none-any.whl"; 46 | sha256 = "041555pzydvncanriapykb4y5f67qms91kl540590vbnnm6hm9kp"; 47 | }; 48 | format = "wheel"; 49 | doCheck = false; 50 | buildInputs = []; 51 | checkInputs = []; 52 | nativeBuildInputs = []; 53 | propagatedBuildInputs = [ 54 | self."python-dateutil" 55 | ]; 56 | meta = { 57 | license = [ pkgs.lib.licenses.asl20 ]; 58 | }; 59 | }; 60 | "beautifulsoup4" = super.buildPythonPackage rec { 61 | pname = "beautifulsoup4"; 62 | version = "4.9.3"; 63 | src = fetchurl { 64 | url = "https://files.pythonhosted.org/packages/d1/41/e6495bd7d3781cee623ce23ea6ac73282a373088fcd0ddc809a047b18eae/beautifulsoup4-4.9.3-py3-none-any.whl"; 65 | sha256 = "0rmn9z026in04c2y12x3xsdfczgyjbssh3g02yzq5v1l3q1pxx7z"; 66 | }; 67 | format = "wheel"; 68 | doCheck = false; 69 | buildInputs = []; 70 | checkInputs = []; 71 | nativeBuildInputs = []; 72 | propagatedBuildInputs = [ 73 | self."soupsieve" 74 | ]; 75 | meta = { 76 | license = [ pkgs.lib.licenses.mit ]; 77 | }; 78 | }; 79 | "cachetools" = super.buildPythonPackage rec { 80 | pname = "cachetools"; 81 | version = "4.2.2"; 82 | src = fetchurl { 83 | url = "https://files.pythonhosted.org/packages/bf/28/c4f5796c67ad06bb91d98d543a5e01805c1ff065e08871f78e52d2a331ad/cachetools-4.2.2-py3-none-any.whl"; 84 | sha256 = "00g05bqm5krpss7fx0sx0d7cgc72zw7bbdc5pbdvcyik2nbvih1c"; 85 | }; 86 | format = "wheel"; 87 | doCheck = false; 88 | buildInputs = []; 89 | checkInputs = []; 90 | nativeBuildInputs = []; 91 | propagatedBuildInputs = []; 92 | meta = { 93 | license = [ pkgs.lib.licenses.mit ]; 94 | }; 95 | }; 96 | "certifi" = super.buildPythonPackage rec { 97 | pname = "certifi"; 98 | version = "2021.5.30"; 99 | src = fetchurl { 100 | url = "https://files.pythonhosted.org/packages/05/1b/0a0dece0e8aa492a6ec9e4ad2fe366b511558cdc73fd3abc82ba7348e875/certifi-2021.5.30-py2.py3-none-any.whl"; 101 | sha256 = "1n57ixzaln34d2qw55g7vh0hd6g033dkhqyxwwdz81kb8kwf9cah"; 102 | }; 103 | format = "wheel"; 104 | doCheck = false; 105 | buildInputs = []; 106 | checkInputs = []; 107 | nativeBuildInputs = []; 108 | propagatedBuildInputs = []; 109 | meta = { 110 | license = [ pkgs.lib.licenses.mpl20 { fullName = "Mozilla Public License 2.0 (MPL 2.0)"; } ]; 111 | }; 112 | }; 113 | "chardet" = super.buildPythonPackage rec { 114 | pname = "chardet"; 115 | version = "4.0.0"; 116 | src = fetchurl { 117 | url = "https://files.pythonhosted.org/packages/19/c7/fa589626997dd07bd87d9269342ccb74b1720384a4d739a1872bd84fbe68/chardet-4.0.0-py2.py3-none-any.whl"; 118 | sha256 = "198xs99vbvcj312d1bk7bgn7aix5h64sqi3hwvr1i4gxcr6har7q"; 119 | }; 120 | format = "wheel"; 121 | doCheck = false; 122 | buildInputs = []; 123 | checkInputs = []; 124 | nativeBuildInputs = []; 125 | propagatedBuildInputs = []; 126 | meta = { 127 | license = [ { fullName = "LGPL"; } { fullName = "GNU Library or Lesser General Public License (LGPL)"; } ]; 128 | }; 129 | }; 130 | "gevent" = super.buildPythonPackage rec { 131 | pname = "gevent"; 132 | version = "21.1.2"; 133 | src = fetchurl { 134 | url = "https://files.pythonhosted.org/packages/0b/50/1b1175ea3a269b5fa3f0f7fed11149888180695bef5fbf568adbb196efaf/gevent-21.1.2.tar.gz"; 135 | sha256 = "10f9y899y9nmq51pv4r1zb51b4w5yxx00sz5whvg9vm956hc432j"; 136 | }; 137 | format = "setuptools"; 138 | doCheck = false; 139 | buildInputs = []; 140 | checkInputs = []; 141 | nativeBuildInputs = []; 142 | propagatedBuildInputs = [ 143 | self."greenlet" 144 | self."setuptools" 145 | self."zope.event" 146 | self."zope.interface" 147 | ]; 148 | meta = { 149 | license = [ pkgs.lib.licenses.mit ]; 150 | }; 151 | }; 152 | "gevent-eventemitter" = super.buildPythonPackage rec { 153 | pname = "gevent-eventemitter"; 154 | version = "2.1"; 155 | src = fetchurl { 156 | url = "https://files.pythonhosted.org/packages/c7/f5/47f896511ca1fb5dd6e9fa1ba152f9ccc3f892f4d31c8757cfe36c248c8e/gevent_eventemitter-2.1-py2.py3-none-any.whl"; 157 | sha256 = "1xqgj2i0pk3rbfn11y1vq7rn54jf3dx2x2hq3x8v4f0zpfgmlq1h"; 158 | }; 159 | format = "wheel"; 160 | doCheck = false; 161 | buildInputs = []; 162 | checkInputs = []; 163 | nativeBuildInputs = []; 164 | propagatedBuildInputs = [ 165 | self."gevent" 166 | ]; 167 | meta = { 168 | license = [ pkgs.lib.licenses.mit ]; 169 | }; 170 | }; 171 | "greenlet" = super.buildPythonPackage rec { 172 | pname = "greenlet"; 173 | version = "1.1.0"; 174 | src = fetchurl { 175 | url = "https://files.pythonhosted.org/packages/47/6d/be10df2b141fcb1020c9605f7758881b5af706fb09a05b737e8eb7540387/greenlet-1.1.0.tar.gz"; 176 | sha256 = "1vjqyv9j8qk191li460bkwhjpkijaaqy2vvr7i4b9zq17ypghzf8"; 177 | }; 178 | format = "setuptools"; 179 | doCheck = false; 180 | buildInputs = []; 181 | checkInputs = []; 182 | nativeBuildInputs = []; 183 | propagatedBuildInputs = []; 184 | meta = { 185 | license = [ pkgs.lib.licenses.mit ]; 186 | }; 187 | }; 188 | "idna" = super.buildPythonPackage rec { 189 | pname = "idna"; 190 | version = "2.10"; 191 | src = fetchurl { 192 | url = "https://files.pythonhosted.org/packages/a2/38/928ddce2273eaa564f6f50de919327bf3a00f091b5baba8dfa9460f3a8a8/idna-2.10-py2.py3-none-any.whl"; 193 | sha256 = "1h280sli58v5dapmf79rnnqdrrk0xjn8vi3pxppknllv3r5q0zdr"; 194 | }; 195 | format = "wheel"; 196 | doCheck = false; 197 | buildInputs = []; 198 | checkInputs = []; 199 | nativeBuildInputs = []; 200 | propagatedBuildInputs = []; 201 | meta = { 202 | license = [ { fullName = "BSD-like"; } pkgs.lib.licenses.bsdOriginal ]; 203 | }; 204 | }; 205 | "protobuf" = super.buildPythonPackage rec { 206 | pname = "protobuf"; 207 | version = "3.17.3"; 208 | src = fetchurl { 209 | url = "https://files.pythonhosted.org/packages/3d/64/a3b379cb9c7827ad33c67dcda4c4ad117bdef1b7d68b22a05c963cf4727d/protobuf-3.17.3.tar.gz"; 210 | sha256 = "0yyx9wf18gamyfm9gr2s5nv77chg50z820r81l4jmhm9xajlx03j"; 211 | }; 212 | format = "setuptools"; 213 | doCheck = false; 214 | buildInputs = []; 215 | checkInputs = []; 216 | nativeBuildInputs = []; 217 | propagatedBuildInputs = [ 218 | self."six" 219 | ]; 220 | meta = { 221 | license = [ { fullName = "3-Clause BSD License"; } ]; 222 | }; 223 | }; 224 | "pycryptodomex" = super.buildPythonPackage rec { 225 | pname = "pycryptodomex"; 226 | version = "3.10.1"; 227 | src = fetchurl { 228 | url = "https://files.pythonhosted.org/packages/82/e2/a0f9f5452a59bafaa3420585f22b58a8566c4717a88c139af2276bb5695d/pycryptodomex-3.10.1.tar.gz"; 229 | sha256 = "0qix4q55sq27r5a9jkgynw136j2kidwhnhlgnjkikysjwbix672l"; 230 | }; 231 | format = "setuptools"; 232 | doCheck = false; 233 | buildInputs = []; 234 | checkInputs = []; 235 | nativeBuildInputs = []; 236 | propagatedBuildInputs = []; 237 | meta = { 238 | license = [ { fullName = "BSD, Public Domain"; } pkgs.lib.licenses.publicDomain pkgs.lib.licenses.bsdOriginal pkgs.lib.licenses.asl20 ]; 239 | }; 240 | }; 241 | "pyqrcode" = super.buildPythonPackage rec { 242 | pname = "pyqrcode"; 243 | version = "1.2.1"; 244 | src = fetchurl { 245 | url = "https://files.pythonhosted.org/packages/37/61/f07226075c347897937d4086ef8e55f0a62ae535e28069884ac68d979316/PyQRCode-1.2.1.tar.gz"; 246 | sha256 = "1m9ln8k9v7dfbh1i81225hx5mdsh8mpf9g7r4wpbfmiyfcs7dgzx"; 247 | }; 248 | format = "setuptools"; 249 | doCheck = false; 250 | buildInputs = []; 251 | checkInputs = []; 252 | nativeBuildInputs = []; 253 | propagatedBuildInputs = []; 254 | meta = { 255 | license = [ pkgs.lib.licenses.bsdOriginal ]; 256 | }; 257 | }; 258 | "python-dateutil" = super.buildPythonPackage rec { 259 | pname = "python-dateutil"; 260 | version = "2.8.1"; 261 | src = fetchurl { 262 | url = "https://files.pythonhosted.org/packages/d4/70/d60450c3dd48ef87586924207ae8907090de0b306af2bce5d134d78615cb/python_dateutil-2.8.1-py2.py3-none-any.whl"; 263 | sha256 = "0answacgnckybm5iyfnaqsgval3mdbpak4i6fsbi2vv8x8qkzfvm"; 264 | }; 265 | format = "wheel"; 266 | doCheck = false; 267 | buildInputs = []; 268 | checkInputs = []; 269 | nativeBuildInputs = []; 270 | propagatedBuildInputs = [ 271 | self."six" 272 | ]; 273 | meta = { 274 | license = [ { fullName = "Dual License"; } pkgs.lib.licenses.bsdOriginal pkgs.lib.licenses.asl20 ]; 275 | }; 276 | }; 277 | "requests" = super.buildPythonPackage rec { 278 | pname = "requests"; 279 | version = "2.25.1"; 280 | src = fetchurl { 281 | url = "https://files.pythonhosted.org/packages/29/c1/24814557f1d22c56d50280771a17307e6bf87b70727d975fd6b2ce6b014a/requests-2.25.1-py2.py3-none-any.whl"; 282 | sha256 = "07l7fm7y9zkvmpfli803dni6iwyyhy1f804y46wycam46r70h462"; 283 | }; 284 | format = "wheel"; 285 | doCheck = false; 286 | buildInputs = []; 287 | checkInputs = []; 288 | nativeBuildInputs = []; 289 | propagatedBuildInputs = [ 290 | self."certifi" 291 | self."chardet" 292 | self."idna" 293 | self."urllib3" 294 | ]; 295 | meta = { 296 | license = [ pkgs.lib.licenses.asl20 ]; 297 | }; 298 | }; 299 | "six" = super.buildPythonPackage rec { 300 | pname = "six"; 301 | version = "1.16.0"; 302 | src = fetchurl { 303 | url = "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl"; 304 | sha256 = "0m02dsi8lvrjf4bi20ab6lm7rr6krz7pg6lzk3xjs2l9hqfjzfwa"; 305 | }; 306 | format = "wheel"; 307 | doCheck = false; 308 | buildInputs = []; 309 | checkInputs = []; 310 | nativeBuildInputs = []; 311 | propagatedBuildInputs = []; 312 | meta = { 313 | license = [ pkgs.lib.licenses.mit ]; 314 | }; 315 | }; 316 | "soupsieve" = super.buildPythonPackage rec { 317 | pname = "soupsieve"; 318 | version = "2.2.1"; 319 | src = fetchurl { 320 | url = "https://files.pythonhosted.org/packages/36/69/d82d04022f02733bf9a72bc3b96332d360c0c5307096d76f6bb7489f7e57/soupsieve-2.2.1-py3-none-any.whl"; 321 | sha256 = "0fy2qjvgwcm4k93lkq133rmwg0sgijpsj93qmgfxp30m9zac5hf2"; 322 | }; 323 | format = "wheel"; 324 | doCheck = false; 325 | buildInputs = []; 326 | checkInputs = []; 327 | nativeBuildInputs = []; 328 | propagatedBuildInputs = []; 329 | meta = { 330 | license = [ pkgs.lib.licenses.mit ]; 331 | }; 332 | }; 333 | "steam" = super.buildPythonPackage rec { 334 | pname = "steam"; 335 | version = "1.2.0"; 336 | src = fetchurl { 337 | url = "https://files.pythonhosted.org/packages/9b/0d/bfddb0ea73263048749541a584dbc23f40a0aa1efa86d072865fb838f52f/steam-1.2.0.tar.gz"; 338 | sha256 = "0zsyaysrki1nar83m307z1jvk5121iys7q3m6bqjzg9fhn200894"; 339 | }; 340 | format = "setuptools"; 341 | doCheck = false; 342 | buildInputs = []; 343 | checkInputs = []; 344 | nativeBuildInputs = []; 345 | propagatedBuildInputs = [ 346 | self."cachetools" 347 | self."gevent" 348 | self."gevent-eventemitter" 349 | self."protobuf" 350 | self."pycryptodomex" 351 | self."requests" 352 | self."six" 353 | self."vdf" 354 | ]; 355 | meta = { 356 | license = [ pkgs.lib.licenses.mit ]; 357 | }; 358 | }; 359 | "steamctl" = super.buildPythonPackage rec { 360 | pname = "steamctl"; 361 | version = "0.8.0"; 362 | src = fetchgit { 363 | url = "git://github.com/ValvePython/steamctl"; 364 | rev = "dbbe1c890d56a272dffcf06c0eab8e11d8e29364"; 365 | sha256 = "8VZvezHQiStsob9vYg+7n/8IYKpqj/KtvxeDoMCY6xY="; 366 | }; 367 | format = "setuptools"; 368 | doCheck = false; 369 | patches = [ 370 | ./pass.patch 371 | ./file.patch 372 | ./dir.patch 373 | ]; 374 | buildInputs = []; 375 | checkInputs = []; 376 | nativeBuildInputs = []; 377 | propagatedBuildInputs = [ 378 | self."appdirs" 379 | self."argcomplete" 380 | self."arrow" 381 | self."beautifulsoup4" 382 | self."pyqrcode" 383 | self."steam" 384 | self."tqdm" 385 | self."vpk" 386 | ]; 387 | meta = { 388 | license = [ pkgs.lib.licenses.mit ]; 389 | }; 390 | }; 391 | "tqdm" = super.buildPythonPackage rec { 392 | pname = "tqdm"; 393 | version = "4.61.1"; 394 | src = fetchurl { 395 | url = "https://files.pythonhosted.org/packages/b4/20/9f1e974bb4761128fc0d0a32813eaa92827309b1756c4b892d28adfb4415/tqdm-4.61.1-py2.py3-none-any.whl"; 396 | sha256 = "1cmx8f106gg425j6wf96xhiglj2fb37cixqqcfn532997zq2j35a"; 397 | }; 398 | format = "wheel"; 399 | doCheck = false; 400 | buildInputs = []; 401 | checkInputs = []; 402 | nativeBuildInputs = []; 403 | propagatedBuildInputs = []; 404 | meta = { 405 | license = [ pkgs.lib.licenses.mit { fullName = "MPLv2.0, MIT Licences"; } { fullName = "Mozilla Public License 2.0 (MPL 2.0)"; } ]; 406 | }; 407 | }; 408 | "urllib3" = super.buildPythonPackage rec { 409 | pname = "urllib3"; 410 | version = "1.26.6"; 411 | src = fetchurl { 412 | url = "https://files.pythonhosted.org/packages/5f/64/43575537846896abac0b15c3e5ac678d787a4021e906703f1766bfb8ea11/urllib3-1.26.6-py2.py3-none-any.whl"; 413 | sha256 = "1m6823gifpdhma46q3rg3vn4s406138qswd776qsqnb129r8dyrr"; 414 | }; 415 | format = "wheel"; 416 | doCheck = false; 417 | buildInputs = []; 418 | checkInputs = []; 419 | nativeBuildInputs = []; 420 | propagatedBuildInputs = []; 421 | meta = { 422 | license = [ pkgs.lib.licenses.mit ]; 423 | }; 424 | }; 425 | "vdf" = super.buildPythonPackage rec { 426 | pname = "vdf"; 427 | version = "3.4"; 428 | src = fetchurl { 429 | url = "https://files.pythonhosted.org/packages/96/60/6456b687cf55cf60020dcd01f9bc51561c3cc84f05fd8e0feb71ce60f894/vdf-3.4-py2.py3-none-any.whl"; 430 | sha256 = "0d254fz4p8648wwhfzv0qq40kjz9fi8d4bdg6pal7qs9rhjs3hb8"; 431 | }; 432 | format = "wheel"; 433 | doCheck = false; 434 | buildInputs = []; 435 | checkInputs = []; 436 | nativeBuildInputs = []; 437 | propagatedBuildInputs = []; 438 | meta = { 439 | license = [ pkgs.lib.licenses.mit ]; 440 | }; 441 | }; 442 | "vpk" = super.buildPythonPackage rec { 443 | pname = "vpk"; 444 | version = "1.3.3"; 445 | src = fetchurl { 446 | url = "https://files.pythonhosted.org/packages/b4/88/bc053835972ebf7b90f569fd78991139abf9435b1243cfad8ca706c00ec0/vpk-1.3.3-py2.py3-none-any.whl"; 447 | sha256 = "0v6qnswj34ph9kxirkpi8yfdamp20g8aa2r47a60y7bba8hmpcf6"; 448 | }; 449 | format = "wheel"; 450 | doCheck = false; 451 | buildInputs = []; 452 | checkInputs = []; 453 | nativeBuildInputs = []; 454 | propagatedBuildInputs = []; 455 | meta = { 456 | license = [ pkgs.lib.licenses.mit ]; 457 | }; 458 | }; 459 | "zope.event" = super.buildPythonPackage rec { 460 | pname = "zope.event"; 461 | version = "4.5.0"; 462 | src = fetchurl { 463 | url = "https://files.pythonhosted.org/packages/9e/85/b45408c64f3b888976f1d5b37eed8d746b8d5729a66a49ec846fda27d371/zope.event-4.5.0-py2.py3-none-any.whl"; 464 | sha256 = "0hhc13dkp5s32idngx48bswj655jr4h7zkq81i75zand74cl0ri6"; 465 | }; 466 | format = "wheel"; 467 | doCheck = false; 468 | buildInputs = []; 469 | checkInputs = []; 470 | nativeBuildInputs = []; 471 | propagatedBuildInputs = [ 472 | self."setuptools" 473 | ]; 474 | meta = { 475 | license = [ pkgs.lib.licenses.zpl21 ]; 476 | }; 477 | }; 478 | "zope.interface" = super.buildPythonPackage rec { 479 | pname = "zope.interface"; 480 | version = "5.4.0"; 481 | src = fetchurl { 482 | url = "https://files.pythonhosted.org/packages/ae/58/e0877f58daa69126a5fb325d6df92b20b77431cd281e189c5ec42b722f58/zope.interface-5.4.0.tar.gz"; 483 | sha256 = "03jsiad578392pfmxa1ihkmvdh2q3dcwqy1vv240jgzc1x9mzfjx"; 484 | }; 485 | format = "setuptools"; 486 | doCheck = false; 487 | buildInputs = []; 488 | checkInputs = []; 489 | nativeBuildInputs = []; 490 | propagatedBuildInputs = [ 491 | self."setuptools" 492 | ]; 493 | meta = { 494 | license = [ pkgs.lib.licenses.zpl21 ]; 495 | }; 496 | }; 497 | } 498 | -------------------------------------------------------------------------------- /examples/default.nix: -------------------------------------------------------------------------------- 1 | let 2 | defaultNix = (import ../default.nix {}).defaultNix; 3 | steamStore = (defaultNix.makeSteamStore.x86_64-linux { 4 | username = "<>"; 5 | targetStore = ""; 6 | outputStore = ""; 7 | passwordFile = ""; 8 | useGuardFiles = false; 9 | }); 10 | in steamStore.linux.Portal2 11 | -------------------------------------------------------------------------------- /flake.lock: -------------------------------------------------------------------------------- 1 | { 2 | "nodes": { 3 | "flake-utils": { 4 | "locked": { 5 | "lastModified": 1623875721, 6 | "narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=", 7 | "owner": "numtide", 8 | "repo": "flake-utils", 9 | "rev": "f7e004a55b120c02ecb6219596820fcd32ca8772", 10 | "type": "github" 11 | }, 12 | "original": { 13 | "owner": "numtide", 14 | "repo": "flake-utils", 15 | "type": "github" 16 | } 17 | }, 18 | "nixpkgs": { 19 | "locked": { 20 | "lastModified": 1624017550, 21 | "narHash": "sha256-o4s2kVehpOGB/tlLy3+KXw64wOAisyJZ/7eusDhqGiY=", 22 | "owner": "nixos", 23 | "repo": "nixpkgs", 24 | "rev": "3b6c3bee9174dfe56fd0e586449457467abe7116", 25 | "type": "github" 26 | }, 27 | "original": { 28 | "owner": "nixos", 29 | "repo": "nixpkgs", 30 | "rev": "3b6c3bee9174dfe56fd0e586449457467abe7116", 31 | "type": "github" 32 | } 33 | }, 34 | "root": { 35 | "inputs": { 36 | "flake-utils": "flake-utils", 37 | "nixpkgs": "nixpkgs" 38 | } 39 | } 40 | }, 41 | "root": "root", 42 | "version": 7 43 | } 44 | -------------------------------------------------------------------------------- /flake.nix: -------------------------------------------------------------------------------- 1 | { 2 | description = "Nix-Steam, a nix system for steam games"; 3 | 4 | inputs = { 5 | nixpkgs.url = "github:nixos/nixpkgs/3b6c3bee9174dfe56fd0e586449457467abe7116"; 6 | flake-utils.url = "github:numtide/flake-utils"; 7 | }; 8 | 9 | outputs = { self, nixpkgs, flake-utils }: 10 | flake-utils.lib.eachSystem [ "x86_64-linux" ] (system: 11 | let 12 | pkgs = import nixpkgs { 13 | inherit system; 14 | config = { 15 | allowUnfree = true; 16 | }; 17 | 18 | overlays = [(final: prev: { 19 | steamctl = prev.callPackage ./deps { 20 | pythonPackages = prev.python38Packages; 21 | }; 22 | })]; 23 | }; 24 | in { 25 | helperLib = pkgs.callPackage ./lib/top-level.nix { 26 | nixpkgsSource = nixpkgs; 27 | }; 28 | makeSteamStore = steamUserInfo: pkgs.callPackage ./games/top-level.nix { 29 | inherit steamUserInfo; 30 | helperLib = self.helperLib."${system}"; 31 | }; 32 | 33 | devShell = 34 | pkgs.mkShell { 35 | NIX_PATH = "nixpkgs=${nixpkgs}"; 36 | buildInputs = [ 37 | pkgs.nixfmt 38 | pkgs.steamcmd 39 | pkgs.steamctl 40 | 41 | ]; 42 | }; 43 | }); 44 | } 45 | -------------------------------------------------------------------------------- /games/linux/amorous/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, steamUserInfo, gameInfo, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "Amorous"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "778700"; 11 | }; 12 | 13 | gameFiles = [ 14 | (gameFileInfo { 15 | inherit mainGameName; 16 | name = "Amorous"; 17 | appId = "778700"; 18 | depotId = "778704"; 19 | manifestId = "1910947975998266938"; 20 | 21 | extraAction = '' 22 | chmod +x game/*.bin* 23 | ''; 24 | }) 25 | 26 | (gameFileInfo { 27 | inherit mainGameName; 28 | name = "Amorous-Content"; 29 | appId = "778700"; 30 | depotId = "778701"; 31 | manifestId = "9201582490132012031"; 32 | }) 33 | ]; 34 | 35 | drvPath = ./wrapper.nix; 36 | } 37 | -------------------------------------------------------------------------------- /games/linux/amorous/wrapper.nix: -------------------------------------------------------------------------------- 1 | { enableAdult ? false, game, linuxWrapperScript, lib, steamcmd, steam-run, writeScript, writeScriptBin, gameFiles, steamUserInfo, realGameLocation, lndir, steamcmdLogin, ... }: 2 | 3 | # Make sure you run it in a directory with no files 4 | writeScriptBin game.name '' 5 | ${ 6 | linuxWrapperScript { 7 | inherit game gameFiles lndir lib steamUserInfo steamcmd realGameLocation; 8 | } 9 | } 10 | 11 | unlink $HOME/games/${game.name}/Amorous.Game.Unix.bin.x86_64 12 | unlink $HOME/games/${game.name}/Amorous.Game.Unix 13 | unlink $HOME/games/${game.name}/FNA.dll 14 | cp -L ${realGameLocation}/Amorous.Game.Unix $HOME/games/${game.name}/Amorous.Game.Unix 15 | cp -L ${realGameLocation}/Amorous.Game.Unix.bin.x86_64 $HOME/games/${game.name}/Amorous.Game.Unix.bin.x86_64 16 | cp -L ${realGameLocation}/FNA.dll $HOME/games/${game.name}/ 17 | chmod +x $HOME/games/${game.name}/Amorous.Game.Unix* 18 | 19 | ${if enableAdult then '' 20 | touch $HOME/games/${game.name}/ShowMeSomeBooty.txt 21 | '' else '' 22 | rm $HOME/games/${game.name}/ShowMeSomeBooty.txt 23 | ''} 24 | 25 | ${steamcmdLogin { inherit steamUserInfo steamcmd; }} 26 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 27 | export LD_LIBRARY_PATH=${realGameLocation}/lib:${realGameLocation}/lib64:$LD_LIBRARY_PATH 28 | export MONO_IOMAP=case 29 | cd $HOME/games/${game.name} 30 | exec ./Amorous.Game.Unix 31 | ''} 32 | '' 33 | -------------------------------------------------------------------------------- /games/linux/antichamber/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, steamUserInfo, gameInfo, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "Antichamber"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "219890"; 11 | }; 12 | 13 | gameFiles = gameFileInfo { 14 | inherit mainGameName; 15 | name = "Antichamber"; 16 | appId = "219890"; 17 | depotId = "219893"; 18 | manifestId = "1098988246616812101"; 19 | 20 | installPhase = '' 21 | mkdir -p $out 22 | cp -a game/* $out 23 | cd $out/Binaries/Linux/lib/ 24 | rm libogg.so libvorbis* libSDL2-2.0.so.0 25 | chmod +x $out/Binaries/Linux/UDKGame-Linux 26 | ''; 27 | }; 28 | 29 | drvPath = ./wrapper.nix; 30 | } 31 | -------------------------------------------------------------------------------- /games/linux/antichamber/wrapper.nix: -------------------------------------------------------------------------------- 1 | { game, lib, steamcmd, steam-run, writeScript, writeScriptBin, gameFiles, steamUserInfo, linuxWrapperScript, realGameLocation, steamcmdLogin, ... }: 2 | 3 | writeScriptBin game.name '' 4 | ${ 5 | linuxWrapperScript { 6 | inherit game gameFiles lndir lib steamUserInfo steamcmd realGameLocation; 7 | } 8 | } 9 | 10 | ${steamcmdLogin { inherit steamUserInfo steamcmd; }} 11 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 12 | export LD_LIBRARY_PATH=${realGameLocation}/Binaries/Linux/lib:$LD_LIBRARY_PATH 13 | cd $HOME/games/${game.name} 14 | exec ./UDKGame-Linux 15 | ''} 16 | '' 17 | -------------------------------------------------------------------------------- /games/linux/helltaker/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, steamUserInfo, gameInfo, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "Helltaker"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "1289310"; 11 | }; 12 | 13 | gameFiles = [ 14 | (gameFileInfo { 15 | inherit mainGameName; 16 | name = "Helltaker"; 17 | appId = "1289310"; 18 | depotId = "1289314"; 19 | manifestId = "8723838119065609357"; 20 | }) 21 | 22 | (gameFileInfo { 23 | inherit mainGameName; 24 | name = "Helltaker-Local"; 25 | appId = "1289310"; 26 | depotId = "1289315"; 27 | manifestId = "6394422377711576735"; 28 | }) 29 | ]; 30 | 31 | drvPath = ./wrapper.nix; 32 | } 33 | -------------------------------------------------------------------------------- /games/linux/helltaker/wrapper.nix: -------------------------------------------------------------------------------- 1 | { game, lib, steamcmd, steam-run-native, writeScript, writeScriptBin, gameFiles, steamUserInfo, lndir, linuxWrapperScript, realGameLocation, steamcmdLogin, ... }: 2 | 3 | writeScriptBin game.name '' 4 | ${ 5 | linuxWrapperScript { 6 | inherit game gameFiles lndir lib steamUserInfo steamcmd realGameLocation; 7 | } 8 | } 9 | 10 | rm $HOME/games/${game.name}/helltaker_lnx.x86_64 11 | cp -L ${realGameLocation}/helltaker_lnx.x86_64 $HOME/games/${game.name}/ 12 | chmod -R +rwx $HOME/games/${game.name}/helltaker_lnx.x86_64 13 | 14 | ${steamcmdLogin { inherit steamUserInfo steamcmd; }} 15 | ${steam-run-native}/bin/steam-run ${writeScript "fix-${game.name}" '' 16 | cd $HOME/games/${game.name}/ 17 | exec ./helltaker_lnx.x86_64 18 | ''} 19 | '' 20 | -------------------------------------------------------------------------------- /games/linux/higurashiCh6/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, steamUserInfo, gameInfo, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "HigurashiCh6"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "668350"; 11 | }; 12 | 13 | gameFiles = gameFileInfo { 14 | inherit mainGameName; 15 | name = "HigurashiCh6"; 16 | appId = "668350"; 17 | depotId = "668353"; 18 | manifestId = "8690377579741694774"; 19 | }; 20 | 21 | drvPath = ./wrapper.nix; 22 | } 23 | -------------------------------------------------------------------------------- /games/linux/higurashiCh6/wrapper.nix: -------------------------------------------------------------------------------- 1 | { game, lib, steamcmd, steam-run, writeScript, writeScriptBin, gameFiles, steamUserInfo, symlinkJoin, linuxWrapperScript, realGameLocation, steamcmdLogin, ... }: 2 | 3 | in writeScriptBin game.name '' 4 | ${ 5 | linuxWrapperScript { 6 | inherit game gameFiles lndir lib steamUserInfo steamcmd realGameLocation; 7 | } 8 | } 9 | 10 | ${steamcmdLogin { inherit steamUserInfo steamcmd; }} 11 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 12 | cd $HOME/games/${game.name} 13 | exec ./HigurashiEp06.x86 14 | ''} 15 | '' 16 | -------------------------------------------------------------------------------- /games/linux/oxenfree/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, steamUserInfo, gameInfo, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "Oxenfree"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "388880"; 11 | }; 12 | 13 | gameFiles = [ 14 | (gameFileInfo { 15 | inherit mainGameName; 16 | name = "Oxenfree-Linux-Universal-Content"; 17 | appId = "388880"; 18 | depotId = "388884"; 19 | manifestId = "8028188999286703994"; 20 | }) 21 | 22 | (gameFileInfo { 23 | inherit mainGameName; 24 | name = "Oxenfree-SteamAPI-x64"; 25 | appId = "388880"; 26 | depotId = "388885"; 27 | manifestId = "760220395727681197"; 28 | }) 29 | ]; 30 | 31 | drvPath = ./wrapper.nix; 32 | } 33 | -------------------------------------------------------------------------------- /games/linux/oxenfree/wrapper.nix: -------------------------------------------------------------------------------- 1 | { game, lib, steamcmd, steam-run-native, writeScript, writeScriptBin, gameFiles, steamUserInfo, lndir, linuxWrapperScript, realGameLocation, steamcmdLogin, ... }: 2 | 3 | writeScriptBin game.name '' 4 | ${ 5 | linuxWrapperScript { 6 | inherit game gameFiles lndir lib steamUserInfo steamcmd realGameLocation; 7 | } 8 | } 9 | 10 | rm $HOME/games/${game.name}/Oxenfree.x86_64 11 | cp -L ${realGameLocation}/Oxenfree.x86_64 $HOME/games/${game.name}/ 12 | chmod -R +rwx $HOME/games/${game.name}/Oxenfree.x86_64 13 | 14 | ${steamcmdLogin { inherit steamUserInfo steamcmd; }} 15 | ${steam-run-native}/bin/steam-run ${writeScript "fix-${game.name}" '' 16 | cd $HOME/games/${game.name}/ 17 | exec ./Oxenfree.x86_64 18 | ''} 19 | '' 20 | -------------------------------------------------------------------------------- /games/linux/payday2/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, steamUserInfo, gameInfo, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "Payday2"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "218620"; 11 | }; 12 | 13 | gameFiles = [ 14 | (gameFileInfo { 15 | inherit mainGameName; 16 | name = "Payday2"; 17 | appId = "218620"; 18 | depotId = "218632"; 19 | manifestId = "1862813793011772620"; 20 | }) 21 | ]; 22 | 23 | drvPath = ./wrapper.nix; 24 | } 25 | -------------------------------------------------------------------------------- /games/linux/payday2/wrapper.nix: -------------------------------------------------------------------------------- 1 | { game, lib, steam, steamcmd, steam-run, writeScript, writeScriptBin, gameFiles, steamUserInfo, symlinkJoin, lndir, realGameLocation, linuxWrapperScript, steamcmdLogin, ... }: 2 | 3 | writeScriptBin game.name '' 4 | ${ 5 | linuxWrapperScript { 6 | inherit game gameFiles lndir lib steamUserInfo steamcmd realGameLocation; 7 | } 8 | } 9 | 10 | rm $HOME/games/${game.name}/payday2_release 11 | cp -L ${realGameLocation}/payday2_release $HOME/games/${game.name}/ 12 | 13 | chmod +rwx $HOME/games/${game.name}/payday2_release 14 | 15 | STEAM_RUNNING="$(pgrep steam -c)" 16 | 17 | if [[ $STEAM_RUNNING == 0 ]]; then 18 | (${steam}/bin/steam -silent -login ${steamUserInfo.username} $(cat ${steamUserInfo.passwordFile}) &) 19 | sleep 60 20 | fi 21 | 22 | ${steamcmdLogin { inherit steamUserInfo steamcmd; }} 23 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 24 | export LD_LIBRARY_PATH=$HOME/games/${game.name}:$LD_LIBRARY_PATH 25 | cd $HOME/games/${game.name} 26 | exec ./payday2_release 27 | ''} 28 | '' 29 | -------------------------------------------------------------------------------- /games/linux/portal2/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, steamUserInfo, gameInfo, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "Portal2"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "620"; 11 | }; 12 | 13 | gameFiles = [ 14 | (gameFileInfo { 15 | inherit mainGameName; 16 | name = "Portal2-Client-Binaries"; 17 | appId = "620"; 18 | depotId = "624"; 19 | manifestId = "1941148049629049074"; 20 | }) 21 | 22 | (gameFileInfo { 23 | inherit mainGameName; 24 | name = "Portal2-Common"; 25 | appId = "620"; 26 | depotId = "621"; 27 | manifestId = "8379316869136765904"; 28 | }) 29 | 30 | (gameFileInfo { 31 | inherit mainGameName; 32 | name = "Portal2-Linux-Content"; 33 | appId = "620"; 34 | depotId = "661"; 35 | manifestId = "1379718481839503052"; 36 | }) 37 | ]; 38 | 39 | drvPath = ./wrapper.nix; 40 | } 41 | -------------------------------------------------------------------------------- /games/linux/portal2/wrapper.nix: -------------------------------------------------------------------------------- 1 | { game, lib, steam, steamcmd, steam-run, writeScript, writeScriptBin, gameFiles, steamUserInfo, symlinkJoin, lndir, linuxWrapperScript, realGameLocation, steamcmdLogin, ... }: 2 | 3 | writeScriptBin game.name '' 4 | ${ 5 | linuxWrapperScript { 6 | inherit game gameFiles lndir lib steamUserInfo steamcmd realGameLocation; 7 | } 8 | } 9 | 10 | rm $HOME/games/${game.name}/portal2.sh 11 | cp -L ${realGameLocation}/portal2.sh $HOME/games/${game.name}/portal2.sh 12 | 13 | rm $HOME/games/${game.name}/portal2_linux 14 | cp -L ${realGameLocation}/portal2_linux $HOME/games/${game.name}/portal2_linux 15 | 16 | chmod +rwx $HOME/games/${game.name}/portal2.sh 17 | chmod +rwx $HOME/games/${game.name}/portal2_linux 18 | 19 | STEAM_RUNNING="$(pgrep steam -c)" 20 | 21 | if [[ $STEAM_RUNNING == 0 ]]; then 22 | chmod -R +rw $HOME/.steam 23 | ${steamcmdLogin { inherit steamUserInfo steamcmd; }} 24 | (${steam}/bin/steam -silent -login ${steamUserInfo.username} $(cat ${steamUserInfo.passwordFile}) &) 25 | sleep 60 26 | fi 27 | 28 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 29 | cd $HOME/games/${game.name} 30 | exec ./portal2.sh -game portal2 -steam 31 | ''} 32 | '' 33 | -------------------------------------------------------------------------------- /games/linux/shenzhenIO/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, steamUserInfo, gameInfo, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "ShenzhenIO"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "504210"; 11 | }; 12 | 13 | gameFiles = [ 14 | (gameFileInfo { 15 | inherit mainGameName; 16 | name = "ShenzhenIO"; 17 | appId = "504210"; 18 | depotId = "504213"; 19 | manifestId = "8236289999055455317"; 20 | }) 21 | ]; 22 | 23 | drvPath = ./wrapper.nix; 24 | } 25 | -------------------------------------------------------------------------------- /games/linux/shenzhenIO/wrapper.nix: -------------------------------------------------------------------------------- 1 | { game, lib, steamcmd, steam-run, writeScript, writeScriptBin, gameFiles, steamUserInfo, symlinkJoin, lndir, linuxWrapperScript, realGameLocation, steamcmdLogin, ... }: 2 | 3 | writeScriptBin game.name '' 4 | ${ 5 | linuxWrapperScript { 6 | inherit game gameFiles lndir lib steamUserInfo steamcmd realGameLocation; 7 | } 8 | } 9 | 10 | unlink $HOME/games/${game.name}/Shenzhen 11 | cp -L ${realGameLocation}/Shenzhen $HOME/games/${game.name}/Shenzhen 12 | 13 | unlink $HOME/games/${game.name}/Content/textures/* 14 | cp -L -r ${realGameLocation}/Content/textures/* $HOME/games/${game.name}/Content/textures/ 15 | 16 | unlink $HOME/games/${game.name}/PackedContent/fonts/* 17 | cp -L -r ${realGameLocation}/PackedContent/fonts/* $HOME/games/${game.name}/PackedContent/fonts/ 18 | 19 | rm $HOME/games/${game.name}/Shenzhen.bin.x86_64 20 | cp -L ${realGameLocation}/Shenzhen.bin.x86_64 $HOME/games/${game.name}/Shenzhen.bin.x86_64 21 | 22 | 23 | chmod +rwx $HOME/games/${game.name}/Shenzhen 24 | chmod +rwx $HOME/games/${game.name}/Shenzhen.bin.x86_64 25 | 26 | ${steamcmdLogin { inherit steamUserInfo steamcmd; }} 27 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 28 | cd $HOME/games/${game.name} 29 | exec ./Shenzhen 30 | ''} 31 | '' 32 | -------------------------------------------------------------------------------- /games/linux/theStanleyParable/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, steamUserInfo, gameInfo, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "TheStanleyParable"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "221910"; 11 | }; 12 | 13 | gameFiles = [ 14 | (gameFileInfo { 15 | inherit mainGameName; 16 | name = "TheStanleyParable-Content"; 17 | appId = "221910"; 18 | depotId = "221911"; 19 | manifestId = "4574887516115604592"; 20 | }) 21 | 22 | (gameFileInfo { 23 | inherit mainGameName; 24 | name = "TheStanleyParable-Tea-Edition"; 25 | appId = "221910"; 26 | depotId = "221914"; 27 | manifestId = "4819957267483375851"; 28 | }) 29 | ]; 30 | 31 | drvPath = ./wrapper.nix; 32 | } 33 | -------------------------------------------------------------------------------- /games/linux/theStanleyParable/wrapper.nix: -------------------------------------------------------------------------------- 1 | { game, lib, steam, steamcmd, steam-run, writeScript, writeScriptBin, gameFiles, steamUserInfo, symlinkJoin, lndir, linuxWrapperScript, realGameLocation, steamcmdLogin, ... }: 2 | 3 | writeScriptBin game.name '' 4 | ${ 5 | linuxWrapperScript { 6 | inherit game gameFiles lndir lib steamUserInfo steamcmd realGameLocation; 7 | } 8 | } 9 | 10 | rm $HOME/games/${game.name}/stanley 11 | cp -L ${realGameLocation}/stanley $HOME/games/${game.name}/ 12 | 13 | rm $HOME/games/${game.name}/stanley_linux 14 | cp -L ${realGameLocation}/stanley_linux $HOME/games/${game.name}/ 15 | 16 | chmod +rwx $HOME/games/${game.name}/stanley 17 | chmod +rwx $HOME/games/${game.name}/stanley_linux 18 | 19 | STEAM_RUNNING="$(pgrep steam -c)" 20 | 21 | if [[ $STEAM_RUNNING == 0 ]]; then 22 | chmod -R +rw $HOME/.steam 23 | ${steamcmdLogin { inherit steamUserInfo steamcmd; }} 24 | (${steam}/bin/steam -silent -login ${steamUserInfo.username} $(cat ${steamUserInfo.passwordFile}) &) 25 | sleep 60 26 | fi 27 | 28 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 29 | cd $HOME/games/${game.name} 30 | exec ./stanley -game thestanleyparable 31 | ''} 32 | '' 33 | -------------------------------------------------------------------------------- /games/linux/top-level.nix: -------------------------------------------------------------------------------- 1 | { steamUserInfo, helperLib }: 2 | 3 | with helperLib; 4 | 5 | let 6 | normalList = { inherit steamUserInfo gameInfo gameFileInfo makeSteamGame; }; 7 | in { 8 | Antichamber = import ./antichamber normalList; 9 | Amorous = import ./amorous normalList; 10 | HigurashiCh6 = import ./higurashiCh6 normalList; 11 | Helltaker = import ./helltaker normalList; 12 | UminekoQuestion = import ./uminekoQuestion normalList; 13 | UminekoAnswer = import ./uminekoAnswer normalList; 14 | Portal2 = import ./portal2 normalList; 15 | Payday2 = import ./payday2 normalList; 16 | TheStanleyParable = import ./theStanleyParable normalList; 17 | Oxenfree = import ./oxenfree normalList; 18 | ShenzhenIO = import ./shenzhenIO normalList; 19 | } 20 | -------------------------------------------------------------------------------- /games/linux/uminekoAnswer/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, steamUserInfo, gameInfo, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "UminekoAnswer"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "639490"; 11 | }; 12 | 13 | gameFiles = [ 14 | (gameFileInfo { 15 | inherit mainGameName; 16 | name = "UminekoAnswer"; 17 | appId = "639490"; 18 | depotId = "639491"; 19 | manifestId = "876924491871297669"; 20 | }) 21 | 22 | (gameFileInfo { 23 | inherit mainGameName; 24 | name = "UminekoQuestion-Linux"; 25 | appId = "639490"; 26 | depotId = "639492"; 27 | manifestId = "857393923138543186"; 28 | }) 29 | ]; 30 | 31 | drvPath = ./wrapper.nix; 32 | } 33 | -------------------------------------------------------------------------------- /games/linux/uminekoAnswer/wrapper.nix: -------------------------------------------------------------------------------- 1 | { game, lib, steamcmd, steam-run, writeScript, writeScriptBin, gameFiles, steamUserInfo, symlinkJoin, lndir, linuxWrapperScript, realGameLocation, steamcmdLogin, ... }: 2 | 3 | writeScriptBin game.name '' 4 | ${ 5 | linuxWrapperScript { 6 | inherit game gameFiles lndir lib steamUserInfo steamcmd realGameLocation; 7 | } 8 | } 9 | 10 | rm $HOME/games/${game.name}/Umineko5to8 11 | cp -L ${realGameLocation}/Umineko5to8 $HOME/games/${game.name}/Umineko5to8 12 | 13 | chmod +rwx $HOME/games/${game.name}/Umineko5to8 14 | 15 | ${steamcmdLogin { inherit steamUserInfo steamcmd; }} 16 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 17 | cd $HOME/games/${game.name} 18 | exec ./Umineko5to8 19 | ''} 20 | '' 21 | -------------------------------------------------------------------------------- /games/linux/uminekoQuestion/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, steamUserInfo, gameInfo, gameFileInfo }: 2 | 3 | makeSteamGame { 4 | inherit steamUserInfo; 5 | 6 | game = gameInfo { 7 | name = "UminekoQuestion"; 8 | appId = "406550"; 9 | }; 10 | 11 | gameFiles = [ 12 | (gameFileInfo { 13 | name = "UminekoQuestion"; 14 | appId = "406550"; 15 | depotId = "406551"; 16 | manifestId = "8049229731852969071"; 17 | }) 18 | 19 | (gameFileInfo { 20 | name = "UminekoQuestion-Linux"; 21 | appId = "406550"; 22 | depotId = "406552"; 23 | manifestId = "1458265691352860752"; 24 | }) 25 | ]; 26 | 27 | drvPath = ./wrapper.nix; 28 | } 29 | -------------------------------------------------------------------------------- /games/linux/uminekoQuestion/wrapper.nix: -------------------------------------------------------------------------------- 1 | { game, lib, steamcmd, steam-run, writeScript, writeScriptBin, gameFiles, steamUserInfo, symlinkJoin, lndir, linuxWrapperScript, realGameLocation, steamcmdLogin, ... }: 2 | 3 | writeScriptBin game.name '' 4 | ${ 5 | linuxWrapperScript { 6 | inherit game gameFiles lndir lib steamUserInfo steamcmd realGameLocation; 7 | } 8 | } 9 | 10 | rm $HOME/games/${game.name}/Umineko1to4 11 | cp -L ${realGameLocation}/Umineko1to4 $HOME/games/${game.name}/Umineko1to4 12 | 13 | chmod +rwx $HOME/games/${game.name}/Umineko1to4 14 | 15 | ${steamcmdLogin { inherit steamUserInfo steamcmd; }} 16 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 17 | cd $HOME/games/${game.name} 18 | exec ./Umineko1to4 19 | ''} 20 | '' 21 | -------------------------------------------------------------------------------- /games/proton/6.10-GE/default.nix: -------------------------------------------------------------------------------- 1 | { stdenv }: 2 | 3 | stdenv.mkDerivation { 4 | name = "Proton-6.10-GE"; 5 | 6 | src = fetchTarball { 7 | url = "https://github.com/GloriousEggroll/proton-ge-custom/releases/download/6.10-GE-1/Proton-6.10-GE-1.tar.gz"; 8 | sha256 = "0yibri0x6a4xxd8djavlsfap00gnf506r25cxpv50yglvi1a3rr1"; 9 | }; 10 | 11 | installPhase = '' 12 | mkdir -p $out 13 | cp -a * $out/ 14 | ''; 15 | } 16 | -------------------------------------------------------------------------------- /games/proton/6.10-GE/wrapper.nix: -------------------------------------------------------------------------------- 1 | { gameFiles, ... }: 2 | 3 | gameFiles 4 | -------------------------------------------------------------------------------- /games/proton/6.3/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, steamUserInfo, gameInfo, gameFileInfo }: 2 | 3 | makeSteamGame { 4 | inherit steamUserInfo; 5 | 6 | game = gameInfo { 7 | name = "Proton6_3"; 8 | appId = "1580130"; 9 | }; 10 | 11 | gameFiles = gameFileInfo { 12 | mainGameName = "Proton6_3"; 13 | name = "Proton6_3"; 14 | appId = "1580130"; 15 | depotId = "1580131"; 16 | manifestId = "7336486418625335787"; 17 | }; 18 | 19 | drvPath = ./wrapper.nix; 20 | } 21 | -------------------------------------------------------------------------------- /games/proton/6.3/wrapper.nix: -------------------------------------------------------------------------------- 1 | { gameFiles, game, ... }: 2 | 3 | gameFiles.overrideAttrs (_:{ 4 | name = game.name; 5 | }) 6 | -------------------------------------------------------------------------------- /games/proton/top-level.nix: -------------------------------------------------------------------------------- 1 | { callPackage, steamUserInfo, helperLib }: 2 | 3 | with helperLib; 4 | 5 | { 6 | proton_6_3 = import ./6.3 { inherit steamUserInfo gameInfo gameFileInfo makeSteamGame; }; 7 | proton_6_10_ge = callPackage ./6.10-GE {}; 8 | } 9 | -------------------------------------------------------------------------------- /games/top-level.nix: -------------------------------------------------------------------------------- 1 | { callPackage, steamUserInfo, helperLib }: 2 | 3 | rec { 4 | linux = callPackage ./linux/top-level.nix { 5 | inherit steamUserInfo helperLib; 6 | }; 7 | 8 | proton = callPackage ./proton/top-level.nix { 9 | inherit steamUserInfo helperLib; 10 | }; 11 | 12 | windows = callPackage ./windows/top-level.nix { 13 | inherit steamUserInfo helperLib proton; 14 | }; 15 | } 16 | -------------------------------------------------------------------------------- /games/windows/alanWake/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, steamUserInfo, gameInfo, proton, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "AlanWake"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "108710"; 11 | platform = "windows"; 12 | }; 13 | 14 | gameFiles = [ 15 | (gameFileInfo { 16 | inherit mainGameName; 17 | name = "AlanWake-2020-Fix"; 18 | platform = "windows"; 19 | appId = "108710"; 20 | depotId = "108711"; 21 | manifestId = "6213019430359665046"; 22 | }) 23 | 24 | (gameFileInfo { 25 | inherit mainGameName; 26 | name = "AlanWake-ThirdParty"; 27 | platform = "windows"; 28 | appId = "108710"; 29 | depotId = "108712"; 30 | manifestId = "901025420359456534"; 31 | }) 32 | 33 | (gameFileInfo { 34 | inherit mainGameName; 35 | name = "AlanWake-Datas"; 36 | platform = "windows"; 37 | appId = "108710"; 38 | depotId = "108725"; 39 | manifestId = "1993621679641115397"; 40 | }) 41 | 42 | (gameFileInfo { 43 | inherit mainGameName; 44 | name = "AlanWake-Videos"; 45 | platform = "windows"; 46 | appId = "108710"; 47 | depotId = "108724"; 48 | manifestId = "8702697917673304354"; 49 | }) 50 | 51 | (gameFileInfo { 52 | inherit mainGameName; 53 | name = "AlanWake-ExesAndShaders"; 54 | platform = "windows"; 55 | appId = "108710"; 56 | depotId = "108723"; 57 | manifestId = "5060317705156608793"; 58 | }) 59 | ]; 60 | 61 | proton = proton.proton_6_3; 62 | 63 | drvPath = ./wrapper.nix; 64 | } 65 | -------------------------------------------------------------------------------- /games/windows/alanWake/optional.nix: -------------------------------------------------------------------------------- 1 | { steamGameFetcher, steamUserInfo, gameFileInfo }: 2 | 3 | steamGameFetcher { 4 | inherit steamUserInfo; 5 | game = gameFileInfo { 6 | mainGameName = "AlanWake"; 7 | name = "AlanWake-Developer-Commentary"; 8 | platform = "windows"; 9 | appId = "108710"; 10 | depotId = "108726"; 11 | manifestId = "1713738522381113009"; 12 | }; 13 | } 14 | -------------------------------------------------------------------------------- /games/windows/alanWake/wrapper.nix: -------------------------------------------------------------------------------- 1 | { game, proton, lib, steamcmd, steam, writeText, steam-run, writeScript, writeScriptBin, gameFiles, lndir, steamUserInfo, protonWrapperScript, realGameLocation, enableDeveloperCommentary ? false, steamGameFetcher, gameFileInfo, ... }: 2 | 3 | let 4 | # Developer Commentary not working right now, need to find out how to enable it 5 | gameFilesMod = gameFiles.overrideAttrs (old: { 6 | paths = old.paths ++ lib.optionals enableDeveloperCommentary [ 7 | (import ./optional.nix { 8 | inherit steamGameFetcher steamUserInfo gameFileInfo; 9 | }) 10 | ]; 11 | }); 12 | in writeScriptBin game.name '' 13 | ${ 14 | protonWrapperScript { 15 | inherit game proton lndir lib steamUserInfo steamcmd steam realGameLocation; 16 | gameFiles = gameFilesMod; 17 | } 18 | } 19 | 20 | rm $HOME/games/${game.name}/AlanWake.exe 21 | cp -L ${realGameLocation}/AlanWake.exe $HOME/games/${game.name}/ 22 | 23 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 24 | cd $HOME/games/${game.name} 25 | export WINEDLLOVERRIDES="xaudio2_7=b,n" 26 | export DXVK_HUD=1 27 | export PROTON_NO_D3D11 28 | export PROTON_NO_D3D10 29 | export WINEPREFIX=$PROTON_PREFIX_HOME/pfx 30 | export STEAM_COMPAT_DATA_PATH=$PROTON_PREFIX_HOME 31 | export STEAM_COMPAT_CLIENT_INSTALL_PATH=$HOME/.steam/steam 32 | export PROTON_FORCE_LARGE_ADDRESS_AWARE=1 33 | 34 | $PROTON_HOME/proton waitforexitandrun ./thirdparty/DirectX/DXSETUP.exe /silent 35 | $PROTON_HOME/proton waitforexitandrun ./thirdparty/Studio_Redistributable/vcredist_x86.exe /q 36 | $PROTON_HOME/proton waitforexitandrun ./AlanWake.exe 37 | ''} 38 | '' 39 | -------------------------------------------------------------------------------- /games/windows/bleachBraveSouls/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, proton, steamUserInfo, gameInfo, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "BleachBraveSouls"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "1201240"; 11 | platform = "windows"; 12 | }; 13 | 14 | gameFiles = [ 15 | (gameFileInfo { 16 | inherit mainGameName; 17 | name = "BleachBraveSouls-Content"; 18 | appId = "1201240"; 19 | platform = "windows"; 20 | depotId = "1201241"; 21 | manifestId = "2130923254481654352"; 22 | }) 23 | ]; 24 | 25 | proton = proton.proton_6_3; 26 | 27 | drvPath = ./wrapper.nix; 28 | } 29 | -------------------------------------------------------------------------------- /games/windows/bleachBraveSouls/wrapper.nix: -------------------------------------------------------------------------------- 1 | { protonWrapperScript, game, proton, lib, steamcmd, steam, writeText, steam-run, writeScript, writeScriptBin, gameFiles, lndir, realGameLocation, steamUserInfo, ... }: 2 | 3 | writeScriptBin game.name '' 4 | ${ 5 | protonWrapperScript { 6 | inherit game gameFiles proton lndir lib steamUserInfo steamcmd steam realGameLocation; 7 | } 8 | } 9 | 10 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 11 | cd $HOME/games/${game.name}/ 12 | export WINEDLLOVERRIDES="dxgi=n" 13 | export DXVK_HUD=1 14 | export WINEPREFIX=$PROTON_PREFIX_HOME/pfx 15 | export STEAM_COMPAT_DATA_PATH=$PROTON_PREFIX_HOME 16 | export STEAM_COMPAT_CLIENT_INSTALL_PATH=$HOME/.steam/steam 17 | 18 | $PROTON_HOME/proton waitforexitandrun ./BleachBraveSouls.exe 19 | ''} 20 | '' 21 | -------------------------------------------------------------------------------- /games/windows/brawlhalla/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, proton, steamUserInfo, gameInfo, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "Brawlhalla"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "291550"; 11 | platform = "windows"; 12 | }; 13 | 14 | gameFiles = [ 15 | (gameFileInfo { 16 | inherit mainGameName; 17 | name = "Brawlhalla-Content"; 18 | appId = "291550"; 19 | platform = "windows"; 20 | depotId = "291551"; 21 | manifestId = "1720424793603833496"; 22 | }) 23 | ]; 24 | 25 | proton = proton.proton_6_3; 26 | 27 | drvPath = ./wrapper.nix; 28 | } 29 | -------------------------------------------------------------------------------- /games/windows/brawlhalla/wrapper.nix: -------------------------------------------------------------------------------- 1 | { protonWrapperScript, game, proton, lib, steamcmd, steam, writeText, steam-run, writeScript, writeScriptBin, gameFiles, lndir, realGameLocation, steamUserInfo, ... }: 2 | 3 | writeScriptBin game.name '' 4 | ${ 5 | protonWrapperScript { 6 | inherit game gameFiles proton lndir lib steamUserInfo steamcmd steam realGameLocation; 7 | } 8 | } 9 | 10 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 11 | cd $HOME/games/${game.name}/ 12 | export WINEDLLOVERRIDES="dxgi=n" 13 | export DXVK_HUD=1 14 | export WINEPREFIX=$PROTON_PREFIX_HOME/pfx 15 | export STEAM_COMPAT_DATA_PATH=$PROTON_PREFIX_HOME 16 | export STEAM_COMPAT_CLIENT_INSTALL_PATH=$HOME/.steam/steam 17 | 18 | $PROTON_HOME/proton waitforexitandrun ./Brawlhalla.exe 19 | ''} 20 | '' 21 | -------------------------------------------------------------------------------- /games/windows/conanExiles/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, proton, steamUserInfo, gameInfo, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "ConanExiles"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "440900"; 11 | platform = "windows"; 12 | }; 13 | 14 | gameFiles = [ 15 | (gameFileInfo { 16 | inherit mainGameName; 17 | name = "ConanExiles-Content"; 18 | appId = "440900"; 19 | platform = "windows"; 20 | depotId = "440901"; 21 | manifestId = "5982054116698208447"; 22 | }) 23 | 24 | (gameFileInfo { 25 | inherit mainGameName; 26 | name = "ConanExiles-Binaries"; 27 | appId = "440900"; 28 | platform = "windows"; 29 | depotId = "440902"; 30 | manifestId = "6773317510006853756"; 31 | }) 32 | 33 | (gameFileInfo { 34 | inherit mainGameName; 35 | name = "ConanExiles-Client-Launcher"; 36 | appId = "440900"; 37 | platform = "windows"; 38 | depotId = "440903"; 39 | manifestId = "6051424170071502041"; 40 | }) 41 | 42 | (gameFileInfo { 43 | inherit mainGameName; 44 | name = "VC-2015-Redist"; 45 | appId = "228980"; 46 | platform = "windows"; 47 | depotId = "228986"; 48 | manifestId = "8782296191957114623"; 49 | }) 50 | 51 | (gameFileInfo { 52 | inherit mainGameName; 53 | name = "DirextX-Redist"; 54 | appId = "228980"; 55 | platform = "windows"; 56 | depotId = "228990"; 57 | manifestId = "1829726630299308803"; 58 | }) 59 | ]; 60 | 61 | proton = proton.proton_6_10_ge; 62 | 63 | drvPath = ./wrapper.nix; 64 | } 65 | -------------------------------------------------------------------------------- /games/windows/conanExiles/wrapper.nix: -------------------------------------------------------------------------------- 1 | { protonWrapperScript, game, proton, lib, steamcmd, steam, writeText, steam-run, writeScript, writeScriptBin, gameFiles, lndir, realGameLocation, steamUserInfo, ... }: 2 | 3 | # 1. Need to add option to override Windows.Engine:OnlineSubsystemSteam:ListenServerQueryPort:0=27215 to another port to avoid the failed login issue 4 | # 2. Might need to chmod the targetStore ConanExiles to allow player to play 5 | # 3. Need to add option to change screen mode to avoid fullscreen crash 6 | writeScriptBin game.name '' 7 | ${ 8 | protonWrapperScript { 9 | inherit game gameFiles proton lndir lib steamUserInfo steamcmd steam realGameLocation; 10 | } 11 | } 12 | 13 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 14 | cd ${steamUserInfo.targetStore}/windows/ConanExiles/ 15 | export WINEDLLOVERRIDES="dxgi=n" 16 | export DXVK_HUD=1 17 | export WINEPREFIX=$PROTON_PREFIX_HOME/pfx 18 | export STEAM_COMPAT_DATA_PATH=$PROTON_PREFIX_HOME 19 | export STEAM_COMPAT_CLIENT_INSTALL_PATH=$HOME/.steam/steam 20 | export WINEESYNC=1 21 | export WINEFSYNC=1 22 | export PROTON_LOG=1 23 | 24 | $PROTON_HOME/proton waitforexitandrun $HOME/games/${game.name}/_CommonRedist/DirectX/Jun2010/DXSETUP.exe /silent 25 | $PROTON_HOME/proton waitforexitandrun $HOME/games/${game.name}/_CommonRedist/vcredist/2015/vc_redist.x64.exe /q 26 | $PROTON_HOME/proton waitforexitandrun ./ConanSandbox/Binaries/Win64/ConanSandbox.exe 27 | ''} 28 | '' 29 | -------------------------------------------------------------------------------- /games/windows/eiyuSenkiGold/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, proton, steamUserInfo, gameInfo, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "EiyuSenkiGold"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "1518430"; 11 | platform = "windows"; 12 | }; 13 | 14 | gameFiles = gameFileInfo { 15 | inherit mainGameName; 16 | name = "EiyuSenkiGold-Content"; 17 | appId = "1518430"; 18 | platform = "windows"; 19 | depotId = "1518431"; 20 | manifestId = "6978971977531136720"; 21 | }; 22 | 23 | proton = proton.proton_6_3; 24 | 25 | drvPath = ./wrapper.nix; 26 | } 27 | -------------------------------------------------------------------------------- /games/windows/eiyuSenkiGold/wrapper.nix: -------------------------------------------------------------------------------- 1 | { protonWrapperScript, game, proton, lib, steamcmd, steam, writeText, steam-run, writeScript, writeScriptBin, gameFiles, lndir, realGameLocation, enableAdult ? false, adultPatch ? "", steamUserInfo, ... }: 2 | 3 | writeScriptBin game.name '' 4 | ${ 5 | protonWrapperScript { 6 | inherit game gameFiles proton lndir lib steamUserInfo steamcmd steam realGameLocation; 7 | } 8 | } 9 | 10 | ${lib.optionalString enableAdult '' 11 | sudo chmod -R a+rw ${steamUserInfo.targetStore}/${game.platform}/${game.name} 12 | ''} 13 | 14 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 15 | cd $HOME/games/${game.name}/ 16 | export WINEDLLOVERRIDES="dxgi=n" 17 | export DXVK_HUD=1 18 | export WINEPREFIX=$PROTON_PREFIX_HOME/pfx 19 | export STEAM_COMPAT_DATA_PATH=$PROTON_PREFIX_HOME 20 | export STEAM_COMPAT_CLIENT_INSTALL_PATH=$HOME/.steam/steam 21 | 22 | ${lib.optionalString enableAdult '' 23 | $PROTON_HOME/proton waitforexitandrun ${adultPatch} 24 | ''} 25 | $PROTON_HOME/proton waitforexitandrun ./EiyuSenkiGOLD.exe 26 | ''} 27 | '' 28 | -------------------------------------------------------------------------------- /games/windows/houseParty/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, proton, steamUserInfo, gameInfo, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "HouseParty"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "611790"; 11 | platform = "windows"; 12 | }; 13 | 14 | gameFiles = gameFileInfo { 15 | inherit mainGameName; 16 | name = "HouseParty-Content"; 17 | appId = "611790"; 18 | platform = "windows"; 19 | depotId = "611791"; 20 | manifestId = "7975763465394150722"; 21 | }; 22 | 23 | proton = proton.proton_6_3; 24 | 25 | drvPath = ./wrapper.nix; 26 | } 27 | -------------------------------------------------------------------------------- /games/windows/houseParty/optional.nix: -------------------------------------------------------------------------------- 1 | { steamUserInfo, gameFileInfo, steamGameFetcher }: 2 | 3 | steamGameFetcher { 4 | inherit steamUserInfo; 5 | game = gameFileInfo { 6 | mainGameName = "HouseParty"; 7 | name = "HouseParty-ExplicitContent"; 8 | appId = "611790"; 9 | platform = "windows"; 10 | depotId = "944540"; 11 | manifestId = "1811577398040335252"; 12 | }; 13 | } 14 | -------------------------------------------------------------------------------- /games/windows/houseParty/wrapper.nix: -------------------------------------------------------------------------------- 1 | { protonWrapperScript, wineWowPackages, winetricks, curl, krb5, keyutils, game, proton, lib, steamcmd, steam, writeText, steam-run, writeScript, writeScriptBin, gameFiles, lndir, realGameLocation, gameFileInfo, steamGameFetcher, steamUserInfo, enableAdult ? false, ... }: 2 | 3 | let 4 | gameFilesMod = gameFiles.overrideAttrs (old: { 5 | paths = old.paths ++ lib.optionals enableAdult [ 6 | (import ./optional.nix { 7 | inherit steamUserInfo gameFileInfo steamGameFetcher; 8 | }) 9 | ]; 10 | }); 11 | in writeScriptBin game.name '' 12 | ${ 13 | protonWrapperScript { 14 | inherit game proton lndir lib steamUserInfo steamcmd steam realGameLocation; 15 | gameFiles = gameFilesMod; 16 | } 17 | } 18 | 19 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 20 | cd $HOME/games/${game.name}/ 21 | export WINEDLLOVERRIDES="dxgi=n" 22 | export DXVK_HUD=1 23 | export WINEPREFIX=$PROTON_PREFIX_HOME/pfx 24 | export STEAM_COMPAT_DATA_PATH=$PROTON_PREFIX_HOME 25 | export STEAM_COMPAT_CLIENT_INSTALL_PATH=$HOME/.steam/steam 26 | 27 | $PROTON_HOME/proton waitforexitandrun ./HouseParty.exe 28 | ''} 29 | '' 30 | -------------------------------------------------------------------------------- /games/windows/justCause/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, steamUserInfo, gameInfo, proton, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "JustCause"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "6880"; 11 | platform = "windows"; 12 | }; 13 | 14 | gameFiles = [ 15 | (gameFileInfo { 16 | inherit mainGameName; 17 | name = "JustCause-Binaries"; 18 | platform = "windows"; 19 | appId = "6880"; 20 | depotId = "6881"; 21 | manifestId = "6527771220312814148"; 22 | }) 23 | 24 | (gameFileInfo { 25 | inherit mainGameName; 26 | name = "JustCause-FMV1"; 27 | platform = "windows"; 28 | appId = "6880"; 29 | depotId = "6882"; 30 | manifestId = "4589612640979803544"; 31 | }) 32 | 33 | (gameFileInfo { 34 | inherit mainGameName; 35 | name = "JustCause-FMV2"; 36 | platform = "windows"; 37 | appId = "6880"; 38 | depotId = "6883"; 39 | manifestId = "4806707053551780261"; 40 | }) 41 | 42 | (gameFileInfo { 43 | inherit mainGameName; 44 | name = "JustCause-PC01"; 45 | platform = "windows"; 46 | appId = "6880"; 47 | depotId = "6888"; 48 | manifestId = "70519445597708639"; 49 | }) 50 | 51 | (gameFileInfo { 52 | inherit mainGameName; 53 | name = "JustCause-PC02"; 54 | platform = "windows"; 55 | appId = "6880"; 56 | depotId = "6889"; 57 | manifestId = "6899635947800562820"; 58 | }) 59 | 60 | (gameFileInfo { 61 | inherit mainGameName; 62 | name = "JustCause-PC03"; 63 | platform = "windows"; 64 | appId = "6880"; 65 | depotId = "6890"; 66 | manifestId = "332007685201679804"; 67 | }) 68 | 69 | (gameFileInfo { 70 | inherit mainGameName; 71 | name = "JustCause-PC04"; 72 | platform = "windows"; 73 | appId = "6880"; 74 | depotId = "6891"; 75 | manifestId = "4619176749946730386"; 76 | }) 77 | ]; 78 | 79 | proton = proton.proton_6_3; 80 | 81 | drvPath = ./wrapper.nix; 82 | } 83 | -------------------------------------------------------------------------------- /games/windows/justCause/wrapper.nix: -------------------------------------------------------------------------------- 1 | { game, proton, lib, steamcmd, steam, steam-run, writeScript, writeScriptBin, gameFiles, lndir, steamUserInfo, protonWrapperScript, realGameLocation, ... }: 2 | 3 | writeScriptBin game.name '' 4 | ${ 5 | protonWrapperScript { 6 | inherit game gameFiles proton lndir lib steamUserInfo steamcmd steam realGameLocation; 7 | } 8 | } 9 | 10 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 11 | cd $HOME/games/${game.name} 12 | export WINEDLLOVERRIDES="dxgi=n" 13 | export DXVK_HUD=1 14 | export WINEPREFIX=$PROTON_PREFIX_HOME/pfx 15 | export STEAM_COMPAT_DATA_PATH=$PROTON_PREFIX_HOME 16 | export STEAM_COMPAT_CLIENT_INSTALL_PATH=$HOME/.steam/steam 17 | 18 | $HOME/protons/${proton.name}/proton waitforexitandrun ./JustCause.exe 19 | ''} 20 | '' 21 | -------------------------------------------------------------------------------- /games/windows/katana-zero/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, proton, steamUserInfo, gameInfo, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "Katana-Zero"; 5 | appId = "460950"; 6 | in makeSteamGame { 7 | inherit steamUserInfo; 8 | 9 | game = gameInfo { 10 | inherit appId; 11 | name = mainGameName; 12 | platform = "windows"; 13 | }; 14 | 15 | gameFiles = [ 16 | (gameFileInfo { 17 | inherit mainGameName appId; 18 | name = "Katana-ZERO-Content"; 19 | platform = "windows"; 20 | depotId = "460951"; 21 | manifestId = "7302141199497370222"; 22 | }) 23 | ]; 24 | 25 | proton = proton.proton_6_10_ge; 26 | 27 | drvPath = ./wrapper.nix; 28 | } 29 | -------------------------------------------------------------------------------- /games/windows/katana-zero/wrapper.nix: -------------------------------------------------------------------------------- 1 | { protonWrapperScript, game, proton, lib, steamcmd, steam, writeText, steam-run, writeScript, writeScriptBin, gameFiles, lndir, realGameLocation, steamUserInfo, ... }: 2 | 3 | writeScriptBin game.name '' 4 | ${ 5 | protonWrapperScript { 6 | inherit game gameFiles proton lndir lib steamUserInfo steamcmd steam realGameLocation; 7 | } 8 | } 9 | 10 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 11 | cd $HOME/games/${game.name}/ 12 | export WINEDLLOVERRIDES="dxgi=n" 13 | export DXVK_HUD=1 14 | export WINEPREFIX=$PROTON_PREFIX_HOME/pfx 15 | export STEAM_COMPAT_DATA_PATH=$PROTON_PREFIX_HOME 16 | export STEAM_COMPAT_CLIENT_INSTALL_PATH=$HOME/.steam/steam 17 | 18 | $PROTON_HOME/proton waitforexitandrun "./Katana ZERO.exe" 19 | ''} 20 | '' 21 | -------------------------------------------------------------------------------- /games/windows/offworld/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, steamUserInfo, gameInfo, proton, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "offworld-trading-company"; 5 | appId = "271240"; 6 | gameFiles = (id: mid: 7 | gameFileInfo { 8 | inherit mainGameName appId; 9 | name = mainGameName; 10 | platform = "windows"; 11 | depotId = id; 12 | manifestId = mid; 13 | }); 14 | in makeSteamGame { 15 | inherit steamUserInfo; 16 | 17 | game = gameInfo { 18 | inherit appId; 19 | name = mainGameName; 20 | platform = "windows"; 21 | }; 22 | 23 | gameFiles = [ 24 | (gameFiles "271241" "4830695401179479638") 25 | (gameFiles "271243" "6513839327882495543") 26 | ]; 27 | 28 | proton = proton.proton_6_3; 29 | 30 | drvPath = ./wrapper.nix; 31 | } 32 | -------------------------------------------------------------------------------- /games/windows/offworld/wrapper.nix: -------------------------------------------------------------------------------- 1 | { game, proton, lib, steamcmd, steam, writeText, steam-run, writeScript, writeScriptBin, gameFiles, lndir, steamUserInfo, protonWrapperScript, realGameLocation, ... }: 2 | 3 | writeScriptBin game.name '' 4 | ${ 5 | protonWrapperScript { 6 | inherit game gameFiles proton lndir lib steamUserInfo steamcmd steam realGameLocation; 7 | } 8 | } 9 | 10 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 11 | cd $HOME/games/${game.name} 12 | export WINEDLLOVERRIDES="dxgi=n" 13 | export DXVK_HUD=1 14 | export WINEPREFIX=$PROTON_PREFIX_HOME/pfx 15 | export STEAM_COMPAT_DATA_PATH=$PROTON_PREFIX_HOME 16 | export STEAM_COMPAT_CLIENT_INSTALL_PATH=$HOME/.steam/steam 17 | 18 | $PROTON_HOME/proton waitforexitandrun ./Offworld.exe 19 | ''} 20 | '' 21 | -------------------------------------------------------------------------------- /games/windows/payday/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, proton, steamUserInfo, gameInfo, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "Payday"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "24240"; 11 | platform = "windows"; 12 | }; 13 | 14 | gameFiles = [ 15 | (gameFileInfo { 16 | inherit mainGameName; 17 | name = "Payday-Content"; 18 | appId = "24240"; 19 | platform = "windows"; 20 | depotId = "24241"; 21 | manifestId = "2887059265933254853"; 22 | }) 23 | 24 | (gameFileInfo { 25 | inherit mainGameName; 26 | name = "Payday-English"; 27 | appId = "24240"; 28 | platform = "windows"; 29 | depotId = "24242"; 30 | manifestId = "6469208572524230226"; 31 | }) 32 | ]; 33 | 34 | proton = proton.proton_6_3; 35 | 36 | drvPath = ./wrapper.nix; 37 | } 38 | -------------------------------------------------------------------------------- /games/windows/payday/wrapper.nix: -------------------------------------------------------------------------------- 1 | { protonWrapperScript, game, proton, lib, steamcmd, steam, writeText, steam-run, writeScript, writeScriptBin, gameFiles, lndir, realGameLocation, steamUserInfo, ... }: 2 | 3 | writeScriptBin game.name '' 4 | ${ 5 | protonWrapperScript { 6 | inherit game gameFiles proton lndir lib steamUserInfo steamcmd steam realGameLocation; 7 | } 8 | } 9 | 10 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 11 | cd $HOME/games/${game.name}/ 12 | export WINEDLLOVERRIDES="dxgi=n" 13 | export DXVK_HUD=1 14 | export WINEPREFIX=$PROTON_PREFIX_HOME/pfx 15 | export STEAM_COMPAT_DATA_PATH=$PROTON_PREFIX_HOME 16 | export STEAM_COMPAT_CLIENT_INSTALL_PATH=$HOME/.steam/steam 17 | 18 | $HOME/protons/${proton.name}/proton waitforexitandrun ./payday_win32_release.exe 19 | ''} 20 | '' 21 | -------------------------------------------------------------------------------- /games/windows/projectWingman/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, proton, steamUserInfo, gameInfo, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "ProjectWingman"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "895870"; 11 | platform = "windows"; 12 | }; 13 | 14 | gameFiles = gameFileInfo { 15 | inherit mainGameName; 16 | name = "ProjectWingman-Content"; 17 | appId = "895870"; 18 | platform = "windows"; 19 | depotId = "895871"; 20 | manifestId = "1672280992675864586"; 21 | }; 22 | 23 | proton = proton.proton_6_10_ge; 24 | 25 | drvPath = ./wrapper.nix; 26 | } 27 | -------------------------------------------------------------------------------- /games/windows/projectWingman/wrapper.nix: -------------------------------------------------------------------------------- 1 | { protonWrapperScript, curl, krb5, keyutils, game, proton, lib, steamcmd, steam, writeText, steam-run, writeScript, writeScriptBin, gameFiles, lndir, steamUserInfo, realGameLocation, ... }: 2 | 3 | writeScriptBin game.name '' 4 | ${ 5 | protonWrapperScript { 6 | inherit game gameFiles proton lndir lib steamUserInfo steamcmd steam realGameLocation; 7 | } 8 | } 9 | 10 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 11 | cd $HOME/games/${game.name}/ 12 | export LD_LIBRARY_PATH=${lib.makeLibraryPath [ curl krb5 keyutils ]}:$LD_LIBRARY_PATH 13 | export WINEDLLOVERRIDES="dxgi=n" 14 | export DXVK_HUD=1 15 | export WINEPREFIX=$PROTON_PREFIX_HOME/pfx 16 | export STEAM_COMPAT_DATA_PATH=$PROTON_PREFIX_HOME 17 | export STEAM_COMPAT_CLIENT_INSTALL_PATH=$HOME/.steam/steam 18 | 19 | $PROTON_HOME/proton waitforexitandrun ./ProjectWingman.exe -nohmd 20 | ''} 21 | '' 22 | -------------------------------------------------------------------------------- /games/windows/rocketLeague/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, proton, steamUserInfo, gameInfo, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "RocketLeague"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "252950"; 11 | platform = "windows"; 12 | }; 13 | 14 | gameFiles = gameFileInfo { 15 | inherit mainGameName; 16 | name = "RocketLeague"; 17 | appId = "252950"; 18 | platform = "windows"; 19 | depotId = "252951"; 20 | manifestId = "2273576982621900744"; 21 | }; 22 | 23 | proton = proton.proton_6_3; 24 | 25 | drvPath = ./wrapper.nix; 26 | } 27 | -------------------------------------------------------------------------------- /games/windows/rocketLeague/wrapper.nix: -------------------------------------------------------------------------------- 1 | { realGameLocation, protonWrapperScript, game, proton, lib, steamcmd, steam, writeText, steam-run, writeScript, writeScriptBin, gameFiles, lndir, steamUserInfo, ... }: 2 | 3 | writeScriptBin game.name '' 4 | ${ 5 | protonWrapperScript { 6 | inherit game gameFiles proton lndir lib steamUserInfo steamcmd steam realGameLocation; 7 | } 8 | } 9 | 10 | rm -r $HOME/games/${game.name}/Engine/* 11 | cp -L -r ${gameFiles}/Engine/* $HOME/games/${game.name}/Engine/ 12 | 13 | rm -r $HOME/games/${game.name}/TAGame/Config/* 14 | cp -L -r ${gameFiles}/TAGame/Config/* $HOME/games/${game.name}/TAGame/Config/ 15 | 16 | chmod -R +rw $HOME/games/${game.name} 17 | 18 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 19 | cd $HOME/games/${game.name}/Binaries/Win64 20 | export WINEDLLOVERRIDES="dxgi=n" 21 | export DXVK_HUD=1 22 | export WINEPREFIX=$PROTON_PREFIX_HOME/pfx 23 | export STEAM_COMPAT_DATA_PATH=$PROTON_PREFIX_HOME 24 | export STEAM_COMPAT_CLIENT_INSTALL_PATH=$HOME/.steam/steam 25 | 26 | $HOME/protons/${proton.name}/proton waitforexitandrun ./RocketLeague.exe 27 | ''} 28 | '' 29 | -------------------------------------------------------------------------------- /games/windows/sleepingDogs/DisplaySettings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1 5 | 1920 6 | 1080 7 | 60000 8 | 1000 9 | default 10 | progressive 11 | 0 12 | 0 13 | 0.0300000#3CF5C28F 14 | 1 15 | 0 16 | 1 17 | 1 18 | 1 19 | 1 20 | 0 21 | 0 22 | 1 23 | 10 24 | 2 25 | 2 26 | 0 27 | 28 | -------------------------------------------------------------------------------- /games/windows/sleepingDogs/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, steamUserInfo, gameInfo, proton, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "SleepingDogs"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "307690"; 11 | platform = "windows"; 12 | }; 13 | 14 | gameFiles = [ 15 | (gameFileInfo { 16 | inherit mainGameName; 17 | name = "SleepingDogs-Exec"; 18 | platform = "windows"; 19 | appId = "307690"; 20 | depotId = "307693 "; 21 | manifestId = "521771309705279162"; 22 | }) 23 | 24 | (gameFileInfo { 25 | inherit mainGameName; 26 | name = "SleepingDogs-UI"; 27 | platform = "windows"; 28 | appId = "307690"; 29 | depotId = "307692"; 30 | manifestId = "8969342104525223947"; 31 | }) 32 | 33 | (gameFileInfo { 34 | inherit mainGameName; 35 | name = "SleepingDogs-Content"; 36 | platform = "windows"; 37 | appId = "307690"; 38 | depotId = "307691"; 39 | manifestId = "1259773366995347002"; 40 | }) 41 | ]; 42 | 43 | proton = proton.proton_6_3; 44 | 45 | drvPath = ./wrapper.nix; 46 | } 47 | -------------------------------------------------------------------------------- /games/windows/sleepingDogs/wrapper.nix: -------------------------------------------------------------------------------- 1 | { game, proton, curl, lib, steamcmd, steam, steam-run, winetricks, wineWowPackages, writeScript, writeScriptBin, gameFiles, lndir, steamUserInfo, protonWrapperScript, realGameLocation, ... }: 2 | 3 | writeScriptBin game.name '' 4 | ${ 5 | protonWrapperScript { 6 | inherit game gameFiles proton lndir lib steamUserInfo steamcmd steam realGameLocation; 7 | } 8 | } 9 | 10 | if [[ ! -f $HOME/games/${game.name}/data/DisplaySettings.xml ]]; then 11 | rm -r $HOME/games/${game.name}/data 12 | cp -L -r ${gameFiles}/data $HOME/games/${game.name}/ 13 | fi 14 | 15 | unlink $HOME/games/${game.name}/sdhdship.exe 16 | cp -L ${gameFiles}/sdhdship.exe $HOME/games/${game.name}/ 17 | 18 | unlink $HOME/games/${game.name}/buildlab.defaults.dat 19 | cp -L ${gameFiles}/buildlab.defaults.dat $HOME/games/${game.name}/ 20 | 21 | rm -r $HOME/games/${game.name}/buildlab.project.dat 22 | cp -L ${gameFiles}/buildlab.project.dat $HOME/games/${game.name}/ 23 | 24 | rm -r $HOME/games/${game.name}/UserOptions.dat 25 | cp -L ${gameFiles}/UserOptions.dat $HOME/games/${game.name}/ 26 | 27 | rm -r $HOME/games/${game.name}/*.txt 28 | cp -L ${gameFiles}/*.txt $HOME/games/${game.name}/ 29 | 30 | rm -r $HOME/games/${game.name}/reflection.rdb 31 | cp -L ${gameFiles}/reflection.rdb $HOME/games/${game.name}/ 32 | 33 | rm -r $HOME/games/${game.name}/*.vdf 34 | cp -L ${gameFiles}/*.vdf $HOME/games/${game.name}/ 35 | 36 | rm -r $HOME/games/${game.name}/redist 37 | cp -L -r ${gameFiles}/redist $HOME/games/${game.name}/ 38 | 39 | rm -r $HOME/games/${game.name}/*.bix 40 | cp -L -r ${gameFiles}/*.bix $HOME/games/${game.name}/ 41 | 42 | rm -r $HOME/games/${game.name}/Global.big 43 | cp -L -r ${gameFiles}/Global.big $HOME/games/${game.name}/ 44 | 45 | chmod -R +rw $HOME/games/${game.name} 46 | 47 | cp ${./DisplaySettings.xml} $HOME/games/${game.name}/data/DisplaySettings.xml 48 | 49 | export WINEPREFIX=$PROTON_PREFIX_HOME/pfx 50 | 51 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 52 | cd $HOME/games/${game.name} 53 | export WINEDLLOVERRIDES="dxgi=n" 54 | export DXVK_HUD=1 55 | export WINEDEBUG=+treeview 56 | export STEAM_COMPAT_DATA_PATH=$PROTON_PREFIX_HOME 57 | export STEAM_COMPAT_CLIENT_INSTALL_PATH=$HOME/.steam/steam 58 | $PROTON_HOME/proton waitforexitandrun vcredist_x64.exe 59 | $PROTON_HOME/proton waitforexitandrun ./SDHDShip.exe 60 | ''} 61 | '' 62 | -------------------------------------------------------------------------------- /games/windows/sonicGenerations/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, steamUserInfo, gameInfo, proton, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "SonicGenerations"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "71340"; 11 | platform = "windows"; 12 | }; 13 | 14 | gameFiles = gameFileInfo { 15 | inherit mainGameName; 16 | name = "SonicGenerations"; 17 | platform = "windows"; 18 | appId = "71340"; 19 | depotId = "71341"; 20 | manifestId = "190831558827569965"; 21 | }; 22 | 23 | proton = proton.proton_6_3; 24 | 25 | drvPath = ./wrapper.nix; 26 | } 27 | -------------------------------------------------------------------------------- /games/windows/sonicGenerations/wrapper.nix: -------------------------------------------------------------------------------- 1 | { game, proton, lib, steamcmd, steam, writeText, steam-run, writeScript, writeScriptBin, gameFiles, lndir, steamUserInfo, protonWrapperScript, realGameLocation, ... }: 2 | 3 | let 4 | sonicReg = writeText "sonic-generation.reg" '' 5 | REGEDIT4 6 | 7 | [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Sega] 8 | 9 | [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Sega\Sonic Generations] 10 | "locale"="en-us" 11 | "SaveLocation"="%UserProfile%\\Saved Games\\Sonic Generations" 12 | ''; 13 | in writeScriptBin game.name '' 14 | ${ 15 | protonWrapperScript { 16 | inherit game gameFiles proton lndir lib steamUserInfo steamcmd steam realGameLocation; 17 | } 18 | } 19 | 20 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 21 | cd $HOME/games/${game.name} 22 | export WINEDLLOVERRIDES="dxgi=n" 23 | export DXVK_HUD=1 24 | export WINEPREFIX=$PROTON_PREFIX_HOME/pfx 25 | export STEAM_COMPAT_DATA_PATH=$PROTON_PREFIX_HOME 26 | export STEAM_COMPAT_CLIENT_INSTALL_PATH=$HOME/.steam/steam 27 | 28 | # Audio fix 29 | export PROTON_NO_ESYNC=1 PROTON_USE_D9VK=1 30 | 31 | $HOME/protons/${proton.name}/proton waitforexitandrun regedit.exe ${sonicReg} 32 | $HOME/protons/${proton.name}/proton waitforexitandrun ./ConfigurationTool.exe 33 | $HOME/protons/${proton.name}/proton waitforexitandrun ./SonicGenerations.exe 34 | ''} 35 | '' 36 | -------------------------------------------------------------------------------- /games/windows/steinsGate/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, proton, steamUserInfo, gameInfo, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "SteinsGate"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "412830"; 11 | platform = "windows"; 12 | }; 13 | 14 | gameFiles = [ 15 | (gameFileInfo { 16 | inherit mainGameName; 17 | name = "SteinsGate-English"; 18 | appId = "412830"; 19 | platform = "windows"; 20 | depotId = "412831"; 21 | manifestId = "4258046810370830803"; 22 | }) 23 | 24 | (gameFileInfo { 25 | inherit mainGameName; 26 | name = "DirectX-2010-Redist"; 27 | appId = "228980"; 28 | platform = "windows"; 29 | depotId = "228990"; 30 | manifestId = "1829726630299308803"; 31 | }) 32 | ]; 33 | 34 | proton = proton.proton_6_10_ge; 35 | 36 | drvPath = ./wrapper.nix; 37 | } 38 | -------------------------------------------------------------------------------- /games/windows/steinsGate/wrapper.nix: -------------------------------------------------------------------------------- 1 | { protonWrapperScript, wineWowPackages, winetricks, curl, krb5, keyutils, game, proton, lib, steamcmd, steam, writeText, steam-run, writeScript, writeScriptBin, gameFiles, lndir, realGameLocation, steamUserInfo, ... }: 2 | 3 | let 4 | winetricksMod = winetricks.override { 5 | wine = null; 6 | }; 7 | in writeScriptBin game.name '' 8 | ${ 9 | protonWrapperScript { 10 | inherit game gameFiles proton lndir lib steamUserInfo steamcmd steam realGameLocation; 11 | } 12 | } 13 | 14 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 15 | export LD_LIBRARY_PATH=${lib.makeLibraryPath [ curl krb5 keyutils ]}:$LD_LIBRARY_PATH 16 | cd $HOME/games/${game.name}/ 17 | export WINEDLLOVERRIDES="dxgi=n" 18 | export DXVK_HUD=1 19 | export WINEPREFIX=$PROTON_PREFIX_HOME/pfx 20 | export STEAM_COMPAT_DATA_PATH=$PROTON_PREFIX_HOME 21 | export STEAM_COMPAT_CLIENT_INSTALL_PATH=$HOME/.steam/steam 22 | export PATH=$PATH:$PROTON_HOME/dist/bin 23 | 24 | $PROTON_HOME/proton waitforexitandrun ./_CommonRedist/DirectX/Jun2010/DXSETUP.exe /silent 25 | $PROTON_HOME/proton waitforexitandrun ./Launcher.exe 26 | ''} 27 | '' 28 | -------------------------------------------------------------------------------- /games/windows/steinsGate0/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, proton, steamUserInfo, gameInfo, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "SteinsGate0"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "825630"; 11 | platform = "windows"; 12 | }; 13 | 14 | gameFiles = [ 15 | (gameFileInfo { 16 | inherit mainGameName; 17 | name = "SteinsGate0-English"; 18 | appId = "825630"; 19 | platform = "windows"; 20 | depotId = "825632"; 21 | manifestId = "2281959220695080388"; 22 | }) 23 | 24 | (gameFileInfo { 25 | inherit mainGameName; 26 | name = "DirectX-2010-Redist"; 27 | appId = "228980"; 28 | platform = "windows"; 29 | depotId = "228990"; 30 | manifestId = "1829726630299308803"; 31 | }) 32 | ]; 33 | 34 | proton = proton.proton_6_10; 35 | 36 | drvPath = ./wrapper.nix; 37 | } 38 | -------------------------------------------------------------------------------- /games/windows/steinsGate0/wrapper.nix: -------------------------------------------------------------------------------- 1 | { protonWrapperScript, game, proton, lib, steamcmd, steam, writeText, steam-run, writeScript, writeScriptBin, gameFiles, lndir, realGameLocation, steamUserInfo, ... }: 2 | 3 | writeScriptBin game.name '' 4 | ${ 5 | protonWrapperScript { 6 | inherit game gameFiles proton lndir lib steamUserInfo steamcmd steam realGameLocation; 7 | } 8 | } 9 | 10 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 11 | cd $HOME/games/${game.name}/ 12 | export WINEDLLOVERRIDES="dxgi=n" 13 | export DXVK_HUD=1 14 | export WINEPREFIX=$PROTON_PREFIX_HOME/pfx 15 | export STEAM_COMPAT_DATA_PATH=$PROTON_PREFIX_HOME 16 | export STEAM_COMPAT_CLIENT_INSTALL_PATH=$HOME/.steam/steam 17 | 18 | $PROTON_HOME/proton waitforexitandrun ./_CommonRedist/DirectX/Jun2010/DXSETUP.exe /silent 19 | $PROTON_HOME/proton waitforexitandrun ./boot.bat 20 | ''} 21 | '' 22 | -------------------------------------------------------------------------------- /games/windows/steinsGateElite/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, proton, steamUserInfo, gameInfo, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "SteinsGateElite"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "819030"; 11 | platform = "windows"; 12 | }; 13 | 14 | gameFiles = [ 15 | (gameFileInfo { 16 | inherit mainGameName; 17 | name = "SteinsGateElite-English"; 18 | appId = "819030"; 19 | platform = "windows"; 20 | depotId = "819032"; 21 | manifestId = "5436224210371133763"; 22 | }) 23 | 24 | (gameFileInfo { 25 | inherit mainGameName; 26 | name = "DirectX-2010-Redist"; 27 | appId = "228980"; 28 | platform = "windows"; 29 | depotId = "228990"; 30 | manifestId = "1829726630299308803"; 31 | }) 32 | ]; 33 | 34 | proton = proton.proton_6_10_ge; 35 | 36 | drvPath = ./wrapper.nix; 37 | } 38 | -------------------------------------------------------------------------------- /games/windows/steinsGateElite/wrapper.nix: -------------------------------------------------------------------------------- 1 | { protonWrapperScript, game, proton, lib, steamcmd, steam, writeText, steam-run, writeScript, writeScriptBin, gameFiles, lndir, realGameLocation, steamUserInfo, ... }: 2 | 3 | writeScriptBin game.name '' 4 | ${ 5 | protonWrapperScript { 6 | inherit game gameFiles proton lndir lib steamUserInfo steamcmd steam realGameLocation; 7 | } 8 | } 9 | 10 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 11 | cd $HOME/games/${game.name}/ 12 | export WINEDLLOVERRIDES="dxgi=n" 13 | export DXVK_HUD=1 14 | export WINEPREFIX=$PROTON_PREFIX_HOME/pfx 15 | export STEAM_COMPAT_DATA_PATH=$PROTON_PREFIX_HOME 16 | export STEAM_COMPAT_CLIENT_INSTALL_PATH=$HOME/.steam/steam 17 | 18 | $PROTON_HOME/proton waitforexitandrun ./_CommonRedist/DirectX/Jun2010/DXSETUP.exe /silent 19 | $PROTON_HOME/proton waitforexitandrun ./boot.bat 20 | ''} 21 | '' 22 | -------------------------------------------------------------------------------- /games/windows/steinsGateLBP/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, proton, steamUserInfo, gameInfo, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "SteinsGateLBP"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "930910"; 11 | platform = "windows"; 12 | }; 13 | 14 | gameFiles = [ 15 | (gameFileInfo { 16 | inherit mainGameName; 17 | name = "SteinsGateLBP-English"; 18 | appId = "930910"; 19 | platform = "windows"; 20 | depotId = "930912"; 21 | manifestId = "3342101974694904456"; 22 | }) 23 | 24 | (gameFileInfo { 25 | inherit mainGameName; 26 | name = "DirectX-2010-Redist"; 27 | appId = "228980"; 28 | platform = "windows"; 29 | depotId = "228990"; 30 | manifestId = "1829726630299308803"; 31 | }) 32 | ]; 33 | 34 | proton = proton.proton_6_10_ge; 35 | 36 | drvPath = ./wrapper.nix; 37 | } 38 | -------------------------------------------------------------------------------- /games/windows/steinsGateLBP/wrapper.nix: -------------------------------------------------------------------------------- 1 | { protonWrapperScript, game, proton, lib, steamcmd, steam, writeText, steam-run, writeScript, writeScriptBin, gameFiles, lndir, realGameLocation, steamUserInfo, ... }: 2 | 3 | writeScriptBin game.name '' 4 | ${ 5 | protonWrapperScript { 6 | inherit game gameFiles proton lndir lib steamUserInfo steamcmd steam realGameLocation; 7 | } 8 | } 9 | 10 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 11 | cd $HOME/games/${game.name}/ 12 | export WINEDLLOVERRIDES="dxgi=n" 13 | export DXVK_HUD=1 14 | export WINEPREFIX=$PROTON_PREFIX_HOME/pfx 15 | export STEAM_COMPAT_DATA_PATH=$PROTON_PREFIX_HOME 16 | export STEAM_COMPAT_CLIENT_INSTALL_PATH=$HOME/.steam/steam 17 | 18 | $PROTON_HOME/proton waitforexitandrun ./_CommonRedist/DirectX/Jun2010/DXSETUP.exe /silent 19 | $PROTON_HOME/proton waitforexitandrun ./Launcher.exe 20 | ''} 21 | '' 22 | -------------------------------------------------------------------------------- /games/windows/thereIsNoGame/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, steamUserInfo, gameInfo, proton, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "ThereIsNoGame"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "1240210"; 11 | platform = "windows"; 12 | }; 13 | 14 | gameFiles = gameFileInfo { 15 | inherit mainGameName; 16 | name = "ThereIsNoGame"; 17 | platform = "windows"; 18 | appId = "1240210"; 19 | depotId = "1240211"; 20 | manifestId = "711553591273793860"; 21 | }; 22 | 23 | proton = proton.proton_6_3; 24 | 25 | drvPath = ./wrapper.nix; 26 | } 27 | -------------------------------------------------------------------------------- /games/windows/thereIsNoGame/wrapper.nix: -------------------------------------------------------------------------------- 1 | { game, proton, lib, steamcmd, steam, writeText, steam-run, writeScript, writeScriptBin, gameFiles, lndir, steamUserInfo, protonWrapperScript, realGameLocation, ... }: 2 | 3 | writeScriptBin game.name '' 4 | ${ 5 | protonWrapperScript { 6 | inherit game gameFiles proton lndir lib steamUserInfo steamcmd steam realGameLocation; 7 | } 8 | } 9 | 10 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 11 | cd $HOME/games/${game.name} 12 | export WINEDLLOVERRIDES="dxgi=n" 13 | export DXVK_HUD=1 14 | export WINEPREFIX=$PROTON_PREFIX_HOME/pfx 15 | export STEAM_COMPAT_DATA_PATH=$PROTON_PREFIX_HOME 16 | export STEAM_COMPAT_CLIENT_INSTALL_PATH=$HOME/.steam/steam 17 | 18 | $PROTON_HOME/proton waitforexitandrun ./Ting.exe 19 | ''} 20 | '' 21 | -------------------------------------------------------------------------------- /games/windows/top-level.nix: -------------------------------------------------------------------------------- 1 | { steamUserInfo, helperLib, proton }: 2 | 3 | with helperLib; 4 | 5 | let 6 | normalList = { inherit steamUserInfo gameInfo proton gameFileInfo makeSteamGame; }; 7 | in { 8 | SonicGenerations = import ./sonicGenerations normalList; 9 | JustCause = import ./justCause normalList; 10 | SleepingDogs = import ./sleepingDogs normalList; 11 | RocketLeague = import ./rocketLeague normalList; 12 | Warframe = import ./warframe normalList; 13 | UminekoGoldenFantasia = import ./uminekoGoldenFantasia normalList; 14 | Payday = import ./payday normalList; 15 | ProjectWingman = import ./projectWingman normalList; 16 | SteinsGate = import ./steinsGate normalList; 17 | SteinsGate0 = import ./steinsGate0 normalList; 18 | SteinsGateElite = import ./steinsGateElite normalList; 19 | SteinsGateLBP = import ./steinsGateLBP normalList; 20 | AlanWake = import ./alanWake normalList; 21 | ThereIsNoGame = import ./thereIsNoGame normalList; 22 | BleachBraveSouls = import ./bleachBraveSouls normalList; 23 | Brawlhalla = import ./brawlhalla normalList; 24 | EiyuSenkiGold = import ./eiyuSenkiGold normalList; 25 | ConanExiles = import ./conanExiles normalList; 26 | HouseParty = import ./houseParty normalList; 27 | Offworld = import ./offworld normalList; 28 | KatanaZero = import ./katana-zero normalList; 29 | } 30 | -------------------------------------------------------------------------------- /games/windows/uminekoGoldenFantasia/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, steamUserInfo, gameInfo, proton, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "UminekoGoldenFantasia"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "550340"; 11 | platform = "windows"; 12 | }; 13 | 14 | gameFiles = gameFileInfo { 15 | inherit mainGameName; 16 | name = "UminekoGoldenFantasia"; 17 | platform = "windows"; 18 | appId = "550340"; 19 | depotId = "550341"; 20 | manifestId = "25311086339845674"; 21 | }; 22 | 23 | proton = proton.proton_6_10_ge; 24 | 25 | drvPath = ./wrapper.nix; 26 | } 27 | -------------------------------------------------------------------------------- /games/windows/uminekoGoldenFantasia/wrapper.nix: -------------------------------------------------------------------------------- 1 | { game, proton, lib, steamcmd, steam, steam-run, writeScript, writeScriptBin, gameFiles, lndir, steamUserInfo, protonWrapperScript, realGameLocation, ... }: 2 | 3 | writeScriptBin game.name '' 4 | ${ 5 | protonWrapperScript { 6 | inherit game gameFiles proton lndir lib steamUserInfo steamcmd steam realGameLocation; 7 | } 8 | } 9 | 10 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 11 | cd $HOME/games/${game.name} 12 | export WINEDLLOVERRIDES="dxgi=n" 13 | export DXVK_HUD=1 14 | export WINEPREFIX=$PROTON_PREFIX_HOME/pfx 15 | export STEAM_COMPAT_DATA_PATH=$PROTON_PREFIX_HOME 16 | export STEAM_COMPAT_CLIENT_INSTALL_PATH=$HOME/.steam/steam 17 | 18 | $HOME/protons/${proton.name}/proton waitforexitandrun ./Launcher.exe 19 | ''} 20 | '' 21 | -------------------------------------------------------------------------------- /games/windows/warframe/default.nix: -------------------------------------------------------------------------------- 1 | { makeSteamGame, proton, steamUserInfo, gameInfo, gameFileInfo }: 2 | 3 | let 4 | mainGameName = "Warframe"; 5 | in makeSteamGame { 6 | inherit steamUserInfo; 7 | 8 | game = gameInfo { 9 | name = mainGameName; 10 | appId = "230410"; 11 | platform = "windows"; 12 | }; 13 | 14 | gameFiles = gameFileInfo { 15 | inherit mainGameName; 16 | name = "Warframe"; 17 | appId = "230410"; 18 | platform = "windows"; 19 | depotId = "230411"; 20 | manifestId = "896988770099174429"; 21 | }; 22 | 23 | proton = proton.proton_6_3; 24 | 25 | drvPath = ./wrapper.nix; 26 | } 27 | -------------------------------------------------------------------------------- /games/windows/warframe/wrapper.nix: -------------------------------------------------------------------------------- 1 | { realGameLocation, protonWrapperScript, game, proton, lib, steamcmd, steam, writeText, steam-run, writeScript, writeScriptBin, gameFiles, lndir, steamUserInfo, fullCopy ? true, ... }: 2 | 3 | writeScriptBin game.name '' 4 | ${ 5 | protonWrapperScript { 6 | inherit game gameFiles proton lndir lib steamUserInfo steamcmd steam realGameLocation; 7 | } 8 | } 9 | ${lib.optionalString fullCopy '' 10 | if [[ ! -f "$HOME/games/${game.name}/.fullCopy" ]]; then 11 | rm -r $HOME/games/${game.name}/* 12 | cp -L -r ${gameFiles}/* $HOME/games/${game.name}/ 13 | touch $HOME/games/${game.name}/.fullCopy 14 | fi 15 | ''} 16 | 17 | chmod -R +rw $HOME/games/${game.name} 18 | 19 | ${steam-run}/bin/steam-run ${writeScript "fix-${game.name}" '' 20 | cd $HOME/games/${game.name}/ 21 | export WINEDLLOVERRIDES="dxgi=n" 22 | export DXVK_HUD=1 23 | export WINEPREFIX=$PROTON_PREFIX_HOME/pfx 24 | export STEAM_COMPAT_DATA_PATH=$PROTON_PREFIX_HOME 25 | export STEAM_COMPAT_CLIENT_INSTALL_PATH=$HOME/.steam/steam 26 | 27 | $HOME/protons/${proton.name}/proton waitforexitandrun ./Tools/Launcher.exe -cluster:public -registry:Steam 28 | ''} 29 | '' 30 | -------------------------------------------------------------------------------- /lib/game-file-info.nix: -------------------------------------------------------------------------------- 1 | { name, appId, depotId, mainGameName, manifestId, platform ? "linux", extraAction ? "" }: { 2 | inherit name appId platform depotId manifestId extraAction mainGameName; 3 | } 4 | -------------------------------------------------------------------------------- /lib/game-files-fetcher.nix: -------------------------------------------------------------------------------- 1 | { stdenv, nixpkgsSource, ruby, writeText, jq, nixUnstable, lib, cacert, steamctl, ... }: 2 | 3 | { game, steamUserInfo, ... }: 4 | 5 | let 6 | generateJSON = writeText "generate-manifest-json" '' 7 | require 'json' 8 | 9 | Encoding.default_external = Encoding::UTF_8 10 | Encoding.default_internal = Encoding::UTF_8 11 | 12 | result = [] 13 | 14 | File.read(ARGV[0]).split("\n").map {|line| 15 | matches = line.match(/(.*) - size:(.*) sha1:(.*)/) 16 | if matches 17 | fileName = matches.captures[0].gsub(/\\/,'/') 18 | fileSize = matches.captures[1].gsub(/,/, ${"'"}').to_i 19 | sha1Checksum = matches.captures[2] 20 | result.append({ fileName: fileName, fileSize: fileSize, sha1Checksum: sha1Checksum }) 21 | end 22 | } 23 | 24 | puts result.to_json 25 | ''; 26 | in stdenv.mkDerivation { 27 | name = "${game.name}-links"; 28 | 29 | buildInputs = [ 30 | jq 31 | nixUnstable 32 | cacert 33 | steamctl 34 | ]; 35 | 36 | buildCommand = '' 37 | export HOME=$PWD 38 | 39 | ${lib.optionalString steamUserInfo.useGuardFiles '' 40 | mkdir -p $HOME/.local/share/steamctl 41 | cp -r ${steamUserInfo.steamctlFiles}/* $HOME/.local/share/steamctl/ 42 | chmod -R +rw $HOME/.local/share/steamctl/ 43 | ''} 44 | 45 | pushd . 46 | cd ${steamUserInfo.targetStore} 47 | mkdir -p ${game.platform}/${game.mainGameName} 48 | popd 49 | 50 | (chmod -R g+rw ${steamUserInfo.targetStore}/${game.platform}/${game.mainGameName}/ || true) > /dev/null 2>&1 51 | 52 | steamctl --user ${steamUserInfo.username} --password_file ${steamUserInfo.passwordFile} depot list -os ${game.platform} -a ${game.appId} -d ${game.depotId} -m ${game.manifestId} --long > manifest.txt 53 | 54 | ${ruby}/bin/ruby ${generateJSON} manifest.txt > manifest.json 55 | rm manifest.txt 56 | 57 | steamctl --user ${steamUserInfo.username} --password_file test depot download -os ${game.platform} -a ${game.appId} -d ${game.depotId} -m ${game.manifestId} -o ${steamUserInfo.targetStore}/${game.platform}/${game.mainGameName}/ 58 | 59 | pushd . 60 | cd ${steamUserInfo.targetStore}/${game.platform}/${game.mainGameName} 61 | ${game.extraAction} 62 | popd 63 | 64 | mkdir -p $out/${game.name} 65 | mv manifest.json $out/${game.name}/manifest.json 66 | ''; 67 | 68 | __noChroot = true; 69 | 70 | outputHashAlgo = "sha256"; 71 | outputHashMode = "recursive"; 72 | } 73 | -------------------------------------------------------------------------------- /lib/game-info.nix: -------------------------------------------------------------------------------- 1 | { name, appId, platform ? "linux"}: { 2 | inherit name appId platform; 3 | } 4 | -------------------------------------------------------------------------------- /lib/make-steam-game.nix: -------------------------------------------------------------------------------- 1 | { callPackage, gameFileInfo, steamGameFetcher, jq, lib, symlinkJoin, protonWrapperScript, linuxWrapperScript, linkFarm, runCommand, steamcmdLogin }: 2 | 3 | { steamUserInfo, game, gameFiles, drvPath, proton ? null }: 4 | 5 | let 6 | gameFilesMod = if (lib.isList gameFiles) then gameFiles else [ gameFiles ]; 7 | in callPackage drvPath { 8 | realGameLocation = "${steamUserInfo.targetStore}/${game.platform}/${game.name}"; 9 | inherit game gameFileInfo steamGameFetcher steamUserInfo proton steamcmdLogin protonWrapperScript linuxWrapperScript; 10 | gameFiles = symlinkJoin { 11 | name = "${game.name}-files"; 12 | 13 | paths = lib.forEach gameFilesMod (gameFile: 14 | steamGameFetcher { 15 | inherit steamUserInfo; 16 | game = gameFile; 17 | }); 18 | }; 19 | } 20 | -------------------------------------------------------------------------------- /lib/steam-user.nix: -------------------------------------------------------------------------------- 1 | { username, passwordFile, useGuardFiles, cachedFileDir, steamctlFiles, outputStore, targetStore } 2 | -------------------------------------------------------------------------------- /lib/top-level.nix: -------------------------------------------------------------------------------- 1 | { callPackage, steam, cacert, nixpkgsSource }: 2 | 3 | rec { 4 | steamUserInfo = import ./steam-user.nix; 5 | gameInfo = import ./game-info.nix; 6 | gameFileInfo = import ./game-file-info.nix; 7 | steamGameFetcher = callPackage ./game-files-fetcher.nix { 8 | inherit nixpkgsSource; 9 | }; 10 | 11 | protonWrapperScript = { game, gameFiles, realGameLocation, proton, lndir, lib, steamUserInfo, steamcmd, steam }: '' 12 | export SteamAppId=${game.appId} 13 | export HOME=${steamUserInfo.outputStore} 14 | export SSL_CERT_FILE=${cacert}/etc/ssl/certs/ca-bundle.crt 15 | mkdir -p $HOME/{prefix/$SteamAppId,protons/${proton.name}/proton,games/${game.name}/manifests} 16 | ${steamcmd}/bin/steamcmd +exit 17 | ${lndir}/bin/lndir ${realGameLocation}/ $HOME/games/${game.name}/ 18 | ${lndir}/bin/lndir ${gameFiles} $HOME/games/${game.name}/manifests 19 | chmod -R +rw $HOME/games/${game.name} 20 | 21 | if [[ ! -f "${proton}/${proton.name}/manifest.json" ]]; then 22 | cp -L -r ${proton}/* $HOME/protons/${proton.name}/proton 23 | else 24 | cp -L -r ${steamUserInfo.targetStore}/linux/${proton.name}/* $HOME/protons/${proton.name}/proton 25 | mkdir -p $HOME/protons/${proton.name}/proton/manifests 26 | ${lndir}/bin/lndir ${proton} $HOME/protons/${proton.name}/proton/manifests 27 | fi 28 | 29 | chmod +x $HOME/protons/${proton.name}/proton/proton 30 | chmod -R +rw $HOME/protons/${proton.name}/proton 31 | 32 | export PROTON_HOME=$HOME/protons/${proton.name}/proton 33 | export PROTON_PREFIX_HOME=$HOME/prefix/$SteamAppId 34 | 35 | ${lib.optionalString steamUserInfo.useGuardFiles '' 36 | cp -r ${steamUserInfo.cachedFileDir}/* $HOME/.steam/steam 37 | ''} 38 | 39 | STEAM_RUNNING="$(pgrep steam -c)" 40 | 41 | if [[ $STEAM_RUNNING == 0 ]]; then 42 | chmod -R +rw $HOME/.steam 43 | ${steamcmdLogin { inherit steamUserInfo steamcmd; } } 44 | (${steam}/bin/steam -silent -login ${steamUserInfo.username} "$(cat "${steamUserInfo.passwordFile}")" &) 45 | sleep 60 46 | fi 47 | ''; 48 | 49 | linuxWrapperScript = { game, gameFiles, realGameLocation, lndir, lib, steamUserInfo, steamcmd }: '' 50 | export SteamAppId=${game.appId} 51 | export HOME=${steamUserInfo.outputStore} 52 | mkdir -p $HOME/games/${game.name}/manifests 53 | ${lndir}/bin/lndir ${realGameLocation} $HOME/games/${game.name} 54 | ${lndir}/bin/lndir ${gameFiles} $HOME/games/${game.name}/manifests 55 | chmod -R +rw $HOME/games/${game.name} 56 | 57 | ${steamcmd}/bin/steamcmd +exit 58 | 59 | ${lib.optionalString steamUserInfo.useGuardFiles '' 60 | cp -r ${steamUserInfo.cachedFileDir}/* $HOME/.steam/steam 61 | ''} 62 | 63 | STEAM_RUNNING="$(pgrep steam -c)" 64 | 65 | if [[ $STEAM_RUNNING == 0 ]]; then 66 | chmod -R +rw $HOME/.steam 67 | ${steamcmdLogin { inherit steamUserInfo steamcmd; } } 68 | (${steam}/bin/steam -silent -login ${steamUserInfo.username} "$(cat "${steamUserInfo.passwordFile}")" > /dev/null &) 69 | sleep 60 70 | fi 71 | 72 | chmod -R +rw $HOME/.steam 73 | ''; 74 | 75 | steamcmdLogin = { steamUserInfo, steamcmd }: '' 76 | ${steamcmd}/bin/steamcmd +login ${steamUserInfo.username} $(cat ${steamUserInfo.passwordFile}) +exit 77 | ''; 78 | 79 | makeSteamGame = callPackage ./make-steam-game.nix { 80 | inherit gameFileInfo steamGameFetcher callPackage protonWrapperScript linuxWrapperScript steamcmdLogin; 81 | }; 82 | } 83 | --------------------------------------------------------------------------------