Steam 版と公式クライアントが分かれてるゲームのプレイ時間を記録する
はじめに
中華ゲームや一部のオンラインゲームでは、Steam 版と公式クライアントでビルドそのものが分かれているタイトルがいくつかあります。触ったもののなかで思いつくものだと、崩壊3rd・Strinova・Starward(星之翼)あたりが分かりやすい例ですし、MapleStory や Latale のような独立ランチャー主体のゲームでも、北米向けに別途 Steam 版が用意されているパターンも見られます。
この手のゲームを遊んでいると、Steam 版だけ引き継ぎができないといった問題があったり、決済がドル建てで公式版と価格が若干違うといった問題があったりしますし、公式クライアントを使いつつ Steam にプレイ時間として記録させたい、という気持ちの人もいるのではないでしょうか?
今回ちょうど Starward でその構成を組む機会があったので、シンボリックリンクで擬似的に紐付ける方法を紹介しようと思います。
Starward には実績がないので特に気になりませんが、今回この方法でできるのはあくまでプレイ時間の記録までで、実績が気になる人は Steam 版で遊ぶ必要があります。実績解除はビルドが別物である以上どうやっても無理ですし、フレンドへの「プレイ中」表示が出るくらいのことしかできません。
Steam の起動とプレイ時間判定の仕組み
Steam が起動先の exe をどう知っているかは、ローカルの appmanifest_<AppID>.acf ではなく、Steam サーバー側に登録された起動設定で決まっているようです。手元の acf を書き換えても起動先 exe は変えられない、という前提で考える必要があります。
試しに Starward の appmanifest_2763670.acf を覗いてみます。
"AppState"
{
"appid" "2764370"
"LauncherPath" "C:\\Program Files (x86)\\Steam\\steam.exe"
"name" "星之翼(Starward)"
"installdir" "StarWings"
"buildid" "22807552"
// タイムスタンプ・サイズ・ダウンロード状態・更新設定などは省略
"InstalledDepots"
{
"2764372"
{
"manifest" "3531203940813460786"
"size" "10936652298"
}
}
// 省略
}
installdir(インストールフォルダ名)、buildid(ビルド ID)、LauncherPath(Steam クライアント自体のパス)あたりは押さえられていますが、ゲームの起動先 exe へのパスはどこにも書かれていません。Steam がゲーム本体の exe をどう叩いているのか acf からは読み取れない作りになっているということです。
そして、プレイ時間の判定はもっと薄い仕組みです。Steam が起動した子プロセスが生きている間、そのゲームは「プレイ中」として扱われます。プロセスが終わったタイミングで「プレイ終了」と判定し、累計プレイ時間に加算してサーバーへ同期という流れのようです。
構成のアイデア
- Steam が叩きに行く exe のパスは決まっていること
- 起動したプロセスの中身は問わないこと
この 2 つの性質を組み合わせると、Steam が見ているインストール内容を「騙して」公式クライアントの中身に差し替えてしまえばいい、ということになります。
具体的には、公式クライアントのインストール内容を Steam 版のインストール先にシンボリックリンクで重ねる形にすれば、Steam が起動するのは公式クライアントの exe で、Steam 側からはプレイ時間がきちんと記録できる、という流れです。
リンクの貼り方
まず初めに、コマンドプロンプトを起動して、こちらから操作する必要があります。スタートメニューから cmd と検索をして、コマンドプロンプトを開いてください。環境によっては管理者権限での実行が必要の可能性があるので、適宜判断してください。
ここからは Starward の構成を例に、実際の手順を見ていきます。やることは大きく 2 つです。まずフォルダ単位のシンボリックリンクで Steam 版の保存先を公式クライアントへ向けます。続いて exe 単位のシンボリックリンクで、Steam 版が叩こうとする exe 名と公式クライアントの実体名を揃える、という流れです。
Steam 版フォルダの名前をずらす
StarWings フォルダが既に存在しているとディレクトリのシンボリックリンクは作れません。かといってフォルダごと消してしまうと戻したくなったときに困るので、StarWings_ のように末尾を変える形でリネームし、退避させておくのが安全です。
ren "C:\Program Files (x86)\Steam\steamapps\common\StarWings" "StarWings_"
フォルダのシンボリックリンクを貼る
空いた StarWings の位置に、公式クライアントのインストール先を指すディレクトリ用のシンボリックリンクを貼ります。Steam 側から見ると steamapps\common\StarWings の中身が、丸ごと公式クライアントのフォルダ内容に差し替わったように見える状態になります。Steam の保存先を、実際は別ドライブにある公式クライアントへすり替える、というのがここでの目的です。
今回の例だと、自分は C ドライブに Steam クライアントを入れていて、D ドライブに公式クライアントを入れているので、以下のコマンドでシンボリックリンクを作ります。適宜読み替えてください。
mklink /D "C:\Program Files (x86)\Steam\steamapps\common\StarWings" "D:\XZYJP\jpshengtiangamespc\10083"
mklink /D はディレクトリ用のシンボリックリンクを作るオプションです。
エクスプローラーから steamapps\common を見ると、退避させた StarWings_ と新しいシンボリックリンクの StarWings が並んでいるのが分かります。
exe のシンボリックリンクを貼る
公式クライアントと Steam 版とでは、起動 exe の命名が違うことがあります。Starward の場合だと、XZYPlay.exe が Steam 版で叩かれる exe で、GamePlay.exe が公式クライアントの exe なので、公式の exe を Steam 版として起動させる必要があります。
Steam クライアントに勘違いさせるため、Steam 版の exe は削除してしまい、以下のコマンドで、公式クライアントの exe を指すシンボリックリンクを XZYPlay.exe として作ります。
すでに先程のフォルダのシンボリックリンクを貼ってある前提で、Steam 上でのインストールディレクトリを指して実行します。こちらも適宜読み替えてください。
mklink "C:\Program Files (x86)\Steam\steamapps\common\StarWings\XZYPlay.exe" "C:\Program Files (x86)\Steam\steamapps\common\StarWings\GamePlay.exe"
/D を付けないとファイル用のシンボリックリンクが作られるので、こちらはオプションなしでコマンドを実行します。
リンクを貼り終わったら、Steam の「プレイ」ボタンから起動できるか確認します。問題なく公式クライアントが立ち上がり、ゲームを終了した後で Steam のライブラリを見ると、プレイ時間が加算されているはずです。
運用上の注意
整合性チェックはしない
注意が要るのは Steam の整合性チェックです。「ローカルファイル → 整合性を確認」を走らせると、リンクが上書きされて元の Steam 版 exe に戻されてしまいます。一度構成が決まったら、整合性チェックはしない運用にした方が無難です。
Steam の自動アップデートを抑える
Steam クライアントによる自動アップデートを抑えるため、設定を起動時にアップデートにしておくことを推奨します。
構成が壊れたときの戻し方
公式インストール → Steam 版インストール → シンボリックリンク貼り直し、と全手順をやり直せば確実に戻せます。ただ、必ずしもそこまでやる必要はありません。
Steam 版と公式クライアントとでディレクトリ構成が全く違う場合は、整合性チェックをしても構成に影響が出ないため、 exe のシンボリックリンクを貼り直すだけで解決することが多いです。
Starward の場合、自分は整合性チェックで構成を崩した後、exe のシンボリックリンクを貼り直すだけで元に戻すことができました。焦らず段階的に試してみてください。
まとめ
Steam 版と公式クライアントでビルドが分かれているゲームに対して、Steam が「起動した exe のプロセス生存だけを見ている」性質を利用し、フォルダと exe の二段シンボリックリンクで Steam 経由から公式クライアントを起動できるようにしました。
- Steam の起動先 exe パスはサーバー側で管理されていて、手元の acf を書き換えても変えられない
- プレイ時間判定はプロセスの生存だけで決まっていて、起動した中身は問われない
- フォルダ単位と exe 単位の二段シンボリックリンクを重ねれば、命名のずれや別ドライブ配置にも対応できる
- 整合性チェックを走らせると元の Steam 版 exe に戻されてしまうので、構成が決まったらしない運用が無難
- 構成が壊れても、ディレクトリ構成が全く違う場合は、整合性チェックをしても構成に影響が出ないため、 exe のシンボリックリンクを貼り直すだけで戻せることが多い
どうあがいても力技ではありますし、実績は取れず、万能な方法ではありません。それでも「ライブラリに統合してプレイ時間を積みたい」という素朴なニーズに対しては、自分としては十分実用的な解決策だと思います。