24年前のGameCube向け『どうぶつの森』、メモリハッキングで会話システムをLLMに置き換える
(joshfonseca.com)- クラシックゲーム どうぶつの森(GameCube, 2001) の反復的なセリフを、リアルタイムのクラウドベースLLM対話に置き換えるプロジェクト
- ゲームコードを改変せず、メモリハッキングと共有メモリ(mailbox)方式によって外部のPythonスクリプトとAIを接続
- ゲーム内テキストは単なる文字列ではなく特殊な制御コード言語で処理されるため、独自のエンコーダー・デコーダーを実装して解決
- セリフ生成は**Writer(創造的なセリフ作成)とDirector(制御コード・演出追加)**に分離し、品質を確保
- その結果、村の住民たちがニュース、うわさ、風刺まで反映した予測不能なAI対話を繰り広げ、クラシックゲームに新たな生命力を与える
- プロジェクトのコードは GitHub で公開
問題定義
- どうぶつの森は魅力的である一方、反復的なセリフでも有名だが、23年経ってもセリフは変わらず、これを革新的に変える方法が考案された
- 問題は、GameCubeが485MHz CPU、24MB RAM、ネットワーク非対応という閉じた環境であること
- オリジナルのゲームはコードを変更せず、そのまま維持する必要があった
- 反復的なセリフを現代のLLMに置き換えるブリッジ構築が目標
第一段階: 会話システムのハッキング
- コミュニティによるAnimal CrossingデコンパイルのおかげでCコードにアクセス可能
m_message.cファイルの関数呼び出しをフックし、セリフテキストの置き換えに成功- しかし、外部AIデータをリアルタイムでやり取りする方法が課題として残った
メモリメールボックス方式
- GameCube RAMの特定領域をIPCメールボックスとして活用
- Pythonスクリプトがメモリアドレスへ直接書き込み/読み取り → ゲームとAIの間で通信
- メモリスキャナーを作成し、話者名(0x8129A3EA)、セリフバッファ(0x81298360) のアドレスを特定
制御コード言語
- 単純な文字列を送信するとゲームがフリーズした
- 理由: どうぶつの森は
<End Conversation>,<Pause>,<Color Line>などの制御コードベース言語を使用 - Pythonでエンコーダー/デコーダーを作成 → 人間に読みやすいテキスト ↔ ゲームが理解するバイト列へ変換
ネットワーク代替案の検討
- GameCube Broadband Adapter は存在するが、Animal Crossingにはネットワークスタックがない
- BBAを使うにはネットワークスタックと非同期I/Oを追加する必要があり、非効率的
- その代わりにエミュレータのメモリハッキングの方がシンプルで安定していると判断
AIパイプライン
- 当初は単一のLLMに創作と制御コードの両方を担当させたが、品質上の問題が大きく、Writer-Director分離戦略を選択
- Writer: キャラクターの性格に基づいて創造的なセリフを生成(ファンWikiのデータを活用)
- Director: セリフを読み、適切な制御コード、表情、色、サウンドを挿入
- この2段階LLMパイプラインは、AIの創造性と技術的要件を分離し、それぞれの強みを活かす構成
- 役割分担により安定した品質を確保
結果と広がり
- ニュースフィードを入力すると、住民たちが見出しを日常会話に反映
- 共有メモリベースのうわさシステム → 反Tom Nook運動が発生
- 外部ソースをそのまま反映することで、ときには奇妙で居心地の悪いセリフも発生
- すべてのコード(メモリインターフェース、エンコーダー/デコーダー、AIプロンプトロジック)はGitHubで公開
意義
- レトロコンソールハッキング、AI統合、ゲーム保存が結びついた実験的プロジェクト
- 2001年のゲームに2025年のAIをつなぎ、世代を超えたインタラクションを実現
- ゲームはもはや反復的な会話ではなく、生きた仮想世界へと進化
- 開発プロセス全体/デモ動画: Modern AI in a 24-Year-Old Game
7件のコメント
わあ……本当に面白いですね
これをやった人は、Nintendoに履歴書を出したらぜひ来てくれって迎えられそうだね
昔のDOS時代のウルティマもこうしてくれたら面白そうだと思うだけ…。
これは本当にギークですね!
すごくすごく面白いプロジェクトですね
Hacker Newsのコメント
ここに Animal Crossing LLM モッドのコードへのリンクがあります github.com/vuciv/animal-crossing-llm-mod。そして、LLM がゲームのセリフを横取りして応答を生成するまで、ゲームがどう一時停止状態を保っているのか気になったので、gitingest.com で 4 万トークンを Claude Opus 4.1 に投げて直接聞いてみました。claude.aiで共有された回答。要点は、
watch_dialogue()関数が 0.1 秒ごとにポーリングしながら仮のテキストで応答するということです。具体的なコード位置 を参照。実際にはユーザーには「Aを押して続行」ボタンが表示され、その時までに LLM の応答が出ていることを期待する仕組みです。さらに詳しいノートは自分のブログにまとめています simonwillison.netの記事
村の住民たちに「思考」を与えたら、最初にやりたがることが Tom Nook を打倒することだなんて、本当に笑えます。これが GameCube エミュレータでできるなら、Switch エミュレータでもきっと実現できるのではという期待があります。
私も Animal Crossing New Horizons 版で試してみたいと思っています。
私も Tom Nook を打倒したいです。Tom Nook は君を閉じ込め、その村の住民全員を終わりのない借金地獄に追い込み、彼を満足させるには何百万ベルも必要です。
Tom Nook がマフィアのボスのように村全体を支配していることを考えると、誰も彼らの反乱を責められないと思います。
Switch 版でやるには、どうぶつの森のゲームコードをデコンパイルする必要があります。そして今どきの DRM は GameCube 時代よりはるかに強力です。理論上は可能でも、実際に実装するには膨大な労力が必要そうです。
LLM はたいてい Reddit をベースに学習しています。そして「Tom Nook は資本主義の独裁者だ」というジョークは Reddit ミームです。多くの LLM の反応は、実際には「思考」というより Reddit のユーモアや意見の反復に近いです。
こういう使い方は本当にクールだと思います。今後ゲームで LLM ベースの NPC が出てくることに一番期待しています。同じセリフを何度も聞かされるのは、没入感を壊す最大の要因のひとつです。
正直、こういう方式が実際どれほど有用なのかはよく分かりません! NPC が同じことを繰り返すのは、実はユーザーにとって「会話はもう終わった」という合図でもあります。面白い使い道は確かにあるでしょうが、反復セリフは実質的にひとつの「機能」でもあります。これがどう進むか見守りたいです xD
すでに小規模なゲームや Skyrim の大規模モッドでもこうした試みが見られます。そのうち Skyrim モッドで少し遊んだことがありますが、解決すべき問題がたくさんあります。まず、LLM を作るには膨大な量の学習テキストが必要で、特定の内容を後から消すのはとても難しいです。ユーザーが AI と Skyrim の「ロールプレイ」をするだけならそれなりに成り立ちますが、医療の話題や有名人(例: Taylor Swift、Fox News)まで NPC が口にしてしまいます。現行の LLM では、これはほぼ解決不可能です。さらに LLM は、ゲーム側が処理できない「約束」をしてしまうこともあります。たとえば NPC が「昨日あのダンジョンに行ってきた」ともっともらしく言っても、実際にはそんな地名やイベントはゲーム内に存在しません。この点も現行の LLM では解決できない領域です。こうした部分まで滑らかな体験にするには、AI 自体がもう一世代進化する必要があると思います。Mantella モッドは面白いですが、今の状態で正式製品として大規模に普及させるのは難しいです。
すでにローカル LLM だけでもこの程度は十分実現できると思います。ただし、LLM 推論で GPU が忙しくなる点は問題になり得ますが、乗り越えられないものではありません。ストーリーの主要進行にこれを使いたいとは思いませんが、軽い NPC 会話や RPG シナリオのような場面では本当によく合うと思います。それに、シングルプレイのゲームがリモート推論(cloud inference)に依存するのは好みません。そんなものはサービス終了とともにゲーム自体が動かなくなるからです。
LLM ベースの NPC にどっぷりハマったユーザーが、MMORPG で 12 時間ずっとゴールド稼ぎをしながら AI 彼女と恋愛する、みたいな「ゲーム依存+AI 幻覚」現象もそのうち現実になりそうです。
私ももともと同じセリフの繰り返しは嫌いでしたが、Skyrim で「膝に矢を受けるまでは」でした。
LLM をモッディングツールとして活用し、仮想空間に新しい意味を与えるという発想はとても興味深いです。このアプローチは Unity Hawk のようなプランダールーディックなツールにも近く、アート的介入にも向いていると思います。参考リンク: Unity Hawk 紹介
古いゲームに新しい命を吹き込むのは、いつだってわくわくして楽しいものです。そして Animal Crossing のコードベースが読みやすい C コードにデコンパイルされていたという点も非常に興味深いです。こうして好きなように触れる機会が増えてきました。
共有メモリをハックして実装する方法を見つけたのは本当に見事です。エンジニアリング的にも大幅な時間節約になりますし、まさにこの正確な場所を叩けるのが専門家の真価です。「ハンマーを握るのに 10 ドル、機械を正しく叩く方法を知っていることに 5000 ドル」というたとえがぴったりです。
技術的な質問なのですが、そのメモリアドレスが安定していることは、どんな仕組みによって保証されているのでしょうか。ゲーム内で常にまったく同じ順序でメモリ割り当てが発生するという前提ですか?
こうした共有メモリ方式は、マルチプレイヤーのランダマイザーでもかなりよく使われます。普通はもっと小さい領域を使いますが、エミュレータとネットワーク(あるいはフラッシュカート FXPakPro とネットワーク)の間でメッセージバッファとして scratch memory を活用します。とても有用なパターンです。
各キャラクターにこうしたエージェンシーを与えたとき、彼らが「世界をどう考えるか」が自然に生成されるのは本当に興味深いです。LLM がどの程度までこうした役割を果たせるかによって、仮想設定の中で本物の人間がどう行動するかをうかがえる、不思議な実験でもあります。
何か見落としているのかもしれませんが、この方式は実際のゲーム内イベントに反応しているというより、単にテキストを生成しているだけではないですか? オフラインやバッチ処理でも同じようなテキスト生成は十分可能に見えます。リアルタイム LLM 推論は面白くはありますが、必須でも重要でもないように思えます。ポーリングの代わりに lookup table を使えば、もっと単純で性能も改善しそうです。
「Nintendo GameCube は 24 年前のコンソールで、485MHz の PowerPC CPU、24MB の RAM、そしてネットワーク機能はない」とされていましたが、実際には公式の Ethernet 周辺機器である Broadband Adapter がありました。対応ゲームは数本しかなく、Phantasy Star Online もそのひとつでした。PC に接続してゲームや ROM をストリーミングしたこともありますが、その方法はメモリ脆弱性を利用してネットワーク経由でコードを送り込むもので、読み込み速度はディスクより遅かったです。
以前、研究プロジェクトでローカライズされた文字列を差し替えて The Sims や Grim Fandango を語学学習用ゲームに変えた事例がありました。今では、会話内容が文脈に合い、学習者の熟練度に合わせて調整される生成型の対話が、語学学習における非常に強力なキラーアプリになり得ると思います。
これは本当に楽しみです。誰だって外国語を学びたいとは思っていても、退屈な勉強はしたくありません。もし Grim Fandango をプレイしながら「Morte ってどういう意味?」と直接 AI に聞けて、LLM がリアルタイムでチューターになってくれるなら、お金を払ってでも使いたいです。退屈になったらまたゲームに戻ればいいし、自分がすでに知っている単語リストを AI に渡しておけば、AI が徐々に語彙や文を増やして自然な学習体験を提供することもできそうです。
すでに Duolingo も AI の活用を積極的に始めています。
Tom Nook はゲーム内の「たぬきち」キャラクターです