PCゲームプラットフォームの実行リンクと所持ゲームのAppID

試したいことがあってSteamといったPCゲームクライアントのゲームのURIスキーム(特に実行プロトコル)を調べていたのですが、日本語での情報が皆無だったのでメモ程度に書き留めておきます。

一部プラットフォームのURIスキーム・実行プロトコルは調べきれなかったので、判明次第追記していこうと思います。

複数プラットフォームのゲームを統合管理できることで有名な GOG Galaxy 2.0 がありますが、これで起動できるプラットフォームなら恐らくURIスキームを利用していると思います。

基本的にゲームのショートカットをデスクトップに生成できるゲームクライアントは、そのショートカットリンクにIDと起動プロトコルが書かれていると思います。

URIスキームとは

Steamなんかをブラウザでログインしながら閲覧していると、無料だったり所持しているゲームの購入ボタンが「今すぐプレイ」になっていますよね。

それを押すとインストール済みの場合はゲームが起動し、未インストールだとそのゲームをインストールか訊かれると思います。

その「今すぐプレイ」というボタンのリンク先、よーく見ると「steam://run/〇〇」となっていて、通常の「http:」や「https:」で始まるURLとは異なっていることがわかりますか?

これはURIスキームと呼ばれるもので、非技術者にも分かるよう大雑把に説明すると、ウェブページへのリンクを扱う感覚でプログラムを起動することができます。

例えばWindows 10を利用しているなら「calculator:」というリンクをクリックすると「電卓」が起動することが分かります。

多くのPCゲームクライアントではこのURIスキームを利用しており、Steamのようにストア経由でゲームの起動を可能にしている所もあります。

Steam

起動プロトコル

PCゲーム業界で最大手なだけあって、Steamで利用可能なURIスキームの仕様は開発者向けの公式ドキュメント(英語)でまとめられています。

ドキュメントを見るに起動プロトコルは二種類存在します。

起動プロトコル

① steam://run/<id>//<args>/
② steam://rungameid/<id>

例えば、Counter-Strike: Global Offensive の場合AppIDは730なので、起動プロトコルは steam://run/730/steam://rungameid/730 になります。

Counter-Strike: Global Offensive on Steam
Counter-Strike: Global Offensive (CS: GO) expands upon the team-based action gameplay that it pioneered when it was launched 19 years ago. CS: GO features new m...

①はMODや非Steamゲームに非対応なので、起動オプション<args>が不要ならば②を使うと良いでしょう。

ちなみに、双方とも対象のゲームがインストールされていないとインストールを促されます。

AppIDの調べ方

以下のファイルにJSON形式でIDやゲームタイトルが書かれています。

C:\Program Files (x86)\Steam\userdata\<AccountID>\7\remote\sharedconfig.vdf

(ちなみに、多分 vdf は Valve Data File の意だと思います)

上記の方法以外にも Steam API を使えば取得しやすいかもしれません。

非SteamゲームのIDの調べ方

ショートカットのリンクから調べる

Steamクライアントからショートカットを作成することで

steam://rungameid/<非SteamゲームのID>

というリンクが付与されたショートカットがデスクトップにできるので簡単に知ることはできます。

が、Steam内でショートカット名を変更するだけでIDが変わってしまう(理由は次項で説明)ので不便ですし、プログラムで扱うなら尚更不便です。

これよりはまだ現実的な非SteamゲームIDの取得方法を以下に記します。

CRC32で計算する

Steam内でのショートカット名を変更するだけでIDが変わってしまう。というのは、Steamでは非SteamゲームのIDを実行ファイルの「絶対パス」と「ショートカット名」からハッシュ値を計算して利用しているからです。

巡回冗長検査 - Wikipedia

CRC32(巡回冗長検査)を利用してIDを算出できますが、なんというか重み付け(?)されているみたいで、CRC32で求めたハッシュ値はビット演算やビットシフトを行わないと正しいIDとならないので注意です。以下に計算方法と例を記します。

計算手順

① 実行ファイルの絶対パスとショートカット名をくっつけた文字列を用意
② CRC32で用意した文字列を計算
(独自プロトコルではなく標準的なもの)
③ 算出したハッシュ値を 0x80000000 で論理和演算(OR)する
④ ③で算出した値を左に32ビットシフトさせる
⑤ ④で算出した値を 0x02000000 で論理和演算(OR)する
⑥ ⑤で算出した値を10進数にすることでIDを算出可能

計算例

実行ファイルの絶対パスが「”C:\a.exe”」
ショートカット名が「a」の場合

① 「”C:\a.exe”」と「a」を繋げて「”C:\a.exe”a」
② CRC32で「”C:\a.exe”a」を計算(= 0x4549DAE0)
③ 0x4549DAE0 ∨ 0x80000000 = 0xC549DAE0
④ 0xC549DAE0 << 32 = 0xC549DAE000000000
⑤ 0xC549DAE000000000 ∨ 0x02000000 = 0xC549DAE002000000
⑥ 0xC549DAE002000000 = 14216134354412765184

参考文献 https://www.reddit.com/r/Steam/comments/8wvyg9/documentation_technical_information_about/

参考文献であるRedditのページにはもっと本質的なことも書いてあると思うので良かったら見てみてください。

[DOCUMENTATION] Technical information about non-Steam shortcuts (creation, steam:// app ID, and storage location, among other things). Add your own non-Steam shortcuts without opening Steam! (including (un)installed 3rd-party libraries/emulated games!)
#OUTDATED SEE HERE: --- --- I've had an incredibly...

また、そのページにあるリンクを辿っていくとCRCを計算するMITライセンスのPythonのスクリプトが置いてあるので、計算に利用しても良いかもしれません。


ショートカット名と実行ファイルの絶対パスは

C:\Program Files (x86)\Steam\userdata\<AccountID>\config

にある shortcuts.vdf に保存されています。少しパースしにくい形式ですが、あまり問題は無いでしょう。(実体はJSON形式ですが、空白文字の文字コードが特殊)

ちなみに、絶対パスを囲んでいる””(ダブルクォーテーション)も文字列に含み、実行ファイルの指定にコマンドライン引数も指定している場合はそれも含めます。

string s = “C:\a.exe”;
string s = “\”C:\a.exe\””;
string s = “\”C:\a.exe\”” + “-option”;

×

ショートカット名に日本語や律儀に™とか®をつけてる場合、文字エンコードの指定を適切に行わないと間違ったハッシュ値(= ID)を延々と生み出すので気をつけてください。

Origin

起動プロトコル

Steamの起動プロトコルとほぼ同じですが、ゲームのIDにはやや癖があります。

起動プロトコル

origin://launchgame/<id>

OriginのゲームIDはSteamのような一意の数値ではなく、いくつかの種類に分かれています。

IDのフォーマット

私が確認した限り、以下の種類が存在します。

① DR<9桁の数値>
② OFB-EAST<5桁の数値>
③ Origin.OFR.50.<7桁の数値>

例えば、Apex Legends の場合IDはOrigin.OFR.50.0002694なので、起動プロトコルは origin://launchgame/Origin.OFR.50.0002694 になります。

Apex Legends - The Next Evolution of Hero Shooter - Free to Play
Apex Legends is a free-to-play hero shooter game where legendary competitors battle for glory, fame, and fortune on the fringes of the Frontier.
ゲームIDの調べ方

インストール済みのゲームであれば簡単にIDを知ることができ、

C:\ProgramData\Origin\LocalContent

の中にある名前がゲームタイトルのフォルダ、その中にある map.crc 以外のファイル(から拡張子を除いたもの)がゲームのIDとなります。

GOG Galaxy 2.0 では所持しているゲームをすべて取得できているみたいなので、また違った取得方法もあると思います。

Uplay

起動プロトコル

基本的に Steam のものと似てますが末尾に「/0」が入ります(引数?)

起動プロトコル

uplay://launch/<id>/0

例えば、Assassin’s Creed III (非リマスター版)の場合IDは54なので、起動プロトコルは uplay://launch/54/0 になります。

ただ、GOG Galaxy 2.0 で取得した Assassin’s Creed III の ID は「4a1562a4-c4d2-4bc5-a85e-f3db588b0072」だったので、何かしらのパラメーターからハッシュ値的なものを算出できるのかもしれません。

ゲームIDの調べ方

以下のレジストリにIDに対応したゲーム名が保存されています。

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Ubisoft\Launcher\Installs\<id>


レジストリを読めないような場合は以下のディレクトリにインストール済みのゲームのIDのフォルダがあるので、そこからIDを取得した後に「https://raw.githubusercontent.com/Haoose/UPLAY_GAME_ID/master/README.md」のようなリストからIDに対応したゲーム名を取得することになります。

C:\Program Files (x86)\Ubisoft\Ubisoft Game Launcher\data\

Epic Games

起動プロトコル

他のゲームクライアントの起動プロトコルよりも長ったらしくて、なおかつブラウザからでは起動できません。

起動プロトコル

com.epicgames.launcher://apps/<codename>?action=launch&silent=true

Fortnite の場合は 「com.epicgames.launcher://apps/Fortnite?action=launch&silent=true」となります。

試す場合はコマンドプロンプトから「start com.epicgames.launcher://apps/Fortnite?action=launch^&silent=true」で実行できます。

コマンドプロンプトで実行する場合は「&」の前に「^」を置いてエスケープしないと「silent=true」(”クライアントを起動しない”の意)の部分が別コマンドと認識されて Epic Games Launcher が起動するので注意。

ゲームIDの調べ方

以下のファイルにJSON形式でインストール先とセットでIDが書かれています。

C:\ProgramData\Epic\UnrealEngineLauncher\LauncherInstalled.dat

インストール先のフォルダ名はPascalCaseで記述されたゲームタイトルなので、ゲームタイトル名も必要な人はそこから抽出すると良いでしょう。

備考

GOG Galaxy 2.0 からゲームリストを取得

プラットフォーム接続をしているなら

C:\ProgramData\GOG.com\Galaxy\storage\galaxy-2.0.db

にあるSQLite3のデータベースに各プラットフォームのゲームタイトルとIDが保存されているので、そこから取得できます。

SQL文で結合しながら抽出する必要があるものの、正直に言ってIDを含むゲームリストを取得するだけならこの方法が一番ラクです。

その他

調べたけど使わなかったもの

個人的に必要性がなかったのでIDの取得方法は調べてません。

battlenet://<codename>


起動プロトコルがわからない URI スキーム

クライアントは上記の URI スキームで起動できるけど、ゲームの起動方法はわからない(´・ω・`)

rockstar:
goggalaxy:

Rockstar Games Launcher
GOG Galaxy 2.0

コメント

タイトルとURLをコピーしました