├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── .gitignore ├── .pylintrc ├── .travis.yml ├── LICENSE ├── README.md ├── __init__.py ├── cabextract ├── cabextract_1.9-1.debian.tar.xz ├── checks.py ├── config.py ├── debug.py ├── download.py ├── engine.py ├── fix.py ├── gamefixes-Amazon └── __init__.py ├── gamefixes-Battlenet └── __init__.py ├── gamefixes-EA └── __init__.py ├── gamefixes-EGS └── __init__.py ├── gamefixes-GOG └── __init__.py ├── gamefixes-Humble ├── __init__.py └── y-s-origin.py ├── gamefixes-Itchio └── __init__.py ├── gamefixes-Steam ├── 1017900.py ├── 1030830.py ├── 105000.py ├── 105400.py ├── 105450.py ├── 1056640.py ├── 1062040.py ├── 1063730.py ├── 108710.py ├── 1097150.py ├── 1097880.py ├── 110800.py ├── 1121560.py ├── 113400.py ├── 1158850.py ├── 1174180.py ├── 1175730.py ├── 12210.py ├── 1222370.py ├── 1230140.py ├── 12360.py ├── 1237970.py ├── 1239520.py ├── 1240440.py ├── 1250410.py ├── 1257290.py ├── 1259970.py ├── 1284210.py ├── 1284410.py ├── 1286880.py ├── 1293820.py ├── 1293830.py ├── 1382330.py ├── 1413480.py ├── 1434950.py ├── 1449280.py ├── 15130.py ├── 1532190.py ├── 1557480.py ├── 15740.py ├── 1613450.py ├── 1659420.py ├── 1664350.py ├── 16700.py ├── 16810.py ├── 1681970.py ├── 1695791.py ├── 1695793.py ├── 1695794.py ├── 1711950.py ├── 1715130.py ├── 17300.py ├── 1795390.py ├── 1930.py ├── 1999770.py ├── 200490.py ├── 200940.py ├── 201480.py ├── 206480.py ├── 206500.py ├── 207350.py ├── 208650.py ├── 20920.py ├── 211420.py ├── 212500.py ├── 213330.py ├── 2138090.py ├── 214510.py ├── 214950.py ├── 215280.py ├── 21680.py ├── 2183070.py ├── 219030.py ├── 219990.py ├── 220240.py ├── 22370.py ├── 223750.py ├── 224960.py ├── 225640.py ├── 227320.py ├── 230820.py ├── 231990.py ├── 2399220.py ├── 240600.py ├── 242760.py ├── 243200.py ├── 244210.py ├── 244850.py ├── 252430.py ├── 257420.py ├── 261510.py ├── 2620.py ├── 266840.py ├── 268050.py ├── 282900.py ├── 284160.py ├── 286360.py ├── 287310.py ├── 287450.py ├── 289130.py ├── 294700.py ├── 298110.py ├── 302370.py ├── 307690.py ├── 307780.py ├── 311730.py ├── 312060.py ├── 312450.py ├── 312670.py ├── 328500.py ├── 329380.py ├── 33990.py ├── 348550.py ├── 35130.py ├── 35140.py ├── 351710.py ├── 356190.py ├── 356500.py ├── 3590.py ├── 359550.py ├── 359870.py ├── 366250.py ├── 372000.py ├── 377160.py ├── 377840.py ├── 378630.py ├── 379720.py ├── 386360.py ├── 388750.py ├── 390710.py ├── 39140.py ├── 39210.py ├── 39500.py ├── 39510.py ├── 39690.py ├── 397540.py ├── 40800.py ├── 409090.py ├── 40950.py ├── 40970.py ├── 409720.py ├── 410900.py ├── 424840.py ├── 428660.py ├── 429720.py ├── 43110.py ├── 434570.py ├── 440900.py ├── 44690.py ├── 447040.py ├── 45750.py ├── 460120.py ├── 46500.py ├── 465280.py ├── 48190.py ├── 489830.py ├── 49520.py ├── 495420.py ├── 508980.py ├── 518790.py ├── 544750.py ├── 550340.py ├── 55150.py ├── 559620.py ├── 570940.py ├── 582660.py ├── 586140.py ├── 593600.py ├── 601510.py ├── 627270.py ├── 63110.py ├── 633230.py ├── 63700.py ├── 63710.py ├── 638160.py ├── 638970.py ├── 65540.py ├── 65600.py ├── 65610.py ├── 658150.py ├── 65930.py ├── 678950.py ├── 700600.py ├── 702050.py ├── 70400.py ├── 70420.py ├── 72850.py ├── 729040.py ├── 730830.py ├── 73170.py ├── 750920.py ├── 773370.py ├── 78000.py ├── 782330.py ├── 7850.py ├── 812140.py ├── 813780.py ├── 816020.py ├── 8190.py ├── 834530.py ├── 893180.py ├── 895870.py ├── 906510.py ├── 910830.py ├── 913740.py ├── 952060.py ├── 968370.py ├── 976310.py ├── 976730.py ├── 9900.py ├── 99300.py ├── 997070.py ├── __init__.py └── default.py ├── gamefixes-ULWGL ├── __init__.py └── default.py ├── gamefixes-Ubisoft └── __init__.py ├── libmspack.so.0 ├── libmspack.so.0.1.0 ├── libmspack_0.10.1-1.debian.tar.xz ├── logger.py ├── steamhelper.py ├── util.py ├── verbs ├── GFSDK_Aftermath_Lib.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 ├── vcrun2019_ge.verb ├── wmp9_ge.verb └── xliveless.verb ├── winetricks └── winetricks_proton5 /.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 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | MANIFEST 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .nox/ 42 | .coverage 43 | .coverage.* 44 | .cache 45 | nosetests.xml 46 | coverage.xml 47 | *.cover 48 | .hypothesis/ 49 | .pytest_cache/ 50 | 51 | # Translations 52 | *.mo 53 | *.pot 54 | 55 | # Django stuff: 56 | *.log 57 | local_settings.py 58 | db.sqlite3 59 | 60 | # Flask stuff: 61 | instance/ 62 | .webassets-cache 63 | 64 | # Scrapy stuff: 65 | .scrapy 66 | 67 | # Sphinx documentation 68 | docs/_build/ 69 | 70 | # PyBuilder 71 | target/ 72 | 73 | # Jupyter Notebook 74 | .ipynb_checkpoints 75 | 76 | # IPython 77 | profile_default/ 78 | ipython_config.py 79 | 80 | # pyenv 81 | .python-version 82 | 83 | # celery beat schedule file 84 | celerybeat-schedule 85 | 86 | # SageMath parsed files 87 | *.sage.py 88 | 89 | # Environments 90 | .env 91 | .venv 92 | env/ 93 | venv/ 94 | ENV/ 95 | env.bak/ 96 | venv.bak/ 97 | 98 | # Spyder project settings 99 | .spyderproject 100 | .spyproject 101 | 102 | # Rope project settings 103 | .ropeproject 104 | 105 | # mkdocs documentation 106 | /site 107 | 108 | # mypy 109 | .mypy_cache/ 110 | .dmypy.json 111 | dmypy.json 112 | 113 | # test deployment 114 | deploy.sh 115 | 116 | # vscode 117 | .vscode 118 | -------------------------------------------------------------------------------- /.pylintrc: -------------------------------------------------------------------------------- 1 | [MASTER] 2 | 3 | # A comma-separated list of package or module names from where C extensions may 4 | # be loaded. Extensions are loading into the active Python interpreter and may 5 | # run arbitrary code 6 | extension-pkg-whitelist= 7 | 8 | # Add files or directories to the blacklist. They should be base names, not 9 | # paths. 10 | ignore=CVS 11 | 12 | # Add files or directories matching the regex patterns to the blacklist. The 13 | # regex matches against base names, not paths. 14 | ignore-patterns= 15 | 16 | # Python code to execute, usually for sys.path manipulation such as 17 | # pygtk.require(). 18 | #init-hook= 19 | 20 | # Use multiple processes to speed up Pylint. 21 | jobs=1 22 | 23 | # List of plugins (as comma separated values of python modules names) to load, 24 | # usually to register additional checkers. 25 | load-plugins= 26 | 27 | # Pickle collected data for later comparisons. 28 | persistent=yes 29 | 30 | # Specify a configuration file. 31 | #rcfile= 32 | 33 | # Allow loading of arbitrary C extensions. Extensions are imported into the 34 | # active Python interpreter and may run arbitrary code. 35 | unsafe-load-any-extension=no 36 | 37 | 38 | [MESSAGES CONTROL] 39 | 40 | # Only show warnings with the listed confidence levels. Leave empty to show 41 | # all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED 42 | confidence= 43 | 44 | # Disable the message, report, category or checker with the given id(s). You 45 | # can either give multiple identifiers separated by comma (,) or put this 46 | # option multiple times (only on the command line, not in the configuration 47 | # file where it should appear only once).You can also use "--disable=all" to 48 | # disable everything first and then reenable specific checks. For example, if 49 | # you want to run only the similarities checker, you can use "--disable=all 50 | # --enable=similarities". If you want to run only the classes checker, but have 51 | # no Warning level messages displayed, use"--disable=all --enable=classes 52 | # --disable=W" 53 | disable=print-statement,parameter-unpacking,unpacking-in-except,old-raise-syntax,backtick,long-suffix,old-ne-operator,old-octal-literal,import-star-module-level,raw-checker-failed,bad-inline-option,locally-disabled,locally-enabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,apply-builtin,basestring-builtin,buffer-builtin,cmp-builtin,coerce-builtin,execfile-builtin,file-builtin,long-builtin,raw_input-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,no-absolute-import,old-division,dict-iter-method,dict-view-method,next-method-called,metaclass-assignment,indexing-exception,raising-string,reload-builtin,oct-method,hex-method,nonzero-method,cmp-method,input-builtin,round-builtin,intern-builtin,unichr-builtin,map-builtin-not-iterating,zip-builtin-not-iterating,range-builtin-not-iterating,filter-builtin-not-iterating,using-cmp-argument,eq-without-hash,div-method,idiv-method,rdiv-method,exception-message-attribute,invalid-str-codec,sys-max-int,bad-python3-import,deprecated-string-function,deprecated-str-translate-call,similarities,fixme,too-many-branches,c-extension-no-member,literal-comparison,no-self-use,pointless-string-statement 54 | 55 | # Enable the message, report, category or checker with the given id(s). You can 56 | # either give multiple identifier separated by comma (,) or put this option 57 | # multiple time (only on the command line, not in the configuration file where 58 | # it should appear only once). See also the "--disable" option for examples. 59 | enable= 60 | 61 | 62 | [REPORTS] 63 | 64 | # Python expression which should return a note less than 10 (10 is the highest 65 | # note). You have access to the variables errors warning, statement which 66 | # respectively contain the number of errors / warnings messages and the total 67 | # number of statements analyzed. This is used by the global evaluation report 68 | # (RP0004). 69 | evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) 70 | 71 | # Template used to display messages. This is a python new-style format string 72 | # used to format the message information. See doc for all details 73 | #msg-template= 74 | 75 | # Set the output format. Available formats are text, parseable, colorized, json 76 | # and msvs (visual studio).You can also give a reporter class, eg 77 | # mypackage.mymodule.MyReporterClass. 78 | output-format=text 79 | 80 | # Tells whether to display a full report or only the messages 81 | reports=no 82 | 83 | # Activate the evaluation score. 84 | score=yes 85 | 86 | 87 | [REFACTORING] 88 | 89 | # Maximum number of nested blocks for function / method body 90 | max-nested-blocks=5 91 | 92 | 93 | [BASIC] 94 | 95 | # Naming hint for argument names 96 | argument-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ 97 | 98 | # Regular expression matching correct argument names 99 | argument-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ 100 | 101 | # Naming hint for attribute names 102 | attr-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ 103 | 104 | # Regular expression matching correct attribute names 105 | attr-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ 106 | 107 | # Bad variable names which should always be refused, separated by a comma 108 | bad-names=foo,bar,baz,toto,tutu,tata 109 | 110 | # Naming hint for class attribute names 111 | class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ 112 | 113 | # Regular expression matching correct class attribute names 114 | class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ 115 | 116 | # Naming hint for class names 117 | class-name-hint=[A-Z_][a-zA-Z0-9]+$ 118 | 119 | # Regular expression matching correct class names 120 | class-rgx=[A-Z_][a-zA-Z0-9]+$ 121 | 122 | # Naming hint for constant names 123 | const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$ 124 | 125 | # Regular expression matching correct constant names 126 | const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ 127 | 128 | # Minimum line length for functions/classes that require docstrings, shorter 129 | # ones are exempt. 130 | docstring-min-length=-1 131 | 132 | # Naming hint for function names 133 | function-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ 134 | 135 | # Regular expression matching correct function names 136 | function-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ 137 | 138 | # Good variable names which should always be accepted, separated by a comma 139 | good-names=i,j,k,ex,Run,_ 140 | 141 | # Include a hint for the correct naming format with invalid-name 142 | include-naming-hint=no 143 | 144 | # Naming hint for inline iteration names 145 | inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$ 146 | 147 | # Regular expression matching correct inline iteration names 148 | inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ 149 | 150 | # Naming hint for method names 151 | method-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ 152 | 153 | # Regular expression matching correct method names 154 | method-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ 155 | 156 | # Naming hint for module names 157 | module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ 158 | 159 | # Regular expression matching correct module names 160 | module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ 161 | 162 | # Colon-delimited sets of names that determine each other's naming style when 163 | # the name regexes allow several styles. 164 | name-group= 165 | 166 | # Regular expression which should only match function or class names that do 167 | # not require a docstring. 168 | no-docstring-rgx=^_ 169 | 170 | # List of decorators that produce properties, such as abc.abstractproperty. Add 171 | # to this list to register other decorators that produce valid properties. 172 | property-classes=abc.abstractproperty 173 | 174 | # Naming hint for variable names 175 | variable-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ 176 | 177 | # Regular expression matching correct variable names 178 | variable-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ 179 | 180 | 181 | [FORMAT] 182 | 183 | # Expected format of line ending, e.g. empty (any line ending), LF or CRLF. 184 | expected-line-ending-format= 185 | 186 | # Regexp for a line that is allowed to be longer than the limit. 187 | ignore-long-lines=^\s*(# )??$ 188 | 189 | # Number of spaces of indent required inside a hanging or continued line. 190 | indent-after-paren=4 191 | 192 | # String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 193 | # tab). 194 | indent-string=' ' 195 | 196 | # Maximum number of characters on a single line. 197 | max-line-length=100 198 | 199 | # Maximum number of lines in a module 200 | max-module-lines=1000 201 | 202 | # List of optional constructs for which whitespace checking is disabled. `dict- 203 | # separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. 204 | # `trailing-comma` allows a space between comma and closing bracket: (a, ). 205 | # `empty-line` allows space-only lines. 206 | no-space-check=trailing-comma,dict-separator 207 | 208 | # Allow the body of a class to be on the same line as the declaration if body 209 | # contains single statement. 210 | single-line-class-stmt=no 211 | 212 | # Allow the body of an if to be on the same line as the test if there is no 213 | # else. 214 | single-line-if-stmt=no 215 | 216 | 217 | [LOGGING] 218 | 219 | # Logging modules to check that the string format arguments are in logging 220 | # function parameter format 221 | logging-modules=logging 222 | 223 | 224 | [MISCELLANEOUS] 225 | 226 | # List of note tags to take in consideration, separated by a comma. 227 | notes=FIXME,XXX,TODO 228 | 229 | 230 | [SIMILARITIES] 231 | 232 | # Ignore comments when computing similarities. 233 | ignore-comments=yes 234 | 235 | # Ignore docstrings when computing similarities. 236 | ignore-docstrings=yes 237 | 238 | # Ignore imports when computing similarities. 239 | ignore-imports=yes 240 | 241 | # Minimum lines number of a similarity. 242 | min-similarity-lines=4 243 | 244 | 245 | [SPELLING] 246 | 247 | # Spelling dictionary name. Available dictionaries: en_US (myspell), en_GB 248 | # (myspell), en_AG (myspell), en_AU (myspell), en_BS (myspell), en_BW 249 | # (myspell), en_BZ (myspell), en_CA (myspell), en_DK (myspell), en_GH 250 | # (myspell), en_HK (myspell), en_IE (myspell), en_IN (myspell), en_JM 251 | # (myspell), en_MW (myspell), en_NA (myspell), en_NG (myspell), en_NZ 252 | # (myspell), en_PH (myspell), en_SG (myspell), en_TT (myspell), en_ZA 253 | # (myspell), en_ZM (myspell), en_ZW (myspell), pl_PL (myspell), fr_BE 254 | # (myspell), fr_CA (myspell), fr_CH (myspell), fr_FR (myspell), fr_LU 255 | # (myspell), fr_MC (myspell). 256 | spelling-dict= 257 | 258 | # List of comma separated words that should not be checked. 259 | spelling-ignore-words= 260 | 261 | # A path to a file that contains private dictionary; one word per line. 262 | spelling-private-dict-file= 263 | 264 | # Tells whether to store unknown words to indicated private dictionary in 265 | # --spelling-private-dict-file option instead of raising a message. 266 | spelling-store-unknown-words=no 267 | 268 | 269 | [TYPECHECK] 270 | 271 | # List of decorators that produce context managers, such as 272 | # contextlib.contextmanager. Add to this list to register other decorators that 273 | # produce valid context managers. 274 | contextmanager-decorators=contextlib.contextmanager 275 | 276 | # List of members which are set dynamically and missed by pylint inference 277 | # system, and so shouldn't trigger E1101 when accessed. Python regular 278 | # expressions are accepted. 279 | generated-members=env,dlloverrides,wine_path,bindir,config.* 280 | 281 | # Tells whether missing members accessed in mixin class should be ignored. A 282 | # mixin class is detected if its name ends with "mixin" (case insensitive). 283 | ignore-mixin-members=yes 284 | 285 | # This flag controls whether pylint should warn about no-member and similar 286 | # checks whenever an opaque object is returned when inferring. The inference 287 | # can return multiple potential results while evaluating a Python object, but 288 | # some branches might not be evaluated, which results in partial inference. In 289 | # that case, it might be useful to still emit no-member and other checks for 290 | # the rest of the inferred objects. 291 | ignore-on-opaque-inference=yes 292 | 293 | # List of class names for which member attributes should not be checked (useful 294 | # for classes with dynamically set attributes). This supports the use of 295 | # qualified names. 296 | ignored-classes=optparse.Values,thread._local,_thread._local 297 | 298 | # List of module names for which member attributes should not be checked 299 | # (useful for modules/projects where namespaces are manipulated during runtime 300 | # and thus existing member attributes cannot be deduced by static analysis. It 301 | # supports qualified module names, as well as Unix pattern matching. 302 | ignored-modules= 303 | 304 | # Show a hint with possible names when a member name was not found. The aspect 305 | # of finding the hint is based on edit distance. 306 | missing-member-hint=yes 307 | 308 | # The minimum edit distance a name should have in order to be considered a 309 | # similar match for a missing member name. 310 | missing-member-hint-distance=1 311 | 312 | # The total number of similar names that should be taken in consideration when 313 | # showing a hint for a missing member. 314 | missing-member-max-choices=1 315 | 316 | 317 | [VARIABLES] 318 | 319 | # List of additional names supposed to be defined in builtins. Remember that 320 | # you should avoid to define new builtins when possible. 321 | additional-builtins= 322 | 323 | # Tells whether unused global variables should be treated as a violation. 324 | allow-global-unused-variables=yes 325 | 326 | # List of strings which can identify a callback function by name. A callback 327 | # name must start or end with one of those strings. 328 | callbacks=cb_,_cb 329 | 330 | # A regular expression matching the name of dummy variables (i.e. expectedly 331 | # not used). 332 | dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ 333 | 334 | # Argument names that match this expression will be ignored. Default to name 335 | # with leading underscore 336 | ignored-argument-names=_.*|^ignored_|^unused_ 337 | 338 | # Tells whether we should check for unused import in __init__ files. 339 | init-import=no 340 | 341 | # List of qualified module names which can have objects that can redefine 342 | # builtins. 343 | redefining-builtins-modules=six.moves,future.builtins 344 | 345 | 346 | [CLASSES] 347 | 348 | # List of method names used to declare (i.e. assign) instance attributes. 349 | defining-attr-methods=__init__,__new__,setUp 350 | 351 | # List of member names, which should be excluded from the protected access 352 | # warning. 353 | exclude-protected=_asdict,_fields,_replace,_source,_make 354 | 355 | # List of valid names for the first argument in a class method. 356 | valid-classmethod-first-arg=cls 357 | 358 | # List of valid names for the first argument in a metaclass class method. 359 | valid-metaclass-classmethod-first-arg=mcs 360 | 361 | 362 | [DESIGN] 363 | 364 | # Maximum number of arguments for function / method 365 | max-args=5 366 | 367 | # Maximum number of attributes for a class (see R0902). 368 | max-attributes=7 369 | 370 | # Maximum number of boolean expressions in a if statement 371 | max-bool-expr=5 372 | 373 | # Maximum number of branch for function / method body 374 | max-branches=12 375 | 376 | # Maximum number of locals for function / method body 377 | max-locals=15 378 | 379 | # Maximum number of parents for a class (see R0901). 380 | max-parents=7 381 | 382 | # Maximum number of public methods for a class (see R0904). 383 | max-public-methods=20 384 | 385 | # Maximum number of return / yield for function / method body 386 | max-returns=6 387 | 388 | # Maximum number of statements in function / method body 389 | max-statements=50 390 | 391 | # Minimum number of public methods for a class (see R0903). 392 | min-public-methods=2 393 | 394 | 395 | [IMPORTS] 396 | 397 | # Allow wildcard imports from modules that define __all__. 398 | allow-wildcard-with-all=no 399 | 400 | # Analyse import fallback blocks. This can be used to support both Python 2 and 401 | # 3 compatible code, which means that the block might have code that exists 402 | # only in one or another interpreter, leading to false positives when analysed. 403 | analyse-fallback-blocks=no 404 | 405 | # Deprecated modules which should not be used, separated by a comma 406 | deprecated-modules=optparse,tkinter.tix 407 | 408 | # Create a graph of external dependencies in the given file (report RP0402 must 409 | # not be disabled) 410 | ext-import-graph= 411 | 412 | # Create a graph of every (i.e. internal and external) dependencies in the 413 | # given file (report RP0402 must not be disabled) 414 | import-graph= 415 | 416 | # Create a graph of internal dependencies in the given file (report RP0402 must 417 | # not be disabled) 418 | int-import-graph= 419 | 420 | # Force import order to recognize a module as part of the standard 421 | # compatibility libraries. 422 | known-standard-library= 423 | 424 | # Force import order to recognize a module as part of a third party library. 425 | known-third-party=enchant 426 | 427 | 428 | [EXCEPTIONS] 429 | 430 | # Exceptions that will emit a warning when being caught. Defaults to 431 | # "Exception" 432 | overgeneral-exceptions=Exception 433 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: python 2 | python: 3 | - "3.6" # Ubuntu 18.04, Fedora 28 4 | install: 5 | - pip install pylint 6 | script: pylint protonfixes/* 7 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2018, Chris Simons 2 | 3 | Redistribution and use in source and binary forms, with or without modification, 4 | are permitted provided that the following conditions are met: 5 | 6 | Redistributions of source code must retain the above copyright notice, this list 7 | of conditions and the following disclaimer. 8 | Redistributions in binary form must reproduce the above copyright notice, this 9 | list of conditions and the following disclaimer in the documentation and/or 10 | other materials provided with the distribution. 11 | 12 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY 13 | EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 14 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 15 | DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY 16 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 17 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 18 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 19 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 20 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 21 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # THIS REPO HAS MOVED 2 | This fork of Protonfixes is now part of OWC -- https://github.com/Open-Wine-Components/ULWGL-protonfixes 3 | 4 | Protonfixes -- used in proton-ge, is now part of OWC (Open Wine Components). Moving forward work will be continued in that repo 5 | -------------------------------------------------------------------------------- /__init__.py: -------------------------------------------------------------------------------- 1 | """ Starts the protonfix module 2 | """ 3 | 4 | import os 5 | import sys 6 | 7 | if 'DEBUG' in os.environ: 8 | from . import debug 9 | 10 | RUN_CONDITIONS = [ 11 | 'STEAM_COMPAT_DATA_PATH' in os.environ, 12 | 'PROTONFIXES_DISABLE' not in os.environ, 13 | 'waitforexitandrun' in sys.argv[1], 14 | ] 15 | 16 | if all(RUN_CONDITIONS): 17 | import traceback 18 | from . import fix 19 | try: 20 | fix.main() 21 | 22 | #pylint: disable=W0702 23 | # Catch any exceptions and print a traceback 24 | except: 25 | sys.stderr.write('ProtonFixes ' + traceback.format_exc()) 26 | sys.stderr.flush() 27 | -------------------------------------------------------------------------------- /cabextract: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GloriousEggroll/protonfixes/d132b7b157257a62b000e3df0c578548ee3f4db8/cabextract -------------------------------------------------------------------------------- /cabextract_1.9-1.debian.tar.xz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GloriousEggroll/protonfixes/d132b7b157257a62b000e3df0c578548ee3f4db8/cabextract_1.9-1.debian.tar.xz -------------------------------------------------------------------------------- /checks.py: -------------------------------------------------------------------------------- 1 | """ Run some tests and generate warnings for proton configuration issues 2 | """ 3 | 4 | import shutil 5 | import os 6 | import subprocess 7 | from .logger import log 8 | 9 | 10 | def esync_file_limits(): 11 | """ 12 | Check esync file limits using /proc/sys/fs/file-max 13 | https://www.reddit.com/r/SteamPlay/comments/9kqisk/tip_for_those_using_proton_no_esync1/ 14 | """ 15 | 16 | warning = '''File descriptor limit is low 17 | This can cause issues with ESYNC 18 | For more details see: 19 | https://github.com/zfigura/wine/blob/esync/README.esync 20 | ''' 21 | 22 | with open('/proc/sys/fs/file-max') as fsmax: 23 | max_files = fsmax.readline() 24 | if int(max_files) < 8192: 25 | log.warn(warning) 26 | return False 27 | return True 28 | 29 | def run_checks(): 30 | """ Run checks to notify of any potential issues 31 | """ 32 | 33 | log.info('Running checks') 34 | checks = [ 35 | esync_file_limits(), 36 | ] 37 | if all(checks): 38 | log.info('All checks successful') 39 | -------------------------------------------------------------------------------- /config.py: -------------------------------------------------------------------------------- 1 | """ Load configuration settings for protonfixes 2 | """ 3 | import os 4 | from configparser import ConfigParser 5 | from .logger import log 6 | 7 | CONF_FILE = '~/.config/protonfixes/config.ini' 8 | DEFAULT_CONF = ''' 9 | [main] 10 | enable_checks = true 11 | enable_splash = false 12 | enable_global_fixes = true 13 | 14 | 15 | [path] 16 | cache_dir = ~/.cache/protonfixes 17 | ''' 18 | 19 | CONF = ConfigParser() 20 | CONF.read_string(DEFAULT_CONF) 21 | 22 | try: 23 | CONF.read(os.path.expanduser(CONF_FILE)) 24 | # pylint: disable=W0703 25 | except Exception: 26 | log.debug('Unable to read config file ' + CONF_FILE) 27 | 28 | def opt_bool(opt): 29 | """ Convert bool ini strings to actual boolean values 30 | """ 31 | 32 | return opt.lower() in ['yes', 'y', 'true', '1'] 33 | 34 | # pylint: disable=E1101 35 | locals().update( 36 | {x:opt_bool(y) for x, y 37 | in CONF['main'].items() 38 | if 'enable' in x}) 39 | 40 | locals().update({x:os.path.expanduser(y) for x, y in CONF['path'].items()}) 41 | 42 | try: 43 | [os.makedirs(os.path.expanduser(d)) for n, d in CONF['path'].items()] 44 | except OSError: 45 | pass 46 | -------------------------------------------------------------------------------- /debug.py: -------------------------------------------------------------------------------- 1 | """ Prints debug info if the environment variable DEBUG is 1 2 | """ 3 | 4 | import os 5 | import sys 6 | import shutil 7 | # pylint: disable=E0611 8 | from __main__ import CURRENT_PREFIX_VERSION, g_proton 9 | from .logger import log 10 | 11 | os.environ['DEBUG'] = '1' 12 | 13 | def show_debug_info(): 14 | """ Show various debug info """ 15 | 16 | check_args = [ 17 | 'iscriptevaluator.exe' in sys.argv[2], 18 | 'getcompatpath' in sys.argv[1], 19 | 'getnativepath' in sys.argv[1], 20 | ] 21 | 22 | if any(check_args): 23 | log.debug(str(sys.argv)) 24 | return 25 | 26 | line = '---------------------------------------' 27 | log.debug('---- begin protontricks debug info ----') 28 | log.debug('Proton Python Version:') 29 | log.debug(sys.executable) 30 | log.debug(sys.version) 31 | log.debug(line) 32 | log.debug('System Python Version:') 33 | try: 34 | log.debug(shutil.which(os.readlink(shutil.which('python')))) 35 | except: #pylint: disable=W0702 36 | log.debug(shutil.which('python')) 37 | log.debug(line) 38 | 39 | log.debug('Proton Version:') 40 | log.debug(CURRENT_PREFIX_VERSION) 41 | log.debug(line) 42 | 43 | log.debug('Proton Directory:') 44 | log.debug(g_proton.base_dir) 45 | log.debug(line) 46 | 47 | ignorevars = [ 48 | 'SteamUser', 49 | 'OLDPWD', 50 | 'SteamAppUser', 51 | 'LS_COLORS', 52 | ] 53 | 54 | log.debug('Environment Variables:') 55 | for key, value in os.environ.items(): 56 | if key not in ignorevars: 57 | log.debug(key + '=' + value) 58 | log.debug(line) 59 | 60 | log.debug('Command Line:') 61 | log.debug(sys.argv) 62 | log.debug('----- end protontricks debug info -----') 63 | 64 | show_debug_info() 65 | -------------------------------------------------------------------------------- /download.py: -------------------------------------------------------------------------------- 1 | """ Module with helper functions to download from file-hosting providers 2 | """ 3 | 4 | import os 5 | import hashlib 6 | import urllib.request 7 | import http.cookiejar 8 | 9 | 10 | GDRIVE_URL = 'https://drive.google.com/uc?id={}&export=download' 11 | HASH_BLOCK_SIZE = 65536 12 | 13 | 14 | def get_filename(headers): 15 | """ Retrieve a filename from a request headers via Content-Disposition 16 | """ 17 | content_disp = [x for x in headers if x[0] == 'Content-Disposition'][0][1] 18 | raw_filename = [x for x in content_disp.split(';') if x.startswith('filename=')][0] 19 | return raw_filename.replace('filename=', '').replace('"', '') 20 | 21 | 22 | def gdrive_download(gdrive_id, path): 23 | """ Download a file from gdrive given the fileid and a path to save 24 | """ 25 | url = GDRIVE_URL.format(gdrive_id) 26 | cjar = http.cookiejar.CookieJar() 27 | opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar)) 28 | urllib.request.install_opener(opener) 29 | req = urllib.request.Request(url) 30 | resp = urllib.request.urlopen(req) 31 | confirm_cookie = [x for x in resp.getheaders() if 32 | (x[0] == 'Set-Cookie' 33 | and x[1].startswith('download_warning'))][0][1] 34 | confirm = confirm_cookie.split(';')[0].split('=')[1] 35 | req2 = urllib.request.Request(url + '&confirm={}'.format(confirm)) 36 | resp2 = urllib.request.urlopen(req2) 37 | filename = get_filename(resp2.getheaders()) 38 | with open(os.path.join(path, filename), 'wb') as save_file: 39 | save_file.write(resp2.read()) 40 | 41 | 42 | def sha1sum(filename): 43 | """ Computes the sha1sum of the specified file 44 | """ 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 | -------------------------------------------------------------------------------- /engine.py: -------------------------------------------------------------------------------- 1 | """ Game engine API 2 | """ 3 | 4 | import io 5 | import os 6 | import sys 7 | from .logger import log 8 | 9 | class Engine(): 10 | """ Game engines 11 | """ 12 | 13 | def __init__(self): 14 | self.engine_name = None 15 | self.supported = { 16 | 'Dunia 2': 'https://pcgamingwiki.com/wiki/Engine:Dunia_2', 17 | 'Unity': 'https://pcgamingwiki.com/wiki/Engine:Unity', 18 | 'RAGE' : 'https://pcgamingwiki.com/wiki/Grand_Theft_Auto_IV#Launch_Options', 19 | 'UE3' : 'https://pcgamingwiki.com/wiki/Engine:Unreal_Engine_3', 20 | 'UE4' : 'https://pcgamingwiki.com/wiki/Engine:Unreal_Engine_4' 21 | } 22 | 23 | # Autodetection 24 | if self._is_unity(): 25 | self.engine_name = 'Unity' 26 | elif self._is_rage(): 27 | self.engine_name = 'RAGE' 28 | elif self._is_ue3(): 29 | self.engine_name = 'UE3' 30 | elif self._is_ue4(): 31 | self.engine_name = 'UE4' 32 | elif self._is_dunia2(): 33 | self.engine_name = 'Dunia 2' 34 | # TODO: dxgi.nvapiHack=False 35 | else: 36 | log.info('Engine: unknown Game engine') 37 | 38 | if self.engine_name is not None: 39 | log.info('Engine: ' + self.engine_name) 40 | log.info('Engine: ' + self.supported[self.engine_name]) 41 | 42 | 43 | def _add_argument(self, args=''): 44 | """ Set command line arguments 45 | """ 46 | 47 | sys.argv += args.split(' ') 48 | 49 | 50 | def _is_unity(self): 51 | """ Detect Unity engine 52 | """ 53 | 54 | dir_list = os.listdir(os.environ['PWD']) 55 | data_list = list(filter(lambda item: 'Data' in item, dir_list)) 56 | 57 | # Check .../Gamename_Data/Mono/etc/ dir 58 | for data_dir in data_list: 59 | if os.path.exists(os.path.join(os.environ['PWD'], data_dir, 'Mono/etc')): 60 | return True 61 | 62 | return False 63 | 64 | 65 | def _is_dunia2(self): 66 | """ Detect Dunia 2 engine (Far Cry >= 3) 67 | """ 68 | 69 | dir_list = os.listdir(os.environ['PWD']) 70 | data_list = list(filter(lambda item: 'data_win' in item, dir_list)) 71 | 72 | # Check .../data_win*/worlds/multicommon dir 73 | for data_dir in data_list: 74 | if os.path.exists(os.path.join(os.environ['PWD'], data_dir, 'worlds/multicommon')): 75 | return True 76 | 77 | return False 78 | 79 | def _is_rage(self): 80 | """ Detect RAGE engine (GTA IV/V) 81 | """ 82 | 83 | # dir_list = os.listdir(os.environ['PWD']) 84 | 85 | # # Check .../*/pc/data/cdimages dir 86 | # for data_dir in dir_list: 87 | # if os.path.exists(os.path.join(os.environ['PWD'], data_dir, 'pc/data/cdimages')): 88 | # return True 89 | if os.path.exists(os.path.join(os.environ['PWD'], 'pc/data/cdimages')): 90 | return True 91 | 92 | return False 93 | 94 | def _is_ue3(self): 95 | """ Detect Unreal Engine 3 96 | """ 97 | 98 | return False 99 | 100 | 101 | def _is_ue4(self): 102 | """ Detect Unreal Engine 4 103 | """ 104 | 105 | return False 106 | 107 | 108 | def _log(self, ctx, msg, warn=False): 109 | """ Log wrapper 110 | """ 111 | 112 | if self.engine_name is None: 113 | log.warn(ctx + ': Engine not defined') 114 | return False 115 | 116 | elif warn is not False: 117 | log.warn(self.engine_name + ': ' + ctx + ': ' + msg) 118 | else: 119 | log.info(self.engine_name + ': ' + ctx + ': ' + msg) 120 | 121 | 122 | def name(self): 123 | """ Report Engine name 124 | """ 125 | return self.engine_name 126 | 127 | 128 | def set(self, engine=None): 129 | """ Force engine 130 | """ 131 | 132 | if engine in self.supported: 133 | self.engine_name = engine 134 | self._log('set', 'forced') 135 | else: 136 | log.warn('Engine not supported (' + engine + ')') 137 | 138 | 139 | def nosplash(self): 140 | """ Disable splash screen 141 | """ 142 | 143 | if self.engine_name == 'UE3': 144 | self._add_argument('-nosplash') 145 | self._log('nosplash', 'splash screen disabled' + res) 146 | else: 147 | self._log('nosplash', 'not supported', True) 148 | 149 | 150 | def info(self): 151 | """ Show some information about engine 152 | """ 153 | 154 | if self.engine_name == 'RAGE': 155 | self._add_argument('-help') 156 | self._log('info', 'command line arguments') 157 | else: 158 | self._log('info', 'not supported', True) 159 | 160 | 161 | def nointro(self): 162 | """ Skip intro videos 163 | """ 164 | 165 | if self.engine_name == 'UE3': 166 | self._add_argument('-nostartupmovies') 167 | self._log('nointro', 'intro videos disabled') 168 | elif self.engine_name is 'Dunia 2': 169 | self._add_argument('-skipintro') 170 | self._log('nointro', 'intro videos disabled') 171 | else: 172 | self._log('nointro', 'not supported', True) 173 | 174 | 175 | def launcher(self, show=True): 176 | """ Force launcher 177 | """ 178 | 179 | if self.engine_name == 'Unity': 180 | self._add_argument('-show-screen-selector') 181 | self._log('launcher', 'forced') 182 | else: 183 | self._log('launcher', 'not supported', True) 184 | 185 | def windowed(self): 186 | """ Force windowed mode 187 | """ 188 | 189 | if self.engine_name == 'Unity': 190 | self._add_argument('-popupwindow -screen-fullscreen 0') 191 | self._log('windowed', 'borderless window') 192 | elif self.engine_name == 'RAGE': 193 | self._add_argument('-windowed') 194 | self._log('windowed', 'window') 195 | else: 196 | self._log('windowed', 'not supported', True) 197 | 198 | 199 | def resolution(self, res=None): 200 | """ Force screen resolution 201 | """ 202 | 203 | if res is not None: 204 | res_wh = res.split('x') 205 | else: 206 | return False 207 | 208 | if self.engine_name == 'Unity': 209 | self._add_argument('-screen-width ' + res_wh[0] + ' -screen-height ' + res_wh[1]) 210 | self._log('resolution', res) 211 | elif self.engine_name == 'RAGE': 212 | self._add_argument('-width ' + res_wh[0] + ' -height ' + res_wh[1]) 213 | self._log('resolution', res) 214 | else: 215 | self._log('resolution', 'not supported', True) 216 | 217 | 218 | engine = Engine() #pylint: disable=C0103 219 | -------------------------------------------------------------------------------- /fix.py: -------------------------------------------------------------------------------- 1 | """ Gets the game id and applies a fix if found 2 | """ 3 | 4 | from __future__ import print_function 5 | import io 6 | import os 7 | import re 8 | import sys 9 | from importlib import import_module 10 | from .util import protonprefix 11 | from .checks import run_checks 12 | from .logger import log 13 | from . import config 14 | 15 | def game_id(): 16 | """ Trys to return the game id from environment variables 17 | """ 18 | 19 | if 'SteamAppId' in os.environ: 20 | return os.environ['SteamAppId'] 21 | if 'SteamGameId' in os.environ: 22 | return os.environ['SteamGameId'] 23 | if 'STEAM_COMPAT_DATA_PATH' in os.environ: 24 | return re.findall(r'\d+', os.environ['STEAM_COMPAT_DATA_PATH'])[-1] 25 | 26 | log.crit('Game ID not found in environment variables') 27 | return None 28 | 29 | 30 | def game_name(): 31 | """ Trys to return the game name from environment variables 32 | """ 33 | 34 | try: 35 | game_library = re.findall(r'.*/steamapps', os.environ['PWD'], re.IGNORECASE)[-1] 36 | game_manifest = os.path.join(game_library, 'appmanifest_' + game_id() + '.acf') 37 | 38 | with io.open(game_manifest, 'r', encoding='utf-8') as appmanifest: 39 | for xline in appmanifest.readlines(): 40 | if 'name' in xline.strip(): 41 | name = re.findall(r'"[^"]+"', xline, re.UNICODE)[-1] 42 | return name 43 | except OSError: 44 | return 'UNKNOWN' 45 | except IndexError: 46 | return 'UNKNOWN' 47 | except UnicodeDecodeError: 48 | return 'UNKNOWN' 49 | return 'UNKNOWN' 50 | 51 | 52 | def run_fix(gameid): 53 | """ Loads a gamefix module by it's gameid 54 | """ 55 | 56 | if gameid is None: 57 | return 58 | 59 | if config.enable_checks: 60 | run_checks() 61 | 62 | game = game_name() + ' ('+ gameid + ')' 63 | localpath = os.path.expanduser('~/.config/protonfixes/localfixes') 64 | 65 | # execute default.py 66 | if os.path.isfile(os.path.join(localpath, 'default.py')): 67 | open(os.path.join(localpath, '__init__.py'), 'a').close() 68 | sys.path.append(os.path.expanduser('~/.config/protonfixes')) 69 | try: 70 | game_module = import_module('localfixes.default') 71 | log.info('Using local defaults for ' + game) 72 | game_module.main() 73 | except ImportError: 74 | log.info('No local defaults found for ' + game) 75 | elif config.enable_global_fixes: 76 | try: 77 | if gameid.isnumeric(): 78 | game_module = import_module('protonfixes.gamefixes-Steam.default') 79 | else: 80 | log.info('Non-steam game ' + game) 81 | game_module = import_module('protonfixes.gamefixes-ULWGL.default') 82 | log.info('Using global defaults for ' + game) 83 | game_module.main() 84 | except ImportError: 85 | log.info('No global defaults found') 86 | 87 | # execute .py 88 | if os.path.isfile(os.path.join(localpath, gameid + '.py')): 89 | open(os.path.join(localpath, '__init__.py'), 'a').close() 90 | sys.path.append(os.path.expanduser('~/.config/protonfixes')) 91 | try: 92 | game_module = import_module('localfixes.' + gameid) 93 | log.info('Using local protonfix for ' + game) 94 | game_module.main() 95 | except ImportError: 96 | log.info('No local protonfix found for ' + game) 97 | elif config.enable_global_fixes: 98 | try: 99 | if gameid.isnumeric(): 100 | game_module = import_module('protonfixes.gamefixes-Steam.' + gameid) 101 | else: 102 | log.info('Non-steam game ' + game) 103 | if os.environ['STORE'] == "amazon": 104 | log.info('Amazon store specified, using Amazon database') 105 | game_module = import_module('protonfixes.gamefixes-Amazon.' + gameid) 106 | elif os.environ['STORE'] == "battlenet": 107 | log.info('Battle.net store specified, using Battle.net database') 108 | game_module = import_module('protonfixes.gamefixes-Battlenet.' + gameid) 109 | elif os.environ['STORE'] == "ea": 110 | log.info('EA store specified, using EA database') 111 | game_module = import_module('protonfixes.gamefixes-EA.' + gameid) 112 | elif os.environ['STORE'] == "egs": 113 | log.info('EGS store specified, using EGS database') 114 | game_module = import_module('protonfixes.gamefixes-EGS.' + gameid) 115 | elif os.environ['STORE'] == "gog": 116 | log.info('GOG store specified, using GOG database') 117 | game_module = import_module('protonfixes.gamefixes-GOG.' + gameid) 118 | elif os.environ['STORE'] == "humble": 119 | log.info('Humble store specified, using Humble database') 120 | game_module = import_module('protonfixes.gamefixes-Humble.' + gameid) 121 | elif os.environ['STORE'] == "itchio": 122 | log.info('Itch.io store specified, using Itch.io database') 123 | game_module = import_module('protonfixes.gamefixes-Itchio.' + gameid) 124 | elif os.environ['STORE'] == "ubisoft": 125 | log.info('Ubisoft store specified, using Ubisoft database') 126 | game_module = import_module('protonfixes.gamefixes-Ubisoft.' + gameid) 127 | else: 128 | log.info('No store specified, using ULWGL database') 129 | game_module = import_module('protonfixes.gamefixes-ULWGL.' + gameid) 130 | log.info('Using protonfix for ' + game) 131 | game_module.main() 132 | except ImportError: 133 | log.info('No protonfix found for ' + game) 134 | 135 | 136 | def main(): 137 | """ Runs the gamefix 138 | """ 139 | 140 | check_args = [ 141 | 'iscriptevaluator.exe' in sys.argv[2], 142 | 'getcompatpath' in sys.argv[1], 143 | 'getnativepath' in sys.argv[1], 144 | ] 145 | 146 | if any(check_args): 147 | log.debug(str(sys.argv)) 148 | log.debug('Not running protonfixes for setup runs') 149 | return 150 | 151 | log.info('Running protonfixes') 152 | run_fix(game_id()) 153 | -------------------------------------------------------------------------------- /gamefixes-Amazon/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GloriousEggroll/protonfixes/d132b7b157257a62b000e3df0c578548ee3f4db8/gamefixes-Amazon/__init__.py -------------------------------------------------------------------------------- /gamefixes-Battlenet/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GloriousEggroll/protonfixes/d132b7b157257a62b000e3df0c578548ee3f4db8/gamefixes-Battlenet/__init__.py -------------------------------------------------------------------------------- /gamefixes-EA/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GloriousEggroll/protonfixes/d132b7b157257a62b000e3df0c578548ee3f4db8/gamefixes-EA/__init__.py -------------------------------------------------------------------------------- /gamefixes-EGS/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GloriousEggroll/protonfixes/d132b7b157257a62b000e3df0c578548ee3f4db8/gamefixes-EGS/__init__.py -------------------------------------------------------------------------------- /gamefixes-GOG/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GloriousEggroll/protonfixes/d132b7b157257a62b000e3df0c578548ee3f4db8/gamefixes-GOG/__init__.py -------------------------------------------------------------------------------- /gamefixes-Humble/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GloriousEggroll/protonfixes/d132b7b157257a62b000e3df0c578548ee3f4db8/gamefixes-Humble/__init__.py -------------------------------------------------------------------------------- /gamefixes-Humble/y-s-origin.py: -------------------------------------------------------------------------------- 1 | ../gamefixes-steam/207350.py -------------------------------------------------------------------------------- /gamefixes-Itchio/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GloriousEggroll/protonfixes/d132b7b157257a62b000e3df0c578548ee3f4db8/gamefixes-Itchio/__init__.py -------------------------------------------------------------------------------- /gamefixes-Steam/1017900.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Age of Empires: DE 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Changes the proton argument from the launcher to the game 9 | """ 10 | 11 | # Replace launcher with game exe in proton arguments 12 | util.append_argument('-NoStartup') 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/1030830.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Mafia II Definitive Edition 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Enable NVIDIA PhysX support. 9 | """ 10 | util.protontricks('physx') 11 | -------------------------------------------------------------------------------- /gamefixes-Steam/105000.py: -------------------------------------------------------------------------------- 1 | """ A New Beginning - Final Cut 2 | https://github.com/ValveSoftware/Proton/issues/1412 3 | No cutscene audio in Daedalic Games (Memoria, The Night of the Rabbit, A New Beginning - Final Cut) (105000 230820 243200) #1412 4 | """ 5 | #pylint: disable=C0103 6 | 7 | from protonfixes import util 8 | 9 | def main(): 10 | util.winedll_override('xaudio2_7', 'd') 11 | -------------------------------------------------------------------------------- /gamefixes-Steam/105400.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Fable III 2 | """ 3 | 4 | #pylint: disable=C0103 5 | 6 | import os 7 | import shutil 8 | 9 | from pathlib import Path 10 | from protonfixes import util 11 | from protonfixes.logger import log 12 | 13 | 14 | def main(): 15 | # https://www.reddit.com/r/SteamDeck/comments/vuagy2/finally_got_fable_3_working/ 16 | util.protontricks("xliveless") 17 | 18 | # Remove Windows Live folder 19 | dirpath = os.path.join(util.protonprefix(),"drive_c","Program Files","Common Files","Microsoft Shared","Windows Live") 20 | if os.path.exists(dirpath): 21 | shutil.rmtree(dirpath) 22 | else: 23 | log(f"Path '{dirpath}' could not be found") 24 | -------------------------------------------------------------------------------- /gamefixes-Steam/105450.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Age Of Empire 3: Complete Collection 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ installs corefonts, l3codecx, mfc42, winxp 9 | """ 10 | 11 | # https://github.com/ValveSoftware/Proton/issues/17#issuecomment-415977510 12 | util.protontricks('mfc42') 13 | util.protontricks('l3codecx') 14 | util.protontricks('corefonts') 15 | util.protontricks('winxp') 16 | -------------------------------------------------------------------------------- /gamefixes-Steam/1056640.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Phantasy Star Online 2 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ 9 | """ 10 | 11 | util.set_environment('WINE_NO_OPEN_FILE_SEARCH','pso2_bin/data') 12 | 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/1062040.py: -------------------------------------------------------------------------------- 1 | """ Dragon Star Varnir 2 | """ 3 | #pylint: disable=C0103 4 | from protonfixes import util 5 | 6 | 7 | def main(): 8 | """ Dragon Star Varnir fix 9 | """ 10 | # Fixes the startup process. 11 | util.winedll_override('xactengine3_7', 'n') 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/1063730.py: -------------------------------------------------------------------------------- 1 | """ Game fix for New World 2 | """ 3 | #pylint: disable=C0103 4 | 5 | import glob 6 | import os 7 | import subprocess 8 | from protonfixes import util 9 | 10 | def main(): 11 | """ Launcher currently broken 12 | """ 13 | # Fix the startup process: 14 | util.replace_command('NewWorldLauncher.exe', 'Bin64/NewWorld.exe') 15 | -------------------------------------------------------------------------------- /gamefixes-Steam/108710.py: -------------------------------------------------------------------------------- 1 | """ Alan Wake 2 | """ 3 | 4 | from protonfixes import util 5 | 6 | 7 | def main(): 8 | """ Installs d3dcompiler_47 9 | """ 10 | 11 | # Fixes error on launch 12 | util.protontricks('d3dcompiler_47') 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/1097150.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Fall Guys 2 | """ 3 | #pylint: disable=C0103 4 | from protonfixes import util 5 | 6 | def main(): 7 | """ Create symlink of eac so at the right location 8 | """ 9 | util.install_eac_runtime() 10 | util.disable_esync() 11 | util.disable_fsync() 12 | 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/1097880.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Super Naughty Maid 2 2 | """ 3 | 4 | from protonfixes import util 5 | 6 | 7 | def main(): 8 | """ installs quartz, wmp9 9 | """ 10 | 11 | # The whole game is only videos and require wmp9 & quartz 12 | util.protontricks('quartz') 13 | util.protontricks('wmp9_x86_64') 14 | -------------------------------------------------------------------------------- /gamefixes-Steam/110800.py: -------------------------------------------------------------------------------- 1 | """ Game fix for L.A. Noire 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ installs d3dx9_43, d3dcompiler_43, d3dx11_43, d3dcompiler_47 9 | forces dx11 (enables intro cinematics) without editing settings.ini 10 | """ 11 | 12 | # https://github.com/ValveSoftware/Proton/issues/544#issuecomment-826150012 13 | util.protontricks('d3dx9_43') 14 | util.protontricks('d3dcompiler_43') 15 | util.protontricks('d3dx11_43') 16 | util.protontricks('d3dcompiler_47') 17 | util.append_argument('-dx11') 18 | -------------------------------------------------------------------------------- /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 | #pylint: disable=C0103 7 | 8 | from protonfixes import util 9 | 10 | def main(): 11 | util.disable_protonaudioconverter() 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/113400.py: -------------------------------------------------------------------------------- 1 | """ APB Reloaded: Fix Wrong DLL error and Steam login crash 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | # Install Visual C++ Runtime 2017 9 | util.protontricks('vcrun2017') 10 | -------------------------------------------------------------------------------- /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 | # pylint: disable=C0103 7 | 8 | from protonfixes import util 9 | 10 | 11 | def main(): 12 | util.disable_protonaudioconverter() 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/1174180.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Red Dead Redemption 2 2 | """ 3 | #pylint: disable=C0103 4 | 5 | import os 6 | from protonfixes import util 7 | 8 | def main(): 9 | """ Sometimes game will not launch if -fullscreen -vulkan is not specified 10 | """ 11 | 12 | util.append_argument('-fullscreen -vulkan') 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/1175730.py: -------------------------------------------------------------------------------- 1 | """ Game fix Tree Of Savior 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ https://forum.treeofsavior.com/t/linux-the-graphic-card-does-not-support-directx11-13ep/418073/13 9 | """ 10 | util.protontricks('d3dcompiler_47') 11 | -------------------------------------------------------------------------------- /gamefixes-Steam/12210.py: -------------------------------------------------------------------------------- 1 | """ Game fix for GTA IV 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ installs wmp11 9 | """ 10 | # Fixes Independence FM user radio station 11 | util.protontricks('wmp11') 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/1222370.py: -------------------------------------------------------------------------------- 1 | """ Necromunda: Hired Gun 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ 9 | """ 10 | 11 | util.replace_command('Necromunda.exe', 'Necromunda/Binaries/Win64/Necromunda-Win64-Shipping.exe') 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/1230140.py: -------------------------------------------------------------------------------- 1 | """ Game fix for ATRI -My Dear Moments- 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Installs wmp11 9 | """ 10 | util.protontricks('quartz_feb2010') 11 | util.protontricks('wmp11') 12 | util.protontricks('qasf') 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/12360.py: -------------------------------------------------------------------------------- 1 | """ Game fix for FlatOut: Ultimate Carnage (2008) 2 | This game requires GFWL, so a mocked 'xlive.dll' is required (multiplayer doesn't work, but single player does) 3 | 4 | """ 5 | 6 | #pylint: disable=C0103 7 | 8 | from protonfixes import util 9 | 10 | 11 | def main(): 12 | util.protontricks("xliveless") 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/1237970.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Titanfall 2 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | import os 7 | import sys 8 | import subprocess 9 | import glob 10 | 11 | def main(): 12 | """ Allow -northstar option to work 13 | """ 14 | # Define game directory 15 | install_dir = glob.escape(util.get_game_install_path()) 16 | 17 | # Restore original titanfall2.exe if NorthstarLauncher.exe was previously symlinked 18 | if os.path.isfile(install_dir + '/Titanfall2.exe.bak'): 19 | subprocess.run(['mv', 'Titanfall2.exe.bak', 'Titanfall2.exe']) 20 | -------------------------------------------------------------------------------- /gamefixes-Steam/1239520.py: -------------------------------------------------------------------------------- 1 | """ Madden NFL 21 needs vcrun2019 for online mode to work 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ 9 | """ 10 | 11 | # Replace launcher with game exe in proton arguments 12 | util.protontricks('vcrun2019_ge') 13 | 14 | -------------------------------------------------------------------------------- /gamefixes-Steam/1240440.py: -------------------------------------------------------------------------------- 1 | """ Halo Infinite needs vcrun2019 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ 9 | """ 10 | 11 | util.protontricks('vcrun2019_ge') 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/1250410.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Flight Simulator 2020 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Needs fastlaunch option 9 | """ 10 | 11 | # Fixes the startup process. 12 | util.append_argument('-FastLaunch') 13 | -------------------------------------------------------------------------------- /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 | #pylint: disable=C0103 7 | 8 | from protonfixes import util 9 | 10 | def main(): 11 | util.disable_protonaudioconverter() 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/1259970.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Pes 2021 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ 9 | """ 10 | 11 | # Replace launcher with game exe in proton arguments 12 | util.protontricks('vcrun2019_ge') 13 | util.protontricks('allfonts') 14 | util.protontricks_proton_5('dotnet462') 15 | util.use_seccomp() 16 | -------------------------------------------------------------------------------- /gamefixes-Steam/1284210.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Guild Wars 2 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | import os 7 | 8 | def main(): 9 | """ GW2 add NOSTEAM option. 10 | """ 11 | # Fixes the startup process. 12 | if 'NOSTEAM' in os.environ: 13 | util.replace_command('-provider', '') 14 | -------------------------------------------------------------------------------- /gamefixes-Steam/1284410.py: -------------------------------------------------------------------------------- 1 | """ GWENT: The Witcher Card Game 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ installs mfc140 9 | 10 | mfc140 is necessary to start the game up. GOG login happens inside the Steam overlay. 11 | 12 | vcrun2019_ge enables full support of the prelauncher interface. GOG login inside the prelauncher. 13 | This prelauncher is not necessary for the Game. If only mfc is present, it's skipped. 14 | """ 15 | 16 | util.protontricks('mfc140') 17 | -------------------------------------------------------------------------------- /gamefixes-Steam/1286880.py: -------------------------------------------------------------------------------- 1 | """ Ship Graveyard Simulator 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ needs builtin vulkan-1 9 | """ 10 | 11 | util.winedll_override('vulkan-1', 'b') 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/1293820.py: -------------------------------------------------------------------------------- 1 | """ Game fix for YOU and ME and HER: A Love Story 2 | """ 3 | 4 | from protonfixes import util 5 | 6 | def main(): 7 | """ install xact, disable esync, disable fsync 8 | """ 9 | 10 | # Fixes the game from crashing or hanging during intro 11 | util.protontricks('xact') 12 | util.disable_esync() 13 | util.disable_fsync() 14 | -------------------------------------------------------------------------------- /gamefixes-Steam/1293830.py: -------------------------------------------------------------------------------- 1 | """ Forza Horizon 4 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ 9 | """ 10 | 11 | # Replace launcher with game exe in proton arguments 12 | util.protontricks('vcrun2019_ge') 13 | -------------------------------------------------------------------------------- /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 | #pylint: disable=C0103 7 | 8 | from protonfixes import util 9 | 10 | def main(): 11 | util.disable_protonaudioconverter() 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 | #pylint: disable=C0103 7 | 8 | from protonfixes import util 9 | 10 | def main(): 11 | util.disable_protonaudioconverter() 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/1434950.py: -------------------------------------------------------------------------------- 1 | """ Game fix HighFleet 2 | """ 3 | #pylint: disable=C0103 4 | # 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ installs d3dcompiler, d3dx11_43 9 | """ 10 | 11 | util.protontricks('d3dx11_43') 12 | util.protontricks('d3dcompiler_47') 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/1449280.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Ghostbusters: The Video Game Remastered (2019) 2 | """ 3 | #pylint: disable=C0103 4 | from pathlib import Path 5 | from protonfixes import util 6 | 7 | # This directory is required to make the game settings persistent 8 | # [source: https://www.pcgamingwiki.com/wiki/Ghostbusters:_The_Video_Game_Remastered#Game_settings_do_not_save] 9 | save_dir = f"{util.protonprefix()}/drive_c/users/steamuser/Local Settings/Application Data/GHOSTBUSTERS" 10 | 11 | 12 | def main(): 13 | try: 14 | Path(save_dir).mkdir(parents=True, exist_ok=True) 15 | except OSError as e: 16 | from protonfixes.logger import log 17 | 18 | log(f"Not able to make the settings directory at '{save_dir}': {e}") 19 | -------------------------------------------------------------------------------- /gamefixes-Steam/15130.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Beyond Good and Evil 2 | """ 3 | #pylint: disable=C0103 4 | import os 5 | import urllib.request 6 | from protonfixes import util 7 | 8 | def main(): 9 | """ installs dsound d3dx9 arial d3dcompiler_47 10 | """ 11 | 12 | util.protontricks('dsound') 13 | util.protontricks('d3dx9') 14 | util.protontricks('arial') 15 | util.protontricks('d3dcompiler_47') 16 | 17 | installpath = os.path.abspath(os.getcwd()) 18 | url = "https://github.com/legluondunet/MyLittleLutrisScripts/raw/master/Beyond%20Good%20and%20Evil/dsound.dll" 19 | 20 | """ Download dsound.dll in the game folder 21 | """ 22 | 23 | if not os.path.isfile(os.path.join(installpath, 'dsound.dll')): 24 | urllib.request.urlretrieve (url, "dsound.dll") 25 | 26 | """ Add a couple of keys in regedit 27 | """ 28 | 29 | util.regedit_add("HKLM\\Software\\Wow6432Node\\Ubisoft") 30 | util.regedit_add("HKLM\\Software\\Wow6432Node\\Ubisoft\\Beyond Good & Evil",'InstallLanguage','REG_DWORD','1') 31 | -------------------------------------------------------------------------------- /gamefixes-Steam/1532190.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Halo CE mod tools 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | # Requires vcrun2019 to launch 9 | util.protontricks('vcrun2019_ge') 10 | util.protontricks('d3dcompiler_47') 11 | util.protontricks('msxml3') 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/1557480.py: -------------------------------------------------------------------------------- 1 | """ Project MIKHAIL: A Muv-Luv War Story 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ needs native d3dcompiler_47 9 | """ 10 | util.protontricks('d3dcompiler_47') 11 | 12 | 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/15740.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Oddworld: Munch's Oddysee 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ installs devenum, quartz, wmp9 9 | """ 10 | 11 | # https://appdb.winehq.org/objectManager.php?sClass=version&iId=34367 12 | util.protontricks('devenum') 13 | util.protontricks('quartz') 14 | util.protontricks('wmp9_x86_64') 15 | -------------------------------------------------------------------------------- /gamefixes-Steam/1613450.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Halo 2 mod tools 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | # Requires vcrun2019 to launch 9 | util.protontricks('vcrun2019_ge') 10 | util.protontricks('d3dcompiler_47') 11 | util.protontricks('msxml3') 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/1659420.py: -------------------------------------------------------------------------------- 1 | """ UNCHARTED: Legacy of Thieves Collection 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main(): 9 | """ The game chokes on more than 16 cores 10 | """ 11 | 12 | util.set_cpu_topology_limit(16) 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/1664350.py: -------------------------------------------------------------------------------- 1 | """ Ship Graveyard Simulator Prologue 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ needs builtin vulkan-1 9 | """ 10 | 11 | util.winedll_override('vulkan-1', 'b') 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/16700.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Stronghold Crusader Extreme HD 2 | Fixes Multiplayer 3 | """ 4 | 5 | # pylint: disable=C0103 6 | 7 | from protonfixes import util 8 | 9 | 10 | def main(): 11 | """ Installs directplay 12 | """ 13 | 14 | util.protontricks('directplay') 15 | -------------------------------------------------------------------------------- /gamefixes-Steam/16810.py: -------------------------------------------------------------------------------- 1 | """ Civilization IV: Colonization 2 | """ 3 | 4 | from protonfixes import util 5 | 6 | def main(): 7 | 8 | util.protontricks('oleaut32') 9 | util.protontricks('msxml3') 10 | util.protontricks('corefonts') 11 | 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/1681970.py: -------------------------------------------------------------------------------- 1 | """ 神都不良探 Underdog Detective 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | util.protontricks('klite') 9 | util.winedll_override('winegstreamer', '') 10 | # it uses quartz instead of mfplat on win7 11 | util.protontricks('win7') 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/1695791.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Halo 3 mod tools 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | # Requires vcrun2019 to launch 9 | util.protontricks('vcrun2019_ge') 10 | util.protontricks('d3dcompiler_47') 11 | util.protontricks('msxml3') 12 | -------------------------------------------------------------------------------- /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 | #pylint: disable=C0103 6 | 7 | from protonfixes import util 8 | 9 | def main(): 10 | util.protontricks('dotnet35')) 11 | util.protontricks('dotnet45') 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/1695794.py: -------------------------------------------------------------------------------- 1 | """ Game fix Halo 3: ODST mod tools 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | # Requires vcrun2019 to launch 9 | util.protontricks('vcrun2019_ge') 10 | util.protontricks('d3dcompiler_47') 11 | util.protontricks('msxml3') 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/1711950.py: -------------------------------------------------------------------------------- 1 | """ GWENT: Rogue Mage 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ installs mfc140 9 | 10 | mfc140 is necessary to start the game up. GOG login happens inside the Steam overlay. 11 | 12 | vcrun2019_ge enables full support of the prelauncher interface. GOG login inside the prelauncher. 13 | This prelauncher is not necessary for the Game. If only mfc is present, it's skipped. 14 | """ 15 | 16 | util.protontricks('mfc140') 17 | -------------------------------------------------------------------------------- /gamefixes-Steam/1715130.py: -------------------------------------------------------------------------------- 1 | """ Crysis Remastered 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ 9 | """ 10 | 11 | # Replace launcher with game exe in proton arguments 12 | util.protontricks('vcrun2019_ge') 13 | util.protontricks('d3dcompiler_43') 14 | -------------------------------------------------------------------------------- /gamefixes-Steam/17300.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Crysis 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Installs d3dcompiler_43, disables esync 9 | """ 10 | 11 | # https://github.com/ValveSoftware/Proton/issues/178#issuecomment-422986182 12 | util.protontricks('d3dcompiler_43') 13 | 14 | # https://github.com/ValveSoftware/Proton/issues/178#issuecomment-415201326 15 | util.disable_esync() 16 | -------------------------------------------------------------------------------- /gamefixes-Steam/1795390.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Carnage Cross 2 | Proton issue: https://github.com/ValveSoftware/Proton/issues/6645 3 | """ 4 | #pylint: disable=C0103 5 | 6 | from protonfixes import util 7 | 8 | def main(): 9 | util.replace_command("CarnageCross/CarnageCross", "CarnageCross/CarnageCross/Binaries/Win64/CarnageCross-Win64-Shipping.exe") 10 | -------------------------------------------------------------------------------- /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 | def main(): 8 | 9 | util.protontricks('xact') 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /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 | #pylint: disable=C0103 7 | 8 | from protonfixes import util 9 | 10 | def main(): 11 | util.disable_protonaudioconverter() 12 | -------------------------------------------------------------------------------- /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 | #pylint: disable=C0103 6 | 7 | from protonfixes import util 8 | 9 | def main(): 10 | util.winedll_override('libvkd3d-1', 'n') 11 | util.protontricks('wmp11') 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/200940.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Sonic CD 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Installs d3dcompiler_43, d3dx9_43, mdx. Locks fps to 60. 9 | """ 10 | 11 | util.protontricks('d3dcompiler_43') 12 | util.protontricks('d3dx9_43') 13 | util.protontricks('mdx') 14 | 15 | util.set_environment('DXVK_FRAME_RATE', '60') 16 | -------------------------------------------------------------------------------- /gamefixes-Steam/201480.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Serious Sam: The Random Encounter 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main(): 9 | """ Installs directmusic and directplay 10 | """ 11 | 12 | util.protontricks('dmband') 13 | util.protontricks('dmime') 14 | util.protontricks('dmloader') 15 | util.protontricks('dmsynth') 16 | util.protontricks('dmstyle') 17 | util.protontricks('dmusic') 18 | util.protontricks('dsound') 19 | util.protontricks('dswave') 20 | util.protontricks('directplay') 21 | util.winedll_override('streamci', 'n') 22 | -------------------------------------------------------------------------------- /gamefixes-Steam/206480.py: -------------------------------------------------------------------------------- 1 | """ Game fix Dungeons & Dragons Online 2 | """ 3 | #pylint: disable=C0103 4 | # 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Disable libglesv2 """ 9 | 10 | # gpu acelleration on wibed3d https://bugs.winehq.org/show_bug.cgi?id=44985 11 | # Make the store work. 12 | util.winedll_override('libglesv2', 'd') 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/206500.py: -------------------------------------------------------------------------------- 1 | """ Game fix for AirMech Strike 2 | """ 3 | 4 | #pylint: disable=C0103 5 | 6 | from protonfixes import util 7 | 8 | def main(): 9 | util.append_argument('/dx11') 10 | -------------------------------------------------------------------------------- /gamefixes-Steam/207350.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Ys Origin 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ installs k-lite 9 | """ 10 | 11 | util.protontricks('klite') 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/208650.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Batman Arkham Knight 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ NVIDIA PhysX support. 9 | """ 10 | 11 | # Enables NVIDIA PhysX in Batman Arkham Knight. 12 | util.protontricks('physx') 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/20920.py: -------------------------------------------------------------------------------- 1 | """ Witcher 2 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main(): 9 | """ Witcher 2 chokes on more than 31 cores 10 | """ 11 | 12 | util.set_cpu_topology_limit(31) 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/211420.py: -------------------------------------------------------------------------------- 1 | """ Game fix Dark Sould Prepare To Die Edition 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Needs WMP9, devenum, quartz, dinput and win7 """ 9 | 10 | #For main menu, intro and outro playback 11 | util.protontricks('wmp9_x86_64') 12 | util.protontricks('devenum') 13 | util.protontricks('quartz') 14 | 15 | #In case if someone wishes to use DSfix 16 | util.protontricks('dinput8') 17 | util.winedll_override('dinput8', 'n') 18 | 19 | util.protontricks('win7') 20 | #Avoiding problems with missing syswow64 21 | util._mk_syswow64() #pylint: disable=protected-access 22 | -------------------------------------------------------------------------------- /gamefixes-Steam/212500.py: -------------------------------------------------------------------------------- 1 | """ Game fix The Lord of the Rings Online 2 | """ 3 | #pylint: disable=C0103 4 | # 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Disable libglesv2 """ 9 | 10 | ## gpu acelleration on wined3d https://bugs.winehq.org/show_bug.cgi?id=44985 11 | # Make the store work. 12 | util.winedll_override('libglesv2', 'd') 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/213330.py: -------------------------------------------------------------------------------- 1 | """ Game fix for LEGO Batman 2: DC Super Heroes 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ installs d3dx9_41 9 | """ 10 | 11 | util.protontricks('d3dx9_41') 12 | -------------------------------------------------------------------------------- /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 | #pylint: disable=C0103 8 | 9 | from protonfixes import util 10 | 11 | def main(): 12 | util.disable_protonaudioconverter() 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/214510.py: -------------------------------------------------------------------------------- 1 | """ Game fix for LEGO The Lord of the Rings 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ installs d3dx9_41 9 | """ 10 | 11 | util.protontricks('d3dx9_41') 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/214950.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Total War: Rome II 2 | """ 3 | 4 | from protonfixes import util 5 | 6 | def main(): 7 | """ installs d3dx11_42, d3dcompiler_42, directplay 8 | Disable esync and fsync 9 | """ 10 | 11 | util.protontricks('d3dx11_42') 12 | util.protontricks('d3dcompiler_42') 13 | util.protontricks('directplay') 14 | 15 | util.disable_esync() 16 | util.disable_fsync() 17 | -------------------------------------------------------------------------------- /gamefixes-Steam/215280.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Secret World Legends 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | import os 7 | 8 | import __main__ as protonmain 9 | 10 | def main(): 11 | util.protontricks('d3dx9_43') 12 | util.protontricks('d3dx11_43') 13 | util.protontricks('d3dcompiler_43') 14 | 15 | -------------------------------------------------------------------------------- /gamefixes-Steam/21680.py: -------------------------------------------------------------------------------- 1 | """ Bionic Commander Rearmed 2 | """ 3 | #pylint: disable=C0103 4 | 5 | import os 6 | import shutil 7 | import subprocess 8 | from protonfixes import util 9 | 10 | def main(): 11 | """ Installs physx 12 | """ 13 | util.protontricks('physx') 14 | 15 | 16 | -------------------------------------------------------------------------------- /gamefixes-Steam/2183070.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Tokyo Necro 2 | """ 3 | 4 | from protonfixes import util 5 | 6 | def main(): 7 | """ installs xact, disable ESYNC, disable FSYNC 8 | """ 9 | 10 | # Fixes crash after typing then entering or clicking `search` within the game's terminal menu 11 | util.protontricks('xact') 12 | # Fixes hanging after typing then entering or clicking `search` within the game's terminal menu 13 | util.disable_esync() 14 | util.disable_fsync() 15 | # Fixes audio not playing for in-game videos 16 | util.disable_protonaudioconverter() 17 | -------------------------------------------------------------------------------- /gamefixes-Steam/219030.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Ys Origin Demo 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ installs k-lite 9 | """ 10 | 11 | # Fix pre-rendered cutscene playback 12 | util.protontricks('klite') 13 | 14 | -------------------------------------------------------------------------------- /gamefixes-Steam/219990.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Grim Dawn 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | import subprocess 7 | import os 8 | 9 | def main(): 10 | """ Run script extender if it exists. 11 | """ 12 | 13 | # Fixes the startup process. 14 | if os.path.isfile(os.path.join(os.getcwd(), 'GrimInternals64.exe')): 15 | util.replace_command('Grim Dawn.exe', 'GrimInternals64.exe') 16 | -------------------------------------------------------------------------------- /gamefixes-Steam/220240.py: -------------------------------------------------------------------------------- 1 | """ FarCry 3 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main(): 9 | """ FarCry 3 chokes on more than 24 cores 10 | """ 11 | 12 | util.set_cpu_topology_limit(24) 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/22370.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Fallout 3 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | import subprocess 7 | import os 8 | import shutil 9 | 10 | def main(): 11 | """ Run script extender if it exists. 12 | """ 13 | 14 | if os.path.isfile(os.path.join(os.getcwd(), 'fose_loader.exe')): 15 | util.replace_command('FalloutLauncher.exe', 'fose_loader.exe') 16 | -------------------------------------------------------------------------------- /gamefixes-Steam/223750.py: -------------------------------------------------------------------------------- 1 | """ Fixes for DCS World Steam Edition 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main(): 9 | # Based on https://www.digitalcombatsimulator.com/en/support/faq/SteamDeck/ 10 | util.protontricks('d3dx11_43') 11 | util.protontricks('d3dcompiler_43') 12 | util.protontricks('d3dcompiler_47') 13 | util.winedll_override('wbemprox', 'n') # doesn't seem to be strictly needed 14 | -------------------------------------------------------------------------------- /gamefixes-Steam/224960.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Tomb Raider I 2 | """ 3 | # pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Enable Glide emulation in dosbox config """ 9 | 10 | conf_dict = {'glide': {'glide': 'emu'}} 11 | util.create_dosbox_conf('glide_fix.conf', conf_dict) 12 | util.append_argument('-conf') 13 | util.append_argument('glide_fix.conf') 14 | -------------------------------------------------------------------------------- /gamefixes-Steam/225640.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Sacred 2 Gold 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main(): 9 | """ Install physx 10 | """ 11 | 12 | util.protontricks('physx') 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/227320.py: -------------------------------------------------------------------------------- 1 | """ Game fix for You Need a Budget 4 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Installs corefonts 9 | """ 10 | 11 | # https://github.com/ValveSoftware/Proton/issues/7 12 | util.protontricks('corefonts') 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/230820.py: -------------------------------------------------------------------------------- 1 | """ The Night of the Rabbit 2 | https://github.com/ValveSoftware/Proton/issues/1412 3 | No cutscene audio in Daedalic Games (Memoria, The Night of the Rabbit, A New Beginning - Final Cut) (105000 230820 243200) #1412 4 | """ 5 | #pylint: disable=C0103 6 | 7 | from protonfixes import util 8 | 9 | def main(): 10 | util.winedll_override('xaudio2_7', 'd') 11 | -------------------------------------------------------------------------------- /gamefixes-Steam/231990.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Spider-Man: Shattered Dimensions 2 | """ 3 | #pylint: disable=C0103 4 | # 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ installs d3dx9_43, xact 9 | """ 10 | 11 | # https://steamcommunity.com/app/231990/discussions/0/3198117312260185786/#c3470604115208907456 12 | util.protontricks('d3dx9_43') 13 | util.protontricks('xact') 14 | -------------------------------------------------------------------------------- /gamefixes-Steam/2399220.py: -------------------------------------------------------------------------------- 1 | """ Game fix for NUKITASHI 2 | """ 3 | 4 | from protonfixes import util 5 | 6 | def main(): 7 | """ Disable protonaudioconverterbin plugin 8 | """ 9 | 10 | # Fixes audio not playing for in-game videos 11 | util.disable_protonaudioconverter() 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/240600.py: -------------------------------------------------------------------------------- 1 | """ Game fix for MotorGP 2 | """ 3 | 4 | #pylint: disable=C0103 5 | 6 | from protonfixes import util 7 | 8 | def main(): 9 | util.protontricks('d3dcompiler_43') 10 | util.protontricks('d3dx9_43') 11 | -------------------------------------------------------------------------------- /gamefixes-Steam/242760.py: -------------------------------------------------------------------------------- 1 | """ Game fix for The Forest 2 | """ 3 | 4 | # pylint: disable=C0103 5 | 6 | from protonfixes import util 7 | 8 | 9 | def main(): 10 | """ If SMT/HT is enabled, The Forest runs with extremely choppy. Just bad. 11 | We can fix it by setting the topology to the physical cores / core count. 12 | TODO: This fix was not tested with more than 10 physical cores yet. 13 | """ 14 | util.set_cpu_topology_nosmt() 15 | -------------------------------------------------------------------------------- /gamefixes-Steam/243200.py: -------------------------------------------------------------------------------- 1 | """ The Dark Eye: Memoria 2 | https://github.com/ValveSoftware/Proton/issues/1412 3 | No cutscene audio in Daedalic Games (Memoria, The Night of the Rabbit, A New Beginning - Final Cut) (105000 230820 243200) #1412 4 | """ 5 | #pylint: disable=C0103 6 | 7 | from protonfixes import util 8 | 9 | def main(): 10 | util.winedll_override('xaudio2_7', 'd') 11 | -------------------------------------------------------------------------------- /gamefixes-Steam/244210.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Assetto Corsa 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """Fixes default launcher and ACM.""" 9 | 10 | # Fixes Assetto itself and Content Manager. Version 4.5.2 does not seem to start. 11 | # Although CefSharp from Content Manager might have a higher requirement, it seems to 12 | # always crash on the GPU process so it doesn't really matter. 13 | # NOTE: needs to come first as it wipes the prefix 14 | util.protontricks_proton_5('dotnet472') # seems to really need things from Proton 5 currently 15 | # Fixes Content Manager (black windows) 16 | util.protontricks('d3dx11_43') 17 | util.protontricks('d3dcompiler_47') 18 | -------------------------------------------------------------------------------- /gamefixes-Steam/244850.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Space Engineers 2 | """ 3 | 4 | # pylint: disable=C0103 5 | 6 | from protonfixes import util 7 | 8 | 9 | def main(): 10 | 11 | base_attibutte = "" 12 | game_opts = """ 13 | 14 | """ 15 | 16 | util.set_xml_options(base_attibutte, game_opts, 'SpaceEngineers.exe.config','game') 17 | 18 | util.append_argument('-skipintro') 19 | -------------------------------------------------------------------------------- /gamefixes-Steam/252430.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Dusty Revenge: Co-Op Edition 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Install vcrun2010 9 | """ 10 | util.protontricks('vcrun2010') 11 | util.protontricks('dsound') 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/257420.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Serious Sam 4 2 | """ 3 | #pylint: disable=C0103 4 | 5 | import os 6 | import subprocess 7 | from protonfixes import util 8 | 9 | def main(): 10 | """ Graphics API workaround 11 | """ 12 | if not os.path.isfile('UserCfg.lua.bak'): 13 | subprocess.call(['cp', 'UserCfg.lua', 'UserCfg.lua.bak']) 14 | f = open('UserCfg.lua',"a+") 15 | f.write("sfx_strAPI = \"OpenAL\";") 16 | f.close 17 | -------------------------------------------------------------------------------- /gamefixes-Steam/261510.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Tesla Effect 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Install corefonts 9 | """ 10 | 11 | # https://github.com/ValveSoftware/Proton/issues/1317 12 | util.protontricks('corefonts') 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/2620.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Call of Duty (2003) 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Set Mesa env vars 9 | """ 10 | 11 | # https://github.com/ValveSoftware/Proton/pull/1423/commits/1a1d25c7d95691e37c94aea4e5f94e0c917aba6f 12 | util.set_environment('MESA_EXTENSION_MAX_YEAR', '2003') 13 | util.set_environment('__GL_ExtensionStringVersion', '17700') 14 | -------------------------------------------------------------------------------- /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 | #pylint: disable=C0103 5 | 6 | from protonfixes import util 7 | 8 | def main(): 9 | """ Changes the proton argument from the launcher to the game 10 | """ 11 | 12 | # Replace launcher with game exe in proton arguments 13 | util.replace_command('Launcher.exe', 'aomx.exe') 14 | -------------------------------------------------------------------------------- /gamefixes-Steam/268050.py: -------------------------------------------------------------------------------- 1 | """ Game fix for The Evil Within(268050) 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Changes the proton argument from the launcher to the game 9 | """ 10 | 11 | util.protontricks('win7') 12 | 13 | util.set_environment('PULSE_LATENCY_MSEC', '60') 14 | -------------------------------------------------------------------------------- /gamefixes-Steam/282900.py: -------------------------------------------------------------------------------- 1 | """ Hyperdimension Neptunia Re;Birth1 2 | Poor performance on some AMD hardware 3 | """ 4 | #pylint: disable=C0103 5 | 6 | from protonfixes import util 7 | 8 | def main(): 9 | util.set_environment('radeonsi_disable_sam', 'true') 10 | util.set_environment('AMD_DEBUG', 'nowc') -------------------------------------------------------------------------------- /gamefixes-Steam/284160.py: -------------------------------------------------------------------------------- 1 | """ Game fix for BeamNG.drive 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ installs d3dx9_43, d3dcompiler_43, d3dx11_43, d3dcompiler_47 9 | """ 10 | 11 | # https://github.com/ValveSoftware/Proton/issues/544#issuecomment-826150012 12 | util.protontricks('d3dx9_43') 13 | util.protontricks('d3dcompiler_43') 14 | util.protontricks('d3dx11_43') 15 | util.protontricks('d3dcompiler_47') 16 | -------------------------------------------------------------------------------- /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 | #pylint: disable=C0103 5 | 6 | from protonfixes import util, os 7 | 8 | def main(): 9 | util.replace_command('SotV_Launcher.exe', 'hd/SotV1.exe') 10 | os.chdir('hd') 11 | -------------------------------------------------------------------------------- /gamefixes-Steam/287310.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Re-Volt (287310) 2 | """ 3 | 4 | #pylint: disable=C0103 5 | 6 | from protonfixes import util 7 | 8 | def main(): 9 | """ Sets the necessary dll overrides for the wrappers that are shipped with the game 10 | """ 11 | 12 | # Set overrides 13 | util.winedll_override('ddraw', 'n') 14 | util.winedll_override('dinput', 'n') 15 | -------------------------------------------------------------------------------- /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 | #pylint: disable=C0103 6 | 7 | from protonfixes import util 8 | 9 | def main(): 10 | """ Installs crypt32 and and bypasses launcher 11 | """ 12 | 13 | # Install crypt32 (not required for Proton 3.16-3 and up) 14 | util.protontricks('crypt32') 15 | 16 | # Install directmusic, set overrides 17 | util.protontricks('directmusic') 18 | util.winedll_override('dmime', 'n') 19 | util.winedll_override('dmsynth', 'n') 20 | util.winedll_override('dmusic', 'n') 21 | util.winedll_override('dsound', 'n') 22 | util.winedll_override('dswave ', 'n') 23 | util.winedll_override('l3codecx', 'n') 24 | 25 | # Set sound to alsa 26 | util.protontricks('sound=alsa') 27 | 28 | # Disable launcher 29 | util.replace_command('patriots.exe', 'riseofnations.exe') 30 | -------------------------------------------------------------------------------- /gamefixes-Steam/289130.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Endless Legend 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Enable -useembedded to get past loading hang 9 | """ 10 | # Enable preload options 11 | util.append_argument('-useembedded') 12 | 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/294700.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Putt-Putt: Pep's Birthday Surprise 2 | """ 3 | 4 | #pylint: disable=C0103 5 | 6 | from protonfixes import util 7 | import os 8 | 9 | # Putt-Putt: PBS doesn't run unless there is a CD-ROM drive attached. 10 | def main(): 11 | dosdevice = os.path.join(util.protonprefix(), 'dosdevices/r:') 12 | if not os.path.exists(dosdevice): 13 | os.symlink('/tmp', dosdevice) #create symlink for dosdevices 14 | 15 | util.regedit_add("HKLM\\System\\MountedDevices",'\\??\\Volume{00000000-0000-0000-0000-000000000052}','REG_BINARY','2f746d7000') #sets up ID? exported from regedit 16 | util.regedit_add("HKLM\\System\\MountedDevices",'\\DosDevices\\R:','REG_BINARY','5c005c002e005c0064003a000000') #sets up dosdevice? exported from regedit 17 | util.regedit_add("HKLM\\Software\\Wine\\Drives",'r:','REG_SZ','cdrom', 1) #designate drive as CD-ROM, requires 64-bit access 18 | -------------------------------------------------------------------------------- /gamefixes-Steam/298110.py: -------------------------------------------------------------------------------- 1 | """ FarCry 4 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main(): 9 | """ FarCry 4 chokes on more than 24 cores 10 | """ 11 | 12 | util.protontricks('d3dcompiler_43') 13 | util.protontricks('d3dcompiler_47') 14 | util.set_cpu_topology_limit(24) 15 | -------------------------------------------------------------------------------- /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 | #pylint: disable=C0103 7 | 8 | from protonfixes import util 9 | 10 | def main(): 11 | util.protontricks('rsx3d') 12 | if util.protontricks('lavfilters'): 13 | util.regedit_add("HKEY_CURRENT_USER\\Software\\GNU\\ffdshow",'blacklist','REG_SZ','OVERSEER.EXE') 14 | util.regedit_add("HKEY_CURRENT_USER\\Software\\GNU\\ffdshow_audio",'blacklist','REG_SZ','OVERSEER.EXE') 15 | if util.protontricks('dgvoodoo2'): 16 | import os, subprocess 17 | syswow64 = os.path.join(util.protonprefix(), 'drive_c/windows/syswow64') 18 | subprocess.call(["sed -i '/[DirectX]/ {{/Resolution/s/max/unforced/}}' {}{}".format(syswow64,'/dgvoodoo.conf')], shell=True) 19 | -------------------------------------------------------------------------------- /gamefixes-Steam/307690.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Sleeping Dogs: Definitive Edition 2 | Note: It does not work with WINED3D. 3 | After the game start fullscreen and resolution can be set from game display settings. 4 | Sometimes the game is crashing. 5 | """ 6 | #pylint: disable=C0103 7 | 8 | from protonfixes import util 9 | 10 | def main(): 11 | """ Set virtual desktop 12 | """ 13 | 14 | # https://github.com/ValveSoftware/Proton/issues/872 15 | util.protontricks('vd=1280x720') 16 | -------------------------------------------------------------------------------- /gamefixes-Steam/307780.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Mortal Kombat X 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ 9 | """ 10 | 11 | # Fix pre-rendered cutscene playback 12 | util.protontricks('xact_x64') 13 | 14 | -------------------------------------------------------------------------------- /gamefixes-Steam/311730.py: -------------------------------------------------------------------------------- 1 | """ Game fix for DEAD OR ALIVE 5 Last Round 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Disables esync 9 | """ 10 | 11 | # https://github.com/ValveSoftware/Proton/issues/1834#issuecomment-433672443 12 | util.disable_esync() 13 | util.disable_fsync() 14 | -------------------------------------------------------------------------------- /gamefixes-Steam/312060.py: -------------------------------------------------------------------------------- 1 | """ Game fix for FFXIV 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | import os 7 | 8 | def main(): 9 | """ FFXIV add NOSTEAM option. 10 | """ 11 | # Fixes the startup process. 12 | if 'NOSTEAM' in os.environ: 13 | util.replace_command('-issteam', '') 14 | -------------------------------------------------------------------------------- /gamefixes-Steam/312450.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Order of Battle: World War II 2 | Still missing intro video codecs 3 | """ 4 | #pylint: disable=C0103 5 | 6 | from protonfixes import util 7 | 8 | def main(): 9 | """ Install corefonts 10 | """ 11 | 12 | # https://github.com/ValveSoftware/Proton/issues/639 13 | util.protontricks('corefonts') 14 | -------------------------------------------------------------------------------- /gamefixes-Steam/312670.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Strange Brigade 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ This bypasses Strange Brigade's Launcher, which renders all black. 9 | """ 10 | 11 | # Fixes the startup process. 12 | util.replace_command('StrangeBrigade.exe', 'StrangeBrigade_Vulkan.exe') 13 | util.append_argument('-skipdrivercheck -noHDR') 14 | 15 | -------------------------------------------------------------------------------- /gamefixes-Steam/328500.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Potatoman Seeks the Troof 2 | """ 3 | #pylint: disable=C0103 4 | 5 | import os 6 | from protonfixes import util 7 | 8 | def main(): 9 | """ The file mms.cfg must have the string OverrideGPUValidation=1 written 10 | """ 11 | fix_installed = False 12 | prefix = util.protonprefix() 13 | macro_path = 'drive_c/windows/syswow64/Macromed/Flash' 14 | flash_path = os.path.join(prefix, macro_path) 15 | mms_path = os.path.join(flash_path, 'mms.cfg') 16 | os.makedirs(flash_path, exist_ok=True) 17 | if os.path.isfile(mms_path): 18 | with open(mms_path) as f: 19 | for line in f: 20 | if 'OverrideGPUValidation' in line: 21 | fix_installed = True 22 | if not fix_installed: 23 | with open(mms_path, 'a') as f: 24 | f.write('\n') 25 | f.write("OverrideGPUValidation=1") 26 | -------------------------------------------------------------------------------- /gamefixes-Steam/329380.py: -------------------------------------------------------------------------------- 1 | """ Game fix Stealth Inc 2: A Game of Clones 2 | """ 3 | # pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | from protonfixes.logger import log 7 | 8 | 9 | def main(): 10 | """ dsound is needed for audio 11 | """ 12 | 13 | log('Installing dsound') 14 | util.protontricks('dsound') -------------------------------------------------------------------------------- /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 | #pylint: disable=C0103 6 | 7 | from protonfixes import util 8 | 9 | def main(): 10 | util.winedll_override('libvkd3d-1', 'n') 11 | util.protontricks('wmp11') 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/348550.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Guilty Gear Accent Core Plus R 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Uses physx 9 | """ 10 | 11 | util.protontricks('quartz') 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/35130.py: -------------------------------------------------------------------------------- 1 | """ Lara Croft and the Guardian of Light 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main(): 9 | """ LCGoL chokes on more than 12 cores 10 | """ 11 | 12 | util.set_cpu_topology_limit(12) 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/35140.py: -------------------------------------------------------------------------------- 1 | """ Game fix Batman Arkham Asylum 2 | (Currently no contollers) 3 | """ 4 | #pylint: disable=C0103 5 | 6 | from protonfixes import util 7 | 8 | def main(): 9 | """ Needs windxp, dotnet35, phyzx, d3dx9 """ 10 | 11 | #Probably not needed when proton will be merged with newer wine 12 | util.protontricks('d3dcompiler_43') 13 | util.protontricks('d3dx9_43') 14 | util.protontricks('physx') 15 | util._mk_syswow64() #pylint: disable=protected-access 16 | 17 | #TODO Controllers fixes 18 | -------------------------------------------------------------------------------- /gamefixes-Steam/351710.py: -------------------------------------------------------------------------------- 1 | """ Hyperdimension Neptunia Re;Birth2 2 | Poor performance on some AMD hardware 3 | """ 4 | #pylint: disable=C0103 5 | 6 | from protonfixes import util 7 | 8 | def main(): 9 | util.set_environment('radeonsi_disable_sam', 'true') 10 | util.set_environment('AMD_DEBUG', 'nowc') 11 | -------------------------------------------------------------------------------- /gamefixes-Steam/356190.py: -------------------------------------------------------------------------------- 1 | """ Game fix Shadow of War 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | # Requires vcrun2019 to launch 9 | util.protontricks('vcrun2019_ge') 10 | 11 | -------------------------------------------------------------------------------- /gamefixes-Steam/356500.py: -------------------------------------------------------------------------------- 1 | """ Game fix for STAR WARS Galactic Battlegrounds Saga 2 | """ 3 | 4 | #pylint: disable=C0103 5 | 6 | from protonfixes import util 7 | 8 | def main(): 9 | util.protontricks('icodecs') 10 | util.protontricks('directplay') 11 | -------------------------------------------------------------------------------- /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 | #pylint: disable=C0103 5 | 6 | from protonfixes import util 7 | 8 | def main(): 9 | """ Changes the proton argument from the launcher to the game 10 | """ 11 | 12 | # Game expects this to be set 13 | util.append_argument('-changedir') 14 | -------------------------------------------------------------------------------- /gamefixes-Steam/359550.py: -------------------------------------------------------------------------------- 1 | """ Rainbow Six Siege 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Rainbow Six Siege needs vk_x11_override_min_image_count=2 for AMD, and overlay disabled for Vulkan 9 | """ 10 | 11 | util.disable_uplay_overlay() 12 | util.set_environment('vk_x11_override_min_image_count', '2') 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/359870.py: -------------------------------------------------------------------------------- 1 | """ Game fix for FFX/X-2 HD Remaster 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | import os 7 | 8 | def main(): 9 | """ 10 | """ 11 | # disable new character intro cutscene to prevent black screen loop 12 | configpath = os.path.join(util.protonprefix(), 'drive_c/users/steamuser/My Documents/SQUARE ENIX/FINAL FANTASY X&X-2 HD Remaster') 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 | f = open(configgame,"w+") 18 | f.write("Language=en") 19 | f.close 20 | -------------------------------------------------------------------------------- /gamefixes-Steam/366250.py: -------------------------------------------------------------------------------- 1 | """ Metal Slug 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | import os 7 | 8 | def main(): 9 | util.protontricks('d3dcompiler_46') 10 | -------------------------------------------------------------------------------- /gamefixes-Steam/372000.py: -------------------------------------------------------------------------------- 1 | """ Game fix Tree Of Savior 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ https://forum.treeofsavior.com/t/linux-the-graphic-card-does-not-support-directx11-13ep/418073/13 9 | """ 10 | util.protontricks('d3dcompiler_47') 11 | -------------------------------------------------------------------------------- /gamefixes-Steam/377160.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Fallout 4 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | import subprocess 7 | import os 8 | 9 | def main(): 10 | """ Run script extender if it exists. 11 | """ 12 | 13 | # Fixes the startup process. 14 | if os.path.isfile(os.path.join(os.getcwd(), 'f4se_loader.exe')): 15 | util.replace_command('Fallout4Launcher.exe', 'f4se_loader.exe') 16 | -------------------------------------------------------------------------------- /gamefixes-Steam/377840.py: -------------------------------------------------------------------------------- 1 | """ Game fix for FINAL FANTASY IX 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Changes the proton argument from the launcher to the game 9 | """ 10 | 11 | # Fix crackling audio 12 | util.set_environment('PULSE_LATENCY_MSEC', '60') 13 | 14 | # Replace launcher with game exe in proton arguments 15 | util.replace_command('FF9_Launcher.exe', 'x64/FF9.exe') 16 | -------------------------------------------------------------------------------- /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 | #pylint: disable=C0103 5 | 6 | from protonfixes import util, os 7 | 8 | def main(): 9 | util.replace_command('SotV_Launcher.exe', 'hd/SotV2.exe') 10 | os.chdir('hd') 11 | -------------------------------------------------------------------------------- /gamefixes-Steam/379720.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Doom 2016 2 | """ 3 | #pylint: disable=C0103 4 | import os 5 | import shutil 6 | import urllib.request 7 | import zipfile 8 | 9 | from protonfixes import util 10 | 11 | 12 | def main(): 13 | """ Enable preload options 14 | """ 15 | 16 | # Enable preload options 17 | util.append_argument('+r_renderAPI 1') 18 | 19 | installpath = os.path.abspath(os.getcwd()) 20 | url = "https://github.com/Riesi/CChromaEditor/files/2277158/CChromaEditorLibrary.zip" 21 | 22 | if not os.path.isfile(os.path.join(installpath, 'CChromaEditorLibrary.dll.bak')): 23 | urllib.request.urlretrieve (url, "CChromaEditorLibrary.zip") 24 | shutil.move(os.path.join(installpath, 'CChromaEditorLibrary.dll'), 25 | os.path.join(installpath, 'CChromaEditorLibrary.dll.bak')) 26 | with zipfile.ZipFile("CChromaEditorLibrary.zip", "r") as zip_ref: 27 | zip_ref.extractall(installpath) 28 | -------------------------------------------------------------------------------- /gamefixes-Steam/386360.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Smite 2 | """ 3 | #pylint: disable=C0103 4 | 5 | import glob 6 | import os 7 | import subprocess 8 | from protonfixes import util 9 | 10 | 11 | def main(): 12 | """ Fix EAC location in smite 13 | """ 14 | install_dir = glob.escape(util.get_game_install_path()) 15 | 16 | # Fix EAC incorrect location: 17 | if not os.path.exists(install_dir + '/Win64/EasyAntiCheat/easyanticheat_x64.so'): 18 | subprocess.call(['ln', '-s', install_dir + '/EasyAntiCheat/easyanticheat_x64.so', install_dir + '/Win64/EasyAntiCheat/']) 19 | 20 | if not os.path.exists(install_dir + '/Win32/EasyAntiCheat/easyanticheat_x86.so'): 21 | subprocess.call(['ln', '-s', install_dir + '/EasyAntiCheat/easyanticheat_x86.so', install_dir + '/Win32/EasyAntiCheat/']) 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /gamefixes-Steam/388750.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Chronophantasma Extend 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Uses installs devenum wmp9 9 | """ 10 | 11 | # https://github.com/ValveSoftware/Proton/issues/703#issuecomment-416075961 12 | util.protontricks('devenum') 13 | util.protontricks('wmp9_x86_64') 14 | -------------------------------------------------------------------------------- /gamefixes-Steam/390710.py: -------------------------------------------------------------------------------- 1 | """ Game fix for SUGURI 2 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Installs d3dxof 9 | """ 10 | 11 | # https://github.com/ValveSoftware/Proton/issues/970#issuecomment-420421289 12 | util.protontricks('d3dxof') 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/39140.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Final Fantasy VII 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ installs vcrun2019_ge and d3dcompiler47 9 | """ 10 | 11 | # FFVII needs vcrun2019 and d3dcompiler_47 12 | util.protontricks('vcrun2019_ge') 13 | util.protontricks('d3dcompiler_47') 14 | 15 | -------------------------------------------------------------------------------- /gamefixes-Steam/39210.py: -------------------------------------------------------------------------------- 1 | """ Game fix for FFXIV 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | import os 7 | 8 | def main(): 9 | """ FFXIV add NOSTEAM option. 10 | """ 11 | # Fixes the startup process. 12 | if 'NOSTEAM' in os.environ: 13 | util.replace_command('-issteam', '') 14 | -------------------------------------------------------------------------------- /gamefixes-Steam/39500.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Gothic 3 2 | """ 3 | #pylint: disable=C0103 4 | 5 | import os 6 | from protonfixes import util 7 | 8 | def main(): 9 | """ Modify ge3.ini 10 | """ 11 | 12 | game_opts = """ 13 | [Engine.Setup] 14 | Timer.ThreadSafe=false 15 | FpS.Max=0 16 | """ 17 | 18 | util.set_ini_options(game_opts,os.path.join('Ini','ge3.ini'),'cp1251','game') -------------------------------------------------------------------------------- /gamefixes-Steam/39510.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Gothic II: Gold Edition 2 | """ 3 | #pylint: disable=C0103 4 | 5 | import glob 6 | import os 7 | from protonfixes import util 8 | 9 | 10 | def main(): 11 | 12 | screen_width,screen_height = util.get_resolution() 13 | 14 | zVidResFullscreenX=str(screen_width) 15 | zVidResFullscreenY=str(screen_height) 16 | 17 | """ Modify Gothic.ini 18 | """ 19 | 20 | game_opts = """ 21 | [GAME] 22 | scaleVideos=1 23 | [VIDEO] 24 | zVidResFullscreenX=""" + zVidResFullscreenX + """ 25 | zVidResFullscreenY=""" + zVidResFullscreenY + """ 26 | zVidResFullscreenBPP=32 27 | """ 28 | 29 | # Localized versions use different casing for filenames 30 | ini_pattern = '[Ss][Yy][Ss][Tt][Ee][Mm]/[Gg][Oo][Tt][Hh][Ii][Cc].[Ii][Nn][Ii]' 31 | install_dir = glob.escape(util.get_game_install_path()) 32 | ini_path = glob.glob(os.path.join(install_dir,ini_pattern)) 33 | 34 | if len(ini_path) == 1: 35 | util.set_ini_options(game_opts,ini_path[0],'cp1251','absolute') 36 | 37 | # Fix the game getting locked on exit 38 | util.disable_fsync() 39 | -------------------------------------------------------------------------------- /gamefixes-Steam/39690.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Arkania 2 | """ 3 | 4 | # pylint: disable=C0103 5 | 6 | from protonfixes import util 7 | 8 | 9 | def main(): 10 | 11 | # This requires Proton 5.0 installed 12 | util.protontricks('wmp11') 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/397540.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Borderlands 3 2 | """ 3 | #pylint: disable=C0103 4 | from protonfixes import util 5 | 6 | 7 | def main(): 8 | """ Borderlands 3 vcrun2019 fix 9 | """ 10 | # Fixes the startup process. 11 | util.protontricks('vcrun2019_ge') 12 | util.protontricks('d3dcompiler_47') 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/40800.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Super Meat Boy 2 | """ 3 | #pylint: disable=C0103 4 | # 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ installs d3dcompiler, xact 9 | """ 10 | 11 | util.protontricks('d3dcompiler_47') 12 | util.protontricks('xact') 13 | -------------------------------------------------------------------------------- /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 | #pylint: disable=C0103 8 | 9 | import os, subprocess, shutil 10 | from protonfixes import util 11 | 12 | def main(): 13 | syswow64 = os.path.join(util.protonprefix(), 'drive_c/windows/syswow64') 14 | if util.protontricks('dgvoodoo2'): 15 | subprocess.call(["sed -i '/[DirectX]/ {{/Resolution/s/max/unforced/}}' {}{}".format(syswow64,'/dgvoodoo.conf')], shell=True) 16 | shutil.copy(os.path.join(syswow64, 'dgd3d9.dll'),os.path.join(syswow64, 'd3d9.dll')) 17 | -------------------------------------------------------------------------------- /gamefixes-Steam/40950.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Stronghold HD 2 | Fixes Multiplayer 3 | """ 4 | # pylint: disable=C0103 5 | 6 | from protonfixes import util 7 | 8 | 9 | def main(): 10 | """ Installs directplay 11 | """ 12 | 13 | util.protontricks('directplay') 14 | -------------------------------------------------------------------------------- /gamefixes-Steam/40970.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Stronghold Crusader HD 2 | Fixes Multiplayer 3 | """ 4 | 5 | # pylint: disable=C0103 6 | 7 | from protonfixes import util 8 | 9 | 10 | def main(): 11 | """ Installs directplay 12 | """ 13 | 14 | util.protontricks('directplay') 15 | -------------------------------------------------------------------------------- /gamefixes-Steam/409720.py: -------------------------------------------------------------------------------- 1 | """ Game fix for BioShock 2 Remastered 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Disable ESYNC, disable intro's 9 | """ 10 | 11 | # After loading the game, or a save file, a key needs to be pressed 12 | # to continue. That screen does not respond to keyboard or mouse, 13 | # so there is no way to continue. -nointro disables that screen 14 | # (but also the intro's at the start of the game). 15 | util.append_argument('-nointro') 16 | 17 | # ESYNC causes texture problems and frequent hangs. 18 | util.disable_esync() 19 | -------------------------------------------------------------------------------- /gamefixes-Steam/410900.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Forts 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Uses winetricks to install the ole32 verb 9 | """ 10 | 11 | util.protontricks('ole32') 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/424840.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Little Nightmares 2 | """ 3 | # pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Add launch parameter 9 | """ 10 | 11 | # The game crashes if running with more than one CPU thread, 12 | # adding "-onethread" will force the game to use only one CPU thread 13 | util.append_argument('-onethread') 14 | -------------------------------------------------------------------------------- /gamefixes-Steam/428660.py: -------------------------------------------------------------------------------- 1 | """ Deliver us the Moon fix 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ 9 | """ 10 | 11 | # Replace launcher with game exe in proton arguments 12 | util.replace_command('MoonMan.exe', 'MoonMan/Binaries/Win64/MoonMan-Win64-Shipping.exe') 13 | 14 | -------------------------------------------------------------------------------- /gamefixes-Steam/429720.py: -------------------------------------------------------------------------------- 1 | """ Game fix for IMSCARED 2 | """ 3 | 4 | #pylint: disable=C0103 5 | 6 | from protonfixes import util 7 | import os 8 | import getpass 9 | 10 | # IMSCARED relies on a folder on the user's Desktop being accessible 11 | # The problem is that all of the folders in Proton are sandboxed 12 | # So this protonfix works around that 13 | def main(): 14 | desktoppath = os.path.join(util.protonprefix(), 'drive_c/users/steamuser/Desktop') 15 | if os.path.exists(desktoppath): 16 | if os.path.islink(desktoppath): 17 | os.unlink(desktoppath) 18 | else: 19 | os.rmdir(desktoppath) 20 | dst = '/home/' + getpass.getuser() + '/Desktop/' 21 | os.symlink(dst, desktoppath) 22 | 23 | 24 | -------------------------------------------------------------------------------- /gamefixes-Steam/43110.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Metro 2033 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Installs d3dx11_42 9 | """ 10 | 11 | # Fixes D3D10 and D3D11 render path crash on launch. 12 | util.protontricks('d3dx11_42') 13 | util.protontricks('d3dcompiler_42') 14 | -------------------------------------------------------------------------------- /gamefixes-Steam/434570.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Blood and Bacon 2 | """ 3 | 4 | #pylint: disable=C0103 5 | 6 | from protonfixes import util 7 | 8 | def main(): 9 | util.protontricks_proton_5('dotnet40') 10 | -------------------------------------------------------------------------------- /gamefixes-Steam/440900.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Conan Exiles 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main(): 9 | """ Launcher workaround 10 | """ 11 | # Fixes the startup process. 12 | util.install_battleye_runtime() 13 | util.replace_command('FuncomLauncher.exe', '../ConanSandbox/Binaries/Win64/ConanSandbox.exe') 14 | util.append_argument('-BattlEye') 15 | 16 | -------------------------------------------------------------------------------- /gamefixes-Steam/44690.py: -------------------------------------------------------------------------------- 1 | """ Game fix for GT Legends 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ installs mfc42 9 | """ 10 | 11 | util.protontricks('mfc42') 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/447040.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Watch_Dogs 2 2 | """ 3 | #pylint: disable=C0103 4 | 5 | import os 6 | from protonfixes import util 7 | 8 | def main(): 9 | """ disable Easy Anti-Cheat and online play, disable uplay overlay and change closebehavior 10 | """ 11 | 12 | uplayconfigpath = os.path.join(util.protonprefix(), 'drive_c/users/steamuser/Local Settings/Application Data/Ubisoft Game Launcher') 13 | if not os.path.exists(uplayconfigpath): 14 | os.makedirs(uplayconfigpath) 15 | uplayconfigfile = os.path.join(uplayconfigpath, 'settings.yml') 16 | if not os.path.isfile(uplayconfigfile): 17 | f = open(uplayconfigfile,"w+") 18 | f.write("overlay:\n enabled: false\n fps_enabled: false\n warning_enabled: false\nuser:\n closebehavior: CloseBehavior_Close\n landingpage: LandingPageLastPlayedGame\n") 19 | f.close 20 | 21 | # Replace launcher with game exe in proton arguments 22 | util.append_argument('-eac_launcher -nosplash') 23 | -------------------------------------------------------------------------------- /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 | #pylint: disable=C0103 8 | 9 | import os 10 | import multiprocessing 11 | 12 | from protonfixes import util 13 | 14 | 15 | def main(): 16 | util.protontricks("xliveless") 17 | 18 | # According to PCGW, no more than 6 physical cores work 19 | # Nevertheless, the game was tested with 12 threads 20 | # TODO: Test the game with SMT disabled / use set_cpu_topology_nosmt() 21 | util.set_cpu_topology_limit(12) 22 | -------------------------------------------------------------------------------- /gamefixes-Steam/460120.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Megadimension Neptunia VII 2 | """ 3 | #pylint: disable=C0103 4 | # 5 | from protonfixes import util 6 | 7 | #Fixes cinematics not showing or spawning in a different window 8 | #also fixes cinematics not playing sound 9 | def main(): 10 | util.protontricks('quartz_feb2010') 11 | util.protontricks('wmp11') 12 | util.protontricks('qasf') 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/46500.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Syberia 2 | """ 3 | #pylint: disable=C0103 4 | 5 | import os 6 | import subprocess 7 | from protonfixes import util 8 | 9 | def main(): 10 | """ needs player.ini to prevent black screen on load 11 | """ 12 | if not os.path.isfile('player.ini'): 13 | subprocess.call(['touch', 'player.ini']) 14 | f = open('player.ini',"w+") 15 | f.write("800 600 32 0 BaseCMO.cmo") 16 | f.close 17 | 18 | -------------------------------------------------------------------------------- /gamefixes-Steam/465280.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Yesterday Origins 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Set to win7 9 | """ 10 | 11 | # Fixes black screen during cutscenes. 12 | util.protontricks('win7') 13 | -------------------------------------------------------------------------------- /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 | #pylint: disable=C0103 6 | 7 | from protonfixes import util 8 | 9 | def main(): 10 | util.append_argument('-playoffline') 11 | -------------------------------------------------------------------------------- /gamefixes-Steam/489830.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Skyrim SE 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | import subprocess 7 | import os 8 | 9 | def main(): 10 | """ Run script extender if it exists. 11 | """ 12 | 13 | if os.path.isfile(os.path.join(os.getcwd(), 'skse64_loader.exe')): 14 | if 'MODS' in os.environ: 15 | util.replace_command('SkyrimSELauncher.exe', 'skse64_loader.exe') 16 | -------------------------------------------------------------------------------- /gamefixes-Steam/49520.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Borderlands 2 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Launcherfix and NVIDIA PhysX support. 9 | """ 10 | 11 | # Fixes the startup process. 12 | util.replace_command('Launcher.exe', 'Borderlands2.exe') 13 | util.append_argument('-NoSplash') 14 | 15 | # Disables esync prevents crashes. 16 | util.disable_esync() 17 | 18 | # Enables NVIDIA PhysX in Borderlands 2. 19 | util.protontricks('physx') 20 | -------------------------------------------------------------------------------- /gamefixes-Steam/495420.py: -------------------------------------------------------------------------------- 1 | """ Game fix for State of Decay 2 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Fix game crashes with d3dcompiler_47 and multiplayer crashes with win7 9 | """ 10 | 11 | util.protontricks('d3dcompiler_47') 12 | util.protontricks('win7') 13 | 14 | -------------------------------------------------------------------------------- /gamefixes-Steam/508980.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Crashday Redline Edition 2 | """ 3 | 4 | # pylint: disable=C0103 5 | 6 | import json 7 | from protonfixes import util 8 | 9 | 10 | def main(): 11 | """ Change setting FSAA to 0 in graphics.config 12 | """ 13 | 14 | config = (util.protonprefix() + "drive_c/users/steamuser/Local Settings/" + 15 | "Application Data/Crashday/config/graphics.config") 16 | 17 | # https://stackoverflow.com/a/45435707 18 | with open(config, 'r') as file: 19 | json_data = json.load(file) 20 | if 'FSAA' in json_data: 21 | json_data['FSAA'] = 0 22 | with open(config, 'w') as file: 23 | json.dump(json_data, file, indent=4) 24 | -------------------------------------------------------------------------------- /gamefixes-Steam/518790.py: -------------------------------------------------------------------------------- 1 | """ The Hunter: Call of the Wild 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Requires nvapi disabled. 9 | """ 10 | util.disable_nvapi() 11 | -------------------------------------------------------------------------------- /gamefixes-Steam/544750.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Soulcalibur VI 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ 9 | """ 10 | 11 | # Replace launcher with game exe in proton arguments 12 | util.use_seccomp() 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/550340.py: -------------------------------------------------------------------------------- 1 | """ Ougon Musoukyoku 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | # Codecs required for opening playback 9 | util.protontricks('lavfilters') 10 | -------------------------------------------------------------------------------- /gamefixes-Steam/55150.py: -------------------------------------------------------------------------------- 1 | """ Warhammer 40,000: Space Marine - Anniversary Edition 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main(): 9 | """ Space Marine chokes on more than 24 cores 10 | """ 11 | 12 | util.set_cpu_topology_limit(24) 13 | 14 | -------------------------------------------------------------------------------- /gamefixes-Steam/559620.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Outlaws + A Handful of Missions 2 | """ 3 | #pylint: disable=C0103 4 | # 5 | from protonfixes import util 6 | 7 | def main(): 8 | # Override ddraw (cutscenes+menu perf) and WinMM (Music) 9 | util.winedll_override('ddraw', 'n,b') 10 | util.winedll_override('winmm', 'n,b') 11 | -------------------------------------------------------------------------------- /gamefixes-Steam/570940.py: -------------------------------------------------------------------------------- 1 | """ Game fix Dark Souls Remastered 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | # Requires vcrun2017 to launch 9 | util.protontricks('vcrun2017') 10 | 11 | -------------------------------------------------------------------------------- /gamefixes-Steam/582660.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Black Desert Online 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | import os 7 | 8 | def main(): 9 | """ Black Desert Online add NOSTEAM option. 10 | """ 11 | # Fixes the startup process. 12 | if 'NOSTEAM' in os.environ: 13 | util.replace_command('--steam', '') 14 | -------------------------------------------------------------------------------- /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 | #pylint: disable=C0103 7 | 8 | from protonfixes import util 9 | 10 | def main(): 11 | util.disable_protonaudioconverter() 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/593600.py: -------------------------------------------------------------------------------- 1 | """ Game fix for PixARK 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Overrides the mprapi.dll to native. 9 | """ 10 | 11 | util.winedll_override('mprapi', 'x') 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/601510.py: -------------------------------------------------------------------------------- 1 | """ Yu-Gi-Oh Duel Links needs vcrun2019 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ 9 | """ 10 | 11 | # Replace launcher with game exe in proton arguments 12 | util.protontricks('vcrun2019_ge') 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/627270.py: -------------------------------------------------------------------------------- 1 | """ Game fix Injustice 2 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | # Requires vcrun2019 to launch 9 | util.protontricks('vcrun2019_ge') 10 | 11 | -------------------------------------------------------------------------------- /gamefixes-Steam/63110.py: -------------------------------------------------------------------------------- 1 | """ Alter Ego 2 | Launcher crashes immediately without displaying any windows 3 | """ 4 | #pylint: disable=C0103 5 | 6 | from protonfixes import util, os 7 | 8 | def main(): 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 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | util.replace_command('NARUTO.exe', 'NARUTO/Binaries/Win64/NARUTO-Win64-Shipping.exe') 9 | util.append_argument('-eac-nop-loaded') 10 | 11 | util.protontricks('hidewineexports=enable') 12 | 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/63700.py: -------------------------------------------------------------------------------- 1 | """ Game fix for BIT.TRIP BEAT 2 | """ 3 | 4 | #pylint: disable=C0103 5 | 6 | from protonfixes import util 7 | 8 | def main(): 9 | util.protontricks('d3dcompiler_43') 10 | util.protontricks('d3dx9_43') 11 | -------------------------------------------------------------------------------- /gamefixes-Steam/63710.py: -------------------------------------------------------------------------------- 1 | """ Game fix for BIT.TRIP RUNNER 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ From: https://www.protondb.com/app/63710 9 | """ 10 | 11 | util.protontricks('d3dcompiler_43') 12 | util.protontricks('d3dx9_43') 13 | util.winedll_override('openal32', 'b') 14 | -------------------------------------------------------------------------------- /gamefixes-Steam/638160.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Moero Chronicle 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | util.protontricks('quartz_feb2010') 9 | util.protontricks('wmp11') 10 | util.protontricks('qasf') 11 | -------------------------------------------------------------------------------- /gamefixes-Steam/638970.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Yakuza 0 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Disable FSYNC 9 | """ 10 | 11 | # Disable fsync to fix saving issues 12 | util.disable_fsync() 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/65540.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Gothic 1 2 | """ 3 | #pylint: disable=C0103 4 | 5 | import os 6 | from protonfixes import util 7 | 8 | 9 | def main(): 10 | 11 | screen_width,screen_height = util.get_resolution() 12 | 13 | zVidResFullscreenX=str(screen_width) 14 | zVidResFullscreenY=str(screen_height) 15 | 16 | """ Modify Gothic.ini 17 | """ 18 | 19 | game_opts = """ 20 | [GAME] 21 | scaleVideos=1 22 | [VIDEO] 23 | zVidResFullscreenX=""" + zVidResFullscreenX + """ 24 | zVidResFullscreenY=""" + zVidResFullscreenY + """ 25 | zVidResFullscreenBPP=32 26 | """ 27 | 28 | util.set_ini_options(game_opts,'Gothic.ini','cp1251','game') 29 | 30 | # Fix the game getting locked on exit 31 | util.disable_fsync() 32 | -------------------------------------------------------------------------------- /gamefixes-Steam/65600.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Gothic 3 Forsaken Gods Enhanced Edition 2 | """ 3 | #pylint: disable=C0103 4 | 5 | import os 6 | from protonfixes import util 7 | 8 | def main(): 9 | """ Modify ge3.ini 10 | """ 11 | 12 | game_opts = """ 13 | [Engine.Setup] 14 | Timer.ThreadSafe=false 15 | FpS.Max=0 16 | """ 17 | 18 | util.set_ini_options(game_opts,os.path.join('Ini','ge3.ini'),'cp1251','game') -------------------------------------------------------------------------------- /gamefixes-Steam/65610.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Arkania 2 | """ 3 | 4 | # pylint: disable=C0103 5 | 6 | from protonfixes import util 7 | 8 | 9 | def main(): 10 | 11 | # This requires Proton 5.0 installed 12 | util.protontricks('wmp11') 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/658150.py: -------------------------------------------------------------------------------- 1 | """ Skeleton Boomerang 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | 8 | def main(): 9 | """ Fixes shader compilation error 10 | """ 11 | 12 | util.protontricks('d3dcompiler_43') 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/65930.py: -------------------------------------------------------------------------------- 1 | """ Game fix for The Bureau: XCOM Declassified 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Disables esync and fsync 9 | """ 10 | 11 | # https://github.com/ValveSoftware/Proton/issues/797#issuecomment-955180056 12 | util.disable_esync() 13 | util.disable_fsync() 14 | -------------------------------------------------------------------------------- /gamefixes-Steam/678950.py: -------------------------------------------------------------------------------- 1 | """ Game fix for DRAGON BALL FighterZ 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | util.replace_command('DBFighterZ.exe', 'RED/Binaries/Win64/RED-Win64-Shipping.exe') 9 | util.append_argument('-eac-nop-loaded') 10 | 11 | util.protontricks('hidewineexports=enable') 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/700600.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Evil Genius 2 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Launcher workaround 9 | """ 10 | 11 | # Fixes the startup process. 12 | util.replace_command('eg2.exe', '../bin/evilgenius_vulkan.exe') 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/702050.py: -------------------------------------------------------------------------------- 1 | """ Game fix for The Song of Saya 2 | """ 3 | 4 | from protonfixes import util 5 | 6 | def main(): 7 | """ Disable esync and fsync 8 | """ 9 | 10 | # Fixes random crashing during gameplay 11 | util.disable_esync() 12 | util.disable_fsync() 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/70400.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Recettear: An Item Shop's Tale 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Install directsound libraries 9 | """ 10 | 11 | util.protontricks('dmime') 12 | util.protontricks('dmloader') 13 | util.protontricks('dmsynth') 14 | util.protontricks('dmusic') 15 | util.protontricks('dsound') 16 | util.protontricks('dswave') 17 | util.winedll_override('streamci', 'n') 18 | util.protontricks('sound=alsa') 19 | 20 | """ Fix for audio stutter/desync 21 | """ 22 | util.set_environment('PULSE_LATENCY_MSEC', '60') 23 | -------------------------------------------------------------------------------- /gamefixes-Steam/70420.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Chantelise - A Tale of Two Sisters 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Install directsound libraries 9 | """ 10 | 11 | util.protontricks('dmime') 12 | util.protontricks('dmloader') 13 | util.protontricks('dmsynth') 14 | util.protontricks('dmusic') 15 | util.protontricks('dsound') 16 | util.protontricks('dswave') 17 | util.winedll_override('streamci', 'n') 18 | util.protontricks('sound=alsa') 19 | 20 | """ Fix for audio stutter/desync 21 | """ 22 | util.set_environment('PULSE_LATENCY_MSEC', '60') 23 | -------------------------------------------------------------------------------- /gamefixes-Steam/72850.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Skyrim 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | import subprocess 7 | import os 8 | 9 | def main(): 10 | """ Run script extender if it exists. 11 | """ 12 | 13 | # Fixes the startup process. 14 | if os.path.isfile(os.path.join(os.getcwd(), 'skse_loader.exe')): 15 | if 'MODS' in os.environ: 16 | util.replace_command('SkyrimLauncher.exe', 'skse_loader.exe') 17 | 18 | -------------------------------------------------------------------------------- /gamefixes-Steam/729040.py: -------------------------------------------------------------------------------- 1 | """ Borderlands GOTY 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ 9 | """ 10 | 11 | util.replace_command('Launcher.exe', 'BorderlandsGOTY.exe') -------------------------------------------------------------------------------- /gamefixes-Steam/730830.py: -------------------------------------------------------------------------------- 1 | """ Escape From Monkey Island 2 | dgvoodoo2 to force anti-aliasing and higher resolution 3 | """ 4 | #pylint: disable=C0103 5 | 6 | from protonfixes import util 7 | 8 | def main(): 9 | util.protontricks('dgvoodoo2') 10 | -------------------------------------------------------------------------------- /gamefixes-Steam/73170.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Darkest Hour: A Hearts of Iron Game 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Set virtual desktop 9 | """ 10 | 11 | # https://github.com/ValveSoftware/Proton/issues/3338 12 | util.protontricks('vd=1280x720') 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/750920.py: -------------------------------------------------------------------------------- 1 | """ Shadow of the Tomb Raider 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Requires media foundation dlls 9 | """ 10 | 11 | util.protontricks('d3dcompiler_47') 12 | 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/773370.py: -------------------------------------------------------------------------------- 1 | """ Exo One 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Requires d3dcompiler_47 9 | """ 10 | 11 | util.protontricks('d3dcompiler_47') 12 | 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/78000.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Bejeweled 3 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ game needs d3dcompiler_43 for dx10 mode, but still does not work. disabling dx10 mode allows dx9 mode to work with dxvk 9 | """ 10 | util.set_environment('PROTON_NO_D3D10', '1') 11 | -------------------------------------------------------------------------------- /gamefixes-Steam/782330.py: -------------------------------------------------------------------------------- 1 | """ DOOM Eternal 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Requires seccomp 9 | """ 10 | 11 | util.use_seccomp() 12 | util.append_argument('+com_skipSignInManager 1') 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/7850.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Cryostasis 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Uses physx 9 | """ 10 | 11 | util.protontricks('physx') 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/812140.py: -------------------------------------------------------------------------------- 1 | """ Assassin's Creed: Odyssey 2 | """ 3 | import os 4 | from protonfixes import util 5 | 6 | def main(): 7 | """ disable Easy Anti-Cheat and online play, disable uplay overlay and change closebehavior 8 | """ 9 | 10 | uplayconfigpath = os.path.join(util.protonprefix(), 'drive_c/users/steamuser/Local Settings/Application Data/Ubisoft Game Launcher') 11 | if not os.path.exists(uplayconfigpath): 12 | os.makedirs(uplayconfigpath) 13 | uplayconfigfile = os.path.join(uplayconfigpath, 'settings.yml') 14 | if not os.path.isfile(uplayconfigfile): 15 | f = open(uplayconfigfile,"w+") 16 | f.write("overlay:\n enabled: false\n fps_enabled: false\n warning_enabled: false\nuser:\n closebehavior: CloseBehavior_Close\n landingpage: LandingPageLastPlayedGame\n") 17 | f.close 18 | # Replace launcher with game exe in proton arguments 19 | util.append_argument('-eac_launcher -nosplash') 20 | -------------------------------------------------------------------------------- /gamefixes-Steam/813780.py: -------------------------------------------------------------------------------- 1 | """ Game fix Age of Empires II: DE 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | # Requires vcrun2019 to launch 9 | util.protontricks('vcrun2019_ge') 10 | 11 | -------------------------------------------------------------------------------- /gamefixes-Steam/816020.py: -------------------------------------------------------------------------------- 1 | """ Game fix for JUMP FORCE 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | util.replace_command('JUMP_FORCE.exe', 'JUMP_FORCE/Binaries/Win64/JUMP_FORCE-Win64-Shipping.exe') 9 | util.append_argument('-eac-nop-loaded') 10 | 11 | util.protontricks('hidewineexports=enable') 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/8190.py: -------------------------------------------------------------------------------- 1 | """ Just Cause 2 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Requires seccomp 9 | """ 10 | 11 | util.protontricks('d3dcompiler_43') 12 | util.protontricks('d3dcompiler_47') 13 | util.protontricks('d3dx10') 14 | util.append_argument('-borderless') 15 | 16 | -------------------------------------------------------------------------------- /gamefixes-Steam/834530.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Yakuza Kiwami 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Disable FSYNC 9 | """ 10 | 11 | # Disable fsync to fix saving issues and hang on exit 12 | util.disable_fsync() 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/893180.py: -------------------------------------------------------------------------------- 1 | """ Game fix Catherine Classic 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ 9 | """ 10 | util.protontricks('d3dcompiler_43') 11 | util.protontricks('d3dcompiler_47') 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/895870.py: -------------------------------------------------------------------------------- 1 | """ Project Wingman 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Requires d3dcompiler_47 9 | """ 10 | 11 | util.protontricks('d3dcompiler_47') 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/906510.py: -------------------------------------------------------------------------------- 1 | 2 | """ Game fix for Conception PLUS: Maidens of the Twelve Stars 3 | """ 4 | #pylint: disable=C0103 5 | 6 | from protonfixes import util 7 | 8 | def main(): 9 | """ installs d3dcompiler_47 10 | """ 11 | 12 | # https://github.com/ValveSoftware/Proton/issues/3493#issuecomment-1521636321 13 | util.protontricks('d3dcompiler_47') 14 | -------------------------------------------------------------------------------- /gamefixes-Steam/910830.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Rebel Galaxy Outlaw 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ installs mfc42 9 | """ 10 | 11 | # https://github.com/ValveSoftware/Proton/issues/4216 12 | util.protontricks('mfc42') 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/913740.py: -------------------------------------------------------------------------------- 1 | """ Game fix for WORLD OF HORROR 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Disable esync 9 | """ 10 | 11 | # esync causes occasional crashing 12 | util.disable_esync() 13 | -------------------------------------------------------------------------------- /gamefixes-Steam/952060.py: -------------------------------------------------------------------------------- 1 | """ Resident Evil 3 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ Requires seccomp 9 | """ 10 | 11 | util.use_seccomp() 12 | -------------------------------------------------------------------------------- /gamefixes-Steam/968370.py: -------------------------------------------------------------------------------- 1 | """ The Blind Prophet 2 | garbled fonts & No cursive font (Segoe Script) 3 | """ 4 | #pylint: disable=C0103 5 | 6 | from protonfixes import util 7 | 8 | def main(): 9 | util.winedll_override('d3d9', 'd') 10 | util.protontricks('segoe_script') 11 | -------------------------------------------------------------------------------- /gamefixes-Steam/976310.py: -------------------------------------------------------------------------------- 1 | """ Game fix Mortal Kombat 11 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | # Requires vcrun2019 to launch 9 | util.protontricks('vcrun2019_ge') 10 | 11 | -------------------------------------------------------------------------------- /gamefixes-Steam/976730.py: -------------------------------------------------------------------------------- 1 | """ Game fix Halo:MCC 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | # Requires vcrun2019 to launch 9 | util.protontricks('vcrun2019_ge') 10 | -------------------------------------------------------------------------------- /gamefixes-Steam/9900.py: -------------------------------------------------------------------------------- 1 | """ Game fix for Star Trek Online launcher 2 | """ 3 | #pylint: disable=C0103 4 | from protonfixes import util 5 | 6 | def main(): 7 | """ Ensure d3dcompiler_47 is installed so the launcher window content is visible 8 | """ 9 | util.protontricks('d3dcompiler_47') 10 | -------------------------------------------------------------------------------- /gamefixes-Steam/99300.py: -------------------------------------------------------------------------------- 1 | """ Game fix Renegade Ops 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | """ This fixed the black screen issue 9 | """ 10 | util.protontricks('d3dcompiler_47') 11 | -------------------------------------------------------------------------------- /gamefixes-Steam/997070.py: -------------------------------------------------------------------------------- 1 | """ Game fix Marvel's Avengers 2 | """ 3 | #pylint: disable=C0103 4 | 5 | from protonfixes import util 6 | 7 | def main(): 8 | # Requires vcrun2019 to launch 9 | util.protontricks('vcrun2019_ge') 10 | util.protontricks('d3dcompiler_47') 11 | -------------------------------------------------------------------------------- /gamefixes-Steam/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GloriousEggroll/protonfixes/d132b7b157257a62b000e3df0c578548ee3f4db8/gamefixes-Steam/__init__.py -------------------------------------------------------------------------------- /gamefixes-Steam/default.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from protonfixes import util 3 | 4 | def main(): 5 | """ global defaults 6 | """ 7 | 8 | # Steam commandline 9 | def use_steam_commands(): 10 | """ Parse aliases from Steam launch options 11 | """ 12 | pf_alias_list = list(filter(lambda item: '-pf_' in item, sys.argv)) 13 | 14 | for pf_alias in pf_alias_list: 15 | sys.argv.remove(pf_alias) 16 | if pf_alias == '-pf_winecfg': 17 | util.winecfg() 18 | elif pf_alias == '-pf_regedit': 19 | util.regedit() 20 | elif pf_alias.split('=')[0] == '-pf_tricks': 21 | param = str(pf_alias.replace('-pf_tricks=', '')) 22 | util.protontricks(param) 23 | elif pf_alias.split('=')[0] == '-pf_dxvk_set': 24 | param = str(pf_alias.replace('-pf_dxvk_set=', '')) 25 | dxvk_opt = param.split('=') 26 | util.set_dxvk_option(str(dxvk_opt[0]), str(dxvk_opt[1])) 27 | 28 | use_steam_commands() 29 | -------------------------------------------------------------------------------- /gamefixes-ULWGL/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GloriousEggroll/protonfixes/d132b7b157257a62b000e3df0c578548ee3f4db8/gamefixes-ULWGL/__init__.py -------------------------------------------------------------------------------- /gamefixes-ULWGL/default.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from protonfixes import util 3 | 4 | def main(): 5 | """ global defaults 6 | """ 7 | -------------------------------------------------------------------------------- /gamefixes-Ubisoft/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GloriousEggroll/protonfixes/d132b7b157257a62b000e3df0c578548ee3f4db8/gamefixes-Ubisoft/__init__.py -------------------------------------------------------------------------------- /libmspack.so.0: -------------------------------------------------------------------------------- 1 | libmspack.so.0.1.0 -------------------------------------------------------------------------------- /libmspack.so.0.1.0: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GloriousEggroll/protonfixes/d132b7b157257a62b000e3df0c578548ee3f4db8/libmspack.so.0.1.0 -------------------------------------------------------------------------------- /libmspack_0.10.1-1.debian.tar.xz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GloriousEggroll/protonfixes/d132b7b157257a62b000e3df0c578548ee3f4db8/libmspack_0.10.1-1.debian.tar.xz -------------------------------------------------------------------------------- /logger.py: -------------------------------------------------------------------------------- 1 | """ Simple logging to stdout the same way Proton does 2 | """ 3 | 4 | import io 5 | import os 6 | import sys 7 | 8 | class Log(): 9 | """Log to stderr for steam dumps 10 | """ 11 | 12 | def __init__(self): 13 | self.pfx = 'ProtonFixes[' + str(os.getpid()) + '] ' 14 | self.colors = { 15 | 'RESET': '\u001b[0m', 16 | 'INFO': '\u001b[34m', 17 | 'WARN': '\u001b[33m', 18 | 'CRIT': '\u001b[31m', 19 | 'DEBUG': '\u001b[35m' 20 | } 21 | 22 | def __call__(self, msg): 23 | """ Allows the Log instance to be called directly 24 | """ 25 | 26 | self.log(msg) 27 | 28 | def log(self, msg='', level='INFO'): 29 | """ Prints the log message to stdout the same way as Proton 30 | """ 31 | 32 | pfx = self.pfx + level + ': ' 33 | color = self.colors[level] 34 | reset = self.colors['RESET'] 35 | logtext = pfx + str(msg) + os.linesep 36 | fulltext = color + pfx + str(msg) + reset + os.linesep 37 | sys.stderr.write(fulltext) 38 | sys.stderr.flush() 39 | with io.open('/tmp/test', 'a', 1, encoding='utf-8') as testfile: 40 | testfile.write(logtext) 41 | 42 | 43 | def info(self, msg): 44 | """ Wrapper for printing info messages 45 | """ 46 | 47 | self.log(msg, 'INFO') 48 | 49 | def warn(self, msg): 50 | """ Wrapper for printing warning messages 51 | """ 52 | 53 | self.log(msg, 'WARN') 54 | 55 | def crit(self, msg): 56 | """ Wrapper for printing critical messages 57 | """ 58 | 59 | self.log(msg, 'CRIT') 60 | 61 | def debug(self, msg): 62 | """ Wrapper for printing debug messages 63 | """ 64 | 65 | if 'DEBUG' in os.environ: 66 | self.log(msg, 'DEBUG') 67 | 68 | 69 | log = Log() #pylint: disable=C0103 70 | -------------------------------------------------------------------------------- /steamhelper.py: -------------------------------------------------------------------------------- 1 | import os 2 | import re 3 | import shutil 4 | import subprocess 5 | import time 6 | 7 | libpaths = [] 8 | REGEX_LIB = re.compile(r'"path"\s*"(?P(.*))"') 9 | REGEX_STATE = re.compile(r'"StateFlags"\s*"(?P(\d))"') 10 | 11 | def install_app(appid, delay=1): 12 | """Wait for the installation of an appid 13 | """ 14 | _install_steam_appid(appid) 15 | while not(_is_app_installed(appid)): 16 | time.sleep(delay) 17 | 18 | def _install_steam_appid(appid): 19 | """ Call steam URL 20 | """ 21 | install_url = "steam://install/"+str(appid) 22 | if shutil.which("xdg-open"): 23 | subprocess.call(["xdg-open", install_url]) 24 | elif shutil.which("gvfs-open"): 25 | subprocess.call(["gvfs-open", install_url]) 26 | elif shutil.which("gnome-open"): 27 | subprocess.call(["gnome-open", install_url]) 28 | elif shutil.which("kde-open"): 29 | subprocess.call(["kde-open", install_url]) 30 | elif shutil.which("exo-open"): 31 | subprocess.call(["exo-open", install_url]) 32 | 33 | def _is_app_installed(appid): 34 | """Check if app is installed 35 | """ 36 | libraries_path = _get_steam_libraries_path() 37 | 38 | # bypass no library path 39 | if len(libraries_path) == 0: 40 | return True 41 | 42 | is_installed = False 43 | for librarypath in libraries_path: 44 | appmanifest_path = _get_manifest_path(appid, librarypath) 45 | if os.path.exists(appmanifest_path): 46 | state = _find_regex_groups(appmanifest_path, REGEX_STATE, 'state') 47 | if(len(state)>0 and int(state[0])==4): 48 | is_installed = True 49 | break 50 | return is_installed 51 | 52 | def _get_steam_libraries_path(): 53 | """Get Steam Libraries Path 54 | """ 55 | STEAM_DIRS = [ 56 | "~/.steam/root", 57 | "~/.steam/debian-installation", 58 | "~/.local/share/Steam", 59 | "~/.steam/steam" 60 | ] 61 | 62 | global libpaths 63 | if len(libpaths) == 0: 64 | for steampath in STEAM_DIRS: 65 | libfile = os.path.join(os.path.expanduser(steampath),"steamapps","libraryfolders.vdf") 66 | if os.path.exists(libfile): 67 | libpaths = _find_regex_groups(libfile, REGEX_LIB, 'path') 68 | break 69 | return libpaths 70 | 71 | 72 | def _get_manifest_path(appid, librarypath): 73 | """Get appmanifest path 74 | """ 75 | return os.path.join(librarypath, "steamapps", "appmanifest_"+str(appid)+".acf") 76 | 77 | def _find_regex_groups(path, regex, groupname): 78 | """ Given a file and a regex with a named group groupname, return an 79 | array of all the matches 80 | """ 81 | matches = [] 82 | with open(path) as re_file: 83 | for line in re_file: 84 | search = regex.search(line) 85 | if search: 86 | matches.append(search.group(groupname)) 87 | return matches 88 | -------------------------------------------------------------------------------- /util.py: -------------------------------------------------------------------------------- 1 | """ Utilities to make gamefixes easier 2 | """ 3 | 4 | import configparser 5 | import os 6 | import sys 7 | import re 8 | import shutil 9 | import signal 10 | import tarfile 11 | import zipfile 12 | import subprocess 13 | import urllib.request 14 | import functools 15 | from .logger import log 16 | from .steamhelper import install_app 17 | from . import config 18 | 19 | try: 20 | import __main__ as protonmain 21 | except ImportError: 22 | log.warn('Unable to hook into Proton main script environment') 23 | 24 | # pylint: disable=unreachable 25 | 26 | def which(appname): 27 | """ Returns the full path of an executable in $PATH 28 | """ 29 | 30 | for path in os.environ['PATH'].split(os.pathsep): 31 | fullpath = os.path.join(path, appname) 32 | if os.path.exists(fullpath) and os.access(fullpath, os.X_OK): 33 | return fullpath 34 | log.warn(str(appname) + 'not found in $PATH') 35 | return None 36 | 37 | 38 | def protondir(): 39 | """ Returns the path to proton 40 | """ 41 | 42 | proton_dir = os.path.dirname(sys.argv[0]) 43 | return proton_dir 44 | 45 | 46 | def protonprefix(): 47 | """ Returns the wineprefix used by proton 48 | """ 49 | 50 | return os.path.join( 51 | os.environ['STEAM_COMPAT_DATA_PATH'], 52 | 'pfx/') 53 | 54 | 55 | def protonnameversion(): 56 | """ Returns the version of proton from sys.argv[0] 57 | """ 58 | 59 | version = re.search('Proton ([0-9]*\\.[0-9]*)', sys.argv[0]) 60 | if version: 61 | return version.group(1) 62 | log.warn('Proton version not parsed from command line') 63 | return None 64 | 65 | 66 | def protontimeversion(): 67 | """ Returns the version timestamp of proton from the `version` file 68 | """ 69 | 70 | fullpath = os.path.join(protondir(), 'version') 71 | try: 72 | with open(fullpath, 'r') as version: 73 | for timestamp in version.readlines(): 74 | return int(timestamp.strip()) 75 | except OSError: 76 | log.warn('Proton version file not found in: ' + fullpath) 77 | return 0 78 | log.warn('Proton version not parsed from file: ' + fullpath) 79 | return 0 80 | 81 | 82 | def protonversion(timestamp=False): 83 | """ Returns the version of proton 84 | """ 85 | 86 | if timestamp: 87 | return protontimeversion() 88 | return protonnameversion() 89 | 90 | def once(func=None, retry=None): 91 | """ Decorator to use on functions which should only run once in a prefix. 92 | Error handling: 93 | By default, when an exception occurs in the decorated function, the 94 | function is not run again. To change that behavior, set retry to True. 95 | In that case, when an exception occurs during the decorated function, 96 | the function will be run again the next time the game is started, until 97 | the function is run successfully. 98 | Implementation: 99 | Uses a file (one per function) in PROTONPREFIX/drive_c/protonfixes/run/ 100 | to track if a function has already been run in this prefix. 101 | """ 102 | if func is None: 103 | return functools.partial(once, retry=retry) 104 | retry = retry if retry else False 105 | 106 | #pylint: disable=missing-docstring 107 | def wrapper(*args, **kwargs): 108 | func_id = func.__module__ + "." + func.__name__ 109 | prefix = protonprefix() 110 | directory = os.path.join(prefix, "drive_c/protonfixes/run/") 111 | file = os.path.join(directory, func_id) 112 | if not os.path.exists(directory): 113 | os.makedirs(directory) 114 | if os.path.exists(file): 115 | return 116 | 117 | exception = None 118 | try: 119 | func(*args, **kwargs) 120 | except Exception as exc: #pylint: disable=broad-except 121 | if retry: 122 | raise exc 123 | exception = exc 124 | 125 | open(file, 'a').close() 126 | 127 | if exception: 128 | raise exception #pylint: disable=raising-bad-type 129 | 130 | return 131 | return wrapper 132 | 133 | 134 | def _killhanging(): 135 | """ Kills processes that hang when installing winetricks 136 | """ 137 | 138 | # avoiding an external library as proc should be available on linux 139 | log.debug('Killing hanging wine processes') 140 | pids = [pid for pid in os.listdir('/proc') if pid.isdigit()] 141 | badexes = ['mscorsvw.exe'] 142 | for pid in pids: 143 | try: 144 | with open(os.path.join('/proc', pid, 'cmdline'), 'rb') as proc_cmd: 145 | cmdline = proc_cmd.read() 146 | for exe in badexes: 147 | if exe in cmdline.decode(): 148 | os.kill(int(pid), signal.SIGKILL) 149 | except IOError: 150 | continue 151 | 152 | def _forceinstalled(verb): 153 | """ Records verb into the winetricks.log.forced file 154 | """ 155 | forced_log = os.path.join(protonprefix(), 'winetricks.log.forced') 156 | with open(forced_log, 'a') as forcedlog: 157 | forcedlog.write(verb + '\n') 158 | 159 | 160 | def _checkinstalled(verb, logfile='winetricks.log'): 161 | """ Returns True if the winetricks verb is found in the winetricks log 162 | """ 163 | 164 | if not isinstance(verb, str): 165 | return False 166 | 167 | winetricks_log = os.path.join(protonprefix(), logfile) 168 | 169 | # Check for 'verb=param' verb types 170 | if len(verb.split('=')) > 1: 171 | wt_verb = verb.split('=')[0] + '=' 172 | wt_verb_param = verb.split('=')[1] 173 | wt_is_set = False 174 | try: 175 | with open(winetricks_log, 'r') as tricklog: 176 | for xline in tricklog.readlines(): 177 | if re.findall(r'^' + wt_verb, xline.strip()): 178 | wt_is_set = bool(xline.strip() == wt_verb + wt_verb_param) 179 | return wt_is_set 180 | except OSError: 181 | return False 182 | # Check for regular verbs 183 | try: 184 | with open(winetricks_log, 'r') as tricklog: 185 | if verb in reversed([x.strip() for x in tricklog.readlines()]): 186 | return True 187 | except OSError: 188 | return False 189 | return False 190 | 191 | 192 | def checkinstalled(verb): 193 | """ Returns True if the winetricks verb is found in the winetricks log 194 | or in the 'winetricks.log.forced' file 195 | """ 196 | 197 | log.info('Checking if winetricks ' + verb + ' is installed') 198 | if _checkinstalled(verb, 'winetricks.log.forced'): 199 | return True 200 | return _checkinstalled(verb) 201 | 202 | 203 | def is_custom_verb(verb): 204 | """ Returns path to custom winetricks verb, if found 205 | """ 206 | 207 | verb_name = verb + '.verb' 208 | verb_dir = 'verbs' 209 | 210 | # check local custom verbs 211 | verbpath = os.path.expanduser('~/.config/protonfixes/localfixes/' + verb_dir) 212 | if os.path.isfile(os.path.join(verbpath, verb_name)): 213 | log.debug('Using local custom winetricks verb from: ' + verbpath) 214 | return os.path.join(verbpath, verb_name) 215 | 216 | # check custom verbs 217 | verbpath = os.path.join(os.path.dirname(__file__), verb_dir) 218 | if os.path.isfile(os.path.join(verbpath, verb_name)): 219 | log.debug('Using custom winetricks verb from: ' + verbpath) 220 | return os.path.join(verbpath, verb_name) 221 | 222 | return False 223 | 224 | 225 | def protontricks(verb): 226 | """ Runs winetricks if available 227 | """ 228 | 229 | if not checkinstalled(verb): 230 | log.info('Installing winetricks ' + verb) 231 | env = dict(protonmain.g_session.env) 232 | env['WINEPREFIX'] = protonprefix() 233 | env['WINE'] = protonmain.g_proton.wine_bin 234 | env['WINELOADER'] = protonmain.g_proton.wine_bin 235 | env['WINESERVER'] = protonmain.g_proton.wineserver_bin 236 | env['WINETRICKS_LATEST_VERSION_CHECK'] = 'disabled' 237 | env['LD_PRELOAD'] = '' 238 | 239 | winetricks_bin = os.path.abspath(__file__).replace('util.py','winetricks') 240 | winetricks_cmd = [winetricks_bin, '--unattended'] + verb.split(' ') 241 | 242 | # check is verb a custom winetricks verb 243 | custom_verb = is_custom_verb(verb) 244 | if custom_verb: 245 | winetricks_cmd = [winetricks_bin, '--unattended', custom_verb] 246 | 247 | if winetricks_bin is None: 248 | log.warn('No winetricks was found in $PATH') 249 | 250 | if winetricks_bin is not None: 251 | 252 | log.debug('Using winetricks command: ' + str(winetricks_cmd)) 253 | 254 | # make sure proton waits for winetricks to finish 255 | for idx, arg in enumerate(sys.argv): 256 | if 'waitforexitandrun' not in arg: 257 | sys.argv[idx] = arg.replace('run', 'waitforexitandrun') 258 | log.debug(str(sys.argv)) 259 | 260 | log.info('Using winetricks verb ' + verb) 261 | subprocess.call([env['WINESERVER'], '-w'], env=env) 262 | process = subprocess.Popen(winetricks_cmd, env=env) 263 | process.wait() 264 | _killhanging() 265 | 266 | # Check if verb recorded to winetricks log 267 | if not checkinstalled(verb): 268 | log.warn('Not recorded as installed: winetricks ' + verb + ', forcing!') 269 | _forceinstalled(verb) 270 | 271 | log.info('Winetricks complete') 272 | return True 273 | 274 | return False 275 | 276 | def protontricks_proton_5(verb): 277 | """ Runs winetricks with Proton 5 which is still useful to install some things like .NET""" 278 | if checkinstalled(verb): 279 | log.debug("Skipping {} as it is marked as installed".format(verb)) 280 | return 281 | 282 | prefix_path = protonprefix() 283 | try: 284 | log.info("Removing the prefix at {} to recreate it with Proton 5".format(prefix_path)) 285 | shutil.rmtree(prefix_path) 286 | except FileNotFoundError: 287 | log.warn('The protonprefix folder was not found') 288 | 289 | log.info('Folder Proton 5.0' + str(os.path.join(os.environ['STEAM_COMPAT_DATA_PATH'],'..','..','common','Proton 5.0'))) 290 | 291 | wine_path = os.path.join(os.environ['STEAM_COMPAT_DATA_PATH'],'..','..','common','Proton 5.0','dist','bin','wine') 292 | # If this is being used to install Dotnet for example and it doesn't exist, failing silently might not be enough 293 | if not os.path.exists(wine_path): 294 | message = "Ensure Proton 5.0 is installed. No Proton 5.0 was found at the expected path at {}".format(wine_path) 295 | try_show_gui_error(message) 296 | raise Exception(message) 297 | 298 | env = dict(protonmain.g_session.env) 299 | env['WINEPREFIX'] = prefix_path 300 | env['WINE'] = wine_path 301 | env['WINELOADER'] = os.path.join(os.environ['STEAM_COMPAT_DATA_PATH'],'..','..','common','Proton 5.0','dist','bin','wine') 302 | env['WINESERVER'] = os.path.join(os.environ['STEAM_COMPAT_DATA_PATH'],'..','..','common','Proton 5.0','dist','bin','wineserver') 303 | env['WINEPATH'] = os.path.join(os.environ['STEAM_COMPAT_DATA_PATH'],'..','..','common','Proton 5.0','dist','bin','wine64') 304 | env['WINETRICKS_LATEST_VERSION_CHECK'] = 'disabled' 305 | env['LD_PRELOAD'] = '' 306 | # The reason for the separate Winetricks is newer Winetricks with Proton 5.0 seems to result 307 | # in the `winecfg` window popping up and things not getting done. 308 | winetricks_bin = os.path.abspath(__file__).replace('util.py','winetricks_proton5') 309 | winetricks_cmd = [winetricks_bin, '--unattended', '--force'] + verb.split(' ') 310 | 311 | 312 | process = subprocess.Popen(winetricks_cmd, env=env) 313 | process.wait() 314 | 315 | def regedit_add(folder,name=None,type=None,value=None,arch=None): 316 | """ Add regedit keys 317 | """ 318 | 319 | env = dict(protonmain.g_session.env) 320 | env['WINEPREFIX'] = protonprefix() 321 | env['WINE'] = protonmain.g_proton.wine_bin 322 | env['WINELOADER'] = protonmain.g_proton.wine_bin 323 | env['WINESERVER'] = protonmain.g_proton.wineserver_bin 324 | 325 | if name is not None and type is not None and value is not None: 326 | 327 | # Flag for if we want to force writing to the 64-bit registry sector 328 | if arch is not None: 329 | regedit_cmd = ['wine', 'reg' , 'add', folder, '/f', '/v', name, '/t', type, '/d', value, '/reg:64'] 330 | else: 331 | regedit_cmd = ['wine', 'reg' , 'add', folder, '/f', '/v', name, '/t', type, '/d', value] 332 | 333 | log.info('Adding key: ' + folder) 334 | 335 | else: 336 | 337 | # Flag for if we want to force writing to the 64-bit registry sector 338 | # We use name here because without the other flags we can't use the arch flag 339 | if name is not None: 340 | regedit_cmd = ['wine', 'reg' , 'add', folder, '/f', '/reg:64'] 341 | else: 342 | regedit_cmd = ['wine', 'reg' , 'add', folder, '/f'] 343 | 344 | log.info('Adding key: ' + folder) 345 | 346 | process = subprocess.Popen(regedit_cmd, env=env) 347 | process.wait() 348 | 349 | def replace_command(orig_str, repl_str): 350 | """ Make a commandline replacement in sys.argv 351 | """ 352 | 353 | log.info('Changing ' + orig_str + ' to ' + repl_str) 354 | for idx, arg in enumerate(sys.argv): 355 | if orig_str in arg: 356 | sys.argv[idx] = arg.replace(orig_str, repl_str) 357 | 358 | def append_argument(argument): 359 | """ Append an argument to sys.argv 360 | """ 361 | 362 | log.info('Adding argument ' + argument) 363 | sys.argv.append(argument) 364 | log.debug('New commandline: ' + str(sys.argv)) 365 | 366 | def set_environment(envvar, value): 367 | """ Add or override an environment value 368 | """ 369 | 370 | log.info('Adding env: ' + envvar + '=' + value) 371 | os.environ[envvar] = value 372 | protonmain.g_session.env[envvar] = value 373 | 374 | def del_environment(envvar): 375 | """ Remove an environment variable 376 | """ 377 | 378 | log.info('Removing env: ' + envvar) 379 | if envvar in os.environ: 380 | del os.environ[envvar] 381 | if envvar in protonmain.g_session.env: 382 | del protonmain.g_session.env[envvar] 383 | 384 | def get_game_install_path(): 385 | """ Game installation path 386 | """ 387 | 388 | log.debug('Detected path to game: ' + os.environ['PWD']) 389 | # only for `waitforexitandrun` command 390 | return os.environ['PWD'] 391 | 392 | def winedll_override(dll, dtype): 393 | """ Add WINE dll override 394 | """ 395 | 396 | log.info('Overriding ' + dll + '.dll = ' + dtype) 397 | protonmain.g_session.dlloverrides[dll] = dtype 398 | 399 | def disable_nvapi(): 400 | """ Disable WINE nv* dlls 401 | """ 402 | 403 | log.info('Disabling NvAPI') 404 | winedll_override('nvapi', '') 405 | winedll_override('nvapi64', '') 406 | winedll_override('nvcuda', '') 407 | winedll_override('nvcuvid', '') 408 | winedll_override('nvencodeapi', '') 409 | winedll_override('nvencodeapi64', '') 410 | 411 | def disable_dxvk(): # pylint: disable=missing-docstring 412 | set_environment('PROTON_USE_WINED3D', '1') 413 | 414 | def disable_esync(): # pylint: disable=missing-docstring 415 | set_environment('PROTON_NO_ESYNC', '1') 416 | 417 | def disable_fsync(): # pylint: disable=missing-docstring 418 | set_environment('PROTON_NO_FSYNC', '1') 419 | 420 | def disable_protonaudioconverter(): # pylint: disable=missing-docstring 421 | set_environment('GST_PLUGIN_FEATURE_RANK', 'protonaudioconverterbin:NONE') 422 | 423 | def use_seccomp(): # pylint: disable=missing-docstring 424 | set_environment('PROTON_USE_SECCOMP', '1') 425 | 426 | @once 427 | def disable_uplay_overlay(): 428 | """Disables the UPlay in-game overlay. 429 | Creates or appends the UPlay settings.yml file 430 | with the correct setting to disable the overlay. 431 | UPlay will overwrite settings.yml on launch, but keep 432 | this setting. 433 | """ 434 | config_dir = os.path.join( 435 | protonprefix(), 436 | 'drive_c/users/steamuser/Local Settings/Application Data/Ubisoft Game Launcher/' 437 | ) 438 | 439 | if not os.path.exists(config_dir): 440 | os.makedirs(config_dir) 441 | 442 | config_file = os.path.join(config_dir, 'settings.yml') 443 | 444 | if not os.path.isdir(config_dir): 445 | log.warn( 446 | 'Could not disable UPlay overlay: "' 447 | + config_dir 448 | + '" does not exist or is not a directory.' 449 | ) 450 | return 451 | 452 | if not os.path.isfile(config_file): 453 | f = open(config_file,"w+") 454 | f.write("\noverlay:\n enabled: false\n forceunhookgame: false\n fps_enabled: false\n warning_enabled: false\n") 455 | f.close 456 | log.info('Disabled UPlay overlay') 457 | else: 458 | try: 459 | with open(config_file, 'a+') as file: 460 | file.write("\noverlay:\n enabled: false\n forceunhookgame: false\n fps_enabled: false\n warning_enabled: false\n") 461 | log.info('Disabled UPlay overlay') 462 | return 463 | except OSError as err: 464 | log.warn('Could not disable UPlay overlay: ' + err.strerror) 465 | 466 | def create_dosbox_conf(conf_file, conf_dict): 467 | """Create DOSBox configuration file. 468 | 469 | DOSBox accepts multiple configuration files passed with -conf 470 | option;, each subsequent one overwrites settings defined in 471 | previous files. 472 | """ 473 | if os.access(conf_file, os.F_OK): 474 | return 475 | conf = configparser.ConfigParser() 476 | conf.read_dict(conf_dict) 477 | with open(conf_file, 'w') as file: 478 | conf.write(file) 479 | 480 | 481 | def _get_config_full_path(cfile, base_path): 482 | """ Find game's config file 483 | """ 484 | 485 | # Start from 'user'/'game' directories or absolute path 486 | if base_path == 'user': 487 | cfg_path = os.path.join(protonprefix(), 'drive_c/users/steamuser/My Documents', cfile) 488 | else: 489 | if base_path == 'game': 490 | cfg_path = os.path.join(get_game_install_path(), cfile) 491 | else: 492 | cfg_path = cfile 493 | 494 | if os.path.exists(cfg_path) and os.access(cfg_path, os.F_OK): 495 | log.debug('Found config file: ' + cfg_path) 496 | return cfg_path 497 | 498 | log.warn('Config file not found: ' + cfg_path) 499 | return False 500 | 501 | def create_backup_config(cfg_path): 502 | """ Create backup config file 503 | """ 504 | 505 | # Backup 506 | if not os.path.exists(cfg_path + '.protonfixes.bak'): 507 | log.info('Creating backup for config file') 508 | shutil.copyfile(cfg_path, cfg_path + '.protonfixes.bak') 509 | 510 | def set_ini_options(ini_opts, cfile, encoding, base_path='user'): 511 | """ Edit game's INI config file 512 | """ 513 | cfg_path = _get_config_full_path(cfile, base_path) 514 | if not cfg_path: 515 | return False 516 | 517 | create_backup_config(cfg_path) 518 | 519 | # set options 520 | conf = configparser.ConfigParser(empty_lines_in_values=True, allow_no_value=True, strict=False) 521 | conf.optionxform = str 522 | 523 | conf.read(cfg_path,encoding) 524 | 525 | log.info('Addinging INI options into '+cfile+':\n'+ str(ini_opts)) 526 | conf.read_string(ini_opts) 527 | 528 | with open(cfg_path, 'w') as configfile: 529 | conf.write(configfile) 530 | return True 531 | 532 | def set_xml_options(base_attibutte, xml_line, cfile, base_path='user'): 533 | """ Edit game's XML config file 534 | """ 535 | xml_path = _get_config_full_path(cfile, base_path) 536 | if not xml_path: 537 | return False 538 | 539 | create_backup_config(xml_path) 540 | 541 | # set options 542 | 543 | base_size = os.path.getsize(xml_path) 544 | backup_size = os.path.getsize(xml_path + '.protonfixes.bak') 545 | 546 | if base_size == backup_size: 547 | ConfigFile = open(xml_path, 'r') 548 | contents = ConfigFile.readlines() 549 | LINENUM=0 550 | for line in contents: 551 | LINENUM+=1 552 | if base_attibutte in line: 553 | log.info('Addinging XML options into '+cfile+':\n'+ str(xml_line)) 554 | contents.insert(LINENUM, xml_line + "\n") 555 | ConfigFile.close() 556 | ConfigFile = open(xml_path, 'w') 557 | for eachitem in contents: 558 | ConfigFile.write(eachitem) 559 | ConfigFile.close() 560 | log.info("Config Patch Applied! \n") 561 | 562 | def get_resolution(): 563 | """ Returns screen res width, height 564 | """ 565 | 566 | with open('/sys/class/graphics/fb0/virtual_size', 'r') as res: 567 | screenx, screeny = map(int, res.read().strip('\n').split(',')) 568 | 569 | return(screenx,screeny) 570 | 571 | def read_dxvk_conf(cfp): 572 | """ Add fake [DEFAULT] section to dxvk.conf 573 | """ 574 | yield '['+ configparser.ConfigParser().default_section +']' 575 | yield from cfp 576 | 577 | 578 | def set_dxvk_option(opt, val, cfile='/tmp/protonfixes_dxvk.conf'): 579 | """ Create custom DXVK config file 580 | 581 | See https://github.com/doitsujin/dxvk/wiki/Configuration for details 582 | """ 583 | conf = configparser.ConfigParser() 584 | conf.optionxform = str 585 | section = conf.default_section 586 | dxvk_conf = os.path.join(get_game_install_path(), 'dxvk.conf') 587 | 588 | conf.read(cfile) 589 | 590 | if not conf.has_option(section, 'session') or conf.getint(section, 'session') != os.getpid(): 591 | log.info('Creating new DXVK config') 592 | set_environment('DXVK_CONFIG_FILE', cfile) 593 | 594 | conf = configparser.ConfigParser() 595 | conf.optionxform = str 596 | conf.set(section, 'session', str(os.getpid())) 597 | 598 | if os.access(dxvk_conf, os.F_OK): 599 | conf.read_file(read_dxvk_conf(open(dxvk_conf))) 600 | log.debug(conf.items(section)) 601 | 602 | # set option 603 | log.info('Addinging DXVK option: '+ str(opt) + ' = ' + str(val)) 604 | conf.set(section, opt, str(val)) 605 | 606 | with open(cfile, 'w') as configfile: 607 | conf.write(configfile) 608 | 609 | def install_eac_runtime(): 610 | """ Install Proton Easyanticheat Runtime 611 | """ 612 | install_app(1826330) 613 | 614 | def install_battleye_runtime(): 615 | """ Install Proton BattlEye Runtime 616 | """ 617 | install_app(1161040) 618 | 619 | def install_all_from_tgz(url, path=os.getcwd()): 620 | """ Install all files from a downloaded tar.gz 621 | """ 622 | 623 | cache_dir = config.cache_dir 624 | tgz_file_name = os.path.basename(url) 625 | tgz_file_path = os.path.join(cache_dir, tgz_file_name) 626 | 627 | if tgz_file_name not in os.listdir(cache_dir): 628 | log.info('Downloading ' + tgz_file_name) 629 | urllib.request.urlretrieve(url, tgz_file_path) 630 | 631 | with tarfile.open(tgz_file_path, 'r:gz') as tgz_obj: 632 | log.info('Extracting ' + tgz_file_name + ' to ' + path) 633 | tgz_obj.extractall(path) 634 | 635 | def install_from_zip(url, filename, path=os.getcwd()): 636 | """ Install a file from a downloaded zip 637 | """ 638 | 639 | if filename in os.listdir(path): 640 | log.info('File ' + filename + ' found in ' + path) 641 | return 642 | 643 | cache_dir = config.cache_dir 644 | zip_file_name = os.path.basename(url) 645 | zip_file_path = os.path.join(cache_dir, zip_file_name) 646 | 647 | if zip_file_name not in os.listdir(cache_dir): 648 | log.info('Downloading ' + filename + ' to ' + zip_file_path) 649 | urllib.request.urlretrieve(url, zip_file_path) 650 | 651 | with zipfile.ZipFile(zip_file_path, 'r') as zip_obj: 652 | log.info('Extracting ' + filename + ' to ' + path) 653 | zip_obj.extract(filename, path=path) 654 | 655 | def try_show_gui_error(text): 656 | try: # in case in-use Python doesn't have tkinter, which is likely 657 | from tkinter import messagebox 658 | messagebox.showerror("Proton Fixes", text) 659 | except Exception as e: 660 | try: 661 | subprocess.run(["notify-send", "protonfixes", text]) 662 | except: 663 | log.info("Failed to show error message with the following text: {}".format(text)) 664 | 665 | def is_smt_enabled() -> bool: 666 | """ Returns whether SMT is enabled. 667 | If the check has failed, False is returned. 668 | """ 669 | try: 670 | with open('/sys/devices/system/cpu/smt/active') as smt_file: 671 | return smt_file.read().strip() == "1" 672 | except PermissionError: 673 | log.warn('No permission to read SMT status') 674 | except OSError as e: 675 | log.warn(f'SMT status not supported by the kernel (errno: {e.errno})') 676 | return False 677 | 678 | def get_cpu_count() -> int: 679 | """ Returns the cpu core count, provided by the OS. 680 | If the request failed, 0 is returned. 681 | """ 682 | cpu_cores = os.cpu_count() 683 | if not cpu_cores or cpu_cores <= 0: 684 | log.warn('Can not read count of logical cpu cores') 685 | return 0 686 | return cpu_cores 687 | 688 | def set_cpu_topology(core_count: int, ignore_user_setting: bool = False) -> bool: 689 | """ This sets the cpu topology to a fixed core count. 690 | By default, a user provided topology is prioritized. 691 | You can override this behavior by setting `ignore_user_setting`. 692 | """ 693 | 694 | # Don't override the user's settings (except, if we override it) 695 | user_topo = os.getenv('WINE_CPU_TOPOLOGY') 696 | if user_topo and not ignore_user_setting: 697 | log.info(f'Using WINE_CPU_TOPOLOGY set by the user: {user_topo}') 698 | return False 699 | 700 | # Sanity check 701 | if not core_count or core_count <= 0: 702 | log.warn('Only positive core_counts can be used to set cpu topology') 703 | return False 704 | 705 | # Format (example, 4 cores): 4:0,1,2,3 706 | cpu_topology = f'{core_count}:{",".join(map(str, range(core_count)))}' 707 | set_environment('WINE_CPU_TOPOLOGY', cpu_topology) 708 | log.info(f'Using WINE_CPU_TOPOLOGY: {cpu_topology}') 709 | return True 710 | 711 | 712 | def set_cpu_topology_nosmt(core_limit: int = 0, ignore_user_setting: bool = False, threads_per_core: int = 2) -> bool: 713 | """ This sets the cpu topology to the count of physical cores. 714 | If SMT is enabled, eg. a 4c8t cpu is limited to 4 logical cores. 715 | You can limit the core count to the `core_limit` argument. 716 | """ 717 | 718 | # Check first, if SMT is enabled 719 | if is_smt_enabled() is False: 720 | log.info('SMT is not active, skipping fix') 721 | return False 722 | 723 | # Currently (2024) SMT allows 2 threads per core, this might change in the future 724 | cpu_cores = get_cpu_count() // threads_per_core # Apply divider 725 | cpu_cores = max(cpu_cores, min(cpu_cores, core_limit)) # Apply limit 726 | return set_cpu_topology(cpu_cores, ignore_user_setting) 727 | 728 | def set_cpu_topology_limit(core_limit: int, ignore_user_setting: bool = False) -> bool: 729 | """ This sets the cpu topology to a limited number of logical cores. 730 | A limit that exceeds the available cores, will be ignored. 731 | """ 732 | 733 | cpu_cores = get_cpu_count() 734 | if core_limit >= cpu_cores: 735 | log.info(f'The count of logical cores ({cpu_cores}) is lower than ' 736 | f'or equal to the set limit ({core_limit}), skipping fix') 737 | return False 738 | 739 | # Apply the limit 740 | return set_cpu_topology(core_limit, ignore_user_setting) 741 | -------------------------------------------------------------------------------- /verbs/GFSDK_Aftermath_Lib.verb: -------------------------------------------------------------------------------- 1 | w_metadata GFSDK_Aftermath_Lib dlls \ 2 | title="GFSDK_Aftermath_Lib.x64 Proxy DLL" \ 3 | publisher="Thomas Crider" \ 4 | year="2022" \ 5 | media="download" \ 6 | file1="GFSDK_Aftermath_Lib.x64.tar.gz" \ 7 | installed_file1="GFSDK_Aftermath_Lib.x64.dll" 8 | 9 | load_GFSDK_Aftermath_Lib() 10 | { 11 | w_download "https://github.com/GloriousEggroll/GFSDK_Aftermath_Lib/releases/download/0.1/GFSDK_Aftermath_Lib.x64.tar.gz" 12 | w_try tar -zxf "${W_CACHE}/${W_PACKAGE}/${file1}" -C "${W_DRIVE_C}/windows/temp/" 13 | } 14 | 15 | -------------------------------------------------------------------------------- /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_1700_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_1700_Basic.exe 24ffa374926004d3b7e8e0a3daa2d0f7f18846c8bcbcbddf8af38a7f9a0fb629 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_1700_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/vcrun2019_ge.verb: -------------------------------------------------------------------------------- 1 | w_metadata vcrun2019_ge dlls \ 2 | title="Visual C++ 2015-2019 libraries (concrt140.dll,mfc140.dll,mfc140u.dll,mfcm140.dll,mfcm140u.dll,msvcp140.dll,vcamp140.dll,vccorlib140.dll,vcomp140.dll,vcruntime140.dll) (and vcruntime140_1.dll on win64)" \ 3 | publisher="Microsoft" \ 4 | year="2019" \ 5 | media="download" \ 6 | conflicts="vcrun2015 vcrun2017 vcrun2019" \ 7 | file1="VC_redist.x86.exe" \ 8 | installed_file1="${W_SYSTEM32_DLLS_WIN}/mfc140.dll" 9 | 10 | load_vcrun2019_ge() 11 | { 12 | # Grab the last version that still containts ucrtbase 13 | w_download https://web.archive.org/web/20210415064013/https://download.visualstudio.microsoft.com/download/pr/85d47aa9-69ae-4162-8300-e6b7e4bf3cf3/14563755AC24A874241935EF2C22C5FCE973ACB001F99E524145113B2DC638C1/VC_redist.x86.exe 14 | 15 | w_override_dlls native,builtin api-ms-win-crt-private-l1-1-0 api-ms-win-crt-conio-l1-1-0 api-ms-win-crt-heap-l1-1-0 api-ms-win-crt-locale-l1-1-0 api-ms-win-crt-math-l1-1-0 api-ms-win-crt-runtime-l1-1-0 api-ms-win-crt-stdio-l1-1-0 api-ms-win-crt-time-l1-1-0 atl140 concrt140 msvcp140 msvcr140 ucrtbase vcomp140 vcruntime140 16 | 17 | w_try_cd "${W_CACHE}"/"${W_PACKAGE}" 18 | w_try "${WINE}" start.exe /exec VC_redist.x86.exe ${W_OPT_UNATTENDED:+/q} 19 | 20 | case "${W_ARCH}" in 21 | win64) 22 | # Also install the 64-bit version 23 | # vcruntime140_1 is only shipped on x64: 24 | w_override_dlls native,builtin vcruntime140_1 25 | 26 | w_download https://web.archive.org/web/20210414165612/https://download.visualstudio.microsoft.com/download/pr/85d47aa9-69ae-4162-8300-e6b7e4bf3cf3/52B196BBE9016488C735E7B41805B651261FFA5D7AA86EB6A1D0095BE83687B2/VC_redist.x64.exe 27 | rm -f "${W_TMP}"/* # Avoid permission error 28 | w_try_cabextract --directory="${W_TMP}" VC_redist.x64.exe 29 | w_try_cabextract --directory="${W_TMP}" "${W_TMP}/a10" 30 | w_try_cabextract --directory="${W_TMP}" "${W_TMP}/a11" 31 | cp "${W_TMP}"/concrt140.dll "${W_SYSTEM64_DLLS}"/concrt140.dll 32 | cp "${W_TMP}"/mfc140.dll "${W_SYSTEM64_DLLS}"/mfc140.dll 33 | cp "${W_TMP}"/mfc140u.dll "${W_SYSTEM64_DLLS}"/mfc140u.dll 34 | cp "${W_TMP}"/mfcm140.dll "${W_SYSTEM64_DLLS}"/mfcm140.dll 35 | cp "${W_TMP}"/mfcm140u.dll "${W_SYSTEM64_DLLS}"/mfcm140u.dll 36 | cp "${W_TMP}"/msvcp140.dll "${W_SYSTEM64_DLLS}"/msvcp140.dll 37 | cp "${W_TMP}"/vcamp140.dll "${W_SYSTEM64_DLLS}"/vcamp140.dll 38 | cp "${W_TMP}"/vccorlib140.dll "${W_SYSTEM64_DLLS}"/vccorlib140.dll 39 | cp "${W_TMP}"/vcomp140.dll "${W_SYSTEM64_DLLS}"/vcomp140.dll 40 | cp "${W_TMP}"/vcruntime140.dll "${W_SYSTEM64_DLLS}"/vcruntime140.dll 41 | 42 | cp "${W_TMP}"/api_ms_win_crt_conio_l1_1_0.dll "${W_SYSTEM64_DLLS}"/api-ms-win-crt-conio-l1-1-0.dll 43 | cp "${W_TMP}"/api_ms_win_crt_heap_l1_1_0.dll "${W_SYSTEM64_DLLS}"/api-ms-win-crt-heap-l1-1-0.dll 44 | cp "${W_TMP}"/api_ms_win_crt_locale_l1_1_0.dll "${W_SYSTEM64_DLLS}"/api-ms-win-crt-locale-l1-1-0.dll 45 | cp "${W_TMP}"/api_ms_win_crt_math_l1_1_0.dll "${W_SYSTEM64_DLLS}"/api-ms-win-crt-math-l1-1-0.dll 46 | cp "${W_TMP}"/api_ms_win_crt_runtime_l1_1_0.dll "${W_SYSTEM64_DLLS}"/api-ms-win-crt-runtime-l1-1-0.dll 47 | cp "${W_TMP}"/api_ms_win_crt_stdio_l1_1_0.dll "${W_SYSTEM64_DLLS}"/api-ms-win-crt-stdio-l1-1-0.dll 48 | cp "${W_TMP}"/ucrtbase.dll "${W_SYSTEM64_DLLS}"/ucrtbase.dll 49 | ;; 50 | esac 51 | } 52 | -------------------------------------------------------------------------------- /verbs/wmp9_ge.verb: -------------------------------------------------------------------------------- 1 | w_metadata wmp9_ge dlls \ 2 | title="Windows Media Player 9" \ 3 | publisher="Microsoft" \ 4 | year="2003" \ 5 | media="download" \ 6 | file1="MPSetup.exe" \ 7 | installed_file1="${W_SYSTEM32_DLLS_WIN}"/l3codeca.acm 8 | 9 | load_wmp9_ge() 10 | { 11 | w_skip_windows wmp9 && return 12 | 13 | # Not really expected to work well yet; see 14 | # https://appdb.winehq.org/appview.php?versionId=1449 15 | 16 | # This version of Windows Media Player can be installed only on Windows 98 Second Edition, Windows Millennium Edition, Windows 2000, Windows XP, and Windows .NET Server. 17 | 18 | w_call wsh57 19 | 20 | w_set_winver winxp 21 | 22 | # See also https://support.microsoft.com/en-us/help/18612/windows-media-player 23 | w_download https://web.archive.org/web/20180404022333if_/download.microsoft.com/download/1/b/c/1bc0b1a3-c839-4b36-8f3c-19847ba09299/MPSetup.exe 678c102847c18a92abf13c3fae404c3473a0770c871a046b45efe623c9938fc0 24 | 25 | # remove builtin placeholders to allow update 26 | rm -f "${W_SYSTEM32_DLLS}"/wmvcore.dll "${W_SYSTEM32_DLLS}"/wmp.dll 27 | rm -f "${W_PROGRAMS_X86_UNIX}/Windows Media Player/wmplayer.exe" 28 | # need native overrides to allow update and later checks to succeed 29 | w_override_dlls native l3codeca.acm wmp wmplayer.exe wmvcore 30 | 31 | # FIXME: should we override quartz? Builtin crashes when you play 32 | # anything, but maybe that's bug 30557 and only affects new systems? 33 | # Wine's pidgen is too stubby, crashes, see Wine bug 31111 34 | w_override_app_dlls MPSetup.exe native pidgen 35 | 36 | w_try_cd "${W_CACHE}"/"${W_PACKAGE}" 37 | if [ "${W_ARCH}" = "win64" ]; then 38 | w_try cabextract -d "${W_TMP}" ./MPSetup.exe 39 | w_try_cd "${W_TMP}" 40 | w_try sed -i 's/IsWow64Process/IsNow64Process/' setup_wm.exe 41 | #w_try "${WINE}" setup_wm.exe 42 | cp -f "${W_TMP}"/9SeriesDefault.wmz "${W_SYSTEM32_DLLS}"/ 43 | cp -f "${W_TMP}"/9SeriesDefault_.wmz "${W_SYSTEM32_DLLS}"/ 44 | cp -f "${W_TMP}"/9xmigrat.dll "${W_SYSTEM32_DLLS}"/ 45 | cp -f "${W_TMP}"/advpack.dll "${W_SYSTEM32_DLLS}"/ 46 | cp -f "${W_TMP}"/asferror.dll "${W_SYSTEM32_DLLS}"/ 47 | cp -f "${W_TMP}"/blackbox.dll "${W_SYSTEM32_DLLS}"/ 48 | cp -f "${W_TMP}"/CEWMDM.dll "${W_SYSTEM32_DLLS}"/ 49 | cp -f "${W_TMP}"/Compact.wmz "${W_SYSTEM32_DLLS}"/ 50 | cp -f "${W_TMP}"/control.xml "${W_SYSTEM32_DLLS}"/ 51 | cp -f "${W_TMP}"/custsat.dll "${W_SYSTEM32_DLLS}"/ 52 | cp -f "${W_TMP}"/drm.cat "${W_SYSTEM32_DLLS}"/ 53 | cp -f "${W_TMP}"/drm.inf "${W_SYSTEM32_DLLS}"/ 54 | cp -f "${W_TMP}"/DRMClien.dll "${W_SYSTEM32_DLLS}"/ 55 | cp -f "${W_TMP}"/DrmStor.dll "${W_SYSTEM32_DLLS}"/ 56 | cp -f "${W_TMP}"/drmv2clt.dll "${W_SYSTEM32_DLLS}"/ 57 | cp -f "${W_TMP}"/dw15.exe "${W_SYSTEM32_DLLS}"/ 58 | cp -f "${W_TMP}"/dwintl.dll "${W_SYSTEM32_DLLS}"/ 59 | cp -f "${W_TMP}"/engsetup.exe "${W_SYSTEM32_DLLS}"/ 60 | cp -f "${W_TMP}"/eula.txt "${W_SYSTEM32_DLLS}"/ 61 | cp -f "${W_TMP}"/fhg.inf "${W_SYSTEM32_DLLS}"/ 62 | cp -f "${W_TMP}"/iexpress.inf "${W_SYSTEM32_DLLS}"/ 63 | cp -f "${W_TMP}"/l3codeca.acm "${W_SYSTEM32_DLLS}"/ 64 | cp -f "${W_TMP}"/LAPRXY.DLL "${W_SYSTEM32_DLLS}"/ 65 | cp -f "${W_TMP}"/logagent.exe "${W_SYSTEM32_DLLS}"/ 66 | cp -f "${W_TMP}"/migrate.dll "${W_SYSTEM32_DLLS}"/ 67 | cp -f "${W_TMP}"/migrate.exe "${W_SYSTEM32_DLLS}"/ 68 | cp -f "${W_TMP}"/MP43DMOD.DLL "${W_SYSTEM32_DLLS}"/ 69 | cp -f "${W_TMP}"/MP4SDMOD.DLL "${W_SYSTEM32_DLLS}"/ 70 | cp -f "${W_TMP}"/MPG4DMOD.DLL "${W_SYSTEM32_DLLS}"/ 71 | cp -f "${W_TMP}"/mpvis.DLL "${W_SYSTEM32_DLLS}"/ 72 | cp -f "${W_TMP}"/msdmo.dll "${W_SYSTEM32_DLLS}"/ 73 | cp -f "${W_TMP}"/msnetobj.dll "${W_SYSTEM32_DLLS}"/ 74 | cp -f "${W_TMP}"/msoobci.dll "${W_SYSTEM32_DLLS}"/ 75 | cp -f "${W_TMP}"/MsPMSNSv.dll "${W_SYSTEM32_DLLS}"/ 76 | cp -f "${W_TMP}"/MsPMSP.dll "${W_SYSTEM32_DLLS}"/ 77 | cp -f "${W_TMP}"/MSSCP.dll "${W_SYSTEM32_DLLS}"/ 78 | cp -f "${W_TMP}"/MSWMDM.dll "${W_SYSTEM32_DLLS}"/ 79 | cp -f "${W_TMP}"/mymusic.inf "${W_SYSTEM32_DLLS}"/ 80 | cp -f "${W_TMP}"/npdrmv2.dll "${W_SYSTEM32_DLLS}"/ 81 | cp -f "${W_TMP}"/npdrmv2.zip "${W_SYSTEM32_DLLS}"/ 82 | cp -f "${W_TMP}"/NPWMSDrm.dll "${W_SYSTEM32_DLLS}"/ 83 | cp -f "${W_TMP}"/PidGen.dll "${W_SYSTEM32_DLLS}"/ 84 | cp -f "${W_TMP}"/Plylst1.wpl "${W_SYSTEM32_DLLS}"/ 85 | cp -f "${W_TMP}"/Plylst10.wpl "${W_SYSTEM32_DLLS}"/ 86 | cp -f "${W_TMP}"/Plylst11.wpl "${W_SYSTEM32_DLLS}"/ 87 | cp -f "${W_TMP}"/Plylst12.wpl "${W_SYSTEM32_DLLS}"/ 88 | cp -f "${W_TMP}"/Plylst13.wpl "${W_SYSTEM32_DLLS}"/ 89 | cp -f "${W_TMP}"/Plylst14.wpl "${W_SYSTEM32_DLLS}"/ 90 | cp -f "${W_TMP}"/Plylst15.wpl "${W_SYSTEM32_DLLS}"/ 91 | cp -f "${W_TMP}"/Plylst2.wpl "${W_SYSTEM32_DLLS}"/ 92 | cp -f "${W_TMP}"/Plylst3.wpl "${W_SYSTEM32_DLLS}"/ 93 | cp -f "${W_TMP}"/Plylst4.wpl "${W_SYSTEM32_DLLS}"/ 94 | cp -f "${W_TMP}"/Plylst5.wpl "${W_SYSTEM32_DLLS}"/ 95 | cp -f "${W_TMP}"/Plylst6.wpl "${W_SYSTEM32_DLLS}"/ 96 | cp -f "${W_TMP}"/Plylst7.wpl "${W_SYSTEM32_DLLS}"/ 97 | cp -f "${W_TMP}"/Plylst8.wpl "${W_SYSTEM32_DLLS}"/ 98 | cp -f "${W_TMP}"/Plylst9.wpl "${W_SYSTEM32_DLLS}"/ 99 | cp -f "${W_TMP}"/plyr_err.chm "${W_SYSTEM32_DLLS}"/ 100 | cp -f "${W_TMP}"/qasf.dll "${W_SYSTEM32_DLLS}"/ 101 | cp -f "${W_TMP}"/QuickSilver.wmz "${W_SYSTEM32_DLLS}"/ 102 | cp -f "${W_TMP}"/Revert.wmz "${W_SYSTEM32_DLLS}"/ 103 | cp -f "${W_TMP}"/roxio.inf "${W_SYSTEM32_DLLS}"/ 104 | cp -f "${W_TMP}"/rsl.dll "${W_SYSTEM32_DLLS}"/ 105 | cp -f "${W_TMP}"/setup_wm.cat "${W_SYSTEM32_DLLS}"/ 106 | cp -f "${W_TMP}"/setup_wm.exe "${W_SYSTEM32_DLLS}"/ 107 | cp -f "${W_TMP}"/setup_wm.inf "${W_SYSTEM32_DLLS}"/ 108 | cp -f "${W_TMP}"/skins.inf "${W_SYSTEM32_DLLS}"/ 109 | cp -f "${W_TMP}"/skinsmui.inf "${W_SYSTEM32_DLLS}"/ 110 | cp -f "${W_TMP}"/unicows.dll "${W_SYSTEM32_DLLS}"/ 111 | cp -f "${W_TMP}"/unregmp2.exe "${W_SYSTEM32_DLLS}"/ 112 | cp -f "${W_TMP}"/w95inf16.dll "${W_SYSTEM32_DLLS}"/ 113 | cp -f "${W_TMP}"/w95inf32.dll "${W_SYSTEM32_DLLS}"/ 114 | cp -f "${W_TMP}"/wm1033.lng "${W_SYSTEM32_DLLS}"/ 115 | cp -f "${W_TMP}"/WMADMOD.DLL "${W_SYSTEM32_DLLS}"/ 116 | cp -f "${W_TMP}"/WMADMOE.DLL "${W_SYSTEM32_DLLS}"/ 117 | cp -f "${W_TMP}"/WMASF.DLL "${W_SYSTEM32_DLLS}"/ 118 | cp -f "${W_TMP}"/wmburn.exe "${W_SYSTEM32_DLLS}"/ 119 | cp -f "${W_TMP}"/wmburn.rxc "${W_SYSTEM32_DLLS}"/ 120 | cp -f "${W_TMP}"/wmdm.cat "${W_SYSTEM32_DLLS}"/ 121 | cp -f "${W_TMP}"/wmdm.inf "${W_SYSTEM32_DLLS}"/ 122 | cp -f "${W_TMP}"/WMDMLOG.dll "${W_SYSTEM32_DLLS}"/ 123 | cp -f "${W_TMP}"/WMDMPS.dll "${W_SYSTEM32_DLLS}"/ 124 | cp -f "${W_TMP}"/wmerror.dll "${W_SYSTEM32_DLLS}"/ 125 | cp -f "${W_TMP}"/wmexpack.cat "${W_SYSTEM32_DLLS}"/ 126 | cp -f "${W_TMP}"/wmexpack.inf "${W_SYSTEM32_DLLS}"/ 127 | cp -f "${W_TMP}"/WMFSDK.cat "${W_SYSTEM32_DLLS}"/ 128 | cp -f "${W_TMP}"/WMFSDK.inf "${W_SYSTEM32_DLLS}"/ 129 | cp -f "${W_TMP}"/wmidx.dll "${W_SYSTEM32_DLLS}"/ 130 | cp -f "${W_TMP}"/WMNetMgr.dll "${W_SYSTEM32_DLLS}"/ 131 | cp -f "${W_TMP}"/wmp.cat "${W_SYSTEM32_DLLS}"/ 132 | cp -f "${W_TMP}"/wmp.dll "${W_SYSTEM32_DLLS}"/ 133 | cp -f "${W_TMP}"/wmp.inf "${W_SYSTEM32_DLLS}"/ 134 | cp -f "${W_TMP}"/wmp.ocx "${W_SYSTEM32_DLLS}"/ 135 | cp -f "${W_TMP}"/wmpasf.dll "${W_SYSTEM32_DLLS}"/ 136 | cp -f "${W_TMP}"/wmpband.dll "${W_SYSTEM32_DLLS}"/ 137 | cp -f "${W_TMP}"/wmpcd.dll "${W_SYSTEM32_DLLS}"/ 138 | cp -f "${W_TMP}"/wmpcore.dll "${W_SYSTEM32_DLLS}"/ 139 | cp -f "${W_TMP}"/wmpdxm.dll "${W_SYSTEM32_DLLS}"/ 140 | cp -f "${W_TMP}"/wmplayer.adm "${W_SYSTEM32_DLLS}"/ 141 | cp -f "${W_TMP}"/wmplayer.chm "${W_SYSTEM32_DLLS}"/ 142 | cp -f "${W_TMP}"/wmplayer.exe "${W_SYSTEM32_DLLS}"/ 143 | cp -f "${W_TMP}"/wmploc.DLL "${W_SYSTEM32_DLLS}"/ 144 | cp -f "${W_TMP}"/WMPNS.dll "${W_SYSTEM32_DLLS}"/ 145 | cp -f "${W_TMP}"/wmpns.jar "${W_SYSTEM32_DLLS}"/ 146 | cp -f "${W_TMP}"/wmpshell.dll "${W_SYSTEM32_DLLS}"/ 147 | cp -f "${W_TMP}"/wmpui.dll "${W_SYSTEM32_DLLS}"/ 148 | cp -f "${W_TMP}"/WMSDMOD.DLL "${W_SYSTEM32_DLLS}"/ 149 | cp -f "${W_TMP}"/WMSDMOE2.DLL "${W_SYSTEM32_DLLS}"/ 150 | cp -f "${W_TMP}"/WMSPDMOD.DLL "${W_SYSTEM32_DLLS}"/ 151 | cp -f "${W_TMP}"/WMSPDMOE.DLL "${W_SYSTEM32_DLLS}"/ 152 | cp -f "${W_TMP}"/WMVCORE.DLL "${W_SYSTEM32_DLLS}"/ 153 | cp -f "${W_TMP}"/WMVDMOD.DLL "${W_SYSTEM32_DLLS}"/ 154 | cp -f "${W_TMP}"/WMVDMOE2.DLL "${W_SYSTEM32_DLLS}"/ 155 | ln -s "${W_SYSTEM32_DLLS}"/WMVCORE.DLL "${W_SYSTEM32_DLLS}"/wmvcore.dll 156 | w_warn "wm9codecs is not supported in win64 prefixes. If you need those codecs, reinstall wmp9 in a 32-bit prefix." 157 | else 158 | w_try "${WINE}" start.exe /exec MPSetup.exe ${W_OPT_UNATTENDED:+/q} 159 | load_wm9codecs 160 | fi 161 | 162 | w_set_winver 'default' 163 | } 164 | -------------------------------------------------------------------------------- /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="2022" \ 5 | media="download" \ 6 | file1="Ultimate-ASI-Loader.zip" \ 7 | installed_file1="xlive.dll" 8 | 9 | load_xliveless() 10 | { 11 | w_download https://github.com/ThirteenAG/Ultimate-ASI-Loader/releases/download/v4.68/Ultimate-ASI-Loader.zip 7517c7d5bd8c475f18e6545b7998df379eed6e2e0a19fcd2139669152f9bcddb ${file1} 12 | w_try_unzip "${W_TMP}" "${W_CACHE}/${W_PACKAGE}/${file1}" "dinput8.dll" 13 | w_try_cp_dll "${W_TMP}/dinput8.dll" "xlive.dll" 14 | w_override_dlls native xlive 15 | } 16 | --------------------------------------------------------------------------------