通过命令行(Proton)执行Steam Play游戏时出错

最近Steam发布了Steam Play,它使用Steam托管的Wine分支称为Proton( GitHub ),让我们可以在Linux下玩完整的游戏库。 它为所有尚未拥有Linux端口的游戏创建了wineprefixes,并且比wine更好。

我正在尝试运行Supreme Commander – Forged Alliance (Steam App ID:9420)并在其非官方多人游戏客户FAF上播放。 该游戏过去常常与Wine一起使用,但现在有很多问题(例如,全屏不起作用,并且在窗口中有很高的黑屏倾向)。 但它确实与Proton合作。

我在这里尝试做的是通过终端运行这个特定的Steam游戏,而不是通过Steam的GUI。

我的意图不是规避Steam DRM,通过终端运行游戏可能无论如何都无法实现,而是通过动态参数运行它。 这将允许设置多人比赛。 这将在未来适用于其他游戏。


但是我在终端上跑步时遇到了麻烦:

cd ~/.local/share/Steam/steamapps/common/Proton* STEAM_COMPAT_DATA_PATH=/home/t/.local/share/Steam/steamapps/compatdata/9420 ./proton run /home/t/.local/share/Steam/steamapps/common/Supreme\ Commander\ Forged\ Alliance/bin/SupremeCommander.exe 

我得到一个错误窗口:“应用程序加载错误P:0000065615”并关闭它只是让我回到终端没有额外的输出。 我已尝试过其他游戏:

  1. Age of Empires 2 HD失败了,但是有一个更详细的错误消息窗口说明蒸汽必须正在运行,但我当时正在运行Steam(如果我点击Steam中的播放按钮它会运行)。

  2. Bannerman :根本没有消息,甚至更少的终端冗长。

  3. Shadow Complex Remastered获取游戏的实际加载器屏幕 ,运行大约两秒钟然后崩溃并出现错误:

     CAppInfoCacheReadFromDiskThread took 3 milliseconds to initialize CApplicationManagerPopulateThread took 7 milliseconds to initialize (will have waited on CAppInfoCacheReadFromDiskThread) 

所以没有游戏似乎通过这种方法成功运行。


也许有些潜力在这里 更新3/10/2018

 WINEPREFIX="/home/t/fa-wineprefix/":"/home/t/.local/share/Steam/steamapps/common/Proton 3.7/dist/lib/wine winecfg" PATH="/home/t/.local/share/Steam/steamapps/common/Proton 3.7/dist/bin/:$PATH" export WINEDLLPATH="/home/t/.local/share/Steam/steamapps/common/Proton 3.7/dist/lib64/wine:/home/t/.local/share/Steam/steamapps/common/Proton 3.7/dist/lib/wine" export LD_LIBRARY_PATH="/home/t/.local/share/Steam/steamapps/common/Proton 3.7/dist/lib64:/path/to/steam/steamapps/common/Proton 3.7/dist/lib:/usr/lib/steam:/usr/lib32/steam" WINEPREFIX="/home/t/fa-wineprefix/" "/home/t/.local/share/Steam/steamapps/common/Proton 3.7/dist/bin/./wine" "/home/t/.local/share/Steam/steamapps/common/Supreme Commander Forged Alliance/bin/SupremeCommander.exe" 

但此方法在此错误窗口的最后一个命令时失败:

应用程序加载错误P:0000065434

以及一些终端输出:

 001f:err:module:load_builtin_dll failed to load .so lib for builtin L"winebus.sys": libudev.so.0: cannot open shared object file: No such file or directory 001f:err:ntoskrnl:ZwLoadDriver failed to create driver L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\WineBus": c0000142 001f:err:winedevice:create_driver failed to create driver L"WineBus": c0000142 0013:err:service:process_send_command service protocol error - failed to write pipe! 000d:fixme:service:scmdatabase_autostart_services Auto-start service L"WineBus" failed to start: 1114 0009:err:module:load_library somehow failed to load steamclient 

所以现在我们更多地了解这个问题。 看起来尽管蒸汽正在运行,并且每一项措施都让它知道蒸汽在哪里找不到蒸汽。

我也从质子文件夹中尝试了相同的结果,结果相同。


一些新的潜力在这里 更新3/10/2018

他提到的技巧是创建一个小的python脚本protonRunner.py

 #!/usr/bin/env python import os import sys home = os.environ["HOME"] os.environ["STEAM_COMPAT_DATA_PATH"] = home + "/.local/share/Steam/steamapps/compatdata/9420" run = "run" exe = "\"" + home + "/.local/share/Steam/steamapps/common/Supreme Commander Forged Alliance/bin/SupremeCommander.exe\"" cmd = "\"" + home + "/.local/share/Steam/steamapps/common/Proton 3.7/proton\" " + run + " " + exe for arg in sys.argv[1:]: cmd += " " + arg os.system(cmd) 

supcomFA.desktop

 [Desktop Entry] Name=SupremeCommander Exec=python $HOME/.local/share/Steam/steamapps/common/Proton\ 3.7/protonRunner.py Icon=/home/t/.local/share/icons/supcom.png Type=Application Encoding=UTF-8 Version=1.0 Terminal=true 

这样做可以完成相同的错误消息:

应用程序加载错误P:0000065434


TL; DR:如何从终端运行Windows Steam游戏(设法通过Linux上的Proton运行)。

这是一个可以帮助您获得答案的实验。 为方便起见,我将您的默认Steam库位置称为$STEAM (默认为~/.local/share/Steam/ )。 Proton默认安装在$STEAM/steamapps/common/Proton 3.7 ,我称之为$PROTON

所以,当我尝试运行The Witcher时 ,Steam运行了这个命令:

 "$PROTON/dist/bin/wine-preloader" "$PROTON/dist/bin/wine" "Z:\$STEAM\steamapps\common\The Witcher Enhanced Edition\System\witcher.exe" 

其中$STEAM有反斜杠而不是斜杠,因为它是Windows路径。 此外,它设置了70个环境变量(与Wine,Steam,各种硬件/驱动程序,库等相关)。 单个变量WINESERVERSOCKET引用了为此实例启动的wine服务器。 如果我省略了这个变量并使用了所有其余的,我可以从命令行启动游戏。

脚步:

  1. 使用保存环境的包装脚本替换$PROTON/dist/bin/wine-preloader

     PROTON="$HOME/.local/share/Steam/steamapps/common/Proton 3.7" # adjust to your settings mv "$PROTON/dist/bin/wine-preloader" "$PROTON/dist/bin/wine-preloader-orig" printf "%s\n" '#! /bin/sh' 'env --null | grep -vz WINESERVERSOCKET > ~/env' > "$PROTON/dist/bin/wine-preloader" printf 'exec %q "$@"\n' "$PROTON/dist/bin/wine-preloader-orig" >> "$PROTON/dist/bin/wine-preloader" chmod +x "$PROTON/dist/bin/wine-preloader" 

    该脚本基本上是这样的:

     #! /bin/sh env --null | grep -vz WINESERVERSOCKET= > ~/env printf "%s\0" "$0"-orig "$@" > ~/cmd exec /home/user/.local/share/Steam/steamapps/common/Proton\ 3.7/dist/bin/wine-preloader-orig "$@" 

    它保存环境,除了WINESERVERSOCKET~/env ,运行命令和~/cmd参数,并使用提供的参数运行实际文件。 它使用ASCII空字符来分隔所有内容,因为实际的环境变量可能包含换行符。

    请注意,为方便起见,我使用-orig保存命令。

  2. 从Steam GUI运行游戏。 包装器脚本将创建这些文件。

  3. 您可以加载环境并从这些文件运行命令。 在bash中

     mapfile -d '' -t env < ~/env mapfile -d '' -t cmd < ~/cmd env "${env[@]}" "${cmd[@]}" 

    -d ''这里告诉bash文件使用ASCII null字符作为分隔符。

这足以让巫师为我奔跑。 所有这些环境变量可能都不是必需的。 我留给你测试哪些不是。


当然,所有这些可能都是完全没必要的。 查看Steam的命令行选项 ,我们有:

 -applaunch  [launch parameters] Launches an Game or Application through Steam. 

当我跑:

 steam -applaunch 20900 foo bar 

Wine命令是:

 "$PROTON/dist/bin/wine" "Z:\$STEAM\steamapps\common\The Witcher Enhanced Edition\System\witcher.exe" foo bar 

所以Steam确实传递了foobar作为游戏的参数。 这可能就是你所需要的。