├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── dependabot.yml ├── scripts │ ├── check_gamefixes.py │ ├── check_imports.py │ ├── check_verbs.py │ └── steam_client.py └── workflows │ ├── build.yml │ └── ci.yml ├── .gitignore ├── .gitmodules ├── .pre-commit-config.yaml ├── LICENSE ├── Makefile ├── README.md ├── __init__.py ├── checks.py ├── config.py ├── config_base.py ├── debug.py ├── download.py ├── engine.py ├── fix.py ├── gamefixes-amazon └── __init__.py ├── gamefixes-battlenet └── __init__.py ├── gamefixes-ea ├── __init__.py ├── umu-1222690.py └── umu-2009100.py ├── gamefixes-egs ├── __init__.py ├── default.py ├── umu-1174180.py ├── umu-1659420.py ├── umu-19900.py ├── umu-2009100.py ├── umu-220240.py ├── umu-233270.py ├── umu-2552430.py ├── umu-271590.py ├── umu-2767030.py ├── umu-286690.py ├── umu-287390.py ├── umu-298110.py ├── umu-3513350.py ├── umu-371660.py ├── umu-397540.py ├── umu-40800.py ├── umu-409710.py ├── umu-409720.py └── umu-825cd0b5286c404289d456d47561cc1a.py ├── gamefixes-gog ├── __init__.py ├── umu-1105510.py ├── umu-1141086411.py ├── umu-1151640.py ├── umu-1209310984.py ├── umu-1228964594.py ├── umu-15130.py ├── umu-1564851593.py ├── umu-1580232252.py ├── umu-1584652180.py ├── umu-1587885678.py ├── umu-1597741823.py ├── umu-1606830592.py ├── umu-1661434114.py ├── umu-1685981342.py ├── umu-1697970811.py ├── umu-1771973390.py ├── umu-1814107259.py ├── umu-1944735225.py ├── umu-2044697588.py ├── umu-2069117974.py ├── umu-207350.py ├── umu-20920.py ├── umu-219990.py ├── umu-22610.py ├── umu-22650.py ├── umu-22670.py ├── umu-237890.py ├── umu-245050.py ├── umu-251150.py ├── umu-251290.py ├── umu-260130.py ├── umu-311770.py ├── umu-312790.py ├── umu-356190.py ├── umu-379720.py ├── umu-39190.py ├── umu-39200.py ├── umu-39510.py ├── umu-39540.py ├── umu-39550.py ├── umu-409710.py ├── umu-409720.py ├── umu-436670.py ├── umu-61500.py ├── umu-644930.py ├── umu-65530.py ├── umu-65540.py ├── umu-7670.py ├── umu-8850.py └── umu-955050.py ├── gamefixes-humble ├── __init__.py ├── umu-2009100.py ├── umu-207350.py └── umu-61500.py ├── gamefixes-itchio └── __init__.py ├── gamefixes-steam ├── 1017900.py ├── 10220.py ├── 1030830.py ├── 105400.py ├── 105450.py ├── 1056640.py ├── 1062040.py ├── 1063730.py ├── 108710.py ├── 1097150.py ├── 1105510.py ├── 110800.py ├── 1112400.py ├── 1121560.py ├── 11440.py ├── 1144400.py ├── 1151440.py ├── 1151640.py ├── 1158850.py ├── 1174180.py ├── 1175730.py ├── 12200.py ├── 12210.py ├── 1222370.py ├── 1222690.py ├── 1237970.py ├── 1239520.py ├── 1240440.py ├── 1245620.py ├── 1250410.py ├── 1257290.py ├── 1259970.py ├── 1272580.py ├── 1277510.py ├── 1277930.py ├── 12810.py ├── 12840.py ├── 1284210.py ├── 1284410.py ├── 1286880.py ├── 1293820.py ├── 1293830.py ├── 1361510.py ├── 1382330.py ├── 1413480.py ├── 1434950.py ├── 1449280.py ├── 1467450.py ├── 1500540.py ├── 15130.py ├── 1532190.py ├── 1544020.py ├── 1557480.py ├── 15700.py ├── 15740.py ├── 15750.py ├── 1613450.py ├── 1659420.py ├── 1664350.py ├── 16700.py ├── 16810.py ├── 1681970.py ├── 1695791.py ├── 1695793.py ├── 1695794.py ├── 1711950.py ├── 1715130.py ├── 1716740.py ├── 1795390.py ├── 1829980.py ├── 1873170.py ├── 1930.py ├── 1971650.py ├── 19900.py ├── 1999770.py ├── 200490.py ├── 2009100.py ├── 200940.py ├── 201480.py ├── 204450.py ├── 205230.py ├── 205650.py ├── 206480.py ├── 206500.py ├── 207350.py ├── 208650.py ├── 20920.py ├── 211420.py ├── 212500.py ├── 213330.py ├── 2135150.py ├── 2138090.py ├── 214510.py ├── 214950.py ├── 215280.py ├── 2161700.py ├── 21680.py ├── 2183070.py ├── 219030.py ├── 219990.py ├── 220240.py ├── 2229850.py ├── 2231380.py ├── 22330.py ├── 22370.py ├── 223750.py ├── 22380.py ├── 2246340.py ├── 224960.py ├── 225640.py ├── 227320.py ├── 231990.py ├── 23300.py ├── 233270.py ├── 23460.py ├── 237890.py ├── 2399220.py ├── 240600.py ├── 242760.py ├── 244210.py ├── 244850.py ├── 245050.py ├── 2457540.py ├── 2458530.py ├── 2475980.py ├── 2505910.py ├── 251150.py ├── 251290.py ├── 252430.py ├── 253430.py ├── 2552410.py ├── 2552430.py ├── 2561580.py ├── 256330.py ├── 257420.py ├── 260130.py ├── 261510.py ├── 261640.py ├── 2620.py ├── 2623190.py ├── 266840.py ├── 2677660.py ├── 2679460.py ├── 268050.py ├── 2697560.py ├── 2699660.py ├── 271590.py ├── 2730350.py ├── 281280.py ├── 282900.py ├── 284160.py ├── 286360.py ├── 286810.py ├── 287310.py ├── 287450.py ├── 289130.py ├── 2905090.py ├── 2909400.py ├── 292410.py ├── 294700.py ├── 298030.py ├── 298110.py ├── 302370.py ├── 307780.py ├── 3094040.py ├── 311210.py ├── 311730.py ├── 312060.py ├── 312450.py ├── 312670.py ├── 312790.py ├── 321040.py ├── 328500.py ├── 329380.py ├── 331370.py ├── 33230.py ├── 33460.py ├── 33990.py ├── 34330.py ├── 348550.py ├── 35000.py ├── 351710.py ├── 356500.py ├── 3590.py ├── 359550.py ├── 359870.py ├── 366250.py ├── 368500.py ├── 371660.py ├── 372000.py ├── 375900.py ├── 377160.py ├── 377840.py ├── 378630.py ├── 379720.py ├── 386360.py ├── 388750.py ├── 390710.py ├── 39190.py ├── 39200.py ├── 39210.py ├── 39500.py ├── 39510.py ├── 39540.py ├── 39550.py ├── 39690.py ├── 397540.py ├── 40800.py ├── 409090.py ├── 40950.py ├── 40970.py ├── 409710.py ├── 409720.py ├── 410900.py ├── 424840.py ├── 428660.py ├── 429720.py ├── 43110.py ├── 434570.py ├── 436670.py ├── 440900.py ├── 44690.py ├── 447040.py ├── 452440.py ├── 4560.py ├── 45750.py ├── 460120.py ├── 460930.py ├── 46500.py ├── 465280.py ├── 465840.py ├── 4730.py ├── 48190.py ├── 489830.py ├── 49520.py ├── 495420.py ├── 497360.py ├── 49900.py ├── 506510.py ├── 508980.py ├── 518790.py ├── 550340.py ├── 553850.py ├── 559620.py ├── 570940.py ├── 582660.py ├── 586140.py ├── 593600.py ├── 601510.py ├── 61500.py ├── 6270.py ├── 627270.py ├── 63110.py ├── 633230.py ├── 63700.py ├── 63710.py ├── 638160.py ├── 638970.py ├── 644930.py ├── 65530.py ├── 65540.py ├── 65600.py ├── 65610.py ├── 658150.py ├── 658260.py ├── 65930.py ├── 678950.py ├── 6920.py ├── 700600.py ├── 70400.py ├── 70420.py ├── 70650.py ├── 72850.py ├── 729040.py ├── 730830.py ├── 73170.py ├── 740550.py ├── 750920.py ├── 7510.py ├── 7670.py ├── 773370.py ├── 78000.py ├── 782330.py ├── 7850.py ├── 812140.py ├── 813780.py ├── 816020.py ├── 8190.py ├── 834530.py ├── 8850.py ├── 888790.py ├── 893180.py ├── 895870.py ├── 906510.py ├── 910830.py ├── 913740.py ├── 9350.py ├── 936160.py ├── 9420.py ├── 950670.py ├── 955050.py ├── 963930.py ├── 968370.py ├── 976310.py ├── 976730.py ├── 9900.py ├── 997070.py ├── __init__.py └── default.py ├── gamefixes-ubisoft ├── __init__.py ├── umu-19900.py ├── umu-220240.py ├── umu-233270.py ├── umu-298110.py └── umu-371660.py ├── gamefixes-umu ├── __init__.py ├── default.py ├── umu-1174180.py ├── umu-2016590.py ├── umu-271590.py ├── umu-321040.py ├── umu-3513350.py ├── umu-39190.py ├── umu-39200.py ├── umu-582660.py ├── umu-identityv.py ├── umu-model2.py ├── umu-pantheonrotf.py ├── umu-pkhex.py ├── umu-silenthill3.py ├── umu-starcitizen.py ├── umu-tenshisz.py ├── umu-zenlesszonezero.py └── winetricks-gui.py ├── gamefixes-zoomplatform ├── __init__.py ├── umu-10220.py ├── umu-12810.py ├── umu-1500540.py ├── umu-15700.py ├── umu-15740.py ├── umu-15750.py ├── umu-240200.py ├── umu-2905090.py ├── umu-292410.py ├── umu-4bff76f4-566a-4714-b481-95d3343afe22.py └── umu-6270.py ├── logger.py ├── protonfixes_test.py ├── pyproject.toml ├── ruff.toml ├── steamhelper.py ├── umu-database.csv ├── util.py ├── verbs ├── cncnet_ra2.verb ├── dgvoodoo2.verb ├── force_gpu.verb ├── force_gpu=amd.verb ├── force_gpu=no.verb ├── force_gpu=nvidia.verb ├── klite.verb ├── rsx3d.verb ├── segoe_script.verb └── xliveless.verb └── winetricks /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | 5 | --- 6 | 7 | **Describe the bug** 8 | A clear and concise description of what the bug is. 9 | 10 | **To Reproduce** 11 | Steps to reproduce the behavior 12 | 13 | **Expected behavior** 14 | A clear and concise description of what you expected to happen. 15 | 16 | **Logs** 17 | Please post debug logs to help identify the problem (Preferably on [Gist](https://gist.github.com/)). Steam logs can be found at `/tmp/dumps/$USER_stdout.txt`. Debug info can be enabled by adding `from protonfixes import debug` to your `user_settings.py` file: 18 | ``` 19 | from protonfixes import debug 20 | import protonfixes 21 | ``` 22 | 23 | **Operating System:** 24 | - Distro and Version: [e.g. Ubuntu 18.04.1 LTS] 25 | - Proton Version: [e.g. Proton 3.7 Beta] 26 | 27 | **Game (if applicable):** 28 | - Game Name: 29 | - Game ID: 30 | 31 | **Additional Information** 32 | Add any other information [i.e. Modified Proton, Non-default Steam Library folder, etc] that might be useful in troubleshooting. 33 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | 5 | --- 6 | 7 | **Is your feature request related to a problem? Please describe.** 8 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 9 | 10 | **Describe the solution you'd like** 11 | A clear and concise description of what you want to happen. 12 | 13 | **Describe alternatives you've considered** 14 | A clear and concise description of any alternative solutions or features you've considered. 15 | 16 | **Additional context** 17 | Add any other context or screenshots about the feature request here. 18 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "github-actions" 4 | directory: "/" 5 | schedule: 6 | interval: "weekly" 7 | 8 | - package-ecosystem: "gitsubmodule" 9 | directory: "/" 10 | schedule: 11 | interval: "daily" 12 | -------------------------------------------------------------------------------- /.github/scripts/check_imports.py: -------------------------------------------------------------------------------- 1 | import sys # noqa: D100 2 | from shutil import which 3 | from trio import Path, run as async_run, open_nursery 4 | from trio.lowlevel import open_process 5 | 6 | EXCLUDES = ('__init__.py', 'default.py') 7 | 8 | PROJECT = Path(__file__).parent.parent.parent 9 | 10 | PROTON_VERB = 'waitforexitandrun' 11 | 12 | 13 | async def run_subproc(py_bin: str, file: Path) -> None: 14 | """Run a module via the Python interpreter""" 15 | path = await file.resolve(strict=True) 16 | proc = await open_process( 17 | [py_bin, str(path), PROTON_VERB], 18 | cwd=str(path.parent), 19 | env={'PYTHONPATH': str(PROJECT.parent)}, 20 | ) 21 | ret = await proc.wait() 22 | 23 | if ret != 0: 24 | err = f'The following file has an invalid import: {file}' 25 | raise RuntimeError(err) 26 | 27 | print(f"File '{file.parent / file.name}' has valid imports") 28 | 29 | 30 | async def main() -> None: 31 | """Validate import statements for files in gamefixes-*. by running them.""" 32 | py_bin = which('python') 33 | 34 | if not py_bin: 35 | sys.exit(1) 36 | 37 | async with open_nursery() as nursery: 38 | for file in await PROJECT.rglob('gamefixes-*/*.py'): 39 | if file.name.startswith(EXCLUDES): 40 | continue 41 | nursery.start_soon(run_subproc, py_bin, file) 42 | 43 | 44 | if __name__ == '__main__': 45 | async_run(main) 46 | -------------------------------------------------------------------------------- /.github/scripts/steam_client.py: -------------------------------------------------------------------------------- 1 | """Steam Client""" 2 | 3 | import sys 4 | from steam.client import SteamClient 5 | from steam.core.msg import MsgProto 6 | from steam.enums import EResult 7 | from steam.enums.emsg import EMsg 8 | from steam.utils.proto import proto_to_dict 9 | from typing import Any 10 | 11 | 12 | class Steam: 13 | """Minimal implementation of the SteamClient package that allows app id validation""" 14 | 15 | def __init__(self) -> None: 16 | """Setup SteamClient and it's events 17 | 18 | Raises: 19 | ValueError: When the SteamClient fires it's "error" event 20 | 21 | """ 22 | self.logged_on_once = False 23 | 24 | self.steam = client = SteamClient() 25 | 26 | # FIXME: pyright outputs 'error: Object of type "None" cannot be called (reportOptionalCall)' 27 | @client.on(SteamClient.EVENT_ERROR) # pyright: ignore (reportOptionalCall) 28 | def handle_error(result: EResult) -> None: 29 | raise ValueError(f'Steam error: {repr(result)}') 30 | 31 | @client.on(SteamClient.EVENT_CONNECTED) # pyright: ignore (reportOptionalCall) 32 | def handle_connected() -> None: 33 | print(f'Connected to {client.current_server_addr}', file=sys.stderr) 34 | 35 | @client.on(SteamClient.EVENT_CHANNEL_SECURED) # pyright: ignore (reportOptionalCall) 36 | def send_login() -> None: 37 | if self.logged_on_once and self.steam.relogin_available: 38 | self.steam.relogin() 39 | 40 | @client.on(SteamClient.EVENT_DISCONNECTED) # pyright: ignore (reportOptionalCall) 41 | def handle_disconnect() -> None: 42 | print('Steam disconnected', file=sys.stderr) 43 | if self.logged_on_once: 44 | print('Reconnecting...', file=sys.stderr) 45 | client.reconnect(maxdelay=30) 46 | 47 | @client.on(SteamClient.EVENT_LOGGED_ON) # pyright: ignore (reportOptionalCall) 48 | def handle_after_logon() -> None: 49 | self.logged_on_once = True 50 | 51 | client.anonymous_login() 52 | 53 | def get_valid_appids(self, appids: set[int]) -> set[int]: 54 | """Queries Steam for the specified appids. 55 | 56 | Args: 57 | appids (set[int]): The app ids that should be validated 58 | 59 | Raises: 60 | ValueError: When the response is empty / unexpected 61 | 62 | Returns: 63 | set[int]: Only valid app ids will be returned 64 | 65 | """ 66 | # https://github.com/SteamRE/SteamKit/blob/master/SteamKit2/SteamKit2/Base/Generated/SteamMsgClientServerAppInfo.cs#L331 67 | resp = self.steam.send_job_and_wait( 68 | message=MsgProto(EMsg.ClientPICSProductInfoRequest), 69 | body_params={ 70 | 'apps': map(lambda x: {'appid': x}, appids), 71 | 'meta_data_only': True, 72 | }, 73 | timeout=15, 74 | ) 75 | 76 | if not resp: 77 | err = 'Error retrieving appinfo from Steam' 78 | raise ValueError(err) 79 | 80 | apps: list[dict[str, Any]] = proto_to_dict(resp).get('apps') or [] 81 | 82 | return {app['appid'] for app in apps} 83 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: make 2 | 3 | on: 4 | push: 5 | branches: ["master"] 6 | pull_request: 7 | branches: ["master"] 8 | 9 | permissions: 10 | contents: read 11 | 12 | jobs: 13 | steamrt3: 14 | runs-on: ubuntu-latest 15 | container: registry.gitlab.steamos.cloud/steamrt/sniper/sdk:beta 16 | steps: 17 | - uses: actions/checkout@v4 18 | with: 19 | submodules: recursive 20 | - name: Build umu-protonfixes 21 | run: | 22 | make 23 | 24 | umu: 25 | runs-on: ubuntu-latest 26 | container: ghcr.io/open-wine-components/umu-sdk:latest 27 | steps: 28 | - uses: actions/checkout@v4 29 | with: 30 | submodules: recursive 31 | - name: Build umu-protonfixes 32 | run: | 33 | make 34 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: ci 2 | 3 | on: 4 | push: 5 | branches: ["master"] 6 | pull_request: 7 | branches: ["master"] 8 | 9 | permissions: 10 | contents: read 11 | 12 | jobs: 13 | build: 14 | runs-on: ubuntu-latest 15 | steps: 16 | - uses: actions/checkout@v4 17 | with: 18 | submodules: recursive 19 | fetch-depth: 0 20 | 21 | - name: Set up Python 22 | uses: actions/setup-python@v5 23 | with: 24 | # The Steam Runtime platform (sniper) uses Python 3.9 25 | python-version: "3.9" 26 | cache: 'pip' # caching pip dependencies 27 | 28 | - name: Install Python dependencies 29 | run: | 30 | pip install ijson 31 | pip install trio 32 | pip install "steam[client]" 33 | 34 | # PyRight, the unit tests, and other scripts import/resolve the "protonfixes" module 35 | # We are using the path "umu-protonfixes", which isn't a valid module name and can't be used 36 | # However: this simple, hacky symbolic link in the parent folder can fix this inconvenience 37 | - name: Fix python module resolution 38 | run: ln -rs . ../protonfixes 39 | 40 | # FIXME: problem matcher is currently disabled upstream, using a fork for the moment 41 | # https://github.com/ludeeus/action-shellcheck/pull/103 42 | # FIXME: symlinks don't work upstream 43 | # https://github.com/ludeeus/action-shellcheck/pull/104 44 | - name: Run ShellCheck 45 | uses: Root-Core/action-shellcheck@fork 46 | with: 47 | ignore_paths: subprojects # prevent ShellCheck from checking unrelated files 48 | ignore_symlinks: false # winetricks is symlinked 49 | 50 | # Ruff uses ruff.toml for it's configuration 51 | - name: Lint with Ruff 52 | uses: astral-sh/ruff-action@v3 53 | 54 | # Pyright uses pyproject.toml for it's configuration 55 | - name: Static type checking with Pyright 56 | uses: jakebailey/pyright-action@v2 57 | 58 | - name: Validate gamefix modules 59 | run: | 60 | python3 .github/scripts/check_gamefixes.py 61 | python3 .github/scripts/check_verbs.py 62 | 63 | - name: Validate gamefix imports 64 | run: | 65 | python3 .github/scripts/check_imports.py 66 | 67 | - name: Test with unittest 68 | run: | 69 | cd .. 70 | python3 -m protonfixes.protonfixes_test 71 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Builing umu-protonfixes binaries 2 | builddir/ 3 | dist/ 4 | subprojects/ 5 | 6 | # Byte-compiled / optimized / DLL files 7 | __pycache__/ 8 | *.py[cod] 9 | *$py.class 10 | 11 | # C extensions 12 | *.so 13 | 14 | # Distribution / packaging 15 | .Python 16 | build/ 17 | develop-eggs/ 18 | dist/ 19 | downloads/ 20 | eggs/ 21 | .eggs/ 22 | lib/ 23 | lib64/ 24 | parts/ 25 | sdist/ 26 | var/ 27 | wheels/ 28 | *.egg-info/ 29 | .installed.cfg 30 | *.egg 31 | MANIFEST 32 | 33 | # PyInstaller 34 | # Usually these files are written by a python script from a template 35 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 36 | *.manifest 37 | *.spec 38 | 39 | # Installer logs 40 | pip-log.txt 41 | pip-delete-this-directory.txt 42 | 43 | # Unit test / coverage reports 44 | htmlcov/ 45 | .tox/ 46 | .nox/ 47 | .coverage 48 | .coverage.* 49 | .cache 50 | nosetests.xml 51 | coverage.xml 52 | *.cover 53 | .hypothesis/ 54 | .pytest_cache/ 55 | 56 | # Translations 57 | *.mo 58 | *.pot 59 | 60 | # Django stuff: 61 | *.log 62 | local_settings.py 63 | db.sqlite3 64 | 65 | # Flask stuff: 66 | instance/ 67 | .webassets-cache 68 | 69 | # Scrapy stuff: 70 | .scrapy 71 | 72 | # Sphinx documentation 73 | docs/_build/ 74 | 75 | # PyBuilder 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # IPython 82 | profile_default/ 83 | ipython_config.py 84 | 85 | # pyenv 86 | .python-version 87 | 88 | # celery beat schedule file 89 | celerybeat-schedule 90 | 91 | # SageMath parsed files 92 | *.sage.py 93 | 94 | # Environments 95 | .env 96 | .venv 97 | env/ 98 | venv/ 99 | ENV/ 100 | env.bak/ 101 | venv.bak/ 102 | 103 | # Spyder project settings 104 | .spyderproject 105 | .spyproject 106 | 107 | # Rope project settings 108 | .ropeproject 109 | 110 | # mkdocs documentation 111 | /site 112 | 113 | # mypy 114 | .mypy_cache/ 115 | .dmypy.json 116 | dmypy.json 117 | 118 | # test deployment 119 | deploy.sh 120 | 121 | # vscode 122 | .vscode 123 | 124 | # pycharm 125 | .idea 126 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "subprojects/libmspack"] 2 | path = subprojects/libmspack 3 | url = https://github.com/kyz/libmspack.git 4 | [submodule "subprojects/winetricks"] 5 | path = subprojects/winetricks 6 | url = https://github.com/Winetricks/winetricks.git 7 | [submodule "subprojects/umu-database"] 8 | path = subprojects/umu-database 9 | url = https://github.com/Open-Wine-Components/umu-database 10 | [submodule "subprojects/unzip"] 11 | path = subprojects/unzip 12 | url = https://salsa.debian.org/sanvila/unzip.git 13 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | repos: 2 | - repo: https://github.com/pre-commit/pre-commit-hooks 3 | rev: v5.0.0 4 | hooks: 5 | - id: trailing-whitespace 6 | - id: check-merge-conflict 7 | - id: check-symlinks 8 | - id: end-of-file-fixer 9 | - id: mixed-line-ending 10 | - repo: https://github.com/astral-sh/ruff-pre-commit 11 | rev: v0.11.9 12 | hooks: 13 | - id: ruff 14 | - repo: https://github.com/RobertCraigie/pyright-python 15 | rev: v1.1.400 16 | hooks: 17 | - id: pyright 18 | additional_dependencies: 19 | - ijson 20 | - trio 21 | - steam[client] 22 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 2-Clause License 2 | 3 | Copyright (c) 2018, Chris Simons 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are met: 7 | 8 | 1. Redistributions of source code must retain the above copyright notice, this 9 | list of conditions and the following disclaimer. 10 | 11 | 2. Redistributions in binary form must reproduce the above copyright notice, 12 | this list of conditions and the following disclaimer in the documentation 13 | and/or other materials provided with the distribution. 14 | 15 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" 16 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 | DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 21 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 22 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 23 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 | -------------------------------------------------------------------------------- /__init__.py: -------------------------------------------------------------------------------- 1 | """Starts the protonfix module and runs fixes after pre-flight-checks""" 2 | 3 | import os 4 | import sys 5 | import traceback 6 | from typing import Callable 7 | 8 | from . import fix 9 | from .logger import log 10 | 11 | sys.path.insert( 12 | 0, 13 | f'{os.path.dirname(os.path.realpath(__file__))}/_vendor', # noqa: PTH120 14 | ) 15 | 16 | bin_dir: str = f'{os.path.dirname(os.path.realpath(__file__))}/files/bin' 17 | i386_lib_dir: str = f'{os.path.dirname(os.path.realpath(__file__))}/files/lib/i386-linux-gnu' 18 | x86_64_lib_dir: str = f'{os.path.dirname(os.path.realpath(__file__))}/files/lib/x86_64-linux-gnu' 19 | 20 | 21 | def check_conditions() -> bool: 22 | """Determine, if the actual game was executed and protonfixes isn't deactivated. 23 | 24 | Returns: 25 | bool: True, if the fix should be executed. 26 | 27 | """ 28 | return ( 29 | len(sys.argv) >= 1 30 | and 'STEAM_COMPAT_DATA_PATH' in os.environ 31 | and 'PROTONFIXES_DISABLE' not in os.environ 32 | and 'waitforexitandrun' in sys.argv[1] 33 | ) 34 | 35 | 36 | def check_iscriptevaluator() -> bool: 37 | """Determine, if we were invoked while running "iscriptevaluator.exe". 38 | 39 | Returns: 40 | bool: True, if we were invoked while running "iscriptevaluator.exe". 41 | 42 | """ 43 | return len(sys.argv) >= 3 and 'iscriptevaluator.exe' in sys.argv[2] 44 | 45 | 46 | def setup(env: dict, bin_path_var: str, lib_path_var: str, func: Callable[[dict, str, str, str], None]) -> None: 47 | """Setup PATH and LD_LIBRARY_PATH to include protonfixes's binary and library paths""" 48 | func(env, bin_path_var, bin_dir, ':') 49 | func(env, lib_path_var, f'{x86_64_lib_dir}:{i386_lib_dir}', ':') 50 | 51 | 52 | def execute() -> None: 53 | """Execute protonfixes""" 54 | if check_iscriptevaluator(): 55 | log.debug('Skipping fix execution. We are running "iscriptevaluator.exe".') 56 | elif not check_conditions(): 57 | log.warn('Skipping fix execution. We are probably running an unit test.') 58 | else: 59 | try: 60 | fix.main() 61 | 62 | # Catch any exceptions and print a traceback 63 | except Exception: 64 | sys.stderr.write('ProtonFixes ' + traceback.format_exc()) 65 | sys.stderr.flush() 66 | 67 | 68 | __all__ = ["setup", "execute"] 69 | -------------------------------------------------------------------------------- /checks.py: -------------------------------------------------------------------------------- 1 | """Run some tests and generate warnings for proton configuration issues""" 2 | 3 | from .logger import log 4 | 5 | 6 | def esync_file_limits() -> bool: 7 | """Check esync file limits using /proc/sys/fs/file-max 8 | 9 | https://www.reddit.com/r/SteamPlay/comments/9kqisk/tip_for_those_using_proton_no_esync1/ 10 | """ 11 | warning = """File descriptor limit is low 12 | This can cause issues with ESYNC 13 | For more details see: 14 | https://github.com/zfigura/wine/blob/esync/README.esync 15 | """ 16 | 17 | with open('/proc/sys/fs/file-max', encoding='ascii') as fsmax: 18 | max_files = fsmax.readline() 19 | if int(max_files) < 8192: 20 | log.warn(warning) 21 | return False 22 | return True 23 | 24 | 25 | def run_checks() -> None: 26 | """Run checks to notify of any potential issues""" 27 | log.info('Running checks') 28 | checks = [ 29 | esync_file_limits(), 30 | ] 31 | if all(checks): 32 | log.info('All checks successful') 33 | -------------------------------------------------------------------------------- /config.py: -------------------------------------------------------------------------------- 1 | """Load configuration settings for protonfixes""" 2 | 3 | from dataclasses import dataclass 4 | from pathlib import Path 5 | 6 | from .config_base import ConfigBase 7 | 8 | 9 | class Config(ConfigBase): 10 | """Configuration for umu-protonfix""" 11 | 12 | @dataclass 13 | class MainSection: 14 | """General parameters 15 | 16 | Attributes: 17 | enable_checks (bool): Run checks (`checks.py`) before the fix is executed. 18 | enable_global_fixes (bool): Enables included fixes. If deactivated, only local fixes (`~/.config/protonfixes/localfixes`) are executed. 19 | 20 | """ 21 | 22 | enable_checks: bool = True 23 | enable_global_fixes: bool = True 24 | 25 | @dataclass 26 | class PathSection: 27 | """Path parameters 28 | 29 | Attributes: 30 | cache_dir (Path): The path that should be used to create temporary and cached files. 31 | 32 | """ 33 | 34 | cache_dir: Path = Path.home() / '.cache/protonfixes' 35 | 36 | main: MainSection 37 | path: PathSection 38 | 39 | 40 | config = Config(Path.home() / '.config/protonfixes/config.ini') 41 | -------------------------------------------------------------------------------- /debug.py: -------------------------------------------------------------------------------- 1 | """Prints debug info if the environment variable DEBUG is 1""" 2 | 3 | import os 4 | import sys 5 | 6 | from __main__ import CURRENT_PREFIX_VERSION, g_proton 7 | from .logger import log 8 | 9 | os.environ['DEBUG'] = '1' 10 | 11 | 12 | def show_debug_info() -> None: 13 | """Show various debug info""" 14 | check_args = [ 15 | 'iscriptevaluator.exe' in sys.argv[2], 16 | 'getcompatpath' in sys.argv[1], 17 | 'getnativepath' in sys.argv[1], 18 | ] 19 | 20 | if any(check_args): 21 | log.debug(str(sys.argv)) 22 | return 23 | 24 | line = '---------------------------------------' 25 | log.debug('---- begin protontricks debug info ----') 26 | log.debug('Proton Python Version:') 27 | log.debug(sys.executable) 28 | log.debug(sys.version) 29 | log.debug(line) 30 | 31 | log.debug('Proton Version:') 32 | log.debug(CURRENT_PREFIX_VERSION) 33 | log.debug(line) 34 | 35 | log.debug('Proton Directory:') 36 | log.debug(g_proton.base_dir) 37 | log.debug(line) 38 | 39 | ignorevars = [ 40 | 'SteamUser', 41 | 'OLDPWD', 42 | 'SteamAppUser', 43 | 'LS_COLORS', 44 | ] 45 | 46 | log.debug('Environment Variables:') 47 | for key, value in os.environ.items(): 48 | if key not in ignorevars: 49 | log.debug(key + '=' + value) 50 | log.debug(line) 51 | 52 | log.debug('Command Line:') 53 | log.debug(f'{sys.argv}') 54 | log.debug('----- end protontricks debug info -----') 55 | 56 | 57 | show_debug_info() 58 | -------------------------------------------------------------------------------- /download.py: -------------------------------------------------------------------------------- 1 | """Module with helper functions to download from file-hosting providers""" 2 | 3 | import os 4 | import hashlib 5 | import urllib.request 6 | import http.cookiejar 7 | 8 | 9 | GDRIVE_URL = 'https://drive.google.com/uc?id={}&export=download' 10 | HASH_BLOCK_SIZE = 65536 11 | 12 | 13 | def get_filename(headers: list) -> str: 14 | """Retrieve a filename from a request headers via Content-Disposition""" 15 | content_disp = [x for x in headers if x[0] == 'Content-Disposition'][0][1] 16 | raw_filename = [x for x in content_disp.split(';') if x.startswith('filename=')][0] 17 | return raw_filename.replace('filename=', '').replace('"', '') 18 | 19 | 20 | def gdrive_download(gdrive_id: str, path: str) -> None: 21 | """Download a file from gdrive given the fileid and a path to save""" 22 | url = GDRIVE_URL.format(gdrive_id) 23 | cjar = http.cookiejar.CookieJar() 24 | opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar)) 25 | urllib.request.install_opener(opener) 26 | 27 | req = urllib.request.Request(url) 28 | with urllib.request.urlopen(req, timeout=10) as resp: 29 | confirm_cookie = [ 30 | x 31 | for x in resp.getheaders() 32 | if (x[0] == 'Set-Cookie' and x[1].startswith('download_warning')) 33 | ][0][1] 34 | confirm = confirm_cookie.split(';')[0].split('=')[1] 35 | 36 | req = urllib.request.Request(f'{url}&confirm={confirm}') 37 | with urllib.request.urlopen(req, timeout=10) as resp: 38 | filename = get_filename(resp.getheaders()) 39 | with open(os.path.join(path, filename), 'wb') as save_file: 40 | save_file.write(resp.read()) 41 | 42 | 43 | def sha1sum(filename: str) -> str: 44 | """Computes the sha1sum of the specified file""" 45 | if not os.path.isfile(filename): 46 | return '' 47 | hasher = hashlib.sha1() 48 | with open(filename, 'rb') as hash_file: 49 | buf = hash_file.read(HASH_BLOCK_SIZE) 50 | while len(buf) > 0: 51 | hasher.update(buf) 52 | buf = hash_file.read(HASH_BLOCK_SIZE) 53 | return hasher.hexdigest() 54 | -------------------------------------------------------------------------------- /gamefixes-amazon/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Open-Wine-Components/umu-protonfixes/992c6351e87dcd24bd66d973c3b1bf181c8bda85/gamefixes-amazon/__init__.py -------------------------------------------------------------------------------- /gamefixes-battlenet/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Open-Wine-Components/umu-protonfixes/992c6351e87dcd24bd66d973c3b1bf181c8bda85/gamefixes-battlenet/__init__.py -------------------------------------------------------------------------------- /gamefixes-ea/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Open-Wine-Components/umu-protonfixes/992c6351e87dcd24bd66d973c3b1bf181c8bda85/gamefixes-ea/__init__.py -------------------------------------------------------------------------------- /gamefixes-ea/umu-1222690.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/1222690.py -------------------------------------------------------------------------------- /gamefixes-ea/umu-2009100.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/2009100.py -------------------------------------------------------------------------------- /gamefixes-egs/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Open-Wine-Components/umu-protonfixes/992c6351e87dcd24bd66d973c3b1bf181c8bda85/gamefixes-egs/__init__.py -------------------------------------------------------------------------------- /gamefixes-egs/default.py: -------------------------------------------------------------------------------- 1 | """Setup for all EGS games (EGL will do this normally)""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('vcrun2022') 8 | util.regedit_add('HKCR\\com.epicgames.launcher') 9 | -------------------------------------------------------------------------------- /gamefixes-egs/umu-1174180.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/1174180.py -------------------------------------------------------------------------------- /gamefixes-egs/umu-1659420.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/1659420.py -------------------------------------------------------------------------------- /gamefixes-egs/umu-19900.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/19900.py -------------------------------------------------------------------------------- /gamefixes-egs/umu-2009100.py: -------------------------------------------------------------------------------- 1 | """Game fix for Immortals of Aveum""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Set SteamGameId so that non-steam versions can pick up steam-specific fixes in proton's wine code 8 | util.set_environment('SteamGameId', '2009100') 9 | -------------------------------------------------------------------------------- /gamefixes-egs/umu-220240.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/220240.py -------------------------------------------------------------------------------- /gamefixes-egs/umu-233270.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/233270.py -------------------------------------------------------------------------------- /gamefixes-egs/umu-2552430.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/2552430.py -------------------------------------------------------------------------------- /gamefixes-egs/umu-271590.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/271590.py -------------------------------------------------------------------------------- /gamefixes-egs/umu-2767030.py: -------------------------------------------------------------------------------- 1 | """Game fix for Marvel Rivals""" 2 | # EGS-ID 575efd0b5dd54429b035ffc8fe2d36d0 3 | 4 | from protonfixes import util 5 | 6 | 7 | def main() -> None: 8 | util.replace_command('epic_launch_helper.exe', 'MarvelRivals_Launcher.exe') 9 | 10 | # Set SteamDeck=1 to be able to launch the game 11 | util.set_environment('SteamDeck', '1') 12 | -------------------------------------------------------------------------------- /gamefixes-egs/umu-286690.py: -------------------------------------------------------------------------------- 1 | """Metro 2033 Redux""" 2 | # EGS-ID petunia 3 | 4 | from protonfixes import util 5 | 6 | 7 | def main() -> None: 8 | util.protontricks('d3dcompiler_47') 9 | -------------------------------------------------------------------------------- /gamefixes-egs/umu-287390.py: -------------------------------------------------------------------------------- 1 | """Metro Last Light Redux""" 2 | # EGS-ID speedwell 3 | 4 | from protonfixes import util 5 | 6 | 7 | def main() -> None: 8 | util.protontricks('d3dcompiler_47') 9 | -------------------------------------------------------------------------------- /gamefixes-egs/umu-298110.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/298110.py -------------------------------------------------------------------------------- /gamefixes-egs/umu-3513350.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-umu/umu-3513350.py -------------------------------------------------------------------------------- /gamefixes-egs/umu-371660.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/371660.py -------------------------------------------------------------------------------- /gamefixes-egs/umu-397540.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/397540.py -------------------------------------------------------------------------------- /gamefixes-egs/umu-40800.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/40800.py -------------------------------------------------------------------------------- /gamefixes-egs/umu-409710.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/409720.py -------------------------------------------------------------------------------- /gamefixes-egs/umu-409720.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/409720.py -------------------------------------------------------------------------------- /gamefixes-egs/umu-825cd0b5286c404289d456d47561cc1a.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-umu/umu-zenlesszonezero.py -------------------------------------------------------------------------------- /gamefixes-gog/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Open-Wine-Components/umu-protonfixes/992c6351e87dcd24bd66d973c3b1bf181c8bda85/gamefixes-gog/__init__.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-1105510.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/1105510.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-1141086411.py: -------------------------------------------------------------------------------- 1 | """Silent Hill 4: The Room""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # GOG's dxcfg / Steam006 fixes 8 | util.winedll_override('d3d8', util.OverrideOrder.NATIVE_BUILTIN) 9 | 10 | # Ultimate ASI Loader / Silent Hill 4 Randomizer 11 | util.winedll_override('dsound', util.OverrideOrder.NATIVE_BUILTIN) 12 | -------------------------------------------------------------------------------- /gamefixes-gog/umu-1151640.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/1151640.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-1209310984.py: -------------------------------------------------------------------------------- 1 | """Game fix for Full Metal Daemon Muramasa""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.disable_protonmediaconverter() 8 | util.winedll_override('wmvdecod', util.OverrideOrder.DISABLED) 9 | -------------------------------------------------------------------------------- /gamefixes-gog/umu-1228964594.py: -------------------------------------------------------------------------------- 1 | """Game fix for Soldier of Fortune II: Double Helix - Gold Edition""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Fix display issues 8 | util.set_environment('MESA_EXTENSION_MAX_YEAR', '2003') 9 | util.set_environment('__GL_ExtensionStringVersion', '17700') 10 | -------------------------------------------------------------------------------- /gamefixes-gog/umu-15130.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/15130.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-1580232252.py: -------------------------------------------------------------------------------- 1 | """Resident Evil (1997)""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.winedll_override('ddraw', util.OverrideOrder.NATIVE_BUILTIN) 8 | util.winedll_override('dinput', util.OverrideOrder.NATIVE_BUILTIN) 9 | -------------------------------------------------------------------------------- /gamefixes-gog/umu-1584652180.py: -------------------------------------------------------------------------------- 1 | """The Wheel of Time""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.winedll_override('ddraw', util.OverrideOrder.NATIVE_BUILTIN) # GOG's dxcfg 8 | -------------------------------------------------------------------------------- /gamefixes-gog/umu-1587885678.py: -------------------------------------------------------------------------------- 1 | """Game fix for Breath of Fire IV""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Load shipped dlls""" 8 | util.winedll_override('ddraw', util.OverrideOrder.NATIVE_BUILTIN) 9 | util.winedll_override('dinput', util.OverrideOrder.NATIVE_BUILTIN) 10 | -------------------------------------------------------------------------------- /gamefixes-gog/umu-1597741823.py: -------------------------------------------------------------------------------- 1 | """Dino Crisis 2""" 2 | # GOG-ID 1597741823 3 | 4 | from protonfixes import util 5 | 6 | 7 | def main() -> None: 8 | util.winedll_override('ddraw', util.OverrideOrder.NATIVE_BUILTIN) 9 | util.winedll_override('dinput', util.OverrideOrder.NATIVE_BUILTIN) 10 | -------------------------------------------------------------------------------- /gamefixes-gog/umu-1606830592.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/1277930.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-1661434114.py: -------------------------------------------------------------------------------- 1 | """Dino Crisis""" 2 | # GOG-ID 1661434114 3 | 4 | from protonfixes import util 5 | 6 | 7 | def main() -> None: 8 | util.winedll_override('ddraw', util.OverrideOrder.NATIVE_BUILTIN) 9 | util.winedll_override('dinput', util.OverrideOrder.NATIVE_BUILTIN) 10 | -------------------------------------------------------------------------------- /gamefixes-gog/umu-1685981342.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/452440.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-1697970811.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/452440.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-1771973390.py: -------------------------------------------------------------------------------- 1 | """METAL GEAR SOLID""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Override for wrapper shipped with the game""" 8 | util.winedll_override('ddraw', util.OverrideOrder.NATIVE_BUILTIN) 9 | util.winedll_override('dinput', util.OverrideOrder.NATIVE_BUILTIN) 10 | -------------------------------------------------------------------------------- /gamefixes-gog/umu-1814107259.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/888790.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-1944735225.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/1829980.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-2044697588.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/452440.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-2069117974.py: -------------------------------------------------------------------------------- 1 | """METAL GEAR SOLID 2 SUBSTANCE""" 2 | # GOG-ID 2069117974 3 | 4 | from protonfixes import util 5 | 6 | 7 | def main() -> None: 8 | util.protontricks('dsound') 9 | util.protontricks('directmusic') 10 | util.protontricks('dsdmo') 11 | util.protontricks('quartz') 12 | -------------------------------------------------------------------------------- /gamefixes-gog/umu-207350.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/207350.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-20920.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/20920.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-219990.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/219990.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-22610.py: -------------------------------------------------------------------------------- 1 | """Alien Breed: Impact""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('physx') 8 | -------------------------------------------------------------------------------- /gamefixes-gog/umu-22650.py: -------------------------------------------------------------------------------- 1 | """Alien Breed 2: Assault""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('physx') 8 | -------------------------------------------------------------------------------- /gamefixes-gog/umu-22670.py: -------------------------------------------------------------------------------- 1 | """Alien Breed 3: Descent""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('physx') 8 | -------------------------------------------------------------------------------- /gamefixes-gog/umu-237890.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/237890.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-245050.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/39540.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-251150.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/251150.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-251290.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/251290.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-260130.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/260130.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-311770.py: -------------------------------------------------------------------------------- 1 | """Game fix for LEGO® Pirates of the Caribbean""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('d3dcompiler_47') 8 | -------------------------------------------------------------------------------- /gamefixes-gog/umu-312790.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/312790.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-356190.py: -------------------------------------------------------------------------------- 1 | """Game fix for Middle-earth: Shadow of War""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Requires vcrun2022 to launch 8 | util.protontricks('vcrun2022') 9 | -------------------------------------------------------------------------------- /gamefixes-gog/umu-379720.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/379720.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-39190.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/39190.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-39200.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/39200.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-39510.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/39510.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-39540.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/39540.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-39550.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/39540.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-409710.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/409720.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-409720.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/409720.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-436670.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/436670.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-61500.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/61500.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-644930.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/644930.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-65530.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/39540.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-65540.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/65540.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-7670.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/409720.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-8850.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/409720.py -------------------------------------------------------------------------------- /gamefixes-gog/umu-955050.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/955050.py -------------------------------------------------------------------------------- /gamefixes-humble/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Open-Wine-Components/umu-protonfixes/992c6351e87dcd24bd66d973c3b1bf181c8bda85/gamefixes-humble/__init__.py -------------------------------------------------------------------------------- /gamefixes-humble/umu-2009100.py: -------------------------------------------------------------------------------- 1 | """Game fix for Immortals of Aveum""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Set SteamGameId so that non-steam versions can pick up steam-specific fixes in proton's wine code 8 | util.set_environment('SteamGameId', '2009100') 9 | -------------------------------------------------------------------------------- /gamefixes-humble/umu-207350.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/207350.py -------------------------------------------------------------------------------- /gamefixes-humble/umu-61500.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/61500.py -------------------------------------------------------------------------------- /gamefixes-itchio/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Open-Wine-Components/umu-protonfixes/992c6351e87dcd24bd66d973c3b1bf181c8bda85/gamefixes-itchio/__init__.py -------------------------------------------------------------------------------- /gamefixes-steam/1017900.py: -------------------------------------------------------------------------------- 1 | """Game fix for Age of Empires: DE""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Changes the proton argument from the launcher to the game""" 8 | # Replace launcher with game exe in proton arguments 9 | util.append_argument('-NoStartup') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/10220.py: -------------------------------------------------------------------------------- 1 | """Postal III""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | # Missing fonts for console and various UI 7 | # grep -rh --include "*.res" '"name"' . | awk -F '"' '{print $4}' | awk '!visited[$0]++' 8 | def main() -> None: 9 | util.protontricks('lucida') 10 | util.protontricks('courier') 11 | util.protontricks('verdana') 12 | util.protontricks('trebuchet') 13 | util.protontricks('arial') 14 | util.protontricks('tahoma') 15 | -------------------------------------------------------------------------------- /gamefixes-steam/1030830.py: -------------------------------------------------------------------------------- 1 | """Game fix for Mafia II Definitive Edition""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Enable NVIDIA PhysX support.""" 8 | util.protontricks('physx') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/105400.py: -------------------------------------------------------------------------------- 1 | """Game fix for Fable III""" 2 | 3 | import os 4 | import shutil 5 | 6 | from protonfixes import util 7 | from protonfixes.logger import log 8 | 9 | 10 | def main() -> None: 11 | # https://www.reddit.com/r/SteamDeck/comments/vuagy2/finally_got_fable_3_working/ 12 | util.protontricks('xliveless') 13 | 14 | # Remove Windows Live folder 15 | dirpath = os.path.join( 16 | util.protonprefix(), 17 | 'drive_c', 18 | 'Program Files', 19 | 'Common Files', 20 | 'Microsoft Shared', 21 | 'Windows Live', 22 | ) 23 | if os.path.exists(dirpath): 24 | shutil.rmtree(dirpath) 25 | else: 26 | log.info(f"Path '{dirpath}' could not be found") 27 | -------------------------------------------------------------------------------- /gamefixes-steam/105450.py: -------------------------------------------------------------------------------- 1 | """Game fix for Age Of Empire 3: Complete Collection""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs corefonts, l3codecx, mfc42, winxp""" 8 | # https://github.com/ValveSoftware/Proton/issues/17#issuecomment-415977510 9 | util.protontricks('mfc42') 10 | util.protontricks('l3codecx') 11 | util.protontricks('corefonts') 12 | util.protontricks('winxp') 13 | -------------------------------------------------------------------------------- /gamefixes-steam/1056640.py: -------------------------------------------------------------------------------- 1 | """Game fix for Phantasy Star Online 2""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.set_environment('WINE_NO_OPEN_FILE_SEARCH', 'pso2_bin/data') 8 | -------------------------------------------------------------------------------- /gamefixes-steam/1062040.py: -------------------------------------------------------------------------------- 1 | """Dragon Star Varnir""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Dragon Star Varnir fix""" 8 | # Fixes the startup process. 9 | util.winedll_override('xactengine3_7', util.OverrideOrder.NATIVE) 10 | -------------------------------------------------------------------------------- /gamefixes-steam/1063730.py: -------------------------------------------------------------------------------- 1 | """Game fix for New World""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Needs core count limit""" 8 | # Fix the startup process: 9 | util.set_cpu_topology_limit(12) 10 | -------------------------------------------------------------------------------- /gamefixes-steam/108710.py: -------------------------------------------------------------------------------- 1 | """Alan Wake""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs d3dcompiler_47""" 8 | # Fixes error on launch 9 | util.protontricks('d3dcompiler_47') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/1097150.py: -------------------------------------------------------------------------------- 1 | """Game fix for Fall Guys""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Create symlink of eac so at the right location""" 8 | util.install_eac_runtime() 9 | util.set_environment('DOTNET_BUNDLE_EXTRACT_BASE_DIR', '') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/1105510.py: -------------------------------------------------------------------------------- 1 | """Game fix for Yakuza 5""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Needs WINE_DISABLE_SFN set from this patch: https://github.com/ValveSoftware/wine/pull/205""" 8 | util.set_environment('WINE_DISABLE_SFN', '1') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/110800.py: -------------------------------------------------------------------------------- 1 | """Game fix for L.A. Noire""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs d3dx9_43, d3dcompiler_43, d3dx11_43, d3dcompiler_47 8 | forces dx11 (enables intro cinematics) without editing settings.ini 9 | """ 10 | # https://github.com/ValveSoftware/Proton/issues/544#issuecomment-826150012 11 | util.protontricks('d3dx9_43') 12 | util.protontricks('d3dcompiler_43') 13 | util.protontricks('d3dx11_43') 14 | util.protontricks('d3dcompiler_47') 15 | util.append_argument('-dx11') 16 | -------------------------------------------------------------------------------- /gamefixes-steam/1112400.py: -------------------------------------------------------------------------------- 1 | """Game fix for Project Torque""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Game needs dotnet35 to launch""" 8 | """https://bugs.winehq.org/show_bug.cgi?id=57666""" 9 | util.protontricks('dotnet35sp1') 10 | util.protontricks('win10') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/1121560.py: -------------------------------------------------------------------------------- 1 | """Atelier Ryza: Ever Darkness & the Secret Hideout 2 | Missing voices/sounds in cutscenes 3 | Requires disabling the gstreamer protonaudioconverterbin plugin to get full audio in cutscenes 4 | """ 5 | 6 | from protonfixes import util 7 | 8 | 9 | def main() -> None: 10 | util.disable_protonmediaconverter() 11 | -------------------------------------------------------------------------------- /gamefixes-steam/11440.py: -------------------------------------------------------------------------------- 1 | """Colin McRae: DiRT""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """The game crashes without limiting cores""" 8 | util.set_cpu_topology_limit(4) 9 | -------------------------------------------------------------------------------- /gamefixes-steam/1144400.py: -------------------------------------------------------------------------------- 1 | """Game fix for Senren*Banka""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Install quartz, wmp11, qasf 8 | Fixes in-game video playback for the intro and ending. 9 | """ 10 | util.protontricks('quartz') 11 | util.protontricks('wmp11') 12 | util.protontricks('qasf') 13 | -------------------------------------------------------------------------------- /gamefixes-steam/1151440.py: -------------------------------------------------------------------------------- 1 | """Utawarerumono: Mask of Truth""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Can't find saves for Mask of Deception.""" 8 | util.import_saves_folder( 9 | 1149550, 'Documents/AQUAPLUS/Utawarerumono Mask of Deception/Save' 10 | ) 11 | -------------------------------------------------------------------------------- /gamefixes-steam/1151640.py: -------------------------------------------------------------------------------- 1 | """Game fix for Horizon Zero Dawn""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # C++ runtime is not provided in the manifest 8 | util.protontricks('vcrun2019') 9 | # Set SteamGameId so that non-steam versions can pick up steam-specific fixes in proton's wine code 10 | util.set_environment('SteamGameId', '1151640') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/1158850.py: -------------------------------------------------------------------------------- 1 | """The Great Ace Attorney Chronicles 2 | Missing sound in bonus content videos 3 | Requires disabling the gstreamer protonaudioconverterbin to get full audio 4 | """ 5 | 6 | from protonfixes import util 7 | 8 | 9 | def main() -> None: 10 | util.disable_protonmediaconverter() 11 | -------------------------------------------------------------------------------- /gamefixes-steam/1174180.py: -------------------------------------------------------------------------------- 1 | """Game fix for Red Dead Redemption 2""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Sometimes game will not launch if -fullscreen -vulkan is not specified""" 8 | util.append_argument('-fullscreen -vulkan') 9 | # Set SteamGameId so that non-steam versions can pick up steam-specific fixes in proton's wine code 10 | util.set_environment('SteamGameId', '1174180') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/1175730.py: -------------------------------------------------------------------------------- 1 | """Game fix Tree Of Savior""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """https://forum.treeofsavior.com/t/linux-the-graphic-card-does-not-support-directx11-13ep/418073/13""" 8 | util.protontricks('d3dcompiler_47') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/12200.py: -------------------------------------------------------------------------------- 1 | """Game fix for Bully: Scholarship Edition""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Video playback is working since GE-Proton 9.11 - without audio 8 | Disabling the media converter fixes this issue 9 | """ 10 | util.disable_protonmediaconverter() 11 | -------------------------------------------------------------------------------- /gamefixes-steam/12210.py: -------------------------------------------------------------------------------- 1 | """Game fix for GTA IV""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs wmp11""" 8 | # Fixes Independence FM user radio station 9 | util.protontricks('wmp11') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/1222370.py: -------------------------------------------------------------------------------- 1 | """Necromunda: Hired Gun""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.replace_command( 8 | 'Necromunda.exe', 'Necromunda/Binaries/Win64/Necromunda-Win64-Shipping.exe' 9 | ) 10 | -------------------------------------------------------------------------------- /gamefixes-steam/1222690.py: -------------------------------------------------------------------------------- 1 | """Game fix for Dragon Age Inquisition""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Has Xinput patch in proton-wine""" 8 | # Set SteamGameId so that non-steam versions can pick up steam-specific fixes in proton's wine code 9 | util.set_environment('SteamGameId', '1222690') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/1237970.py: -------------------------------------------------------------------------------- 1 | """Game fix for Titanfall 2""" 2 | 3 | import os 4 | import subprocess 5 | import glob 6 | from protonfixes import util 7 | 8 | 9 | def main() -> None: 10 | """Allow -northstar option to work""" 11 | # Define game directory 12 | install_dir = glob.escape(util.get_game_install_path()) 13 | 14 | # Restore original titanfall2.exe if NorthstarLauncher.exe was previously symlinked 15 | if os.path.isfile(install_dir + '/Titanfall2.exe.bak'): 16 | subprocess.run(['mv', 'Titanfall2.exe.bak', 'Titanfall2.exe'], check=False) 17 | -------------------------------------------------------------------------------- /gamefixes-steam/1239520.py: -------------------------------------------------------------------------------- 1 | """Madden NFL 21 needs vcrun2019 for online mode to work""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Replace launcher with game exe in proton arguments 8 | util.protontricks('vcrun2019') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/1240440.py: -------------------------------------------------------------------------------- 1 | """Halo Infinite needs vcrun2019""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('vcrun2019') 8 | -------------------------------------------------------------------------------- /gamefixes-steam/1245620.py: -------------------------------------------------------------------------------- 1 | """Game fix for Elden Ring: Create the `DLC.bdt` and `DLC.bhd` files to work around the "Inappropriate activity detected" error for players that don't own the DLC""" 2 | 3 | from pathlib import Path 4 | from protonfixes import util 5 | 6 | 7 | def main() -> None: 8 | game_dir = Path(util.get_game_install_path()) / 'Game' 9 | # Create the DLC.bdt file if it doesn't already exist, which is known to fix Easy AntiCheat not working for players that don't own the DLC 10 | # A blank file is enough to get multiplayer working 11 | (game_dir / 'DLC.bdt').touch(exist_ok=True) 12 | # Now also needs DLC.bhd after 1.14 patch 13 | (game_dir / 'DLC.bhd').touch(exist_ok=True) 14 | -------------------------------------------------------------------------------- /gamefixes-steam/1250410.py: -------------------------------------------------------------------------------- 1 | """Game fix for Flight Simulator 2020""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Needs fastlaunch option""" 8 | # Fixes the startup process. 9 | util.append_argument('-FastLaunch') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/1257290.py: -------------------------------------------------------------------------------- 1 | """Atelier Ryza 2: Lost Legends & the Secret Fairy 2 | Missing voices/sounds in cutscenes 3 | Requires disabling the gstreamer protonaudioconverterbin plugin to get full audio in cutscenes 4 | """ 5 | 6 | from protonfixes import util 7 | 8 | 9 | def main() -> None: 10 | util.disable_protonmediaconverter() 11 | -------------------------------------------------------------------------------- /gamefixes-steam/1259970.py: -------------------------------------------------------------------------------- 1 | """Game fix for Pes 2021""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Replace launcher with game exe in proton arguments 8 | util.protontricks('vcrun2019') 9 | util.protontricks('allfonts') 10 | util.protontricks('dotnet462') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/1272580.py: -------------------------------------------------------------------------------- 1 | """Nine Witches: Family Disruption 2 | No music 3 | """ 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main() -> None: 9 | util.disable_protonmediaconverter() 10 | -------------------------------------------------------------------------------- /gamefixes-steam/1277510.py: -------------------------------------------------------------------------------- 1 | """Game fix for Re:ZERO -Starting Life in Another World- The Prophecy of the Throne""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('d3dcompiler_47') 8 | -------------------------------------------------------------------------------- /gamefixes-steam/1277930.py: -------------------------------------------------------------------------------- 1 | """Game fix for Riddle Joker""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Install quartz, wmp11, qasf 8 | 9 | Fixes in-game video playback for the intro and ending. 10 | """ 11 | util.protontricks('quartz') 12 | util.protontricks('wmp11') 13 | util.protontricks('qasf') 14 | -------------------------------------------------------------------------------- /gamefixes-steam/12810.py: -------------------------------------------------------------------------------- 1 | """Overlord II""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('physx') # Game crashes without it 8 | -------------------------------------------------------------------------------- /gamefixes-steam/12840.py: -------------------------------------------------------------------------------- 1 | """Game fix for Dirt 2""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """This game uses GFWL, which causes it to fail to launch. xliveless is needed to get this working.""" 8 | util.protontricks('xliveless') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/1284210.py: -------------------------------------------------------------------------------- 1 | """Game fix for Guild Wars 2""" 2 | 3 | import os 4 | from protonfixes import util 5 | 6 | 7 | def main() -> None: 8 | """GW2 add NOSTEAM option.""" 9 | # Fixes the startup process. 10 | if 'NOSTEAM' in os.environ: 11 | util.replace_command('-provider', '') 12 | -------------------------------------------------------------------------------- /gamefixes-steam/1284410.py: -------------------------------------------------------------------------------- 1 | """GWENT: The Witcher Card Game""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs mfc140 8 | 9 | mfc140 is necessary to start the game up. GOG login happens inside the Steam overlay. 10 | 11 | vcrun2019 enables full support of the prelauncher interface. GOG login inside the prelauncher. 12 | This prelauncher is not necessary for the Game. If only mfc is present, it's skipped. 13 | """ 14 | util.protontricks('mfc140') 15 | -------------------------------------------------------------------------------- /gamefixes-steam/1286880.py: -------------------------------------------------------------------------------- 1 | """Ship Graveyard Simulator""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Needs builtin vulkan-1""" 8 | util.winedll_override('vulkan-1', util.OverrideOrder.BUILTIN) 9 | -------------------------------------------------------------------------------- /gamefixes-steam/1293820.py: -------------------------------------------------------------------------------- 1 | """Game fix for YOU and ME and HER: A Love Story""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Fixes audio not playing for in-game videos 8 | util.disable_protonmediaconverter() 9 | -------------------------------------------------------------------------------- /gamefixes-steam/1293830.py: -------------------------------------------------------------------------------- 1 | """Forza Horizon 4""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Replace launcher with game exe in proton arguments 8 | util.protontricks('vcrun2019') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/1361510.py: -------------------------------------------------------------------------------- 1 | """Teenage Mutant Ninja Turtles Shredders Revenge""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Requires vcrun2017 to launch 8 | util.protontricks('vcrun2017') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/1382330.py: -------------------------------------------------------------------------------- 1 | """Persona 5 Strikers 2 | Missing voices/sounds in cutscenes 3 | Requires disabling the gstreamer protonaudioconverterbin plugin to get full audio in cutscenes. 4 | fixed by Swish in Protondb 5 | """ 6 | 7 | from protonfixes import util 8 | 9 | 10 | def main() -> None: 11 | util.disable_protonmediaconverter() 12 | -------------------------------------------------------------------------------- /gamefixes-steam/1413480.py: -------------------------------------------------------------------------------- 1 | """Shin Megami Tensei III Nocturne HD Remaster 2 | Missing voices/sounds in cutscenes 3 | Requires disabling the gstreamer protonaudioconverterbin plugin to get full audio in cutscenes. 4 | fixed Persona 5 Strikers by Swish in Protondb 5 | """ 6 | 7 | from protonfixes import util 8 | 9 | 10 | def main() -> None: 11 | util.disable_protonmediaconverter() 12 | -------------------------------------------------------------------------------- /gamefixes-steam/1434950.py: -------------------------------------------------------------------------------- 1 | """Game fix HighFleet""" 2 | 3 | # 4 | from protonfixes import util 5 | 6 | 7 | def main() -> None: 8 | """Installs d3dcompiler, d3dx11_43""" 9 | util.protontricks('d3dx11_43') 10 | util.protontricks('d3dcompiler_47') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/1449280.py: -------------------------------------------------------------------------------- 1 | """Game fix for Ghostbusters: The Video Game Remastered (2019)""" 2 | 3 | from pathlib import Path 4 | from protonfixes import util 5 | from protonfixes.logger import log 6 | 7 | 8 | def main() -> None: 9 | # This directory is required to make the game settings persistent 10 | # [source: https://www.pcgamingwiki.com/wiki/Ghostbusters:_The_Video_Game_Remastered#Game_settings_do_not_save] 11 | save_dir = f'{util.protonprefix()}/drive_c/users/steamuser/Local Settings/Application Data/GHOSTBUSTERS' 12 | 13 | try: 14 | Path(save_dir).mkdir(parents=True, exist_ok=True) 15 | except OSError as e: 16 | log.warn(f"Not able to make the settings directory at '{save_dir}': {e}") 17 | -------------------------------------------------------------------------------- /gamefixes-steam/1467450.py: -------------------------------------------------------------------------------- 1 | 65540.py -------------------------------------------------------------------------------- /gamefixes-steam/1500540.py: -------------------------------------------------------------------------------- 1 | """Hardwar""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.winedll_override( 8 | 'dinput', util.OverrideOrder.NATIVE_BUILTIN 9 | ) # DxWrapper component 10 | util.winedll_override('winmm', util.OverrideOrder.NATIVE_BUILTIN) # Music playback 11 | -------------------------------------------------------------------------------- /gamefixes-steam/15130.py: -------------------------------------------------------------------------------- 1 | """Game fix for Beyond Good and Evil""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs dsound d3dx9 arial d3dcompiler_47""" 8 | util.protontricks('dsound') 9 | util.protontricks('d3dx9') 10 | util.protontricks('arial') 11 | util.protontricks('d3dcompiler_47') 12 | 13 | """ Add a couple of keys in regedit 14 | """ 15 | 16 | util.regedit_add('HKLM\\Software\\Wow6432Node\\Ubisoft') 17 | util.regedit_add( 18 | 'HKLM\\Software\\Wow6432Node\\Ubisoft\\Beyond Good & Evil', 19 | 'InstallLanguage', 20 | 'REG_DWORD', 21 | '1', 22 | ) 23 | -------------------------------------------------------------------------------- /gamefixes-steam/1532190.py: -------------------------------------------------------------------------------- 1 | """Game fix for Halo CE mod tools""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Requires vcrun2019 to launch 8 | util.protontricks('vcrun2019') 9 | util.protontricks('d3dcompiler_47') 10 | util.protontricks('msxml3') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/1544020.py: -------------------------------------------------------------------------------- 1 | """The Callisto Protocol""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('vcrun2022') 8 | -------------------------------------------------------------------------------- /gamefixes-steam/1557480.py: -------------------------------------------------------------------------------- 1 | """Project MIKHAIL: A Muv-Luv War Story""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Needs native d3dcompiler_47""" 8 | util.protontricks('d3dcompiler_47') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/15700.py: -------------------------------------------------------------------------------- 1 | """Oddworld: Abe's Oddysee""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('cnc_ddraw') # Videos are laggy without this 8 | -------------------------------------------------------------------------------- /gamefixes-steam/15740.py: -------------------------------------------------------------------------------- 1 | """Game fix for Oddworld: Munch's Oddysee""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Klite to fix videos 8 | prev version of this used devenum, quartz, wmp9 but that caused laggy intros 9 | """ 10 | util.protontricks('klite') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/15750.py: -------------------------------------------------------------------------------- 1 | """Oddworld: Stranger's Wrath HD""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('mfc90') # The game crashes on launch without mfc90 8 | -------------------------------------------------------------------------------- /gamefixes-steam/1613450.py: -------------------------------------------------------------------------------- 1 | """Game fix for Halo 2 mod tools""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Requires vcrun2019 to launch 8 | util.protontricks('vcrun2019') 9 | util.protontricks('d3dcompiler_47') 10 | util.protontricks('msxml3') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/1659420.py: -------------------------------------------------------------------------------- 1 | """UNCHARTED: Legacy of Thieves Collection""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """The game chokes on more than 16 cores""" 8 | util.set_cpu_topology_limit(16) 9 | -------------------------------------------------------------------------------- /gamefixes-steam/1664350.py: -------------------------------------------------------------------------------- 1 | """Ship Graveyard Simulator Prologue""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Needs builtin vulkan-1""" 8 | util.winedll_override('vulkan-1', util.OverrideOrder.BUILTIN) 9 | -------------------------------------------------------------------------------- /gamefixes-steam/16700.py: -------------------------------------------------------------------------------- 1 | """Game fix for Stronghold Crusader Extreme HD 2 | Fixes Multiplayer 3 | """ 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main() -> None: 9 | """Installs directplay""" 10 | util.protontricks('directplay') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/16810.py: -------------------------------------------------------------------------------- 1 | """Civilization IV: Colonization""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('oleaut32') 8 | util.protontricks('msxml3') 9 | util.protontricks('corefonts') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/1681970.py: -------------------------------------------------------------------------------- 1 | """神都不良探 Underdog Detective""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('klite') 8 | util.winedll_override('winegstreamer', util.OverrideOrder.DISABLED) 9 | # it uses quartz instead of mfplat on win7 10 | util.protontricks('win7') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/1695791.py: -------------------------------------------------------------------------------- 1 | """Game fix for Halo 3 mod tools""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Requires vcrun2019 to launch 8 | util.protontricks('vcrun2019') 9 | util.protontricks('d3dcompiler_47') 10 | util.protontricks('msxml3') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/1695793.py: -------------------------------------------------------------------------------- 1 | """Game fix for the Halo Reach mod tools Foundation gamemode. 2 | Standalone and Sapien seem to work just fine without d3dcompiler_47 and msxml3, although might be required at some deeper level. I just playtested it. 3 | - Oro, @orowith2os 4 | """ 5 | 6 | from protonfixes import util 7 | 8 | 9 | def main() -> None: 10 | util.protontricks('dotnet35') 11 | util.protontricks('dotnet45') 12 | -------------------------------------------------------------------------------- /gamefixes-steam/1695794.py: -------------------------------------------------------------------------------- 1 | """Game fix Halo 3: ODST mod tools""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Requires vcrun2019 to launch 8 | util.protontricks('vcrun2019') 9 | util.protontricks('d3dcompiler_47') 10 | util.protontricks('msxml3') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/1711950.py: -------------------------------------------------------------------------------- 1 | """GWENT: Rogue Mage""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs mfc140 8 | 9 | mfc140 is necessary to start the game up. GOG login happens inside the Steam overlay. 10 | 11 | vcrun2019 enables full support of the prelauncher interface. GOG login inside the prelauncher. 12 | This prelauncher is not necessary for the Game. If only mfc is present, it's skipped. 13 | """ 14 | util.protontricks('mfc140') 15 | -------------------------------------------------------------------------------- /gamefixes-steam/1715130.py: -------------------------------------------------------------------------------- 1 | """Crysis Remastered""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Replace launcher with game exe in proton arguments 8 | util.protontricks('vcrun2019') 9 | util.protontricks('d3dcompiler_43') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/1716740.py: -------------------------------------------------------------------------------- 1 | 22330.py -------------------------------------------------------------------------------- /gamefixes-steam/1795390.py: -------------------------------------------------------------------------------- 1 | """Game fix for Carnage Cross 2 | Proton issue: https://github.com/ValveSoftware/Proton/issues/6645 3 | """ 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main() -> None: 9 | util.replace_command( 10 | 'CarnageCross/CarnageCross', 11 | 'CarnageCross/CarnageCross/Binaries/Win64/CarnageCross-Win64-Shipping.exe', 12 | ) 13 | -------------------------------------------------------------------------------- /gamefixes-steam/1829980.py: -------------------------------------------------------------------------------- 1 | """Game fix for Cafe Stella""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Install quartz, wmp11, qasf 8 | 9 | Fixes in-game video playback for the intro and ending. 10 | """ 11 | util.protontricks('quartz') 12 | util.protontricks('wmp11') 13 | util.protontricks('qasf') 14 | -------------------------------------------------------------------------------- /gamefixes-steam/1873170.py: -------------------------------------------------------------------------------- 1 | """Cease to Breathe 2 | Replace included nwjs (0.71) - which doesn't work - with 0.86 3 | Fix cursor hitbox (set frame=false in package.json) 4 | Updated from 0.85 that didn't display custom cursors. 5 | """ 6 | 7 | import os 8 | import glob 9 | import shutil 10 | import urllib.request 11 | import zipfile 12 | import subprocess 13 | import hashlib 14 | from protonfixes import util 15 | from protonfixes.logger import log 16 | 17 | 18 | def main() -> None: 19 | util.replace_command('CTB.exe', 'nw.exe') 20 | install_dir = glob.escape(util.get_game_install_path()) 21 | if not os.path.isfile(os.path.join(install_dir, 'nw.exe')): 22 | url = 'https://dl.nwjs.io/v0.86.0/nwjs-v0.86.0-win-x64.zip' 23 | hashsum = 'ed2681847162e0fa457dd55e293b6f331ccd58acedd934a98e7fe1406c26dd4f' 24 | nwjs = os.path.basename(url) 25 | urllib.request.urlretrieve(url, nwjs) 26 | with open(nwjs, 'rb') as f: 27 | nwjs_sum = hashlib.sha256(f.read()).hexdigest() 28 | if hashsum == nwjs_sum: 29 | with zipfile.ZipFile(nwjs, 'r') as zip_ref: 30 | zip_ref.extractall(install_dir) 31 | nwjs = os.path.join(install_dir, nwjs.rsplit('.', 1)[0]) 32 | shutil.copytree(nwjs, install_dir, dirs_exist_ok=True) 33 | shutil.rmtree(nwjs) 34 | else: 35 | log(f"{nwjs} checksum doesn't match, fix not applied.") 36 | subprocess.call( 37 | [f'sed -i \'s/"frame": true/"frame": false/\' "{install_dir}/package.json"'], 38 | shell=True, 39 | ) 40 | -------------------------------------------------------------------------------- /gamefixes-steam/1930.py: -------------------------------------------------------------------------------- 1 | """Two Worlds Epic Edition - ID 1930 2 | https://www.protondb.com/app/1930 3 | """ 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main() -> None: 9 | util.protontricks('xact') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/1971650.py: -------------------------------------------------------------------------------- 1 | """Octopath Traveler 2""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Imports demo saves into the full game's prefix""" 8 | util.import_saves_folder( 9 | 2203230, 10 | f'Documents/My Games/Octopath_Traveler2/Steam/{util.get_steam_account_id()}/SaveGames', 11 | True, 12 | ) 13 | -------------------------------------------------------------------------------- /gamefixes-steam/19900.py: -------------------------------------------------------------------------------- 1 | """Far Cry 2""" 2 | 3 | 4 | def main() -> None: 5 | """Set CPU limit to upstream core count 6 | See https://github.com/ValveSoftware/Proton/blob/proton_9.0/proton#L1154 7 | 8 | Code block is intentionally empty because this game exists in EGS and 9 | Ubisoft (umu-19900) 10 | """ 11 | -------------------------------------------------------------------------------- /gamefixes-steam/1999770.py: -------------------------------------------------------------------------------- 1 | """Atelier Ryza 3: Alchemist of the End & the Secret Key 2 | Missing voices/sounds in cutscenes 3 | Requires disabling the gstreamer protonaudioconverterbin plugin to get full audio in cutscenes 4 | """ 5 | 6 | from protonfixes import util 7 | 8 | 9 | def main() -> None: 10 | util.disable_protonmediaconverter() 11 | -------------------------------------------------------------------------------- /gamefixes-steam/200490.py: -------------------------------------------------------------------------------- 1 | """Memento Mori 2 | wmp11 (Fixes missing logo videos and problems with working videos) 3 | hangs on logo without override 4 | """ 5 | 6 | from protonfixes import util 7 | 8 | 9 | def main() -> None: 10 | util.winedll_override('libvkd3d-1', util.OverrideOrder.NATIVE) 11 | util.protontricks('wmp11') 12 | -------------------------------------------------------------------------------- /gamefixes-steam/2009100.py: -------------------------------------------------------------------------------- 1 | """Game fix for Immortals of Aveum""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Set SteamGameId so that non-steam versions can pick up steam-specific fixes in proton's wine code 8 | util.set_environment('SteamGameId', '2009100') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/200940.py: -------------------------------------------------------------------------------- 1 | """Game fix for Sonic CD""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs d3dcompiler_43, d3dx9_43, mdx. Locks fps to 60.""" 8 | util.protontricks('d3dcompiler_43') 9 | util.protontricks('d3dx9_43') 10 | util.protontricks('mdx') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/201480.py: -------------------------------------------------------------------------------- 1 | """Game fix for Serious Sam: The Random Encounter""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs directmusic and directplay""" 8 | util.protontricks('dmband') 9 | util.protontricks('dmime') 10 | util.protontricks('dmloader') 11 | util.protontricks('dmsynth') 12 | util.protontricks('dmstyle') 13 | util.protontricks('dmusic') 14 | util.protontricks('dsound') 15 | util.protontricks('dswave') 16 | util.protontricks('directplay') 17 | util.winedll_override('streamci', util.OverrideOrder.NATIVE) 18 | -------------------------------------------------------------------------------- /gamefixes-steam/204450.py: -------------------------------------------------------------------------------- 1 | """Game fix for Call of Juarez: Gunslinger""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Fixes missing sound in cutscenes""" 8 | util.disable_protonmediaconverter() 9 | -------------------------------------------------------------------------------- /gamefixes-steam/205230.py: -------------------------------------------------------------------------------- 1 | """Hell Yeah!""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs xna40 to fix videos and music""" 8 | util.protontricks('xna40') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/205650.py: -------------------------------------------------------------------------------- 1 | """The Testament of Sherlock Holmes""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Needs to have PhysX installed to work, even for systems not using Nvidia.""" 8 | util.protontricks('physx') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/206480.py: -------------------------------------------------------------------------------- 1 | """Game fix Dungeons & Dragons Online""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Disable libglesv2""" 8 | # gpu acceleration on wined3d https://bugs.winehq.org/show_bug.cgi?id=44985 9 | # Make the store work. 10 | util.winedll_override('libglesv2', util.OverrideOrder.DISABLED) 11 | -------------------------------------------------------------------------------- /gamefixes-steam/206500.py: -------------------------------------------------------------------------------- 1 | """Game fix for AirMech Strike""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.append_argument('/dx11') 8 | -------------------------------------------------------------------------------- /gamefixes-steam/207350.py: -------------------------------------------------------------------------------- 1 | """Game fix for Ys Origin""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('directshow') 8 | util.protontricks('cinepak') 9 | util.protontricks('lavfilters') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/208650.py: -------------------------------------------------------------------------------- 1 | """Game fix for Batman Arkham Knight""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """NVIDIA PhysX support.""" 8 | # Enables NVIDIA PhysX in Batman Arkham Knight. 9 | util.protontricks('physx') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/20920.py: -------------------------------------------------------------------------------- 1 | """The Witcher 2: Assassins of Kings Enhanced Edition""" 2 | 3 | 4 | def main() -> None: 5 | """Witcher 2 chokes on more than 16 cores 6 | Code block is intentionally empty because this game exists in GOG (umu-20920) 7 | """ 8 | -------------------------------------------------------------------------------- /gamefixes-steam/211420.py: -------------------------------------------------------------------------------- 1 | """Game fix Dark Souls Prepare To Die Edition""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Needs WMP9, devenum, quartz, dinput and win7""" 8 | # For main menu, intro and outro playback 9 | util.protontricks('devenum') 10 | util.protontricks('quartz') 11 | util.protontricks('wmp9') 12 | 13 | # In case if someone wishes to use DSfix 14 | util.protontricks('dinput8') 15 | 16 | util.protontricks('win7') 17 | -------------------------------------------------------------------------------- /gamefixes-steam/212500.py: -------------------------------------------------------------------------------- 1 | """Game fix The Lord of the Rings Online""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Disable libglesv2""" 8 | ## gpu acceleration on wined3d https://bugs.winehq.org/show_bug.cgi?id=44985 9 | # Make the store work. 10 | util.winedll_override('libglesv2', util.OverrideOrder.DISABLED) 11 | -------------------------------------------------------------------------------- /gamefixes-steam/213330.py: -------------------------------------------------------------------------------- 1 | """Game fix for LEGO Batman 2: DC Super Heroes""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs d3dx9_41""" 8 | util.protontricks('d3dx9_41') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/2135150.py: -------------------------------------------------------------------------------- 1 | """Elin""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Fixes Steam Workshop modding.""" 8 | util.winedll_override('winhttp', util.OverrideOrder.NATIVE_BUILTIN) 9 | -------------------------------------------------------------------------------- /gamefixes-steam/2138090.py: -------------------------------------------------------------------------------- 1 | """Atelier Marie Remake: The Alchemist of Salburg 2 | Missing voices/sounds in cutscenes 3 | Requires disabling the gstreamer protonaudioconverterbin plugin to get full audio in cutscenes. 4 | fixed by Swish in Protondb 5 | further stolen from marianoag by bitwolf 6 | """ 7 | 8 | from protonfixes import util 9 | 10 | 11 | def main() -> None: 12 | util.disable_protonmediaconverter() 13 | -------------------------------------------------------------------------------- /gamefixes-steam/214510.py: -------------------------------------------------------------------------------- 1 | """Game fix for LEGO The Lord of the Rings""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs d3dx9_41""" 8 | util.protontricks('d3dx9_41') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/214950.py: -------------------------------------------------------------------------------- 1 | """Game fix for Total War: Rome II""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs d3dcompiler_42, directplay 8 | Disable esync and fsync 9 | """ 10 | util.protontricks('d3dcompiler_42') 11 | util.protontricks('directplay') 12 | util.disable_esync() 13 | util.disable_fsync() 14 | -------------------------------------------------------------------------------- /gamefixes-steam/215280.py: -------------------------------------------------------------------------------- 1 | """Game fix for Secret World Legends""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('d3dx9_43') 8 | util.protontricks('d3dx11_43') 9 | util.protontricks('d3dcompiler_43') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/2161700.py: -------------------------------------------------------------------------------- 1 | """Persona 3 Reload""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Imports demo saves into the full game.""" 8 | util.import_saves_folder( 9 | 3358440, f'AppData/Roaming/SEGA/P3R/Steam/{util.get_steam_account_id()}', True 10 | ) 11 | -------------------------------------------------------------------------------- /gamefixes-steam/21680.py: -------------------------------------------------------------------------------- 1 | """Bionic Commander Rearmed""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs physx""" 8 | util.protontricks('physx') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/2183070.py: -------------------------------------------------------------------------------- 1 | """Game fix for Tokyo Necro""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Fixes audio not playing for in-game videos 8 | util.disable_protonmediaconverter() 9 | -------------------------------------------------------------------------------- /gamefixes-steam/219030.py: -------------------------------------------------------------------------------- 1 | """Game fix for Ys Origin Demo""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('directshow') 8 | util.protontricks('cinepak') 9 | util.protontricks('lavfilters') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/219990.py: -------------------------------------------------------------------------------- 1 | """Game fix for Grim Dawn""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Fix black screen. Only needed in a Wine prefix that lacks the DirectX Redist installation that comes with the game installer. 8 | util.protontricks('d3dcompiler_43') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/220240.py: -------------------------------------------------------------------------------- 1 | """FarCry 3""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """FarCry 3 chokes on more than 24 cores""" 8 | util.set_cpu_topology_limit(24) 9 | -------------------------------------------------------------------------------- /gamefixes-steam/2229850.py: -------------------------------------------------------------------------------- 1 | """Game fix for Command & Conquer Red Alert™ 2 and Yuri's Revenge™""" 2 | 3 | import os 4 | 5 | from protonfixes import util 6 | from protonfixes.logger import log 7 | 8 | 9 | def main() -> None: 10 | """Install and launch the CnCNet Launcher 11 | 12 | It fixes several issues, allows multiplayer and provides a working UI, 13 | while the game has sometimes problems like missing or shifted buttons. 14 | 15 | The game will just show a black screen without cnc-ddraw or the patch in place. 16 | """ 17 | # Opt out of CnCNet with 'NO_CNCNET=1 %command%' 18 | no_cncnet = os.getenv('NO_CNCNET', '') 19 | if str.lower(no_cncnet) in ['y', 'yes', 'true', 'on', '1']: 20 | log("Skipping CnCNet on user's request.") 21 | use_cnc_ddraw() 22 | return 23 | 24 | # Install the CnCNet Launcher 25 | if not util.checkinstalled('cncnet_ra2') and not util.protontricks('cncnet_ra2'): 26 | log("Failed to install CnCNet Launcher, let's try cnc-ddraw.") 27 | use_cnc_ddraw() 28 | 29 | # CnCNet Launcher is in place, run it 30 | if os.path.isfile('CnCNetYRLauncher.exe'): 31 | log('CnCNet Launcher found, bypass game execution!') 32 | util.replace_command('Ra2.exe', 'CnCNetYRLauncher.exe') 33 | util.replace_command('RA2MD.exe', 'CnCNetYRLauncher.exe') 34 | 35 | 36 | def use_cnc_ddraw() -> None: 37 | """Install cnc-ddraw, the current replacement from EA isn't working.""" 38 | log('Using cnc-ddraw.') 39 | 40 | # Return early, if cnc-ddraw is installed 41 | if util.checkinstalled('cnc_ddraw'): 42 | log('cnc-ddraw found, nothing to do!') 43 | return 44 | 45 | # Install cnc-ddraw 46 | if not util.protontricks('cnc_ddraw'): 47 | log('Failed to install cnc-ddraw') 48 | return 49 | 50 | # After installing cnc_ddraw, we need to prevent the game 51 | # from loading the local ddraw.dll, instead of our override. 52 | # Note: This is only done once. 53 | if os.path.isfile('ddraw.dll'): 54 | log('Renaming local ddraw.dll to ddraw.dll.bak') 55 | os.rename('ddraw.dll', 'ddraw.dll.bak') 56 | -------------------------------------------------------------------------------- /gamefixes-steam/2231380.py: -------------------------------------------------------------------------------- 1 | """Tom Clancy's Ghost Recon Breakpoint""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Game ships with outdated uPlay launcher, which will not install to be able to start the game""" 8 | util.protontricks('ubisoftconnect') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/22330.py: -------------------------------------------------------------------------------- 1 | """Mod support for following Bethesda games: 2 | 3 | - Fallout 3 - Game of the Year Edition 4 | - Fallout 4 5 | - Fallout: New Vegas 6 | - The Elder Scrolls IV: Oblivion 7 | - The Elder Scrolls IV: Oblivion Remastered 8 | - The Elder Scrolls V: Skyrim 9 | - The Elder Scrolls V: Skyrim Special Edition 10 | - Starfield 11 | """ 12 | 13 | import os 14 | 15 | from protonfixes import util 16 | 17 | 18 | def main_with_id(game_id: str) -> None: 19 | """Enable modding and fixes""" 20 | # modorganizer2 features a redirector and breaks if we replace the command. (Issue #103) 21 | if os.path.exists('modorganizer2'): 22 | return 23 | 24 | # Run script extender if it exists. 25 | mapping = get_redirect_name(game_id) 26 | if os.path.isfile(mapping.to_value): 27 | util.replace_command(mapping.from_value, mapping.to_value) 28 | 29 | 30 | def get_redirect_name(game_id: str) -> util.ReplaceType: 31 | """Mapping for SteamID -> script extender replacements""" 32 | mapping = { 33 | '22380': ('FalloutNV.exe', 'nvse_loader.exe'), # Fallout New Vegas 34 | '22370': ('FalloutLauncher.exe', 'fose_loader.exe'), # Fallout 3 35 | '377160': ('Fallout4Launcher.exe', 'f4se_loader.exe'), # Fallout 4 36 | '22330': ('OblivionLauncher.exe', 'obse_loader.exe'), # Oblivion 37 | '2623190': ( 38 | 'OblivionRemastered.exe', 39 | 'OblivionRemastered/Binaries/Win64/obse64_loader.exe', 40 | ), # Oblivion Remastered 41 | '72850': ('SkyrimLauncher.exe', 'skse_loader.exe'), # Skyrim 42 | '489830': ('SkyrimSELauncher.exe', 'skse64_loader.exe'), # Skyrim SE 43 | '1716740': ('Starfield.exe', 'sfse_loader.exe'), # Starfield 44 | }.get(game_id, ('', '')) 45 | return util.ReplaceType(*mapping) 46 | -------------------------------------------------------------------------------- /gamefixes-steam/22370.py: -------------------------------------------------------------------------------- 1 | 22330.py -------------------------------------------------------------------------------- /gamefixes-steam/223750.py: -------------------------------------------------------------------------------- 1 | """Fixes for DCS World Steam Edition""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Based on https://www.digitalcombatsimulator.com/en/support/faq/SteamDeck/ 8 | util.protontricks('d3dx11_43') 9 | util.protontricks('d3dcompiler_43') 10 | util.protontricks('d3dcompiler_47') 11 | util.winedll_override( 12 | 'wbemprox', util.OverrideOrder.NATIVE 13 | ) # doesn't seem to be strictly needed 14 | -------------------------------------------------------------------------------- /gamefixes-steam/22380.py: -------------------------------------------------------------------------------- 1 | 22330.py -------------------------------------------------------------------------------- /gamefixes-steam/2246340.py: -------------------------------------------------------------------------------- 1 | """Monster Hunter Wilds""" 2 | 3 | import os 4 | from protonfixes import util 5 | 6 | 7 | def main() -> None: 8 | """Imports Monster Hunter: World save from remote steam cloud folder. We need to get steam cloud ID, not steamID, which is only reported as folder name in local""" 9 | # get all remote IDs to anticipate for multi accounts 10 | listRemoteID = [ 11 | name for name in os.listdir(f'{os.environ["STEAM_BASE_FOLDER"]}/userdata') 12 | ] 13 | 14 | # import save for all remote IDs because we don't know which one is the right ID. import function is robust enough to anticipate wrong ID. 15 | for accoundID in listRemoteID: 16 | # skip 0 17 | if accoundID != '0': 18 | util.import_saves_folder( 19 | 582010, f'../../Program Files (x86)/Steam/userdata/{accoundID}/582010/' 20 | ) 21 | -------------------------------------------------------------------------------- /gamefixes-steam/224960.py: -------------------------------------------------------------------------------- 1 | """Game fix for Tomb Raider I""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Enable Glide emulation in dosbox config""" 8 | conf_dict = {'glide': {'glide': 'emu'}} 9 | util.create_dosbox_conf('glide_fix.conf', conf_dict) 10 | util.append_argument('-conf') 11 | util.append_argument('glide_fix.conf') 12 | -------------------------------------------------------------------------------- /gamefixes-steam/225640.py: -------------------------------------------------------------------------------- 1 | """Game fix for Sacred 2 Gold""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Install physx""" 8 | util.protontricks('physx') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/227320.py: -------------------------------------------------------------------------------- 1 | """Game fix for You Need a Budget 4""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs corefonts""" 8 | # https://github.com/ValveSoftware/Proton/issues/7 9 | util.protontricks('corefonts') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/231990.py: -------------------------------------------------------------------------------- 1 | """Game fix for Spider-Man: Shattered Dimensions""" 2 | 3 | # 4 | from protonfixes import util 5 | 6 | 7 | def main() -> None: 8 | """Installs d3dx9_43, xact""" 9 | # https://steamcommunity.com/app/231990/discussions/0/3198117312260185786/#c3470604115208907456 10 | util.protontricks('d3dx9_43') 11 | util.protontricks('xact') 12 | -------------------------------------------------------------------------------- /gamefixes-steam/23300.py: -------------------------------------------------------------------------------- 1 | """Yosumin""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Works around a Wine bug causing the game to crash.""" 8 | util.protontricks('d3dx9') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/233270.py: -------------------------------------------------------------------------------- 1 | """Far Cry Blood Dragon""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """dx11 version is broken""" 8 | util.set_cpu_topology_limit(24) 9 | -------------------------------------------------------------------------------- /gamefixes-steam/23460.py: -------------------------------------------------------------------------------- 1 | """Ceville 2 | Works with dotnet35sp1 only, now without needing Proton5 3 | Videos still don't work. 4 | """ 5 | 6 | import os 7 | import subprocess 8 | from protonfixes import util 9 | 10 | 11 | def main() -> None: 12 | util.protontricks('dotnet35sp1') 13 | util.winedll_override('libvkd3d-1', util.OverrideOrder.NATIVE) 14 | 15 | # Videos play and audio works but screen is black. 16 | # util.protontricks('quartz') 17 | # util.protontricks('klite') 18 | if os.path.isdir('./data/shared/videos'): 19 | subprocess.call(['mv', './data/shared/videos', './data/shared/_videos']) 20 | -------------------------------------------------------------------------------- /gamefixes-steam/237890.py: -------------------------------------------------------------------------------- 1 | """Game fix for Agarest: Generations of War""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('wmp9') 8 | util.winedll_override('winegstreamer', util.OverrideOrder.DISABLED) 9 | -------------------------------------------------------------------------------- /gamefixes-steam/2399220.py: -------------------------------------------------------------------------------- 1 | """Game fix for NUKITASHI""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Disable protonaudioconverterbin plugin""" 8 | # Fixes audio not playing for in-game videos 9 | util.disable_protonmediaconverter() 10 | -------------------------------------------------------------------------------- /gamefixes-steam/240600.py: -------------------------------------------------------------------------------- 1 | """Game fix for MotorGP""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('d3dcompiler_43') 8 | util.protontricks('d3dx9_43') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/242760.py: -------------------------------------------------------------------------------- 1 | """Game fix for The Forest""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """If SMT/HT is enabled, The Forest runs with extremely choppy. Just bad. 8 | We can fix it by setting the topology to the physical cores / core count. 9 | TODO: This fix was not tested with more than 10 physical cores yet. 10 | """ 11 | util.set_cpu_topology_nosmt() 12 | -------------------------------------------------------------------------------- /gamefixes-steam/244210.py: -------------------------------------------------------------------------------- 1 | """Game fix for Assetto Corsa""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Fixes default launcher and ACM.""" 8 | util.protontricks('dotnet452') 9 | # Fixes Content Manager (black windows) 10 | util.protontricks('d3dx11_43') 11 | util.protontricks('d3dcompiler_47') 12 | util.winedll_override('dwrite', util.OverrideOrder.NATIVE_BUILTIN) 13 | util.protontricks('win10') 14 | util.set_environment('PULSE_LATENCY_MSEC', '60') 15 | -------------------------------------------------------------------------------- /gamefixes-steam/244850.py: -------------------------------------------------------------------------------- 1 | """Game fix for Space Engineers""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('xaudio29') 8 | 9 | base_attibutte = '' 10 | game_opts = """ 11 | 12 | """ 13 | 14 | util.set_xml_options(base_attibutte, game_opts, 'Bin64/SpaceEngineers.exe.config') 15 | 16 | util.append_argument('-skipintro') 17 | -------------------------------------------------------------------------------- /gamefixes-steam/245050.py: -------------------------------------------------------------------------------- 1 | 39540.py -------------------------------------------------------------------------------- /gamefixes-steam/2457540.py: -------------------------------------------------------------------------------- 1 | """Cardfight!! Vanguard Dear Days 2""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Imports player cards from Cardfight!! Vanguard Dear Days. Yes that save path is indeed VG2 no idea why""" 8 | util.import_saves_folder(1881420, 'Saved Games/VG2/SAVELOAD') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/2458530.py: -------------------------------------------------------------------------------- 1 | """Game fix for Sanoba Witch FHD Edition""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Install quartz, wmp11, qasf 8 | 9 | Fixes in-game video playback for the intro and ending. 10 | """ 11 | util.protontricks('quartz') 12 | util.protontricks('wmp11') 13 | util.protontricks('qasf') 14 | -------------------------------------------------------------------------------- /gamefixes-steam/2475980.py: -------------------------------------------------------------------------------- 1 | """Gobliiins 5 (and Demo - 2505910) 2 | Setup doesn't work and language is default to french 3 | """ 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main_with_id(game_id: str) -> None: 9 | """The game consists of 4 parts, that are located in their own folder 10 | They each have a separate config, that needs to be patched 11 | 12 | The demo launches from it's install directory and doesn't need a subfolder 13 | """ 14 | cfg_str = """ 15 | [language] 16 | translation=English 17 | 18 | [graphics] 19 | filter=Linear 20 | """ 21 | 22 | # Demo 23 | if game_id == '2505910': 24 | util.set_ini_options(cfg_str, 'acsetup.cfg') 25 | return 26 | 27 | # Full 28 | for i in range(1, 5): 29 | util.set_ini_options(cfg_str, f'Gobliiins5-Part{i}/acsetup.cfg') 30 | -------------------------------------------------------------------------------- /gamefixes-steam/2505910.py: -------------------------------------------------------------------------------- 1 | 2475980.py -------------------------------------------------------------------------------- /gamefixes-steam/251150.py: -------------------------------------------------------------------------------- 1 | """Game fix for The Legend of Heroes: Trails in the Sky""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('quartz') # Cutscene fixes 8 | util.protontricks('amstream') 9 | util.protontricks('lavfilters') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/251290.py: -------------------------------------------------------------------------------- 1 | """Game fix for The Legend of Heroes: Trails in the Sky SC""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('quartz') # Cutscene fixes 8 | util.protontricks('amstream') 9 | util.protontricks('lavfilters') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/252430.py: -------------------------------------------------------------------------------- 1 | """Game fix for Dusty Revenge: Co-Op Edition""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Install vcrun2010""" 8 | util.protontricks('vcrun2010') 9 | util.protontricks('dsound') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/253430.py: -------------------------------------------------------------------------------- 1 | """CastleMiner Z""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs xna40 to fix Main Menu music, missing graphics, keyboard input, and high GPU usage""" 8 | util.protontricks('xna40') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/2552410.py: -------------------------------------------------------------------------------- 1 | 3094040.py -------------------------------------------------------------------------------- /gamefixes-steam/2552430.py: -------------------------------------------------------------------------------- 1 | """Game fix for KINGDOM HEARTS -HD 1.5+2.5 ReMIX-""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Game needs SteamDeck=1 for cutscenes to work.""" 8 | util.set_environment('SteamDeck', '1') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/2561580.py: -------------------------------------------------------------------------------- 1 | """Horizon Zero Dawn Remastered""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Game allows playing saves from the original Complete Edition, but by default it can't find them.""" 8 | util.import_saves_folder(1151640, 'My Documents/Horizon Zero Dawn') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/256330.py: -------------------------------------------------------------------------------- 1 | """WRC 4""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Black screen without it 8 | util.protontricks('d3dx9_42') 9 | util.protontricks('d3dx9_43') 10 | 11 | # Fixes background videos 12 | util.protontricks('wmp11') 13 | 14 | # Fixes audio sliders in options 15 | util.protontricks('xact') 16 | -------------------------------------------------------------------------------- /gamefixes-steam/257420.py: -------------------------------------------------------------------------------- 1 | """Game fix for Serious Sam 4""" 2 | 3 | import os 4 | import subprocess 5 | 6 | 7 | def main() -> None: 8 | """Graphics API workaround""" 9 | if not os.path.isfile('UserCfg.lua.bak'): 10 | subprocess.call(['cp', 'UserCfg.lua', 'UserCfg.lua.bak']) 11 | 12 | # Assume UTF-8 13 | with open('UserCfg.lua', 'a+', encoding='utf-8') as f: 14 | f.write('sfx_strAPI = "OpenAL";') 15 | -------------------------------------------------------------------------------- /gamefixes-steam/260130.py: -------------------------------------------------------------------------------- 1 | """Game fix for Agarest Zero""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('wmp9') 8 | util.disable_protonmediaconverter() 9 | -------------------------------------------------------------------------------- /gamefixes-steam/261510.py: -------------------------------------------------------------------------------- 1 | """Game fix for Tesla Effect""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Install corefonts""" 8 | # https://github.com/ValveSoftware/Proton/issues/1317 9 | util.protontricks('corefonts') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/261640.py: -------------------------------------------------------------------------------- 1 | """Game fix for Borderlands: The Pre-Sequel""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Launcherfix and NVIDIA PhysX support.""" 8 | # Fixes the startup process. 9 | util.replace_command('Launcher.exe', 'BorderlandsPreSequel.exe') 10 | util.append_argument('-NoSplash') 11 | 12 | # Disables esync prevents crashes. 13 | util.disable_esync() 14 | 15 | # Enables NVIDIA PhysX in Borderlands: The Pre-Sequel. 16 | util.protontricks('physx') 17 | -------------------------------------------------------------------------------- /gamefixes-steam/2620.py: -------------------------------------------------------------------------------- 1 | """Game fix for Call of Duty (2003)""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Set Mesa env vars""" 8 | # https://github.com/ValveSoftware/Proton/pull/1423/commits/1a1d25c7d95691e37c94aea4e5f94e0c917aba6f 9 | util.set_environment('MESA_EXTENSION_MAX_YEAR', '2003') 10 | util.set_environment('__GL_ExtensionStringVersion', '17700') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/2623190.py: -------------------------------------------------------------------------------- 1 | 22330.py -------------------------------------------------------------------------------- /gamefixes-steam/266840.py: -------------------------------------------------------------------------------- 1 | """Game fix for Age of Mythology: Extended Edition 2 | Source: https://github.com/JamesHealdUK/protonfixes/blob/master/fixes/266840.sh 3 | """ 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main() -> None: 9 | """Changes the proton argument from the launcher to the game""" 10 | # Replace launcher with game exe in proton arguments 11 | util.replace_command('Launcher.exe', 'aomx.exe') 12 | -------------------------------------------------------------------------------- /gamefixes-steam/2677660.py: -------------------------------------------------------------------------------- 1 | """Game fix for Indiana Jones and the Great Circle""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Bad performance on Nvidia due to VRAM under-utilization""" 8 | util.set_environment('__GL_13ebad', '0x1') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/2679460.py: -------------------------------------------------------------------------------- 1 | """Metaphor ReFantazio""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Imports demo saves into the full game.""" 8 | util.import_saves_folder( 9 | 3130330, 10 | f'AppData/Roaming/SEGA/METAPHOR/Steam/{util.get_steam_account_id()}', 11 | True, 12 | ) 13 | -------------------------------------------------------------------------------- /gamefixes-steam/268050.py: -------------------------------------------------------------------------------- 1 | """Game fix for The Evil Within(268050)""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Changes the proton argument from the launcher to the game""" 8 | util.protontricks('win7') 9 | 10 | util.set_environment('PULSE_LATENCY_MSEC', '60') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/2697560.py: -------------------------------------------------------------------------------- 1 | """Game fix for Mojika - Truth Rears Its Ugly Head""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.disable_protonmediaconverter() 8 | -------------------------------------------------------------------------------- /gamefixes-steam/2699660.py: -------------------------------------------------------------------------------- 1 | """PowerWash Adventure""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Needs vcrun2019 to fix 'Visual C++ Runtime' required error""" 8 | util.protontricks('vcrun2022') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/271590.py: -------------------------------------------------------------------------------- 1 | """Game fix for GTAV""" 2 | 3 | import os 4 | from protonfixes import util 5 | 6 | 7 | def main() -> None: 8 | """Game fix for GTAV""" 9 | # Rockstar reads SteamAppId and tries to init Steam API 10 | # We want to avoid this when running from Epic for example 11 | game_id = os.environ.get('UMU_ID') 12 | if game_id and not game_id.isnumeric(): 13 | util.del_environment('SteamAppId') 14 | -------------------------------------------------------------------------------- /gamefixes-steam/2730350.py: -------------------------------------------------------------------------------- 1 | 3094040.py -------------------------------------------------------------------------------- /gamefixes-steam/281280.py: -------------------------------------------------------------------------------- 1 | """Game fix for Mashed(281280)""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Mashed needs win xp otherwise cars may fall through the ground""" 8 | """https://www.pcgamingwiki.com/wiki/Mashed#Jumping_Bug_Fix""" 9 | util.protontricks('winxp') 10 | 11 | """Hide the launcher""" 12 | util.append_argument('-VS0 -CS0') 13 | -------------------------------------------------------------------------------- /gamefixes-steam/282900.py: -------------------------------------------------------------------------------- 1 | """Hyperdimension Neptunia Re;Birth1 2 | Poor performance on some AMD hardware 3 | """ 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main() -> None: 9 | util.set_environment('radeonsi_disable_sam', 'true') 10 | util.set_environment('AMD_DEBUG', 'nowc') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/284160.py: -------------------------------------------------------------------------------- 1 | """Game fix for BeamNG.drive""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs d3dx9_43, d3dcompiler_43, d3dx11_43, d3dcompiler_47""" 8 | # https://github.com/ValveSoftware/Proton/issues/544#issuecomment-826150012 9 | util.protontricks('d3dx9_43') 10 | util.protontricks('d3dcompiler_43') 11 | util.protontricks('d3dx11_43') 12 | util.protontricks('d3dcompiler_47') 13 | -------------------------------------------------------------------------------- /gamefixes-steam/286360.py: -------------------------------------------------------------------------------- 1 | """Shadows on the Vatican - Act I: Greed 2 | Launcher keeps it's process running in the background but nothing shows up 3 | """ 4 | 5 | import os 6 | from protonfixes import util 7 | 8 | 9 | def main() -> None: 10 | util.replace_command('SotV_Launcher.exe', 'hd/SotV1.exe') 11 | os.chdir('hd') 12 | -------------------------------------------------------------------------------- /gamefixes-steam/286810.py: -------------------------------------------------------------------------------- 1 | """Hard Truck Apocalypse: Rise of Clans""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Won't start at 32 or more cores.""" 8 | util.set_cpu_topology_limit(31) 9 | -------------------------------------------------------------------------------- /gamefixes-steam/287310.py: -------------------------------------------------------------------------------- 1 | """Game fix for Re-Volt (287310)""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Sets the necessary dll overrides for the wrappers that are shipped with the game""" 8 | # Set overrides 9 | util.winedll_override('ddraw', util.OverrideOrder.NATIVE) 10 | util.winedll_override('dinput', util.OverrideOrder.NATIVE) 11 | -------------------------------------------------------------------------------- /gamefixes-steam/287450.py: -------------------------------------------------------------------------------- 1 | """Game fix for Rise of Nations: Extended Edition 2 | Source: https://github.com/simons-public/protonfixes/issues/24#issue-372384148 3 | """ 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main() -> None: 9 | """Installs crypt32 and and bypasses launcher""" 10 | # Install crypt32 (not required for Proton 3.16-3 and up) 11 | util.protontricks('crypt32') 12 | 13 | # Install DirectMusic 14 | util.protontricks('directmusic') 15 | 16 | # Set sound to alsa 17 | util.protontricks('sound=alsa') 18 | 19 | # Install DirectPlay for reliable multiplayer connections 20 | util.protontricks('directplay') 21 | 22 | # Disable launcher 23 | util.replace_command('patriots.exe', 'riseofnations.exe') 24 | -------------------------------------------------------------------------------- /gamefixes-steam/289130.py: -------------------------------------------------------------------------------- 1 | """Game fix for Endless Legend""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Enable -useembedded to get past loading hang""" 8 | # Enable preload options 9 | util.append_argument('-useembedded') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/2905090.py: -------------------------------------------------------------------------------- 1 | """UberSolder""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('quartz') 8 | -------------------------------------------------------------------------------- /gamefixes-steam/2909400.py: -------------------------------------------------------------------------------- 1 | """Final Fantasy VII Rebirth""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Grants bonus items to players with save data for Final Fantasy VII Remake Intergrade""" 8 | util.import_saves_folder(1462040, 'Documents/My Games/FINAL FANTASY VII REMAKE') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/292410.py: -------------------------------------------------------------------------------- 1 | """Street Racing Syndicate""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # fix videos 8 | util.protontricks('lavfilters') 9 | 10 | # in case user uses the ThirteenAG widescreen fix 11 | util.winedll_override('d3d9', util.OverrideOrder.NATIVE_BUILTIN) 12 | -------------------------------------------------------------------------------- /gamefixes-steam/294700.py: -------------------------------------------------------------------------------- 1 | """Game fix for Putt-Putt: Pep's Birthday Surprise""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """The game doesn't run unless there is a CD-ROM drive attached.""" 8 | util.create_dos_device() 9 | 10 | # sets up ID? exported from regedit 11 | util.regedit_add( 12 | 'HKLM\\System\\MountedDevices', 13 | '\\??\\Volume{00000000-0000-0000-0000-000000000052}', 14 | 'REG_BINARY', 15 | '2f746d7000', 16 | ) 17 | 18 | # sets up dosdevice? exported from regedit 19 | util.regedit_add( 20 | 'HKLM\\System\\MountedDevices', 21 | '\\DosDevices\\R:', 22 | 'REG_BINARY', 23 | '5c005c002e005c0064003a000000', 24 | ) 25 | -------------------------------------------------------------------------------- /gamefixes-steam/298030.py: -------------------------------------------------------------------------------- 1 | """Game fix for Total Annihilation""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Multiplayer requires directplay for full functionality""" 8 | util.protontricks('directplay') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/298110.py: -------------------------------------------------------------------------------- 1 | """FarCry 4""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """FarCry 4 chokes on more than 24 cores""" 8 | util.protontricks('d3dcompiler_43') 9 | util.protontricks('d3dcompiler_47') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/302370.py: -------------------------------------------------------------------------------- 1 | """Tex Murphy: Overseer 2 | Digital Sound Initialization Error (Intel RSX 3D drivers are not installed) 3 | LAV Filters for video and DgVoodoo for textures 4 | edit registry to avoid ffdshow compatibility manager popup 5 | """ 6 | 7 | import os 8 | import subprocess 9 | from protonfixes import util 10 | 11 | 12 | def main() -> None: 13 | util.protontricks('rsx3d') 14 | if util.protontricks('lavfilters'): 15 | util.regedit_add( 16 | 'HKEY_CURRENT_USER\\Software\\GNU\\ffdshow', 17 | 'blacklist', 18 | 'REG_SZ', 19 | 'OVERSEER.EXE', 20 | ) 21 | util.regedit_add( 22 | 'HKEY_CURRENT_USER\\Software\\GNU\\ffdshow_audio', 23 | 'blacklist', 24 | 'REG_SZ', 25 | 'OVERSEER.EXE', 26 | ) 27 | if util.protontricks('dgvoodoo2'): 28 | syswow64 = os.path.join( 29 | util.protonprefix(), 'drive_c/windows/syswow64', 'dgvoodoo.conf' 30 | ) 31 | subprocess.call( 32 | [f"sed -i '/[DirectX]/ {{/Resolution/s/max/unforced/}}' {syswow64}"], 33 | shell=True, 34 | ) 35 | -------------------------------------------------------------------------------- /gamefixes-steam/307780.py: -------------------------------------------------------------------------------- 1 | """Game fix for Mortal Kombat X""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Fix pre-rendered cutscene playback 8 | util.protontricks('xact_x64') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/3094040.py: -------------------------------------------------------------------------------- 1 | """Fixes in-game media playback.""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('wmp9') 8 | util.protontricks('directshow') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/311210.py: -------------------------------------------------------------------------------- 1 | """Game fix for Black Ops III""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs devenum, quartz, wmp9""" 8 | # If you have too many audio devices the game shows a black screen with audio only, this works around the issue. 9 | # https://www.reddit.com/r/blackops3/comments/3rpd4f/black_screen_with_only_audio_pc/ 10 | util.protontricks('sound=alsa') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/311730.py: -------------------------------------------------------------------------------- 1 | """Game fix for DEAD OR ALIVE 5 Last Round""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Disables esync""" 8 | # https://github.com/ValveSoftware/Proton/issues/1834#issuecomment-433672443 9 | util.disable_esync() 10 | util.disable_fsync() 11 | -------------------------------------------------------------------------------- /gamefixes-steam/312060.py: -------------------------------------------------------------------------------- 1 | """Game fix for FFXIV""" 2 | 3 | import os 4 | from protonfixes import util 5 | 6 | 7 | def main() -> None: 8 | """FFXIV add NOSTEAM option.""" 9 | # Fixes the startup process. 10 | if 'NOSTEAM' in os.environ: 11 | util.replace_command('-issteam', '') 12 | -------------------------------------------------------------------------------- /gamefixes-steam/312450.py: -------------------------------------------------------------------------------- 1 | """Game fix for Order of Battle: World War II 2 | Still missing intro video codecs 3 | """ 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main() -> None: 9 | """Install corefonts""" 10 | # https://github.com/ValveSoftware/Proton/issues/639 11 | util.protontricks('corefonts') 12 | -------------------------------------------------------------------------------- /gamefixes-steam/312670.py: -------------------------------------------------------------------------------- 1 | """Game fix for Strange Brigade""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """This bypasses Strange Brigade's Launcher, which renders all black.""" 8 | # Fixes the startup process. 9 | util.replace_command('StrangeBrigade.exe', 'StrangeBrigade_Vulkan.exe') 10 | util.append_argument('-skipdrivercheck -noHDR') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/312790.py: -------------------------------------------------------------------------------- 1 | """Game fix for Agarest: Generations of War 2""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('wmp9') 8 | util.disable_protonmediaconverter() 9 | -------------------------------------------------------------------------------- /gamefixes-steam/321040.py: -------------------------------------------------------------------------------- 1 | """Game fix for Dirt 3 Complete Edition""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs openal as redistributable install script is borked.""" 8 | util.protontricks('openal') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/328500.py: -------------------------------------------------------------------------------- 1 | """Game fix for Potatoman Seeks the Troof""" 2 | 3 | import os 4 | from protonfixes import util 5 | 6 | 7 | def main() -> None: 8 | """The file mms.cfg must have the string OverrideGPUValidation=1 written""" 9 | fix_installed = False 10 | prefix = util.protonprefix() 11 | macro_path = 'drive_c/windows/syswow64/Macromed/Flash' 12 | flash_path = os.path.join(prefix, macro_path) 13 | mms_path = os.path.join(flash_path, 'mms.cfg') 14 | os.makedirs(flash_path, exist_ok=True) 15 | if os.path.isfile(mms_path): 16 | with open(mms_path, encoding='utf-8') as f: 17 | for line in f: 18 | if 'OverrideGPUValidation' in line: 19 | fix_installed = True 20 | if not fix_installed: 21 | with open(mms_path, 'a', encoding='utf-8') as f: 22 | f.write('\n') 23 | f.write('OverrideGPUValidation=1') 24 | -------------------------------------------------------------------------------- /gamefixes-steam/329380.py: -------------------------------------------------------------------------------- 1 | """Game fix Stealth Inc 2: A Game of Clones""" 2 | 3 | from protonfixes import util 4 | from protonfixes.logger import log 5 | 6 | 7 | def main() -> None: 8 | """Dsound is needed for audio""" 9 | log('Installing dsound') 10 | util.protontricks('dsound') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/331370.py: -------------------------------------------------------------------------------- 1 | """Game fix for Dauntless""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Game needs SteamDeck=1 for EAC to work.""" 8 | util.set_environment('SteamDeck', '1') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/33230.py: -------------------------------------------------------------------------------- 1 | """Game fix for Assassin's Creed 2""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Game ships with outdated and not working uPlay launcher.""" 8 | util.protontricks('ubisoftconnect') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/33460.py: -------------------------------------------------------------------------------- 1 | """Game fix for From Dust""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Game will get stuck on initial loading screen unless these are disabled""" 8 | util.disable_esync() 9 | util.disable_fsync() 10 | -------------------------------------------------------------------------------- /gamefixes-steam/33990.py: -------------------------------------------------------------------------------- 1 | """Alternativa 2 | wmp11 (Fixes missing logo videos and problems with working videos) 3 | hangs on logo without override 4 | """ 5 | 6 | from protonfixes import util 7 | 8 | 9 | def main() -> None: 10 | util.winedll_override('libvkd3d-1', util.OverrideOrder.NATIVE) 11 | util.protontricks('wmp11') 12 | -------------------------------------------------------------------------------- /gamefixes-steam/34330.py: -------------------------------------------------------------------------------- 1 | """Total War: Shogun 2""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('d3dcompiler_43') 8 | -------------------------------------------------------------------------------- /gamefixes-steam/348550.py: -------------------------------------------------------------------------------- 1 | """Game fix for Guilty Gear Accent Core Plus R""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Uses physx""" 8 | util.protontricks('quartz') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/35000.py: -------------------------------------------------------------------------------- 1 | """Game fix for Mini Ninjas""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Game needs OpenAL library for audio to work, but the game doesn't include it by default, leading to missing audio in-game, even on Windows.""" 8 | util.protontricks('openal') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/351710.py: -------------------------------------------------------------------------------- 1 | """Hyperdimension Neptunia Re;Birth2 2 | Poor performance on some AMD hardware 3 | """ 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main() -> None: 9 | util.set_environment('radeonsi_disable_sam', 'true') 10 | util.set_environment('AMD_DEBUG', 'nowc') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/356500.py: -------------------------------------------------------------------------------- 1 | """Game fix for STAR WARS Galactic Battlegrounds Saga""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('icodecs') 8 | util.protontricks('directplay') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/3590.py: -------------------------------------------------------------------------------- 1 | """Game fix for Plants vs. Zombies: Game of the Year 2 | Source: https://github.com/JamesHealdUK/protonfixes/blob/master/fixes/3590.sh 3 | """ 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main() -> None: 9 | """Changes the proton argument from the launcher to the game""" 10 | # Game expects this to be set 11 | util.append_argument('-changedir') 12 | -------------------------------------------------------------------------------- /gamefixes-steam/359550.py: -------------------------------------------------------------------------------- 1 | """Game fix for Rainbow Six Siege""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Game ships with outdated and not working uPlay launcher.""" 8 | util.disable_uplay_overlay() 9 | util.set_environment('vk_x11_override_min_image_count', '2') 10 | util.protontricks('ubisoftconnect') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/359870.py: -------------------------------------------------------------------------------- 1 | """Game fix for FFX/X-2 HD Remaster""" 2 | 3 | import os 4 | from protonfixes import util 5 | 6 | 7 | def main() -> None: 8 | # Game defaults to Japanese language, set this to English instead 9 | configpath = os.path.join( 10 | util.protonprefix(), 11 | 'drive_c/users/steamuser/My Documents/SQUARE ENIX/FINAL FANTASY X&X-2 HD Remaster', 12 | ) 13 | if not os.path.exists(configpath): 14 | os.makedirs(configpath) 15 | configgame = os.path.join(configpath, 'GameSetting.ini') 16 | if not os.path.isfile(configgame): 17 | with open(configgame, 'w+', encoding='utf-8') as f: 18 | f.write('Language=en') 19 | -------------------------------------------------------------------------------- /gamefixes-steam/366250.py: -------------------------------------------------------------------------------- 1 | """Metal Slug""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('d3dcompiler_46') 8 | -------------------------------------------------------------------------------- /gamefixes-steam/368500.py: -------------------------------------------------------------------------------- 1 | """Game fix for Assassin's Creed: Syndicate""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Game ships with outdated and not working uPlay launcher.""" 8 | util.protontricks('ubisoftconnect') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/371660.py: -------------------------------------------------------------------------------- 1 | """Far Cry Primal""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Chokes on more than 31 cores""" 8 | util.set_cpu_topology_limit(31) 9 | -------------------------------------------------------------------------------- /gamefixes-steam/372000.py: -------------------------------------------------------------------------------- 1 | """Game fix Tree Of Savior""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """https://forum.treeofsavior.com/t/linux-the-graphic-card-does-not-support-directx11-13ep/418073/13""" 8 | util.protontricks('d3dcompiler_47') 9 | # Installing Quartz allows the game to work on GE 10-1 10 | util.protontricks('quartz') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/375900.py: -------------------------------------------------------------------------------- 1 | """Game fix for Trackmania Turbo""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Game ships with outdated and not working uPlay launcher.""" 8 | util.protontricks('ubisoftconnect') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/377160.py: -------------------------------------------------------------------------------- 1 | 22330.py -------------------------------------------------------------------------------- /gamefixes-steam/377840.py: -------------------------------------------------------------------------------- 1 | """Game fix for FINAL FANTASY IX""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Fix crackling audio 8 | util.set_environment('PULSE_LATENCY_MSEC', '60') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/378630.py: -------------------------------------------------------------------------------- 1 | """Shadows on the Vatican - Act II: Wrath 2 | Launcher keeps it's process running in the background but nothing shows up 3 | """ 4 | 5 | import os 6 | from protonfixes import util 7 | 8 | 9 | def main() -> None: 10 | util.replace_command('SotV_Launcher.exe', 'hd/SotV2.exe') 11 | os.chdir('hd') 12 | -------------------------------------------------------------------------------- /gamefixes-steam/379720.py: -------------------------------------------------------------------------------- 1 | """Game fix for Doom 2016""" 2 | 3 | import os 4 | import shutil 5 | import urllib.request 6 | import zipfile 7 | 8 | from protonfixes import util 9 | 10 | 11 | def main() -> None: 12 | """Enable preload options""" 13 | # Enable preload options 14 | util.append_argument('+r_renderAPI 1') 15 | 16 | installpath = os.path.abspath(os.getcwd()) 17 | url = ( 18 | 'https://github.com/Riesi/CChromaEditor/files/2277158/CChromaEditorLibrary.zip' 19 | ) 20 | 21 | if not os.path.isfile(os.path.join(installpath, 'CChromaEditorLibrary.dll.bak')): 22 | urllib.request.urlretrieve(url, 'CChromaEditorLibrary.zip') 23 | shutil.move( 24 | os.path.join(installpath, 'CChromaEditorLibrary.dll'), 25 | os.path.join(installpath, 'CChromaEditorLibrary.dll.bak'), 26 | ) 27 | with zipfile.ZipFile('CChromaEditorLibrary.zip', 'r') as zip_ref: 28 | zip_ref.extractall(installpath) 29 | -------------------------------------------------------------------------------- /gamefixes-steam/386360.py: -------------------------------------------------------------------------------- 1 | """Game fix for Smite""" 2 | 3 | import glob 4 | import os 5 | import subprocess 6 | from protonfixes import util 7 | 8 | 9 | def main() -> None: 10 | """Fix EAC location in smite""" 11 | install_dir = glob.escape(util.get_game_install_path()) 12 | 13 | # Fix EAC incorrect location: 14 | if not os.path.exists(install_dir + '/Win64/EasyAntiCheat/easyanticheat_x64.so'): 15 | subprocess.call( 16 | [ 17 | 'ln', 18 | '-s', 19 | install_dir + '/EasyAntiCheat/easyanticheat_x64.so', 20 | install_dir + '/Win64/EasyAntiCheat/', 21 | ] 22 | ) 23 | 24 | if not os.path.exists(install_dir + '/Win32/EasyAntiCheat/easyanticheat_x86.so'): 25 | subprocess.call( 26 | [ 27 | 'ln', 28 | '-s', 29 | install_dir + '/EasyAntiCheat/easyanticheat_x86.so', 30 | install_dir + '/Win32/EasyAntiCheat/', 31 | ] 32 | ) 33 | -------------------------------------------------------------------------------- /gamefixes-steam/388750.py: -------------------------------------------------------------------------------- 1 | """Game fix for Chronophantasma Extend""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Uses installs devenum wmp9""" 8 | # https://github.com/ValveSoftware/Proton/issues/703#issuecomment-416075961 9 | util.protontricks('devenum') 10 | util.protontricks('wmp9') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/390710.py: -------------------------------------------------------------------------------- 1 | """Game fix for SUGURI 2""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs d3dxof""" 8 | # https://github.com/ValveSoftware/Proton/issues/970#issuecomment-420421289 9 | util.protontricks('d3dxof') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/39190.py: -------------------------------------------------------------------------------- 1 | """Game fix for Dungeon Siege""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Enable Multiplayer and protontricks directplay for full functionality""" 8 | util.append_argument('Zonematch=true') 9 | util.protontricks('directplay') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/39200.py: -------------------------------------------------------------------------------- 1 | """Game fix for Dungeon Siege II""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Apply protontricks directplay for full multiplayer functionality""" 8 | # Even though the Steam version has disabled multiplayer functionality 9 | # many people will apply a fix to unlock Broken Worlds which will also 10 | # enable multiplayer again. 11 | util.protontricks('directplay') 12 | -------------------------------------------------------------------------------- /gamefixes-steam/39210.py: -------------------------------------------------------------------------------- 1 | """Game fix for FFXIV""" 2 | 3 | import os 4 | from protonfixes import util 5 | 6 | 7 | def main() -> None: 8 | """FFXIV add NOSTEAM option.""" 9 | # Fixes the startup process. 10 | if 'NOSTEAM' in os.environ: 11 | util.replace_command('-issteam', '') 12 | -------------------------------------------------------------------------------- /gamefixes-steam/39500.py: -------------------------------------------------------------------------------- 1 | """Game fix for Gothic 3 (and Forsaken Gods Enhanced Edition)""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Modify ge3.ini""" 8 | game_opts = """ 9 | [Engine.Setup] 10 | Timer.ThreadSafe=false 11 | FpS.Max=0 12 | """ 13 | 14 | util.set_ini_options(game_opts, 'Ini/ge3.ini', 'cp1251') 15 | -------------------------------------------------------------------------------- /gamefixes-steam/39510.py: -------------------------------------------------------------------------------- 1 | 65540.py -------------------------------------------------------------------------------- /gamefixes-steam/39540.py: -------------------------------------------------------------------------------- 1 | """Game fix for SpellForce""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Needs DirectPlay for multiplayer functionality""" 8 | util.protontricks('directplay') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/39550.py: -------------------------------------------------------------------------------- 1 | 39540.py -------------------------------------------------------------------------------- /gamefixes-steam/39690.py: -------------------------------------------------------------------------------- 1 | """Game fix for Arkania""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # This requires Proton 5.0 installed 8 | util.protontricks('wmp11') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/397540.py: -------------------------------------------------------------------------------- 1 | """Game fix for Borderlands 3""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Borderlands 3""" 8 | # Fixes the startup process. 9 | util.protontricks('d3dcompiler_47') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/40800.py: -------------------------------------------------------------------------------- 1 | """Game fix for Super Meat Boy""" 2 | 3 | # 4 | from protonfixes import util 5 | 6 | 7 | def main() -> None: 8 | """Installs d3dcompiler, xact""" 9 | util.protontricks('d3dcompiler_47') 10 | util.protontricks('xact') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/409090.py: -------------------------------------------------------------------------------- 1 | """The Big Secret of a Small Town 2 | No cursor or double cursor selecting custom cursor in options 3 | PROTON_USE_WINED3D=1 fixes the problem but removes the antialising 4 | dgvoodoo2 fixes the cursors and keeps the antialising 5 | copy dgvoodoo2 d3d9.dll every time otherwise it gets overwritten 6 | """ 7 | 8 | import os 9 | import subprocess 10 | import shutil 11 | from protonfixes import util 12 | 13 | 14 | def main() -> None: 15 | syswow64 = os.path.join(util.protonprefix(), 'drive_c/windows/syswow64') 16 | if util.protontricks('dgvoodoo2'): 17 | subprocess.call( 18 | [ 19 | f"sed -i '/[DirectX]/ {{/Resolution/s/max/unforced/}}' {syswow64}/dgvoodoo.conf" 20 | ], 21 | shell=True, 22 | ) 23 | shutil.copy( 24 | os.path.join(syswow64, 'dgd3d9.dll'), os.path.join(syswow64, 'd3d9.dll') 25 | ) 26 | -------------------------------------------------------------------------------- /gamefixes-steam/40950.py: -------------------------------------------------------------------------------- 1 | """Game fix for Stronghold HD 2 | Fixes Multiplayer 3 | """ 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main() -> None: 9 | """Installs directplay""" 10 | util.protontricks('directplay') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/40970.py: -------------------------------------------------------------------------------- 1 | """Game fix for Stronghold Crusader HD 2 | Fixes Multiplayer 3 | """ 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main() -> None: 9 | """Installs directplay""" 10 | util.protontricks('directplay') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/409710.py: -------------------------------------------------------------------------------- 1 | 409720.py -------------------------------------------------------------------------------- /gamefixes-steam/409720.py: -------------------------------------------------------------------------------- 1 | """Game fix for BioShock 2 Remastered""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Disable ESYNC and FSYNC""" 8 | # ESYNC and FSYNC causes low quality texture problems in all BioShock 1 and 2 versions (Original and Remastered). 9 | util.disable_esync() 10 | util.disable_fsync() 11 | -------------------------------------------------------------------------------- /gamefixes-steam/410900.py: -------------------------------------------------------------------------------- 1 | """Game fix for Forts""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Uses winetricks to install the ole32 verb""" 8 | util.protontricks('ole32') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/424840.py: -------------------------------------------------------------------------------- 1 | """Game fix for Little Nightmares""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Add launch parameter""" 8 | # The game crashes if running with more than one CPU thread, 9 | # adding "-onethread" will force the game to use only one CPU thread 10 | util.append_argument('-onethread') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/428660.py: -------------------------------------------------------------------------------- 1 | """Deliver us the Moon fix""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Replace launcher with game exe in proton arguments 8 | util.replace_command( 9 | 'MoonMan.exe', 'MoonMan/Binaries/Win64/MoonMan-Win64-Shipping.exe' 10 | ) 11 | -------------------------------------------------------------------------------- /gamefixes-steam/429720.py: -------------------------------------------------------------------------------- 1 | """Game fix for IMSCARED""" 2 | 3 | import os 4 | import getpass 5 | from protonfixes import util 6 | 7 | 8 | def main() -> None: 9 | # IMSCARED relies on a folder on the user's Desktop being accessible 10 | # The problem is that all of the folders in Proton are sandboxed 11 | # So this protonfix works around that 12 | desktoppath = os.path.join(util.protonprefix(), 'drive_c/users/steamuser/Desktop') 13 | if os.path.exists(desktoppath): 14 | if os.path.islink(desktoppath): 15 | os.unlink(desktoppath) 16 | else: 17 | os.rmdir(desktoppath) 18 | dst = '/home/' + getpass.getuser() + '/Desktop/' 19 | os.symlink(dst, desktoppath) 20 | -------------------------------------------------------------------------------- /gamefixes-steam/43110.py: -------------------------------------------------------------------------------- 1 | """Game fix for Metro 2033""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs d3dcompiler_42""" 8 | util.protontricks('d3dcompiler_42') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/434570.py: -------------------------------------------------------------------------------- 1 | """Game fix for Blood and Bacon""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('dotnet40') 8 | -------------------------------------------------------------------------------- /gamefixes-steam/436670.py: -------------------------------------------------------------------------------- 1 | """Game fix for The Legend of Heroes: Trails in the Sky the 3rd""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('quartz') # Cutscene fixes 8 | util.protontricks('amstream') 9 | util.protontricks('lavfilters') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/440900.py: -------------------------------------------------------------------------------- 1 | """Game fix for Conan Exiles""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Launcher workaround""" 8 | # Fixes the startup process. 9 | util.install_battleye_runtime() 10 | util.replace_command( 11 | 'FuncomLauncher.exe', '../ConanSandbox/Binaries/Win64/ConanSandbox.exe' 12 | ) 13 | util.append_argument('-BattlEye') 14 | -------------------------------------------------------------------------------- /gamefixes-steam/44690.py: -------------------------------------------------------------------------------- 1 | """Game fix for GT Legends""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs mfc42""" 8 | util.protontricks('mfc42') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/447040.py: -------------------------------------------------------------------------------- 1 | """Game fix for Watch_Dogs 2""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Disable Easy Anti-Cheat and online play""" 8 | # Replace launcher with game exe in proton arguments 9 | util.append_argument('-eac_launcher -nosplash') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/452440.py: -------------------------------------------------------------------------------- 1 | """Game fix for Flowers - Le Volume Sur Printemps 2 | 3 | This fix installs the font that should be bundled with the game in case it 4 | does not get installed during the setup process. Without this fix, the default 5 | font will be used which doesn't wrap correctly, resulting in the text breaking 6 | outside its text box area. 7 | """ 8 | 9 | import os 10 | from hashlib import sha256 11 | from subprocess import run 12 | 13 | import __main__ as protonmain 14 | from protonfixes import util 15 | from protonfixes.logger import log 16 | 17 | 18 | def main() -> None: 19 | env = protonmain.g_session.env.copy() 20 | wine = f'{util.protondir()}/files/bin/wine64' 21 | install_dir = util.get_game_install_path() 22 | 23 | # Font installer inside the `fonts` subdir 24 | font_installer = 'overlock_mod_font_installer.exe' 25 | 26 | # Digest of the font installer 27 | hashsum = 'd3bd48162d91322c3d2861cdccc538955336eff7f0fe50eeafee1b7551a52152' 28 | 29 | if os.path.isfile(f'{util.protonprefix()}/drive_c/windows/Fonts/Overlock-Mod.ttf'): 30 | log.info("Font 'Overlock-Mod.ttf' already installed in prefix, skipping...") 31 | return 32 | 33 | if not os.path.isfile(f'{install_dir}/font/{font_installer}'): 34 | log.warn(f"Could not find '{font_installer}' in '{install_dir}', skipping...") 35 | return 36 | 37 | with open(f'{install_dir}/font/{font_installer}', mode='rb') as file: 38 | if sha256(file.read()).hexdigest() != hashsum: 39 | log.warn(f'Digest mismatched: {font_installer}') 40 | log.warn(f"Expected '{hashsum}', skipping...") 41 | return 42 | 43 | log.info("Installing font 'Overlock-Mod.ttf' in prefix...") 44 | retc = run( 45 | [wine, 'start', '/unix', f'{install_dir}/font/{font_installer}', '/silent'], 46 | check=False, 47 | env=env, 48 | ).returncode 49 | 50 | if retc: 51 | log.warn(f"Running '{font_installer}' exited with the status code: {retc}") 52 | -------------------------------------------------------------------------------- /gamefixes-steam/4560.py: -------------------------------------------------------------------------------- 1 | """Game fix for Transformers: War for Cybertron""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs physx library, without it the game simply won't launch""" 8 | util.protontricks('physx') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/45750.py: -------------------------------------------------------------------------------- 1 | """Game fix for Lost Planet 2 (2010) 2 | This game requires two fixes to work: 3 | 1. A mocked xlive.dll for GFWL (multiplayer will not work, but the single player does) 4 | 2. No more than 12 CPU cores (on PCGamingWiki is described as 6, but on my personal test I was able to set until 12 of 16) [source: https://www.pcgamingwiki.com/wiki/Lost_Planet_2#Alternate_solution_for_high_core_CPUs] 5 | """ 6 | 7 | from protonfixes import util 8 | 9 | 10 | def main() -> None: 11 | util.protontricks('xliveless') 12 | 13 | # According to PCGW, no more than 6 physical cores work 14 | # Nevertheless, the game was tested with 12 threads 15 | # TODO: Test the game with SMT disabled / use set_cpu_topology_nosmt() 16 | util.set_cpu_topology_limit(12) 17 | -------------------------------------------------------------------------------- /gamefixes-steam/460120.py: -------------------------------------------------------------------------------- 1 | """Game fix for Megadimension Neptunia VII""" 2 | 3 | # 4 | from protonfixes import util 5 | 6 | 7 | # Fixes cinematics not showing or spawning in a different window 8 | # also fixes cinematics not playing sound 9 | def main() -> None: 10 | util.protontricks('quartz_feb2010') 11 | util.protontricks('wmp11') 12 | util.protontricks('qasf') 13 | -------------------------------------------------------------------------------- /gamefixes-steam/460930.py: -------------------------------------------------------------------------------- 1 | """Game fix for Ghost Recon WIldlands""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Game ships with outdated and not working uPlay launcher.""" 8 | util.protontricks('ubisoftconnect') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/46500.py: -------------------------------------------------------------------------------- 1 | """Game fix for Syberia""" 2 | 3 | import os 4 | import subprocess 5 | 6 | 7 | def main() -> None: 8 | """Needs player.ini to prevent black screen on load""" 9 | if not os.path.isfile('player.ini'): 10 | subprocess.call(['touch', 'player.ini']) 11 | with open('player.ini', 'w+', encoding='utf-8') as f: 12 | f.write('800 600 32 0 BaseCMO.cmo') 13 | -------------------------------------------------------------------------------- /gamefixes-steam/465280.py: -------------------------------------------------------------------------------- 1 | """Game fix for Yesterday Origins""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Set to win7""" 8 | # Fixes black screen during cutscenes. 9 | util.protontricks('win7') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/465840.py: -------------------------------------------------------------------------------- 1 | """The Last Blade""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('d3dcompiler_46') 8 | -------------------------------------------------------------------------------- /gamefixes-steam/4730.py: -------------------------------------------------------------------------------- 1 | """Outrun 2006: Coast 2 Coast""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | # Fix water rendering as black 7 | def main() -> None: 8 | util.protontricks('d3dx9') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/48190.py: -------------------------------------------------------------------------------- 1 | """Game fix for Assassin's Creed: Brotherhood 2 | 3 | Game uses an old customized Ubisoft launcher that's currently not working with Proton. 4 | """ 5 | 6 | from protonfixes import util 7 | 8 | 9 | def main() -> None: 10 | util.append_argument('-playoffline') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/489830.py: -------------------------------------------------------------------------------- 1 | 22330.py -------------------------------------------------------------------------------- /gamefixes-steam/49520.py: -------------------------------------------------------------------------------- 1 | """Game fix for Borderlands 2""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Launcherfix and NVIDIA PhysX support.""" 8 | # Fixes the startup process. 9 | util.replace_command('Launcher.exe', 'Borderlands2.exe') 10 | util.append_argument('-NoSplash') 11 | 12 | # Disables esync prevents crashes. 13 | util.disable_esync() 14 | 15 | # Enables NVIDIA PhysX in Borderlands 2. 16 | util.protontricks('physx') 17 | -------------------------------------------------------------------------------- /gamefixes-steam/495420.py: -------------------------------------------------------------------------------- 1 | """Game fix for State of Decay 2""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Fix game crashes with d3dcompiler_47 and multiplayer crashes with win7""" 8 | util.protontricks('d3dcompiler_47') 9 | util.protontricks('win7') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/49900.py: -------------------------------------------------------------------------------- 1 | """Game fix for Plain Sight""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs XNA 3.1 to avoid crash when loading levels""" 8 | util.protontricks('xna31') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/506510.py: -------------------------------------------------------------------------------- 1 | """Shadows of Adam""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Fixes game getting stuck on a white screen.""" 8 | util.winedll_override('dcomp', util.OverrideOrder.DISABLED) 9 | -------------------------------------------------------------------------------- /gamefixes-steam/508980.py: -------------------------------------------------------------------------------- 1 | """Game fix for Crashday Redline Edition""" 2 | 3 | import json 4 | from protonfixes import util 5 | 6 | 7 | def main() -> None: 8 | """Change setting FSAA to 0 in graphics.config""" 9 | config = ( 10 | util.protonprefix() 11 | / 'drive_c/users/steamuser/Local Settings/' 12 | / 'Application Data/Crashday/config/graphics.config' 13 | ) 14 | 15 | # https://stackoverflow.com/a/45435707 16 | with open(config, encoding='utf-8') as file: 17 | json_data = json.load(file) 18 | if 'FSAA' in json_data: 19 | json_data['FSAA'] = 0 20 | with open(config, 'w', encoding='utf-8') as file: 21 | json.dump(json_data, file, indent=4) 22 | -------------------------------------------------------------------------------- /gamefixes-steam/518790.py: -------------------------------------------------------------------------------- 1 | """The Hunter: Call of the Wild""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Requires nvapi disabled.""" 8 | util.disable_nvapi() 9 | -------------------------------------------------------------------------------- /gamefixes-steam/550340.py: -------------------------------------------------------------------------------- 1 | """Ougon Musoukyoku""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Codecs required for opening playback 8 | util.protontricks('lavfilters') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/553850.py: -------------------------------------------------------------------------------- 1 | """Helldivers 2""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs prevent cursor from leaving window in borderless mode""" 8 | util.protontricks('grabfullscreen=y') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/559620.py: -------------------------------------------------------------------------------- 1 | """Game fix for Outlaws + A Handful of Missions""" 2 | 3 | # 4 | from protonfixes import util 5 | 6 | 7 | def main() -> None: 8 | # Override ddraw (cutscenes+menu perf) and WinMM (Music) 9 | util.winedll_override('ddraw', util.OverrideOrder.NATIVE_BUILTIN) 10 | util.winedll_override('winmm', util.OverrideOrder.NATIVE_BUILTIN) 11 | -------------------------------------------------------------------------------- /gamefixes-steam/570940.py: -------------------------------------------------------------------------------- 1 | """Game fix Dark Souls Remastered""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Requires vcrun2017 to launch 8 | util.protontricks('vcrun2017') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/582660.py: -------------------------------------------------------------------------------- 1 | """Game fix for Black Desert Online""" 2 | 3 | import os 4 | from protonfixes import util 5 | 6 | 7 | def main() -> None: 8 | """Black Desert Online add NOSTEAM option.""" 9 | # Fixes the startup process. 10 | if 'NOSTEAM' in os.environ: 11 | util.replace_command('--steam', '') 12 | # Needed for settings archive 13 | util.set_environment('SteamGameId', '582660') 14 | # Needed for Launcher 15 | util.set_environment('WINE_DISABLE_KERNEL_WRITEWATCH', '1') 16 | -------------------------------------------------------------------------------- /gamefixes-steam/586140.py: -------------------------------------------------------------------------------- 1 | """BlazBlue Centralfiction 2 | Missing voices/sounds in cutscenes 3 | Requires disabling the gstreamer protonaudioconverterbin plugin to get full audio in cutscenes 4 | """ 5 | 6 | from protonfixes import util 7 | 8 | 9 | def main() -> None: 10 | util.disable_protonmediaconverter() 11 | -------------------------------------------------------------------------------- /gamefixes-steam/593600.py: -------------------------------------------------------------------------------- 1 | """Game fix for PixARK""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Overrides the mprapi.dll to native.""" 8 | util.winedll_override('mprapi', util.OverrideOrder.NATIVE) 9 | -------------------------------------------------------------------------------- /gamefixes-steam/601510.py: -------------------------------------------------------------------------------- 1 | """Yu-Gi-Oh Duel Links needs vcrun2019""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Replace launcher with game exe in proton arguments 8 | util.protontricks('vcrun2019') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/61500.py: -------------------------------------------------------------------------------- 1 | """Game fix for Age of Wonders""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('icodecs') 8 | -------------------------------------------------------------------------------- /gamefixes-steam/6270.py: -------------------------------------------------------------------------------- 1 | """Ducati World Championship""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('icodecs') 8 | -------------------------------------------------------------------------------- /gamefixes-steam/627270.py: -------------------------------------------------------------------------------- 1 | """Game fix Injustice 2""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Requires vcrun2019 to launch 8 | util.protontricks('vcrun2019') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/63110.py: -------------------------------------------------------------------------------- 1 | """Alter Ego 2 | Launcher crashes immediately without displaying any windows 3 | """ 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main() -> None: 9 | util.replace_command('AlterEgo.exe', './RunDev.exe') 10 | util.append_argument('AlterEgo.ebr') 11 | util.set_environment('SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS', '0') 12 | -------------------------------------------------------------------------------- /gamefixes-steam/633230.py: -------------------------------------------------------------------------------- 1 | """Game fix for Naruto To Boruto""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.replace_command( 8 | 'NARUTO.exe', 'NARUTO/Binaries/Win64/NARUTO-Win64-Shipping.exe' 9 | ) 10 | util.append_argument('-eac-nop-loaded') 11 | util.protontricks('hidewineexports=enable') 12 | -------------------------------------------------------------------------------- /gamefixes-steam/63700.py: -------------------------------------------------------------------------------- 1 | """Game fix for BIT.TRIP BEAT""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('d3dcompiler_43') 8 | util.protontricks('d3dx9_43') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/63710.py: -------------------------------------------------------------------------------- 1 | """Game fix for BIT.TRIP RUNNER""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """From: https://www.protondb.com/app/63710""" 8 | util.protontricks('d3dcompiler_43') 9 | util.protontricks('d3dx9_43') 10 | util.winedll_override('openal32', util.OverrideOrder.BUILTIN) 11 | -------------------------------------------------------------------------------- /gamefixes-steam/638160.py: -------------------------------------------------------------------------------- 1 | """Game fix for Moero Chronicle""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('quartz_feb2010') 8 | util.protontricks('wmp11') 9 | util.protontricks('qasf') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/638970.py: -------------------------------------------------------------------------------- 1 | """Game fix for Yakuza 0""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Disable FSYNC""" 8 | # Disable fsync to fix saving issues 9 | util.disable_fsync() 10 | -------------------------------------------------------------------------------- /gamefixes-steam/644930.py: -------------------------------------------------------------------------------- 1 | """They Are Billions""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # fix broken or missing font in UI 8 | util.protontricks('gdiplus') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/65530.py: -------------------------------------------------------------------------------- 1 | 39540.py -------------------------------------------------------------------------------- /gamefixes-steam/65540.py: -------------------------------------------------------------------------------- 1 | """Game fix for Gothic 1 Classic 2 | Game fix for Gothic II: Gold Classic 3 | Game fix for The Chronicles Of Myrtana: Archolos (mod of Gothic II: Gold Classic) 4 | """ 5 | 6 | from protonfixes import util 7 | 8 | 9 | def main() -> None: 10 | # Fix resolution, not necessary with 'GD3D11' - but doesn't hurt 11 | set_resolution() 12 | 13 | # Fix background music / Gothic 2 startup 14 | util.protontricks('directmusic') 15 | util.winedll_override( 16 | '*dsound', util.OverrideOrder.BUILTIN 17 | ) # Override registry entry 18 | 19 | # Fix crackling audio 20 | util.set_environment('PULSE_LATENCY_MSEC', '90') 21 | 22 | # Allow use of the popular workshop item 'GD3D11', which implements the DirectDraw API with Gothic-specific fixes 23 | # Gothic 1: https://steamcommunity.com/sharedfiles/filedetails/?id=2791606767 24 | # Gothic 2: https://steamcommunity.com/sharedfiles/filedetails/?id=2787015529 25 | # 26 | # This might also be necessary for the GOG release 27 | util.winedll_override('ddraw', util.OverrideOrder.NATIVE_BUILTIN) 28 | 29 | # Fix extreme mouse stutter and allow additional use of 'GRawInput (mouse fix)' from workshop 30 | # Gothic 1: https://steamcommunity.com/sharedfiles/filedetails/?id=3054112346 31 | # Gothic 2: https://steamcommunity.com/sharedfiles/filedetails/?id=3054078559 32 | util.winedll_override('dinput', util.OverrideOrder.NATIVE_BUILTIN) 33 | 34 | 35 | def set_resolution() -> None: 36 | # Patch the config to match the system resolution 37 | resolution = util.get_resolution() 38 | 39 | if not resolution: 40 | return 41 | 42 | screen_width, screen_height = resolution 43 | zVidResFullscreenX = str(screen_width) 44 | zVidResFullscreenY = str(screen_height) 45 | 46 | game_opts = ( 47 | """ 48 | [GAME] 49 | scaleVideos=1 50 | [VIDEO] 51 | zVidResFullscreenX=""" 52 | + zVidResFullscreenX 53 | + """ 54 | zVidResFullscreenY=""" 55 | + zVidResFullscreenY 56 | + """ 57 | zVidResFullscreenBPP=32 58 | """ 59 | ) 60 | 61 | util.set_ini_options(game_opts, 'system/Gothic.ini', 'cp1251') 62 | -------------------------------------------------------------------------------- /gamefixes-steam/65600.py: -------------------------------------------------------------------------------- 1 | 39500.py -------------------------------------------------------------------------------- /gamefixes-steam/65610.py: -------------------------------------------------------------------------------- 1 | """Game fix for Arkania""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # This requires Proton 5.0 installed 8 | util.protontricks('wmp11') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/658150.py: -------------------------------------------------------------------------------- 1 | """Skeleton Boomerang""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Fixes shader compilation error""" 8 | util.protontricks('d3dcompiler_43') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/658260.py: -------------------------------------------------------------------------------- 1 | """BLUE REFLECTION 2 | Missing voices/sounds in cutscenes 3 | """ 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main() -> None: 9 | util.disable_protonmediaconverter() 10 | -------------------------------------------------------------------------------- /gamefixes-steam/65930.py: -------------------------------------------------------------------------------- 1 | """Game fix for The Bureau: XCOM Declassified""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Disables esync and fsync""" 8 | # https://github.com/ValveSoftware/Proton/issues/797#issuecomment-955180056 9 | util.disable_esync() 10 | util.disable_fsync() 11 | -------------------------------------------------------------------------------- /gamefixes-steam/678950.py: -------------------------------------------------------------------------------- 1 | """Game fix for DRAGON BALL FighterZ""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.replace_command('DBFighterZ.exe', 'RED/Binaries/Win64/RED-Win64-Shipping.exe') 8 | util.append_argument('-eac-nop-loaded') 9 | 10 | util.protontricks('hidewineexports=enable') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/6920.py: -------------------------------------------------------------------------------- 1 | """Deus Ex: Invisible War""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Fix for extremely loud audio glitches when using Spy Drones 8 | util.protontricks('dsound') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/700600.py: -------------------------------------------------------------------------------- 1 | """Game fix for Evil Genius 2""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Launcher workaround""" 8 | # Fixes the startup process. 9 | util.replace_command('eg2.exe', '../bin/evilgenius_vulkan.exe') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/70400.py: -------------------------------------------------------------------------------- 1 | """Game fix for Recettear: An Item Shop's Tale""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Install directsound libraries""" 8 | util.protontricks('dmime') 9 | util.protontricks('dmloader') 10 | util.protontricks('dmsynth') 11 | util.protontricks('dmusic') 12 | util.protontricks('dsound') 13 | util.protontricks('dswave') 14 | util.winedll_override('streamci', util.OverrideOrder.NATIVE) 15 | util.protontricks('sound=alsa') 16 | 17 | """ Fix for audio stutter/desync 18 | """ 19 | util.set_environment('PULSE_LATENCY_MSEC', '60') 20 | -------------------------------------------------------------------------------- /gamefixes-steam/70420.py: -------------------------------------------------------------------------------- 1 | """Game fix for Chantelise - A Tale of Two Sisters""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Install directsound libraries""" 8 | util.protontricks('dmime') 9 | util.protontricks('dmloader') 10 | util.protontricks('dmsynth') 11 | util.protontricks('dmusic') 12 | util.protontricks('dsound') 13 | util.protontricks('dswave') 14 | util.winedll_override('streamci', util.OverrideOrder.NATIVE) 15 | util.protontricks('sound=alsa') 16 | 17 | """ Fix for audio stutter/desync 18 | """ 19 | util.set_environment('PULSE_LATENCY_MSEC', '60') 20 | -------------------------------------------------------------------------------- /gamefixes-steam/70650.py: -------------------------------------------------------------------------------- 1 | """Game fix for Worms: Blast""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs directmusic to fix menu and game music""" 8 | util.protontricks('directmusic') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/72850.py: -------------------------------------------------------------------------------- 1 | 22330.py -------------------------------------------------------------------------------- /gamefixes-steam/729040.py: -------------------------------------------------------------------------------- 1 | """Borderlands GOTY""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.replace_command('Launcher.exe', 'BorderlandsGOTY.exe') 8 | -------------------------------------------------------------------------------- /gamefixes-steam/730830.py: -------------------------------------------------------------------------------- 1 | """Escape From Monkey Island 2 | dgvoodoo2 to force anti-aliasing and higher resolution 3 | """ 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main() -> None: 9 | util.protontricks('dgvoodoo2') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/73170.py: -------------------------------------------------------------------------------- 1 | """Game fix for Darkest Hour: A Hearts of Iron Game""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Set virtual desktop""" 8 | # https://github.com/ValveSoftware/Proton/issues/3338 9 | util.protontricks('vd=1280x720') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/740550.py: -------------------------------------------------------------------------------- 1 | """Game fix for Record of Agarest War Mariage""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('wmp9') 8 | util.disable_protonmediaconverter() 9 | -------------------------------------------------------------------------------- /gamefixes-steam/750920.py: -------------------------------------------------------------------------------- 1 | """Shadow of the Tomb Raider""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Requires media foundation dlls""" 8 | util.protontricks('d3dcompiler_47') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/7510.py: -------------------------------------------------------------------------------- 1 | """X-Blades""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """The launcher won't start the game, so it needs to be skipped for the game to run.""" 8 | util.replace_command('launcher\\.exe$', 'xblades.exe') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/7670.py: -------------------------------------------------------------------------------- 1 | 409720.py -------------------------------------------------------------------------------- /gamefixes-steam/773370.py: -------------------------------------------------------------------------------- 1 | """Exo One""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Requires d3dcompiler_47""" 8 | util.protontricks('d3dcompiler_47') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/78000.py: -------------------------------------------------------------------------------- 1 | """Game fix for Bejeweled 3""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Game needs d3dcompiler_43 for dx10 mode, but still does not work. disabling dx10 mode allows dx9 mode to work with dxvk""" 8 | util.set_environment('PROTON_NO_D3D10', '1') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/782330.py: -------------------------------------------------------------------------------- 1 | """DOOM Eternal""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.append_argument('+com_skipSignInManager 1') 8 | -------------------------------------------------------------------------------- /gamefixes-steam/7850.py: -------------------------------------------------------------------------------- 1 | """Game fix for Cryostasis""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Uses physx""" 8 | util.protontricks('physx') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/812140.py: -------------------------------------------------------------------------------- 1 | """Assassin's Creed: Odyssey""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Disable uplay overlay and change close behavior 8 | # See https://github.com/Open-Wine-Components/umu-protonfixes/pull/94#issuecomment-2227475597 9 | util.disable_uplay_overlay() 10 | -------------------------------------------------------------------------------- /gamefixes-steam/813780.py: -------------------------------------------------------------------------------- 1 | """Game fix Age of Empires II: DE""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Requires vcrun2019 to launch 8 | util.protontricks('vcrun2019') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/816020.py: -------------------------------------------------------------------------------- 1 | """Game fix for JUMP FORCE""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.replace_command( 8 | 'JUMP_FORCE.exe', 'JUMP_FORCE/Binaries/Win64/JUMP_FORCE-Win64-Shipping.exe' 9 | ) 10 | util.append_argument('-eac-nop-loaded') 11 | 12 | util.protontricks('hidewineexports=enable') 13 | -------------------------------------------------------------------------------- /gamefixes-steam/8190.py: -------------------------------------------------------------------------------- 1 | """Just Cause 2""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Requires seccomp""" 8 | util.protontricks('d3dcompiler_43') 9 | util.protontricks('d3dcompiler_47') 10 | util.protontricks('d3dx10') 11 | util.append_argument('-borderless') 12 | -------------------------------------------------------------------------------- /gamefixes-steam/834530.py: -------------------------------------------------------------------------------- 1 | """Game fix for Yakuza Kiwami""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Disable FSYNC""" 8 | # Disable fsync to fix saving issues and hang on exit 9 | util.disable_fsync() 10 | -------------------------------------------------------------------------------- /gamefixes-steam/8850.py: -------------------------------------------------------------------------------- 1 | 409720.py -------------------------------------------------------------------------------- /gamefixes-steam/888790.py: -------------------------------------------------------------------------------- 1 | """Game fix for Sabbat of the Witch""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Install quartz, wmp11, qasf 8 | 9 | Fixes in-game video playback for the intro and ending. 10 | """ 11 | util.protontricks('quartz') 12 | util.protontricks('wmp11') 13 | util.protontricks('qasf') 14 | -------------------------------------------------------------------------------- /gamefixes-steam/893180.py: -------------------------------------------------------------------------------- 1 | """Game fix Catherine Classic""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('directshow') 8 | util.protontricks('cinepak') 9 | util.protontricks('lavfilters') 10 | util.protontricks('d3dcompiler_43') 11 | util.protontricks('d3dcompiler_47') 12 | util.disable_protonmediaconverter() 13 | -------------------------------------------------------------------------------- /gamefixes-steam/895870.py: -------------------------------------------------------------------------------- 1 | """Project Wingman""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Requires d3dcompiler_47""" 8 | util.protontricks('d3dcompiler_47') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/906510.py: -------------------------------------------------------------------------------- 1 | """Game fix for Conception PLUS: Maidens of the Twelve Stars""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs d3dcompiler_47""" 8 | # https://github.com/ValveSoftware/Proton/issues/3493#issuecomment-1521636321 9 | util.protontricks('d3dcompiler_47') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/910830.py: -------------------------------------------------------------------------------- 1 | """Game fix for Rebel Galaxy Outlaw""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs mfc42""" 8 | # https://github.com/ValveSoftware/Proton/issues/4216 9 | util.protontricks('mfc42') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/913740.py: -------------------------------------------------------------------------------- 1 | """Game fix for WORLD OF HORROR""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Disable esync""" 8 | # esync causes occasional crashing 9 | util.disable_esync() 10 | -------------------------------------------------------------------------------- /gamefixes-steam/9350.py: -------------------------------------------------------------------------------- 1 | """Game fix for Supreme Commander""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Bad performance unless Esync and Fsync are disabled.""" 8 | util.disable_esync() 9 | util.disable_fsync() 10 | -------------------------------------------------------------------------------- /gamefixes-steam/936160.py: -------------------------------------------------------------------------------- 1 | """Atelier Rorona ~The Alchemist of Arland~ DX 2 | Missing voices/sounds in cutscenes 3 | Requires disabling the gstreamer protonaudioconverterbin plugin to get full audio in cutscenes. 4 | fixed by Swish in Protondb 5 | further stolen from marianoag by bitwolf 6 | """ 7 | 8 | from protonfixes import util 9 | 10 | 11 | def main() -> None: 12 | util.disable_protonmediaconverter() 13 | -------------------------------------------------------------------------------- /gamefixes-steam/9420.py: -------------------------------------------------------------------------------- 1 | 9350.py -------------------------------------------------------------------------------- /gamefixes-steam/950670.py: -------------------------------------------------------------------------------- 1 | """Game fix for Gothic Playable Teaser""" 2 | 3 | from pathlib import Path 4 | from protonfixes import util 5 | from protonfixes.logger import log 6 | 7 | 8 | def main() -> None: 9 | """Performance fixes and cleanup of excessive logs""" 10 | modify_settings() 11 | clear_logs() 12 | 13 | 14 | def modify_settings() -> None: 15 | # Assure that the settings folder exists 16 | path = Path('GothicRemake/Saved/Config/WindowsNoEditor/') 17 | if not path.is_dir(): 18 | log.info(f'Creating settings folder "{path}".') 19 | path.mkdir(parents=True, exist_ok=True) 20 | 21 | # Assure, that the settings file exists 22 | # Necessary defaults will still be created by the game 23 | path = path / 'Engine.ini' 24 | if not path.is_file(): 25 | log.info(f'Creating empty settings file "{path}".') 26 | path.touch(exist_ok=True) 27 | 28 | # Disable excessive (as in gigabytes) logging 29 | # Disable motion blur / depth of field / lens flare 30 | game_opts = """ 31 | [Core.Log] 32 | Global=off 33 | LogInteractiveProcess=all off 34 | 35 | [SystemSettings] 36 | r.MotionBlur.Max=0 37 | r.MotionBlurQuality=0 38 | r.DefaultFeature.MotionBlur=0 39 | r.DepthOfFieldQuality=0 40 | r.LensFlareQuality=0 41 | """ 42 | util.set_ini_options(game_opts, path) 43 | 44 | 45 | def clear_logs() -> None: 46 | # Clear all logs > 10 MB 47 | log_files = Path('GothicRemake/Saved/Logs').glob('*.log') 48 | for file in log_files: 49 | file_size = file.stat().st_size # Bytes 50 | file_size = file_size // 1000 // 1000 # Megabytes 51 | if file.is_file() and file_size > 10: 52 | log.info(f'Removing log file "{file}" with a size of {file_size} MB.') 53 | file.unlink() 54 | -------------------------------------------------------------------------------- /gamefixes-steam/955050.py: -------------------------------------------------------------------------------- 1 | """Bright Memory""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Requires nvapi disabled.""" 8 | util.disable_nvapi() 9 | -------------------------------------------------------------------------------- /gamefixes-steam/963930.py: -------------------------------------------------------------------------------- 1 | """Contractors VR""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.protontricks('vcrun2022') # Game crashes without it 8 | -------------------------------------------------------------------------------- /gamefixes-steam/968370.py: -------------------------------------------------------------------------------- 1 | """The Blind Prophet 2 | garbled fonts & No cursive font (Segoe Script) 3 | """ 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main() -> None: 9 | util.winedll_override('d3d9', util.OverrideOrder.DISABLED) 10 | util.protontricks('segoe_script') 11 | -------------------------------------------------------------------------------- /gamefixes-steam/976310.py: -------------------------------------------------------------------------------- 1 | """Game fix Mortal Kombat 11""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Requires vcrun2019 to launch 8 | util.protontricks('vcrun2019') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/976730.py: -------------------------------------------------------------------------------- 1 | """Game fix Halo:MCC""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Requires vcrun2019 to launch 8 | util.protontricks('vcrun2019') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/9900.py: -------------------------------------------------------------------------------- 1 | """Game fix for Star Trek Online launcher""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Ensure d3dcompiler_47 is installed so the launcher window content is visible""" 8 | util.protontricks('d3dcompiler_47') 9 | -------------------------------------------------------------------------------- /gamefixes-steam/997070.py: -------------------------------------------------------------------------------- 1 | """Game fix Marvel's Avengers""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Requires vcrun2019 to launch 8 | util.protontricks('vcrun2019') 9 | util.protontricks('d3dcompiler_47') 10 | -------------------------------------------------------------------------------- /gamefixes-steam/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Open-Wine-Components/umu-protonfixes/992c6351e87dcd24bd66d973c3b1bf181c8bda85/gamefixes-steam/__init__.py -------------------------------------------------------------------------------- /gamefixes-steam/default.py: -------------------------------------------------------------------------------- 1 | """Default file for Steam game fixes 2 | This file is always executed for games that are identified as Steam games, 3 | even if no game fix is present. It is run before game fixes are applied. 4 | """ 5 | 6 | import sys 7 | from protonfixes import util 8 | 9 | 10 | def main() -> None: 11 | """Global defaults""" 12 | 13 | # Steam commandline 14 | def use_steam_commands() -> None: 15 | """Parse aliases from Steam launch options""" 16 | pf_alias_list = list(filter(lambda item: item.startswith('-pf_'), sys.argv)) 17 | 18 | for pf_alias in pf_alias_list: 19 | alias, sep, param = pf_alias.partition('=') 20 | if sep != '=': 21 | continue 22 | sys.argv.remove(pf_alias) 23 | 24 | if alias == '-pf_tricks': 25 | util.protontricks(param) 26 | elif alias == '-pf_dxvk_set': 27 | dxvk_opt, dxvk_sep, dxvk_val = param.partition('=') 28 | if dxvk_sep == '=': 29 | util.set_dxvk_option(dxvk_opt, dxvk_val) 30 | elif alias == '-pf_replace_cmd': 31 | repl_opt, repl_sep, repl_val = param.partition('=') 32 | if repl_sep == '=': 33 | util.replace_command(repl_opt, repl_val) 34 | 35 | use_steam_commands() 36 | -------------------------------------------------------------------------------- /gamefixes-ubisoft/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Open-Wine-Components/umu-protonfixes/992c6351e87dcd24bd66d973c3b1bf181c8bda85/gamefixes-ubisoft/__init__.py -------------------------------------------------------------------------------- /gamefixes-ubisoft/umu-19900.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/19900.py -------------------------------------------------------------------------------- /gamefixes-ubisoft/umu-220240.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/220240.py -------------------------------------------------------------------------------- /gamefixes-ubisoft/umu-233270.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/233270.py -------------------------------------------------------------------------------- /gamefixes-ubisoft/umu-298110.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/298110.py -------------------------------------------------------------------------------- /gamefixes-ubisoft/umu-371660.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/371660.py -------------------------------------------------------------------------------- /gamefixes-umu/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Open-Wine-Components/umu-protonfixes/992c6351e87dcd24bd66d973c3b1bf181c8bda85/gamefixes-umu/__init__.py -------------------------------------------------------------------------------- /gamefixes-umu/default.py: -------------------------------------------------------------------------------- 1 | """Default file for UMU game fixes 2 | This file is always executed for games that are identified as UMU games, 3 | even if no game fix is present. It is run before game fixes are applied. 4 | """ 5 | 6 | 7 | def main() -> None: 8 | """Global defaults""" 9 | -------------------------------------------------------------------------------- /gamefixes-umu/umu-1174180.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/1174180.py -------------------------------------------------------------------------------- /gamefixes-umu/umu-2016590.py: -------------------------------------------------------------------------------- 1 | """Game fix for Dark and Darker""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Installs wininet and urlmon in order to allow Blacksmith Launcher to properly install the game. 8 | 9 | This also has the side effect of breaking voip in DungeonCrawler.exe, so we add registry entries 10 | to only use native wininet and urlmon for Blacksmith.exe, and not DungeonCrawler.exe. 11 | """ 12 | util.protontricks('wininet') 13 | util.protontricks('urlmon') 14 | 15 | util.regedit_add( 16 | 'HKEY_CURRENT_USER\\Software\\Wine\\AppDefaults\\DungeonCrawler.exe\\DllOverrides', 17 | 'wininet', 18 | 'REG_SZ', 19 | 'builtin', 20 | ) 21 | util.regedit_add( 22 | 'HKEY_CURRENT_USER\\Software\\Wine\\AppDefaults\\DungeonCrawler.exe\\DllOverrides', 23 | 'urlmon', 24 | 'REG_SZ', 25 | 'builtin', 26 | ) 27 | -------------------------------------------------------------------------------- /gamefixes-umu/umu-271590.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/271590.py -------------------------------------------------------------------------------- /gamefixes-umu/umu-321040.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/321040.py -------------------------------------------------------------------------------- /gamefixes-umu/umu-3513350.py: -------------------------------------------------------------------------------- 1 | """Wuthering Waves - ID 3513350 2 | https://www.protondb.com/app/3513350 3 | """ 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main() -> None: 9 | """Video playback glitches in 2.1+ content 10 | This disables Proton mfplat at the cost 11 | of in-game experience for now. 12 | """ 13 | util.winedll_override('mfplat', util.OverrideOrder.DISABLED) 14 | """In-game browser fix.""" 15 | util.wineexe_override('KRSDKExternal', util.OverrideOrder.DISABLED) 16 | """Font fixes for in-game resources, if any.""" 17 | util.protontricks('sourcehansans') 18 | util.protontricks('fakechinese') 19 | util.protontricks('corefonts') 20 | """Set SteamGameId so that non-steam versions can 21 | pick up steam-specific fixes in proton's wine code 22 | if, when and should such fixes ever land. 23 | """ 24 | util.set_environment('SteamGameId', '3513350') 25 | -------------------------------------------------------------------------------- /gamefixes-umu/umu-39190.py: -------------------------------------------------------------------------------- 1 | """Game fix for Dungeon Siege""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Apply protontricks directplay for full multiplayer functionality""" 8 | util.protontricks('directplay') 9 | -------------------------------------------------------------------------------- /gamefixes-umu/umu-39200.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/39200.py -------------------------------------------------------------------------------- /gamefixes-umu/umu-582660.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/582660.py -------------------------------------------------------------------------------- /gamefixes-umu/umu-identityv.py: -------------------------------------------------------------------------------- 1 | """Game fix for Identity V""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Fixes black screen on first launch 8 | util.protontricks('d3dcompiler_47') 9 | -------------------------------------------------------------------------------- /gamefixes-umu/umu-model2.py: -------------------------------------------------------------------------------- 1 | """Application fix Model 2 emulator""" 2 | # 3 | 4 | from protonfixes import util 5 | 6 | 7 | def main() -> None: 8 | """Installs d3dcompiler_42, d3dx9_42, d3dx9, xact, xact_64""" 9 | util.protontricks('d3dcompiler_42') 10 | util.protontricks('d3dx9_42') 11 | util.protontricks('d3dx9') 12 | util.protontricks('xact') 13 | util.protontricks('xact_x64') 14 | -------------------------------------------------------------------------------- /gamefixes-umu/umu-pantheonrotf.py: -------------------------------------------------------------------------------- 1 | """Game fix for Pantheon: Rise of the Fallen""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Standalone launcher fix 8 | util.protontricks('dotnet48') 9 | util.protontricks('win10') 10 | -------------------------------------------------------------------------------- /gamefixes-umu/umu-pkhex.py: -------------------------------------------------------------------------------- 1 | """PKHeX""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Needs dotnet, project bumps dotnet version every couple pkhex versions 8 | util.protontricks('dotnetdesktop9') 9 | -------------------------------------------------------------------------------- /gamefixes-umu/umu-silenthill3.py: -------------------------------------------------------------------------------- 1 | """Game fix for Silent Hill 3""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | # Needs directmusic for some cutscenes 8 | util.protontricks('directmusic') 9 | util.winedll_override('dsound', util.OverrideOrder.BUILTIN) 10 | -------------------------------------------------------------------------------- /gamefixes-umu/umu-starcitizen.py: -------------------------------------------------------------------------------- 1 | """Game fix for Star Citizen""" 2 | 3 | import os 4 | from protonfixes import util 5 | 6 | 7 | def main() -> None: 8 | # patch libcuda to workaround crashes related to DLSS 9 | # See: https://github.com/jp7677/dxvk-nvapi/issues/174#issuecomment-2227462795 10 | patched = util.patch_libcuda() 11 | if patched: 12 | # Satisfy check for the existence of these dlls when trying to initialize ngx 13 | # Copy an existing DLL to these three names 14 | env_path = os.path.join(util.protonprefix(), 'drive_c', 'windows', 'system32') 15 | dest_files = ['cryptbase.dll', 'devobj.dll', 'drvstore.dll'] 16 | for file in dest_files: 17 | link_path = os.path.join(env_path, file) 18 | if not os.path.isfile(link_path): 19 | os.symlink('security.dll', link_path) 20 | 21 | # RSI Launcher depends on powershell 22 | util.protontricks('powershell') 23 | 24 | # RSI Launcher animation 25 | util.winedll_override('libglesv2', util.OverrideOrder.BUILTIN) 26 | -------------------------------------------------------------------------------- /gamefixes-umu/umu-tenshisz.py: -------------------------------------------------------------------------------- 1 | """Game fix for Angelic Chaos: RE-BOOT!""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.disable_protonmediaconverter() 8 | -------------------------------------------------------------------------------- /gamefixes-umu/umu-zenlesszonezero.py: -------------------------------------------------------------------------------- 1 | """Game fix for Zenless Zone Zero""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Needs gamedrive fix to detect proper install space""" 8 | util.set_game_drive(True) 9 | -------------------------------------------------------------------------------- /gamefixes-umu/winetricks-gui.py: -------------------------------------------------------------------------------- 1 | """Call Winetricks GUI""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | """Requires seccomp""" 8 | util.protontricks('gui') 9 | -------------------------------------------------------------------------------- /gamefixes-zoomplatform/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Open-Wine-Components/umu-protonfixes/992c6351e87dcd24bd66d973c3b1bf181c8bda85/gamefixes-zoomplatform/__init__.py -------------------------------------------------------------------------------- /gamefixes-zoomplatform/umu-10220.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/10220.py -------------------------------------------------------------------------------- /gamefixes-zoomplatform/umu-12810.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/12810.py -------------------------------------------------------------------------------- /gamefixes-zoomplatform/umu-1500540.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/1500540.py -------------------------------------------------------------------------------- /gamefixes-zoomplatform/umu-15700.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/15700.py -------------------------------------------------------------------------------- /gamefixes-zoomplatform/umu-15740.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/15740.py -------------------------------------------------------------------------------- /gamefixes-zoomplatform/umu-15750.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/15750.py -------------------------------------------------------------------------------- /gamefixes-zoomplatform/umu-240200.py: -------------------------------------------------------------------------------- 1 | """Duke Nukem: Manhattan Project - Enhanced Edition""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.winedll_override('d3d8', util.OverrideOrder.NATIVE_BUILTIN) 8 | util.protontricks('vcrun2019') 9 | -------------------------------------------------------------------------------- /gamefixes-zoomplatform/umu-2905090.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/2905090.py -------------------------------------------------------------------------------- /gamefixes-zoomplatform/umu-292410.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/292410.py -------------------------------------------------------------------------------- /gamefixes-zoomplatform/umu-4bff76f4-566a-4714-b481-95d3343afe22.py: -------------------------------------------------------------------------------- 1 | """Incoming Trilogy""" 2 | 3 | from protonfixes import util 4 | 5 | 6 | def main() -> None: 7 | util.winedll_override('d3d8', util.OverrideOrder.NATIVE_BUILTIN) 8 | util.winedll_override('ddraw', util.OverrideOrder.BUILTIN) 9 | util.winedll_override('winmm', util.OverrideOrder.NATIVE_BUILTIN) 10 | -------------------------------------------------------------------------------- /gamefixes-zoomplatform/umu-6270.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/6270.py -------------------------------------------------------------------------------- /logger.py: -------------------------------------------------------------------------------- 1 | """Simple logging to stdout the same way Proton does""" 2 | 3 | import os 4 | import sys 5 | 6 | from enum import Enum 7 | 8 | 9 | # Enums 10 | class LogLevel(Enum): 11 | """Enum and mapping (level -> color) for log levels""" 12 | 13 | RESET = '\u001b[0m' 14 | INFO = '\u001b[34m' 15 | WARN = '\u001b[33m' 16 | CRIT = '\u001b[31m' 17 | DEBUG = '\u001b[35m' 18 | 19 | 20 | class Log: 21 | """Log to stderr for steam dumps""" 22 | 23 | pfx = f'ProtonFixes[{os.getpid()}]' 24 | is_tty = os.isatty(sys.stderr.fileno()) 25 | 26 | @classmethod 27 | def __colorize(cls, msg: str, level: LogLevel) -> str: 28 | if not cls.is_tty: 29 | return msg 30 | color = level.value 31 | reset = LogLevel.RESET.value 32 | return f'{color}{msg}{reset}' 33 | 34 | @classmethod 35 | def __call__(cls, msg: str) -> None: 36 | """Allows the Log instance to be called directly""" 37 | cls.log(msg) 38 | 39 | @classmethod 40 | def log(cls, msg: str = '', level: LogLevel = LogLevel.INFO) -> None: 41 | """Prints the log message to stdout the same way as Proton""" 42 | # To terminal 43 | print( 44 | cls.__colorize(f'{cls.pfx} {level.name}: {msg}', level), 45 | file=sys.stderr, 46 | flush=True, 47 | ) 48 | 49 | # To log file 50 | with open('/tmp/protonfixes_test.log', 'a', 1, encoding='utf-8') as testfile: 51 | print(f'{cls.pfx} {level.name}: {msg}', file=testfile) 52 | 53 | @classmethod 54 | def info(cls, msg: str) -> None: 55 | """Wrapper for printing info messages""" 56 | cls.log(msg, LogLevel.INFO) 57 | 58 | @classmethod 59 | def warn(cls, msg: str) -> None: 60 | """Wrapper for printing warning messages""" 61 | cls.log(msg, LogLevel.WARN) 62 | 63 | @classmethod 64 | def crit(cls, msg: str) -> None: 65 | """Wrapper for printing critical messages""" 66 | cls.log(msg, LogLevel.CRIT) 67 | 68 | @classmethod 69 | def debug(cls, msg: str) -> None: 70 | """Wrapper for printing debug messages""" 71 | if 'DEBUG' not in os.environ: 72 | return 73 | cls.log(msg, LogLevel.DEBUG) 74 | 75 | 76 | log = Log() 77 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "umu-protonfixes" 3 | description = "Stop gap solution to fix issues in games that run under Wine." 4 | keywords = ["proton", "protontricks", "wine", "winetricks", "linux", "gaming"] 5 | license = {file = "LICENSE"} 6 | requires-python = "3.9" 7 | 8 | 9 | [project.urls] 10 | Repository = "https://github.com/Open-Wine-Components/umu-protonfixes.git" 11 | Issues = "https://github.com/Open-Wine-Components/umu-protonfixes/issues" 12 | 13 | 14 | [tool.pyright] 15 | exclude = [ 16 | "**/__pycache__", 17 | "subprojects", 18 | "verbs" 19 | ] 20 | extraPaths = [ ".." ] # Fix "protonfixes" module resolution 21 | pythonVersion = "3.9" 22 | pythonPlatform = "Linux" 23 | 24 | # Pyright rules, that are not covered by `typeCheckingMode = 'standard'` 25 | # https://microsoft.github.io/pyright/#/configuration?id=diagnostic-settings-defaults 26 | reportMissingModuleSource = "error" 27 | reportUnusedImport = "error" 28 | reportDuplicateImport = "error" 29 | reportWildcardImportFromLibrary = "error" 30 | reportShadowedImports = "error" 31 | -------------------------------------------------------------------------------- /steamhelper.py: -------------------------------------------------------------------------------- 1 | """The Steamhelper allows the installation of Steam apps""" 2 | 3 | import os 4 | import re 5 | import shutil 6 | import subprocess 7 | import time 8 | 9 | 10 | libpaths = [] 11 | REGEX_LIB = re.compile(r'"path"\s*"(?P(.*))"') 12 | REGEX_STATE = re.compile(r'"StateFlags"\s*"(?P(\d))"') 13 | STEAM_DIRS = [ 14 | '~/.steam/root', 15 | '~/.steam/debian-installation', 16 | '~/.local/share/Steam', 17 | '~/.steam/steam', 18 | ] 19 | 20 | 21 | def install_app(appid: str, delay: int = 1) -> None: 22 | """Wait for the installation of an appid""" 23 | _install_steam_appid(appid) 24 | while not _is_app_installed(appid): 25 | time.sleep(delay) 26 | 27 | 28 | def _install_steam_appid(appid: str) -> None: 29 | """Call steam URL""" 30 | install_url = f'steam://install/{appid}' 31 | if shutil.which('xdg-open'): 32 | subprocess.call(['xdg-open', install_url]) 33 | elif shutil.which('gvfs-open'): 34 | subprocess.call(['gvfs-open', install_url]) 35 | elif shutil.which('gnome-open'): 36 | subprocess.call(['gnome-open', install_url]) 37 | elif shutil.which('kde-open'): 38 | subprocess.call(['kde-open', install_url]) 39 | elif shutil.which('exo-open'): 40 | subprocess.call(['exo-open', install_url]) 41 | 42 | 43 | def _is_app_installed(appid: str) -> bool: 44 | """Check if app is installed""" 45 | libraries_path = _get_steam_libraries_path() 46 | 47 | # bypass no library path 48 | if len(libraries_path) == 0: 49 | return True 50 | 51 | is_installed = False 52 | for librarypath in libraries_path: 53 | appmanifest_path = _get_manifest_path(appid, librarypath) 54 | if os.path.exists(appmanifest_path): 55 | state = _find_regex_groups(appmanifest_path, REGEX_STATE, 'state') 56 | if len(state) > 0 and int(state[0]) == 4: 57 | is_installed = True 58 | break 59 | return is_installed 60 | 61 | 62 | def _get_steam_libraries_path() -> list: 63 | """Get Steam Libraries Path""" 64 | if len(libpaths) == 0: 65 | for steampath in STEAM_DIRS: 66 | libfile = os.path.join( 67 | os.path.expanduser(steampath), 'steamapps', 'libraryfolders.vdf' 68 | ) 69 | if os.path.exists(libfile): 70 | libpaths.append(_find_regex_groups(libfile, REGEX_LIB, 'path')) 71 | break 72 | return libpaths 73 | 74 | 75 | def _get_manifest_path(appid: str, librarypath: str) -> str: 76 | """Get appmanifest path""" 77 | return os.path.join(librarypath, 'steamapps', f'appmanifest_{str(appid)}.acf') 78 | 79 | 80 | def _find_regex_groups(path: str, regex: re.Pattern, groupname: str) -> list: 81 | """Given a file and a regex with a named group groupname, return an array of all the matches""" 82 | matches = [] 83 | with open(path, encoding='ascii') as re_file: 84 | for line in re_file: 85 | search = regex.search(line) 86 | if search: 87 | matches.append(search.group(groupname)) 88 | return matches 89 | -------------------------------------------------------------------------------- /umu-database.csv: -------------------------------------------------------------------------------- 1 | subprojects/umu-database/umu-database.csv -------------------------------------------------------------------------------- /verbs/cncnet_ra2.verb: -------------------------------------------------------------------------------- 1 | w_metadata cncnet_ra2 dlls \ 2 | title="CnCnet5 Red Alert / Yuri's Revenge - Multiplayer / Game patches" \ 3 | publisher="CnCnet community" \ 4 | year="2013" \ 5 | media="download" \ 6 | file1="CnCNet5_YR_Installer.exe" \ 7 | installed_file1="CnCNetYRLauncher.exe" 8 | 9 | load_cncnet_ra2() 10 | { 11 | w_download https://github.com/CnCNet/cncnet-yr-client-package/releases/download/yr-8.55/CnCNet5_YR_Installer_8.55.0.exe c1cf19fa40bb07e881ffeea33df8a5961162e009c558b33d91076f51ca3f949c ${file1} 12 | w_try "${WINE}" start.exe /exec ${W_CACHE}/${W_PACKAGE}/${file1} /silent /verysilent /norestart /suppressmsgboxes 13 | } 14 | -------------------------------------------------------------------------------- /verbs/dgvoodoo2.verb: -------------------------------------------------------------------------------- 1 | w_metadata dgvoodoo2 dlls \ 2 | title="dgvoodoo2" \ 3 | publisher="dege" \ 4 | year="2023" \ 5 | media="download" \ 6 | file1="dgVoodoo2_81_1.zip" \ 7 | installed_file1="${W_SYSTEM32_DLLS_WIN}/ddraw.dll" \ 8 | installed_file2="${W_SYSTEM32_DLLS_WIN}/d3dimm.dll" \ 9 | installed_file3="${W_SYSTEM32_DLLS_WIN}/d3d9.dll" \ 10 | installed_file3="${W_SYSTEM32_DLLS_WIN}/dgd3d9.dll" \ 11 | installed_file4="${W_SYSTEM32_DLLS_WIN}/dgvoodoo.conf" 12 | 13 | load_dgvoodoo2() 14 | { 15 | w_download https://github.com/dege-diosg/dgVoodoo2/releases/download/v2.81.1/dgVoodoo2_81_1.zip 13c84b6e3b19bb5e38afdb67f2d1ee3c1b6291284a0043a6a40061d2c6e7c18c ${file1} 16 | w_try_unzip "${W_TMP}" "${W_CACHE}/${W_PACKAGE}/${file1}" 17 | w_try_cp_dll "${W_TMP}/MS/x86/DDraw.dll" "${W_SYSTEM32_DLLS}/ddraw.dll" 18 | w_try_cp_dll "${W_TMP}/MS/x86/D3DImm.dll" "${W_SYSTEM32_DLLS}/d3dimm.dll" 19 | w_try_cp_dll "${W_TMP}/MS/x86/D3D9.dll" "${W_SYSTEM32_DLLS}/d3d9.dll" 20 | w_try_cp_dll "${W_TMP}/MS/x86/D3D9.dll" "${W_SYSTEM32_DLLS}/dgd3d9.dll" 21 | sed -i '/dgVoodooWatermark/s/true/false/' "${W_TMP}/dgVoodoo.conf" 22 | sed -i '/[DirectX]/ {/Filtering/s/appdriven/16/ ; /KeepFilterIfPointSampled/s/false/true/ ; /Resolution/s/unforced/max/ ; /Antialiasing/s/appdriven/8x/}' "${W_TMP}/dgVoodoo.conf" 23 | w_try_cp_dll "${W_TMP}/dgVoodoo.conf" "${W_SYSTEM32_DLLS}/dgvoodoo.conf" 24 | w_override_dlls native ddraw 25 | w_override_dlls native d3d9 26 | w_override_dlls native d3dimm 27 | } 28 | -------------------------------------------------------------------------------- /verbs/force_gpu.verb: -------------------------------------------------------------------------------- 1 | w_metadata force_gpu=amd settings \ 2 | title="Fake an AMD RADEON RX 480 card in place of Nvidia cards (default)" 3 | w_metadata force_gpu=nvidia settings \ 4 | title="Force Nvidia GeForce GTX 970 card" 5 | w_metadata force_gpu=no settings \ 6 | title="Use WINE/Proton defaults for GPU" 7 | 8 | load_force_gpu() 9 | { 10 | # Both cards are from dlls/wined3d/adapter_gl.c 11 | # cards_amd_mesa[] / cards_nvidia_mesa[] list 12 | # most top in the list 13 | case "$arg" in 14 | amd) _W_gpu_vendor="dword:00001002"; _W_gpu_device="dword:000067df";; 15 | nvidia) _W_gpu_vendor="dword:000010de"; _W_gpu_device="dword:000013c2";; 16 | no) _W_gpu_vendor="-"; _W_gpu_device="-";; 17 | *) w_die "Unexpected argument '$arg'. Should be default/amd/nvidia";; 18 | esac 19 | 20 | echo "Forcing GPU to '$arg'" 21 | cat > "$W_TMP"/force_gpu.reg <<_EOF_ 22 | REGEDIT4 23 | 24 | [HKEY_CURRENT_USER\\Software\\Wine\\Direct3D] 25 | "VideoPciVendorID"=${_W_gpu_vendor} 26 | "VideoPciDeviceID"=${_W_gpu_device} 27 | _EOF_ 28 | 29 | w_try_regedit "$W_TMP_WIN"\\force_gpu.reg 30 | 31 | unset _W_gpu_vendor 32 | unset _W_gpu_device 33 | } 34 | -------------------------------------------------------------------------------- /verbs/force_gpu=amd.verb: -------------------------------------------------------------------------------- 1 | w_metadata force_gpu=amd settings \ 2 | title="Fake an AMD RADEON RX 480 card in place of Nvidia cards (default)" 3 | w_metadata force_gpu=nvidia settings \ 4 | title="Force Nvidia GeForce GTX 970 card" 5 | w_metadata force_gpu=no settings \ 6 | title="Use WINE/Proton defaults for GPU" 7 | 8 | load_force_gpu() 9 | { 10 | # Both cards are from dlls/wined3d/adapter_gl.c 11 | # cards_amd_mesa[] / cards_nvidia_mesa[] list 12 | # most top in the list 13 | case "$arg" in 14 | amd) _W_gpu_vendor="dword:00001002"; _W_gpu_device="dword:000067df";; 15 | nvidia) _W_gpu_vendor="dword:000010de"; _W_gpu_device="dword:000013c2";; 16 | no) _W_gpu_vendor="-"; _W_gpu_device="-";; 17 | *) w_die "Unexpected argument '$arg'. Should be default/amd/nvidia";; 18 | esac 19 | 20 | echo "Forcing GPU to '$arg'" 21 | cat > "$W_TMP"/force_gpu.reg <<_EOF_ 22 | REGEDIT4 23 | 24 | [HKEY_CURRENT_USER\\Software\\Wine\\Direct3D] 25 | "VideoPciVendorID"=${_W_gpu_vendor} 26 | "VideoPciDeviceID"=${_W_gpu_device} 27 | _EOF_ 28 | 29 | w_try_regedit "$W_TMP_WIN"\\force_gpu.reg 30 | 31 | unset _W_gpu_vendor 32 | unset _W_gpu_device 33 | } 34 | -------------------------------------------------------------------------------- /verbs/force_gpu=no.verb: -------------------------------------------------------------------------------- 1 | w_metadata force_gpu=amd settings \ 2 | title="Fake an AMD RADEON RX 480 card in place of Nvidia cards (default)" 3 | w_metadata force_gpu=nvidia settings \ 4 | title="Force Nvidia GeForce GTX 970 card" 5 | w_metadata force_gpu=no settings \ 6 | title="Use WINE/Proton defaults for GPU" 7 | 8 | load_force_gpu() 9 | { 10 | # Both cards are from dlls/wined3d/adapter_gl.c 11 | # cards_amd_mesa[] / cards_nvidia_mesa[] list 12 | # most top in the list 13 | case "$arg" in 14 | amd) _W_gpu_vendor="dword:00001002"; _W_gpu_device="dword:000067df";; 15 | nvidia) _W_gpu_vendor="dword:000010de"; _W_gpu_device="dword:000013c2";; 16 | no) _W_gpu_vendor="-"; _W_gpu_device="-";; 17 | *) w_die "Unexpected argument '$arg'. Should be default/amd/nvidia";; 18 | esac 19 | 20 | echo "Forcing GPU to '$arg'" 21 | cat > "$W_TMP"/force_gpu.reg <<_EOF_ 22 | REGEDIT4 23 | 24 | [HKEY_CURRENT_USER\\Software\\Wine\\Direct3D] 25 | "VideoPciVendorID"=${_W_gpu_vendor} 26 | "VideoPciDeviceID"=${_W_gpu_device} 27 | _EOF_ 28 | 29 | w_try_regedit "$W_TMP_WIN"\\force_gpu.reg 30 | 31 | unset _W_gpu_vendor 32 | unset _W_gpu_device 33 | } 34 | -------------------------------------------------------------------------------- /verbs/force_gpu=nvidia.verb: -------------------------------------------------------------------------------- 1 | w_metadata force_gpu=amd settings \ 2 | title="Fake an AMD RADEON RX 480 card in place of Nvidia cards (default)" 3 | w_metadata force_gpu=nvidia settings \ 4 | title="Force Nvidia GeForce GTX 970 card" 5 | w_metadata force_gpu=no settings \ 6 | title="Use WINE/Proton defaults for GPU" 7 | 8 | load_force_gpu() 9 | { 10 | # Both cards are from dlls/wined3d/adapter_gl.c 11 | # cards_amd_mesa[] / cards_nvidia_mesa[] list 12 | # most top in the list 13 | case "$arg" in 14 | amd) _W_gpu_vendor="dword:00001002"; _W_gpu_device="dword:000067df";; 15 | nvidia) _W_gpu_vendor="dword:000010de"; _W_gpu_device="dword:000013c2";; 16 | no) _W_gpu_vendor="-"; _W_gpu_device="-";; 17 | *) w_die "Unexpected argument '$arg'. Should be default/amd/nvidia";; 18 | esac 19 | 20 | echo "Forcing GPU to '$arg'" 21 | cat > "$W_TMP"/force_gpu.reg <<_EOF_ 22 | REGEDIT4 23 | 24 | [HKEY_CURRENT_USER\\Software\\Wine\\Direct3D] 25 | "VideoPciVendorID"=${_W_gpu_vendor} 26 | "VideoPciDeviceID"=${_W_gpu_device} 27 | _EOF_ 28 | 29 | w_try_regedit "$W_TMP_WIN"\\force_gpu.reg 30 | 31 | unset _W_gpu_vendor 32 | unset _W_gpu_device 33 | } 34 | -------------------------------------------------------------------------------- /verbs/klite.verb: -------------------------------------------------------------------------------- 1 | w_metadata klite dlls \ 2 | title="K-Lite codecs" \ 3 | media="download" \ 4 | file1="K-Lite_Codec_Pack_1815_Basic.exe" \ 5 | homepage="https://codecguide.com/download_kl.htm" 6 | 7 | load_klite() 8 | { 9 | w_download https://files3.codecguide.com/K-Lite_Codec_Pack_1815_Basic.exe 9eba61163d4ff3c0ce3e88aa21b15366757a260684d6190a271fc452ba05e7d7 10 | w_try_cd "${W_CACHE}/${W_PACKAGE}" 11 | cat > "klcp_basic_unattended.ini" <<_EOF_ 12 | [Setup] 13 | Group=K-Lite Codec Pack 14 | NoIcons=1 15 | SetupType=custom 16 | Components=video\lav, video\lav\hevc, video\lav\h264, video\lav\mpeg4, video\lav\mpeg2, video\lav\mpeg1, video\lav\vc1, video\lav\wmv, video\lav\other, audio\lav, audio\lav\ac3dts, audio\lav\truehd, audio\lav\aac, audio\lav\flac, audio\lav\mpeg, audio\lav\wma, audio\lav\other, sourcefilter\lav, sourcefilter\lav\avi, sourcefilter\lav\matroska, sourcefilter\lav\mp4, sourcefilter\lav\mpegps, sourcefilter\lav\mpegts, sourcefilter\lav\wmv, sourcefilter\lav\other, subtitles\vsfilter, tools\codectweaktool, shell\icaros_thumbnail, shell\icaros_property, misc\brokencodecs, misc\brokenfilters 17 | Tasks=reset_settings\fresh, wmp_reg_formats, adjust_preferred_decoders 18 | NoRestart=1 19 | CloseApplications=0 20 | [Data] 21 | uim_version=12 22 | creationdate=20210117 23 | creationtime=022013 24 | [Settings] 25 | abort_if_existing_version_is_newer=1 26 | keep_existing_settings_on_upgrade=1 27 | install_only_x64_components=0 28 | [Thumbnails] 29 | Extensions=.avi;.divx;.amv;.mpeg;.mpg;.m1v;.m2v;.mp2v;.mpv2;.vob;.wmv;.asf;.mp4;.m4v;.mp4v;.mpv4;.mov;.hdmov;.3g2;.3gp;.3gp2;.3gpp;.mkv;.mk3d;.webm;.ts;.m2ts;.mts;.m2t;.tp;.flv;.f4v;.ogm;.ogv;.rm;.rmvb;.dv;.mxf;.ivf;.evo;.video;.cbr;.cbz;.cb7;.mp3;.wav;.m4a;.ape;.flac;.ogg;.mka;.mpc;.opus;.tak;.wv 30 | [Audio Configuration] 31 | audio_passthrough=0 32 | bitstream_ac3=0 33 | bitstream_dts=0 34 | bitstream_eac3=0 35 | bitstream_dtshd=0 36 | bitstream_truehd=0 37 | [Hardware Acceleration] 38 | hwa_other_auto=1 39 | [Languages] 40 | lang_set_preferred=1 41 | lang_autodetect=1 42 | _EOF_ 43 | w_try "${WINE}" start.exe /exec K-Lite_Codec_Pack_1815_Basic.exe /verysilent /norestart /LoadInf="./klcp_basic_unattended.ini" 44 | } 45 | -------------------------------------------------------------------------------- /verbs/rsx3d.verb: -------------------------------------------------------------------------------- 1 | w_metadata rsx3d dlls \ 2 | title="Intel RSX 3D" \ 3 | publisher="Intel" \ 4 | year="1997" \ 5 | media="download" \ 6 | file1="rsx3d.zip" \ 7 | installed_file1="${W_SYSTEM32_DLLS_WIN}/rsx.dll" \ 8 | installed_file2="${W_SYSTEM32_DLLS_WIN}/aaudio.dll" 9 | 10 | load_rsx3d() 11 | { 12 | w_download https://ilovepaws.nyc3.digitaloceanspaces.com/drivers/RSX3D.zip 1c931e4df0bcd435ce59f7fed5244efe14d84b97847315e4841998936c9afb20 ${file1} 13 | w_try_unzip "${W_TMP}" "${W_CACHE}/${W_PACKAGE}/${file1}" 14 | w_try_cp_dll "${W_TMP}/RSX3D/RSX.DLL" "${W_SYSTEM32_DLLS}/rsx.dll" 15 | w_try_cp_dll "${W_TMP}/RSX3D/AAUDIO.DLL" "${W_SYSTEM32_DLLS}/aaudio.dll" 16 | w_override_dlls native rsx aaudio 17 | w_try_regsvr rsx.dll 18 | w_try_regsvr aaudio.dll 19 | } 20 | -------------------------------------------------------------------------------- /verbs/segoe_script.verb: -------------------------------------------------------------------------------- 1 | w_metadata segoe_script fonts \ 2 | title="Segoe Script font" \ 3 | publisher="Microsoft" \ 4 | year="2006" \ 5 | media="download" \ 6 | file1="SegoeScript.zip" \ 7 | installed_file1=${W_FONTSDIR_WIN}"/segoe script.ttf" 8 | 9 | load_segoe_script() 10 | { 11 | w_download http://legionfonts.com/storage/archives/Segoe%20Script.zip e107150c98eabc93897616cccd6ab8ebd778a780ce69a31b5dd47f1991e90507 ${file1} 12 | w_try_unzip "${W_TMP}" "${W_CACHE}/${W_PACKAGE}/${file1}" 13 | w_try_cp_font_files "${W_TMP}" "${W_FONTSDIR_UNIX}" "*.ttf" 14 | w_register_font "segoe script.ttf" "Segoe Script" 15 | } 16 | -------------------------------------------------------------------------------- /verbs/xliveless.verb: -------------------------------------------------------------------------------- 1 | w_metadata xliveless dlls \ 2 | title="Games for Windows Live (gfw / gfwl) - xlive.dll mock, single player only" \ 3 | publisher="ThirteenAG" \ 4 | year="2024" \ 5 | media="download" \ 6 | file1="Ultimate-ASI-Loader.zip" \ 7 | installed_file1="${W_SYSTEM32_DLLS_WIN}/xlive.dll" 8 | 9 | load_xliveless() 10 | { 11 | w_package_warn_win64 # Only a 32-bit DLL is installed 12 | 13 | w_download https://github.com/ThirteenAG/Ultimate-ASI-Loader/releases/download/v7.7.0/Ultimate-ASI-Loader.zip 62778dc40a2f44b1636db3aca5a3d01727a1c7eb40b1c49d42b71472631cd2d7 14 | w_try_unzip "${W_TMP}" "${W_CACHE}/${W_PACKAGE}/${file1}" "dinput8.dll" 15 | w_try_cp_dll "${W_TMP}/dinput8.dll" "${W_SYSTEM32_DLLS}/xlive.dll" 16 | w_override_dlls native xlive 17 | } 18 | -------------------------------------------------------------------------------- /winetricks: -------------------------------------------------------------------------------- 1 | subprojects/winetricks/src/winetricks --------------------------------------------------------------------------------