protonscr

Injustice - Gods Among Us - Ultimate Edition

protonopen appid 242700Game compatibility - Unofficial.NET
ValveSoftware/Proton#3498 · opened 2020-02-08 by legluondunet · updated 2021-11-11 · 3 comments · github · game page · search this game
Llegluondunet 2020-02-08 github

Compatibility Report

  • Name of the game with compatibility issues: Injustice - Gods Among Us - Ultimate Edition
  • Steam AppID of the game: 242700

System Information

I confirm:

  • [X] that I haven't found an existing compatibility report for this game.
  • [X] that I have checked whether there are updates for my system available.

steam-242700.log

Symptoms

Launcher does nothing, creates a zombie process and I have to finally kill it manually:
killall -9 InjusticeLaunch

Reproduction

Launch the game and choose "Launcher" instead of "Play Injustice"

Nota: if you choose "Play Injustice", the game launches and you can play it without trouble.
This game could be whitelisted when the "Launcher" issue will be fixed.

Mmadewokherd 2020-02-11 github

With current (master branch, not 4.9) Wine Mono, I get this error:

[00000035:] EXCEPTION handling: System.InvalidProgramException: Invalid IL code in InjusticeLauncher.LauncherForm:PlayBtn_Click (object,System.EventArgs): IL_0079: ldc.i4.1

Trying with MONO_VERBOSE_METHOD=PlayBtn_Click doesn't give much more information:

converting (in B4: stack: 5) IL_0078: ldc.i4.0  
converting (in B4: stack: 6) IL_0079: ldc.i4.1  
exiting due to invalid il(0001006A, 0, 0, 00000000) stub!

Opening with ILSpy shows that this method has a maxstack value of 6. Since Mono sees 6 values in the stack here already, trying to load a constant value of 1 would overflow the stack.

Most likely, Mono's idea of how much stack is being used is wrong. Looking back for the last time the stack is empty takes me here:

converting (in B5: stack: 0) IL_0025: ldloca.s  4
converting (in B5: stack: 1) IL_0027: ldc.i4.s  31
converting (in B5: stack: 2) IL_0029: ldsflda   0x0400000c
rva field 0041F2C4
converting (in B5: stack: 3) IL_002e: ldloc.1   
converting (in B5: stack: 4) IL_002f: call      0x0a000072
cmethod = int modopt(System.Runtime.CompilerServices.CallConvCdecl) <Module>:sprintf_s (sbyte modopt(System.Runtime.CompilerServices.IsSignUnspecifiedByte)*,uint,sbyte modopt(System.Runtime.CompilerServices.IsSignUnspecifiedByte) modopt(System.Runtime.CompilerServices.IsConst)*)
converting (in B5: stack: 2) IL_0034: pop       

ILSpy sees this call instruction a little differently:
IL_002f: call vararg int32 modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) '<Module>'::sprintf_s(int8 modopt([mscorlib]System.Runtime.CompilerServices.IsSignUnspecifiedByte)*, uint32, int8 modopt([mscorlib]System.Runtime.CompilerServices.IsSignUnspecifiedByte) modopt([mscorlib]System.Runtime.CompilerServices.IsConst)*, ..., uint32)

Mono is treating the function as if it has 3 arguments, but ILSpy shows an additional uint32 argument at the end. I'm guessing this is an issue with how it processes vararg calls.

Mmadewokherd 2020-02-11 github

Even if we fixed this, sprintf_s is a vararg pinvoke function, which currently don't work in Mono.

Mmadewokherd 2021-06-05 github

This should be fixed by Wine Mono 6.2.0.

There's currently no Proton release that includes the new Wine Mono, but the MSI can be manually installed for a specific game. @redmcg has a helpful guide here: https://github.com/redmcg/wine-mono/wiki#install-later-version

Nothing extracted yet.