GPT-6.1で解読、Fast Food Tycoon 2の描画エンジン
Decompiling Fast Food Tycoon 2: Drawing the World

2001年の経営シミュレーションゲームFast Food Tycoon 2を、GPT-6.1とGhidraによるエージェントループで解析した記録。4,046個の関数をデコンパイルし、ReadProcessMemoryで実行中のゲームのメモリを覗き、UIスレッドにコマンドを送って操作。アイソメトリックな街の描画、時間帯ごとの照明、スプライトアニメーション、ピザの採点ロジックまで明らかにする。
ゲームはピザを24の領域に分割してトッピングの均一さを採点し、反対側に一致するピースがあるか調べ、相性の良い食材の組み合わせを確認する(顧客層ごとに評価も異なる)。さらに食材の重みに基づく盗用チェックまで存在する。
HNでの議論
30- yayachiken
素晴らしい記事だ、子供の頃このゲームが大好きだった。
ピザの採点ルールがそんなにシンプルだったのは興味深い。ゲーム内の百科事典に、子供やティーンは大きなポーションサイズを好むと書いてあったのを覚えている。そのせいでいつも、丸ごとフライドチキンを乗せただけのピザを作っていた。再現が簡単で、儲かるし(材料費が高い=利益率が高い)、評価も良かったからね。
それに、トマトソースを均一に塗ったピザが何も塗ってないものより評価が高いのには間違いなく気づいていた。おそらく対称性のルールからだろう。ただ、裸のピザは嫌われるというのがハードコードされているだけだと思っていたよ。
翻訳について興味深い点:このゲームはドイツ製で、かなり奇抜さに踏み込んでいる。例えば、ほとんどの人口統計グループには面白くて非常に口語的な名前がついていた。「Grufties」を「Goths」と訳したようだ。ドイツ語でのGruftiの実際の意味(ゴスサブカルチャーのメンバー)を考えれば理にかなっているが、ゲーム内では実際には年配者(ほとんど「Gruft」=「墓」に入っている人々)を指す面白い言い方として使われていた。だから明らかに辞書からそのまま引っ張ってきた誤訳だ。もしかしたら「Cryptid」の方が適切だったかもね。:D
- vintagedave
これこそAI支援記事のあるべき姿だ:AIを使って逆コンパイルし、調査する(記事の冒頭に非常に興味深いテクニックがいくつか挙げられている)が、記事自体は人間が書いている。AIは理解を助けるために使ったのであって、すべてをAIにやらせたわけではないことが分かる。
- glimshe
これは才能あるエンジニアがAIと協力して逆コンパイルを機能させた良い例だ。
中には大量のエージェント時間と費用をかけて力技でやる人もいると思うが、彼らは6.1 Sol Mediumという、優れているが最高性能ではないAIモデル+エフォートを使った。
これは、AIを使う際のタスク速度とコストに才能と経験が大きく影響するという、私が聞いてきたことと一致する。価格の補助金がなくなったら、エンジニアのパフォーマンスを評価する際の重要な要素になるだろう:「たくさんトークンを使ったのに、大した成果がないじゃないか!」
どこに落ち着くかは分からないが、才能+AIは依然としてバイブ仕事に大きく勝る。
- fredrikholm
> モールの割引ゲームの中から選んだのに、それ以来ずっと私の精神から離れない。
これは私がお気に入りのPCゲームのほとんどを見つけた方法でもあり、このゲームもそうだ。
よく、垂直なメッシュの円柱に非常に手抜きの看板が貼ってあり、価格だけが書いてあるようなものがあった。何層もの任意のゲームを掘り進めなければならず、驚くほど頻繁に本物の宝石を見つけたものだ。
あの時代の最高のゲームのいくつかが、同じ時代の最悪のゲームと同じくらい人気だったことに気づいたのは、思春期の私にとって目から鱗だった。
記事をありがとう、本当に魅力的な読み物だった!朝の良いスタートになった。
- Scaevolus
生の近似逆コンパイルコードをSQLiteに読み込むよりも、MCPアダプター経由のツール呼び出しでGhidraを直接使う方が良い結果が得られるだろう。これは、vtableを使った複雑な間接ジャンプパターンのようないくつかのケースで分析トレースが失敗する場合に特に重要だ。Xrefやパターン検索はもちろんネイティブにサポートされているし、メモリスナップショットも読み込める。
シンプルな「/goal このコードベースを分析し、各関数に名前を割り当て、パラメータ用の名前付き構造体を作成する」という指示は、かなり弱いエージェントでもうまく機能する。大量のテキストを解析するのは彼らの得意分野だということを忘れないでください!
この設定は、PS2やN64など、より動的なコードローディングを伴うよりエキゾチックな非x86アーキテクチャでも機能する。