Skip to main content

protonfixes

Screenshot

A module for applying fixes at runtime to unsupported games with Steam Proton without changing game installation files. The idea is to include seperate fixes that are only loaded when a game matching that ID is run. This should keep the individual game fixes from affecting any other games. Applying the fixes at runtime should also them to persist after game updates.

Current fixes include:

  • Final Fantasy IX
  • Oddworld: Abe's Oddysee
  • Forts
  • Styx: Master of Shadows

Current utilities available:

  • util.protontricks('verb')
    • installs a winetricks verb
  • util.use_win32_prefix()
    • creates and uses a win32 (32bit) wineprefix
  • util.replace_command('original', 'replacement')
    • replaces text in the game's launch command
  • util.append_argument('argument')
    • adds an argument to the game's launch command
  • util.protonprefix()
    • returns the path of the current wineprefix used by Proton

Installation

Optional Requirements

Winetricks

If you want to be able to use fixes with winetricks it must be installed and be in your $PATH. Fixes that do not use winetricks will still work without winetricks being installed.

Winetricks can take a long time to load

Wine

If you want to use a win32 (32bit) prefix, you need to have wine installed and be in your $PATH. Currently creating a 32bit prefix with Proton wine doesn't work because the wineserver is already running by the time user_settings.py is loaded.

Splashscreen

For the splashscreen to work, you need to have cefpython3 installed. It can be installed with pip using sudo pip install cefpython3. The splashscreen can help let you know that protonfixes is running a long task, for example installing dotnet35.

Install from PIP

# sudo pip install protonfixes

Install using setuptools

# sudo python setup.py install

Add to user_settings.py

In the steamapps/common/Proton* directory, add the following line to the user_settings.py file:

import protonfixes

If there is no user_settings.py file, make a copy of the user_settings.sample.py file included with Proton.

Writing Game Fixes

Game fixes are written in python and are named by the Steam game ID with the extension .py. For example, the file 377840.py will be loaded when the game FINAL FANTASY IX is run. Gamefixes can be added to the ~/.config/protonfixes/localfixes/ directory. Here are some things to consider when writing fixes:

  • Only import libraries that are part of the Python standard library for portability.
  • Use docstrings and comment thoroughly. There will likely be people without python experience making game fixes and good commented examples will help
  • Do not use any hard-coded paths, Steam may not always be installed in the same location.
  • Check your gamefix with pylint. You can safely disable warning C0103, modules named by Steam ID will never conform to snake_case naming style.

Testing

When testing, local fixes can be added to ~/.config/protonfixes/localfixes/. They should be imported the same way as an included fix would be. For example, ~/.config/protonfixes/localfixes/377840.py would be loaded for FFIX. Please feel free to submit working gamefixes to improve the project.

Example game fixes

377840.py - Changing the executable launched and setting an environment variable

import os
from protonfixes import util


def main():
    """ Bypass the launcher and fix audio
    """

    print('Applying FINAL FANTASY IX Game Fixes')

    # Fix crackling audio
    os.environ['PULSE_LATENCY_MSEC'] = '60'

    # Replace launcher with game exe in proton arguments
    util.replace_command('FF9_Launcher', 'x64/FF9.exe')

410900.py - Running a winetricks verb

from protonfixes import util

def main():
    """ Uses winetricks to install the ole32 verb
    """

    print('Applying fixes for Forts')

    util.protontricks('ole32')

15700.py - Example using a win32 prefix

Oddworld doesn't actually require a win32 prefix or dotnet35, but I used it for testing since it's 32bit

import sys
from protonfixes import util

def main():
    """ Adds -interline to arguments, uses a win32 prefix, and installs dotnet35
    """

    print('Applying fixes for Oddworld: Abe\'s Oddysee')

    # Adding -interline fixes slow video but adds scanlines
    util.append_argument('-interline')

    print('Using a win32 prefix')
    util.use_win32_prefix()

    # Make sure any winetricks are run after changing to a win32 prefix
    util.protontricks('dotnet35')

Contributing

Pull requests are welcome! If you're not comfortable doing pull requests, send your fixes to me by any other means and you will be credited in the comments.

Metadata

Release files for protonfixes 1.0.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for protonfixes 1.0.4
File Size Uploaded
protonfixes-1.0.4.tar.gz 10.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for protonfixes 1.0.4
File Interpreter ABI Platform
protonfixes-1.0.4-py3-none-any.whl Python 3 none any Details

Total release size: 22.8 kB

Release files / protonfixes-1.0.4.tar.gz

Download URL protonfixes-1.0.4.tar.gz
Size 10.0 kB
Tags Source
SHA-256 checksum
How to use checksums
619a687aa4d9394daa8ce22cf61a2a7abf06f53ee63db7abf74cd05ae4d0b5fb
BLAKE2b-256 checksum
How to use checksums
b6edf7129d34a1e9782a1a9b6553a6453767336db93d97e46597aa3c8fce31c2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.11.0 pkginfo/1.4.2 requests/2.19.1 setuptools/40.4.2 requests-toolbelt/0.8.0 tqdm/4.26.0 CPython/3.7.0

Release files / protonfixes-1.0.4-py3-none-any.whl

Download URL protonfixes-1.0.4-py3-none-any.whl
Size 12.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f8b1036a7a179ed88e606f0ac429ee76bb6aa87e5b084447b4abb72ed5be874a
BLAKE2b-256 checksum
How to use checksums
4c5957ae4182221f1d2fe64006b590711ac13f00ec54d1e3bcbbde6d7ca22d01
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.11.0 pkginfo/1.4.2 requests/2.19.1 setuptools/40.4.2 requests-toolbelt/0.8.0 tqdm/4.26.0 CPython/3.7.0

Release history Release notifications | RSS feed

1.0.14

2 release files

1.0.12

2 release files

1.0.11

2 release files

1.0.10

2 release files

1.0.9

2 release files

1.0.8

2 release files

1.0.7

2 release files

1.0.6

2 release files

1.0.5

2 release files

This release

1.0.4 This release

2 release files

1.0.3

2 release files

1.0.2

2 release files

1.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page