Package: protonfixes
protonfixes- There is a regression in wine's MSI installer affecting Proton 3.16.- If you are using protonfixes to play games that require dotnet tricks,- you can temporarily switch to Proton 3.7 to get protonfixes to install- dotnet tricks for that game. Alternatively you can install a compiled- Proton 3.16 with a the patched version of wine available on my Proton- repo at https://github.com/simons-public/Proton/releases/tag/msi-fix- On Proton 3.16 some games may treat the XBox and Steam Controller trigger- axis as a joystick input causing controls to drift upwards and to the- left (this can be observed by running '/tmp/proton_$USER/run control' and- looking at the Test Joystick tab under Game Controllers.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:Age Of Empire 3: Complete CollectionAge of Empires 2 HD EditionAge of Mythology: Extended EditionBattlefield: Bad Company 2BioShock 2 RemasteredCall of Duty (2003)Chronophantasma ExtendCivilization 4 (Beyond the Sword)Doom 2016EVE OnlineFINAL FANTASY IXFortsGame fix for Fallout 2Game fix for Fallout: A Post Nuclear Role Playing GameGrand Theft Auto VKiller is Dead at LaunchLittle NightmaresOddworld: Abe's OddyseeOddworld: Munch's OddyseeOrder of Battle: World War IISTAR WARS Jedi Knight II - Jedi OutcastSTAR WARS Jedi Knight - Jedi AcademyStyx: Master of ShadowsSUGURI 2Tesla EffectThe Evil WithinTitan Quest Anniversary EditionTomb Raider IYou Need a Budget 4Current utilities available:util.protontricks('verb')installs a winetricks verbutil.use_win32_prefix()creates and uses a win32 (32bit) wineprefixutil.replace_command('original', 'replacement')replaces text in the game's launch commandutil.append_argument('argument')adds an argument to the game's launch commandutil.protonprefix()returns the path of the current wineprefix used by Protonutil.set_environment('VARIABLE', 'value')sets an environment variableutil.winedll_override('dllname', 'x')override dllname where x is n for native, b for builtin, or '' for disablewinedll_override shortcuts:util.disable_dxvk()util.disable_esync()util.disable_d3d10()util.disable_d3d11()util.disable_nvapi()util.get_game_install_path()returns the path to the current gameutil.create_dosbox_conf('filename', conf_dict)creates a config file filename with the dict conf_dict(needs to have '-conf' and 'filename' added with util.append_argument for dosbox use config)InstallationOptional RequirementsWinetricksIf 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 runWineIf 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 timeuser_settings.pyis loaded.Progress Dialog / SplashscreenIf Steam is in big picture mode, protontricks will try to launch a similarly themed splash dialog usingcefpython(pictured above). Otherwise it will try to usezenityto display a progress bar. If Steam is not in big picture mode, it will default tozenity. The progress bar or splashscreen can help let you know that protonfixes is running a long task, for example installingdotnet35.For the progress dialog to work, you need to havezenityinstalled on your system, the steam-runtime version is broken. It can probably be installed using your distro's package manager.For the big screen splashscreen to work, you need to havecefpython3installed. It can be installed with pip usingsudo pip install cefpython3.Install from PIPMake sure to use the version of pip that matches the version of Python that Proton is running. Proton should be running onpython3. If you are unsure, try installing with both pip3 and pip2 in the below commands.# sudo pip3 install protonfixesUpgrade from PIP# sudo pip3 install protonfixes --upgradeInstall using setuptools# sudo python3 setup.py installAdd to user_settings.pyIn the steamapps/common/Proton* directory, add the following line to the bottom of theuser_settings.pyfile:import protonfixesIf there is nouser_settings.pyfile, make a copy of theuser_settings.sample.pyfile included with Proton.DebuggingProton output can be seen in either/tmp/dumps/${USER}_stdout.txtor the terminal you started Steam from. To add additionalprotonfixesdebugging information, add the following line aboveimport protonfixes:from protonfixes import debugThis will add information like this:ProtonFixes[27351] DEBUG: ---- begin protontricks debug info ----
ProtonFixes[27351] DEBUG: Proton Python Version:
ProtonFixes[27351] DEBUG: /usr/bin/python3
ProtonFixes[27351] DEBUG: 3.7.0 (default, Jul 15 2018, 10:44:58)
[GCC 8.1.1 20180531]
ProtonFixes[27351] DEBUG: ---------------------------------------Although the environment variables are dumped, the sensitive variables like SteamUser and SteamAppUser are filtered out.Writing Game FixesGame fixes are written in python and are named by the Steam game ID with the extension .py. For example, the file377840.pywill 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 helpDo 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.TestingWhen 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.pywould be loaded for FFIX. Please feel free to submit working gamefixes to improve the project.Example game fixes377840.py- Changing the executable launched and setting an environment variable""" Game fix for FINAL FANTASY IX"""#pylint: disable=C0103fromprotonfixesimportutilfromprotonfixes.loggerimportlogdefmain():""" Changes the proton argument from the launcher to the game"""log('Applying fixes for FINAL FANTASY IX')# Fix crackling audioutil.set_environment('PULSE_LATENCY_MSEC','60')# Replace launcher with game exe in proton argumentsutil.replace_command('FF9_Launcher.exe','x64/FF9.exe')410900.py- Running a winetricks verb""" Game fix for Forts"""#pylint: disable=C0103fromprotonfixesimportutilfromprotonfixes.loggerimportlogdefmain():""" Uses winetricks to install the ole32 verb"""log('Applying fixes for Forts')util.protontricks('ole32')15700.py- Example using a win32 prefixOddworld doesn't actually require a win32 prefix or dotnet35, but I used it for testing since it's 32bitfromprotonfixesimportutilfromprotonfixes.loggerimportlogdefmain():""" Adds -interline to arguments, uses a win32 prefix, and installs dotnet35"""log('Applying fixes for Oddworld: Abe\'s Oddysee')# Adding -interline fixes slow video but adds scanlinesutil.append_argument('-interline')log('Using a win32 prefix')util.use_win32_prefix()# Make sure any winetricks are run after changing to a win32 prefixutil.protontricks('dotnet35')ContributingPull 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.