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

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

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

我正在努力奔跑最高指挥官 - 锻造联盟(Steam App ID:9420)并在其非官方多人客户端 FAF 上玩。该游戏以前可以与 Wine 配合使用,但现在存在许多问题(例如,全屏不起作用,窗口模式下容易黑屏)。但它可以与 Proton 配合使用。

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

我的目的不是绕过 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. 帝国时代 2 HD失败,但出现了一个更详细的错误消息窗口,指出 steam 必须正在运行,但我当时正在运行 Steam(如果我单击 Steam 中的播放按钮它就会运行)。

  2. 班纳曼:根本没有任何消息,甚至终端详细信息也更少。

  3. 暗影复合体重制版获取游戏的实际加载屏幕,运行大约两秒钟然后崩溃并出现错误:

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

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


也许有一些潜力这里 更新时间:2018 年 3 月 10 日

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

所以现在我们对这个问题有了更多的了解。尽管蒸汽在运行,并且采取了各种措施让它知道蒸汽在哪里,但似乎还是找不到蒸汽。

我也在质子文件夹中尝试了同样的事情,结果相同。


一些新的潜在的这里 更新时间:2018 年 3 月 10 日

他提到的技巧是创建一个小型 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 运行)。

答案1

这里有一个实验可能有助于您找到答案。为方便起见,我将把您的默认 Steam 库位置称为$STEAM(默认为~/.local/share/Steam/)。Proton 默认安装到$STEAM/steamapps/common/Proton 3.7,我将其称为$PROTON

所以,当我尝试跑步时那巫师,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 空字符作为分隔符。

这足以那巫师对我来说,所有这些环境变量可能都不是必需的。我留给你去测试哪些是不需要的。


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

-applaunch <appID> [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作为参数传递给了游戏。这也许就是您所需要的。

相关内容