最近,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”,关闭它只会让我回到终端,没有任何额外的输出。我尝试过其他游戏:
帝国时代 2 HD失败,但出现了一个更详细的错误消息窗口,指出 steam 必须正在运行,但我当时正在运行 Steam(如果我单击 Steam 中的播放按钮它就会运行)。
班纳曼:根本没有任何消息,甚至终端详细信息也更少。
暗影复合体重制版获取游戏的实际加载屏幕,运行大约两秒钟然后崩溃并出现错误:
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 服务器。如果我省略这个变量并使用其余所有变量,我就可以从命令行启动游戏。
脚步:
$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 空字符作为分隔符。
这足以那巫师对我来说,所有这些环境变量可能都不是必需的。我留给你去测试哪些是不需要的。
当然,所有这些可能都是完全没有必要的。看看 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 确实将foo
和bar
作为参数传递给了游戏。这也许就是您所需要的。