ゲームスコアのランキングシステムで不正なスコア送信を防止する方法

GIGAZINE



ゲームの楽しみ方の1つに「ハイスコアを競い合う」というものがありますが、単に数字の大小を比較するだけというシンプルなルールであるが故に、ゲームのハイスコアを不正な方法で更新する不届き者もまれに存在します。イライラ棒系リズムゲーム「Open Hexagon」の制作者であるVittorio Romeo氏が、Open Hexagonに投入した不正行為防止の取り組みについて解説しています。

vittorio romeo’s website
https://vittorioromeo.info/index/blog/oh_secure_leaderboards.html

Open Hexagonは、イライラ棒系リズムゲーム「Super Hexagon」のクローンゲームで、Super Hexagonの開発者であるTerry Cavanagh氏の全面協力の下、オープンソースで開発が進められています。

実際にどんなゲームなのかは以下のムービーを見るとよくわかります。六角形の周りをグルグルと回るカーソルを動かし、四方八方から押し寄せてくる壁のような障害物を避け続けるという、シンプルでありながら奥深いゲームとなっています。

Open Hexagon – Steam Release Trailer – YouTube
[embedded content]

Romeo氏は、入力と時間と初期状態が同じであれば、どんな環境でも常に同じプレイが再現されるゲーム性を「決定論的ゲームプレイ」と呼んでいます。

Open Hexagonでは、障害物を避け続けて長く生き残るほど、高いスコアを記録することができ、トップハイスコアをオンライン上に投稿することで他のプレイヤーと競うこともできます。このトップハイスコアの登録で不正行為を防止するため、Open Hexagonではハイスコアと同時にリプレイデータをアップロードする仕組みになっています。

リプレイデータはプレイの全てを録画したデータではなく、入力シーケンス、障害物をランダムで生成するためのシード値、レベル情報、プレイヤー名をまとめて保存したもの。これにより、リプレイデータのファイルサイズを極力小さくしながら決定論的ゲームプレイを維持することが可能になります。

そして、プレイヤーがハイスコアを直接サーバーに直接するのではなく、Open Hexagonがリプレイファイルをサーバーに送信することで、ランキングに登録されるようになります。もちろんリプレイファイルを自作してアップロードするという不正も技術的には可能だそうですが、はるかに難しく時間のかかる行為だとRomeo氏は述べています。


Open Hexagonは障害物がせまってくる速度によって難度が変わります。そのため、チートツールを使用してゲームのシミュレーション速度を遅くすると、生き残りやすくなり、より高いハイスコアを残しやすくなります。もちろんこの方法は完全に不正ですが、リプレイデータ上には不正の痕跡が残らず、有効となってしまいます。

Romeo氏は、この不正行為を防ぐために「記録されたプレイの実際の長さ」を何らかの方法で測定する必要があると考えました。最初のアイデアは「クライアント側のシステム時計からタイムスタンプを収集してリプレイデータに記録する」というものでしたが、この方法ではクライアントの時計を偽装することで簡単にすり抜けられてしまいます。

そこで、「ゲーム開始時にソフトがサーバーにゲーム開始を宣言するパケットを送り、ゲームが終了するとリプレイデータを含むパケットをサーバーに送信する」という方法が実装されました。この方法だと、クライアントではなくサーバー側のシステム時計に依存するので、プレイ時間をごまかすことはできません。サーバー側でチート行為が判明した場合は、プレイヤーのSteam IDやプレイヤーアカウントも一緒に記録され、ハイスコアのリーダーボードから永久追放となります。


それでもまだ不正行為の対策は万全ではなかった、とRomeo氏。Open Hexagonはカスタマイズ性が高いことが売りであり、ゲームファイルを簡単にいじることができます。ただし、もし障害物のパターンを変更したり速度を遅くしたりするような「ゲーム性に直接影響のある部分」を変更するとサーバー側から拒否されるようになっていました。

一方、リプレイデータは必要最低限のデータしか共有していないので、背景の回転速度や背景の色、壁の色など、視覚的な部分の設定を変更すれば、リプレイの有効性には影響しない範囲で難易度を調整することが可能になります。Romeo氏は「Open Hexagonはゲーム性そのものよりも視覚的特性に依存したギミックを中心に設計されています」と述べており、視覚的な部分の設定を変更できてしまうことはアンフェアさを生むといえます。

この問題を解決するには、視覚的な部分がゲームプレイに影響を与えるようにすればいいわけです。そこでRomeo氏は、障害物を生成する乱数生成のシード値に視覚的な設定の値を投入するように修正しました。

void HexagonGame::update(FT ft)
{ // ... rng.advance(status.pulse); rng.advance(status.pulse3D); rng.advance(status.fastSpin); rng.advance(status.flashEffect); rng.advance(levelStatus.rotationSpeed); // ...and more visual effects...
}

もしゲームファイルの視覚的な設定を変更した場合、障害物を生成する乱数ジェネレーターの出力結果も変化するため、アンフェアさは解消されます。もし不当にゲームファイルをいじろうとしても、乱数ジェネレーターの結果が異なるため、サーバー側はリプレイを拒否することが可能となります。Romeo氏は「このやり方はゲームファイルのチェックサムハッシュをサーバーとやりとりするよりは泥臭いですが、間違いなくより実用的な方法です」とコメントしています。


なお、Open HexagonはSteamでは長く「早期アクセス」の状態となっていましたが、2021年11月2日に正式版がリリースされています。価格は520円です。

Steam:Open Hexagon
https://store.steampowered.com/app/1358090/Open_Hexagon/


この記事のタイトルとURLをコピーする

Source