世界を動かす技術を、日本語で。

「ザ・ゲームズ:ウィンター・チャレンジ」における最長のスキージャンプの作成

概要

  • The Games: Winter Challenge のスキージャンプ最適化の探求記録
  • コピーガードがジャンプ距離に及ぼす影響の解明
  • ゲームバイナリ解析による物理シミュレーションの理解
  • リプレイファイルフォーマットの詳細解析
  • 最適ジャンプ再現のための外部入力生成手法

スキージャンプ最適化の道

  • The Games: Winter Challenge のスキージャンプで、どこまでジャンプ距離を伸ばせるかの挑戦記録
  • 子供時代に100メートル超えが不可能だった理由が コピーガード による制限であることを判明
  • コピーガードを解除した状態では、特別なテクニックなしでも100メートル超えが可能
  • 本当の「どこまで飛べるか?」という問いに答えるための2つのアプローチ
    • ツールアシストによるフレーム単位入力制御での最適化
    • ゲームバイナリ解析による物理ロジックの完全理解
  • ツールアシスト手法の限界として、隠れたメカニクスの未発見や膨大な入力パターンの試行コストを指摘
  • より効率的な解析のため、 バイナリ解析 による物理システム・入力・リプレイファイルの解読を選択

スキージャンプイベントの基本メカニクス

  • ジャンプは4つのフェーズに分かれる
    • ジャンプ台降下:左右移動で風の影響を相殺
    • 踏み切り:タイミングよく下キーでジャンプ力決定
    • 飛行:上下キーでスキー角度調整、風の影響あり
    • 着地:エンターキーで安全着地
  • 降下時にコースから逸れると 雪煙と減速音 でフィードバック
  • 飛行中はゲーム内フィードバックが少なく、マニュアルでは「スキーを平行に保つ」ことが推奨
  • 90年代初頭当時主流の「平行スタイル」がゲーム最適とされるが、現実のV字スタイルの効果は再現されていない可能性
  • 表面的な最適解はマニュアル準拠だが、 隠し要素やバグ技 の存在も否定できない
    • 例:Super Mario 64の「Backwards Long Jump」のような未想定の挙動

リプレイファイルフォーマットの解析

  • ゲームバイナリの解析は、まず リプレイファイル から着手
  • DOSBoxのエミュレータでリプレイのファイルI/Oを特定し、バイナリ構造を調査
  • リプレイファイルは大きく2ブロック構成
    • ヘッダー+セーブステート部
    • 入力記録部(4バイト単位で入力を記録)
  • 主要バイトの意味
    • 0x10:ジャンパーのスーツ色(0~15が有効範囲)
    • 0x50:ジャンプ時の風のランダムシード
    • 0x102:踏み切り時のスキー角度
  • 入力記録部は4バイトごとに1フレームの入力を記録し、パターンが明確
  • リプレイ再生時は、セーブステートで初期状態を復元し、記録された入力列でシミュレーションを再現
  • 長距離競技(Biathlon等)では途中から記録が始まる場合もあり、セーブステートの役割が大きい
  • ファイル構造(例)
    • ヘッダー:ファイルサイズ、フレーム数、各ブロックのオフセット・サイズ等
    • セーブステート:ジャンパー色、RNGシード、初期スキー角度など
    • 入力データ:4バイト単位で入力を時系列記録

まとめと今後の展望

  • リプレイファイルの詳細解析 により、初期状態・風・入力の全てを制御可能
  • バイナリ解析で物理演算ロジックを抽出し、 外部シミュレーション や最適入力列の自動生成が可能
  • 得られた入力列をリプレイファイルとして合成し、 ゲーム内で最適ジャンプを再現 する手法の確立
  • 表面的な攻略法だけでなく、 ゲームエンジン内部の深層理解 による本質的な最適化の実現

Hackerたちの意見

自分のPCジョイスティックには連射モードがあって、確かこれを使うとすごいジャンプができたんだよね。

どのボタンをジョイスティックに自動化させたの?

それはちょっと変だね。オプティマイザーがラピッドファイアのジョイスティックと同じことができると思ってたから、シミュレーションコードがそんな風に騙されるなら、ブルートフォースの時に気づくべきじゃない?他の可能性としては、入力処理の問題を利用したってこともあるけど、その場合、結果はリプレイファイルに保存できないよね?そうじゃなければ、オプティマイザーも見つけられたはずだし。あの大きなジャンプをリプレイできたの?

このゲームと夏季オリンピックは、PCゲームに登場したときにすごいインパクトがあったなぁ。いい思い出!それに、同じグラフィックエンジンが野球ゲームにも使われて(洗練されたのかな?)、ハードボールシリーズがあったよね。もちろん、ヨーロッパではあまり人気がなかったけど。野球が盛んな地域ではどうだったんだろう?オリンピックタイトルと比べて、野球ゲームの人気はどうだったのかな?

ウィンター・チャレンジのスキージャンプで、親友と一緒に何時間も遊んだなぁ。108.5が僕たちが出せた最大のジャンプだったのを今でも覚えてるよ。

あのグラフィックを実現したことに驚いてるし、それを思いついたのもすごいね。

ライセンスコードを動かすバグを引き当てるために、ゲームを20回から50回もロードしたことを忘れられないよ。延々とロードして、紙のホイールでコードを確認して、失敗して、またやり直し。今の子たちはこの苦労を知らないだろうな。

すごい仕事と献身だね。簡単に記録を破るバグを見つけると思ってたけど、残念ながらゲームがあまりにもよくできてるみたい。最後のバグはかなり期待できそうだったけど。整数オーバーフローの可能性は完全には排除できないから、いつか全ての組み合わせをブルートフォースできる計算能力が手に入るかもね。

コツはセカンドギアから始めることだよ。

https://www.retrogames.cz/play_419-DOS.php?emulator=archive

このエントリーの前の投稿はさらにすごいよ!超簡潔に言うと、ウィンターゲームには間違ったコードを入力するとゲームがうまく動かなくなるDRMがあって、ほとんどのクラック(1996年の「公式」クラックも含む)はそれをスキップしちゃうから、壊れたゲームになっちゃうんだ。それにはgog.comのバージョンも含まれてる。この人は実際にgog.com版のゲーム用の「パッチ」をリリースしたんだ。 https://mrwint.github.io/winter/patcher/index.html

彼が詳細を説明するのが本当に上手で、彼の「サイドバー」では基盤となるアーキテクチャのコア機能について説明してるのが好きだな。リンクはこちらだよ: https://mrwint.github.io/winter/writeup/writeup.html