最近SteamはSteam Playをリリースしました。これは、Proton( GitHub )というSteamがホストするWineのフォークを使用して、Linuxで完全なゲームライブラリをプレイできるようにします。まだLinuxポートを持っていないすべてのゲームにwineprefixを作成し、wineよりもはるかにうまく機能します。
Supreme Commander-Forged Alliance(Steam App ID:9420)を実行して、非公式のマルチプレイヤークライアントFAFでプレイしようとしています。このゲームはかつてWineで機能していましたが、現在では多くの問題があります(たとえば、フルスクリーンが機能せず、ウィンドウが黒画面になる傾向が高い)。しかし、Protonでは機能します。
私がここでやろうとしているのは、この特定のSteamゲームをSteamのGUIではなく端末で実行することです
私の意図はSteam DRMを回避することではありません。SteamDRMはターミナルを介してゲームを実行することはおそらく達成できませんが、動的な引数を使用して実行します。これにより、マルチプレイヤーマッチを設定できます。これは将来的に他のゲームにも適用されます。
しかし、ターミナルで実行すると問題が発生します。
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を実行していました(そしてSteamで再生ボタンをクリックすると実行されます)。
Bannerman:メッセージはまったくなく、端末の詳細はさらに少なくなります。
Shadow Complex Remasteredは ゲームの実際のローダー画面 を取得し、約2秒間実行した後、エラーでクラッシュします:
CAppInfoCacheReadFromDiskThread took 3 milliseconds to initialize
CApplicationManagerPopulateThread took 7 milliseconds to initialize (will have waited on CAppInfoCacheReadFromDiskThread)
そのため、この方法ではゲームが正常に実行されないようです。
おそらくいくつかの可能性 ここUPDATE 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
そのため、この問題について詳しく知ることができました。 Steamが実行されているにも関わらず、Steamがどこにあるかを知らせるためのあらゆる手段はSteamを見つけられないようです。
私も同じ結果をプロトンフォルダー内から同じことを試みました。
いくつかのnew潜在的な ここUPDATE 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プロトンgithubのaeikumの助けのおかげで解決策を見つけました。
https://www.youtube.com/watch?v=c5K7QmK-Xas(2019年3月12日更新)https://github.com/tatsujb/installFAFscript
答えを得るのに役立つかもしれない実験があります。便宜上、デフォルトのSteamライブラリの場所を$Steam
(デフォルトは~/.local/share/Steam/
)と呼びます。プロトンはデフォルトで$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
は、このインスタンスに対して開始されたワインサーバーを参照していました。この変数を省略し、残りをすべて使用した場合、コマンドラインからゲームを開始できます。
手順:
$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 null文字を使用してすべてを区切ります。
便宜上、-orig
を追加してコマンドを保存していることに注意してください。
Steam GUIからゲームを実行します。ラッパースクリプトはこれらのファイルを作成します。
環境をロードし、これらのファイルからコマンドを実行できます。バッシュ
mapfile -d '' -t env < ~/env
mapfile -d '' -t cmd < ~/cmd
env "${env[@]}" "${cmd[@]}"
ここの-d ''
は、bashがASCII null文字を区切り文字として使用することを示しています。
ウィッチャーが私のために走るにはこれで十分でした。これらの環境変数はすべて、おそらく必要ないでしょう。どちらをテストするかはあなたに任せます。
もちろん、これらはすべて完全に不要な場合があります。 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
をゲームの引数として渡しました。必要なのはこれだけです。