通过命令行(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”并关闭它只是让我回到终端没有额外的输出。 我已尝试过其他游戏:
-
Age of Empires 2 HD失败了,但是有一个更详细的错误消息窗口说明蒸汽必须正在运行,但我当时正在运行Steam(如果我点击Steam中的播放按钮它会运行)。
-
Bannerman :根本没有消息,甚至更少的终端冗长。
-
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服务器。 如果我省略了这个变量并使用了所有其余的,我可以从命令行启动游戏。
脚步:
-
使用保存环境的包装脚本替换
$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
保存命令。 -
从Steam GUI运行游戏。 包装器脚本将创建这些文件。
-
您可以加载环境并从这些文件运行命令。 在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确实传递了foo
和bar
作为游戏的参数。 这可能就是你所需要的。