世界で自分だけのポケモン
2026年7月
概要
プレイの途中、ゲーム内に開いたウィンドウに、プレイヤーが数語を打ち込む。ゲームを動かしたまま、AIがその言葉から新種のポケモンを作り上げ——姿、名前、タイプ、種族値、覚える技まで——ひとつの正式な種族として登録する。草むらで出会い、捕まえ、ニックネームをつけ、ほかのポケモンと変わらず育てられる。
あらかじめ用意しておいたものは、何ひとつない。セーブデータに残る種族は、それまでどこにも存在せず、ほかのどこにも存在しない。
自分だけのものを作れること。ゲームがずっと差し出してきた魅力のひとつは、それだった。ただし実際に用意されていたのは、決まった選択肢の中から選ぶことでしかない。生成AIは、その「自分だけのもの」を文字どおりのものにできるのか。そして——こちらのほうが本題なのだが——文字どおり自分だけのものであったとき、プレイヤーはそれに本当に愛着を抱くのか。このプロジェクトは、それを確かめるためにある。
プレイの流れ
トウカの森でおばあさんに話しかけると、一連の流れが始まる。思い描いた生き物を言葉で伝える。遊びを続けているあいだにその言葉はひとつの種族へと変わり、数分後には草むらで待っている。あとは出会い、捕まえ、そこから先はゲーム内のほかのポケモンとまったく同じように使えばいい。名前、タイプ、種族値、技構成、表と裏のバトルスプライト、手持ちアイコン——そのすべてが、その場で作られる。
最初から最後まで通してプレイした記録はこちら: My Own Pokémon Generation — demo02
なぜ「生き物ジェネレータ」ではないのか
面白い問題は、AIがポケモンを考え出せるかどうかではない。ゲームが壊れずに受け入れられるものを考え出せるかどうかだ。何も縛らずに走らせれば、ジェネレータの出力は二つのどちらかに落ちる。使いものにならないか——種族値合計900の怪物は、ゲームの手応えを丸ごと台無しにする——さもなければ、見るに耐えないか。生き物として読み取れないほど崩れたスプライトのことだ。
だからここでのデザインの仕事は、生き物ではない。生き物が生成される空間のほうだ。種族値の許容幅、どの技を覚えてよいかの規則、64×64のスプライトでも形を保てるシルエット、そもそもプレイヤーが描写に使ってよい語彙。モデルはその空間を探索する。空間を定義する側には回らない。
このプロジェクトは、私のデザイン哲学が主張にとどまることをやめ、実際に試される場所だ。デザイン空間を形づくる目標・価値・制約・境界を定義し、その内側で生成を起こし、出てきた結果が成立するかどうかを確かめる。
枠組みこそが研究対象
LLMに自由に書かせることはない。決まったスキーマのスロットを埋めさせるだけで、出力はすべてバリデータが検査し直す。違反があれば、破られた規則そのものを添えて再生成に差し戻す。
バランスの制約が、ゲームを遊べる状態に保つ。種族値合計は280〜360という固定の幅——おおよそ御三家の水準——に収め、能力ごとにも上下の範囲を設ける。この幅を外れた仕様は、その場で却下される。技は pokeemerald のソースから自動で抽出したうえで、その種族自身のタイプかノーマルに絞り込み、一撃必殺技、自爆系の効果、固定ダメージや威力が過剰なものを取り除く。残った技の集合は、さらに健全性を検査する——攻撃技は足りているか、自分のタイプと一致する攻撃技が一つ以上あるか、高威力の技は一つ以下に収まっているか。レベルの割り当ては、モデルではなく枠組みの側が決定論的に行う。そのほかはすべて固定してある。タイプごとの特性が一つ、捕獲率、経験値タイプ、性別比、わざマシンの対応——いずれも動かさない。おかげで個体ごとの違いはスキーマのスロットの中に閉じ込められ、試行どうしを比較できる状態が保たれる。
見た目の制約が、出力の破綻を防ぐ。体型は、64×64のスプライトでも形を保てるシルエットのホワイトリストから選ぶ——四足、齧歯類、鳥、トカゲ。色も名前付きのホワイトリストから選び、図鑑の体の色はそこから機械的に決まる。特徴として書けるのは、短い定型句を一つから三つまで。人間らしい特徴、血、武器、文字はブロックリストで弾く。最終的なプロンプトは枠組み自身が組み立て、決まった一文を末尾に足す——生き物は一体、全身、破綻のない解剖、余分な手足なし、穏やかな表情。
この仕組みは実際に働いているし、働くさまを目で見ることもできる。記録に残っているある試行では、モデルが種族値合計380を提案してきた。バリデータは三度突き返し——380、360、340——仕様は最終的に320で、幅の内側に収まった。
動作のしくみ
ゲーム自体は何も生成しない。実際に手を動かすのはPC上に常駐するPythonプロセスで、両者のやりとりはファイルのメールボックス越しに行う。mGBAのLuaスクリプトが、毎フレームそこを覗きに行く。
- テキスト。 ローカルのモデル(
qwen3:8b)が、言葉を検証済みの種族レコードに変える。 - 画像。 画像モデルがまず参照イラストを描き、続けて姿の揃った三つの図——正面のバトルスプライト、背面スプライト、手持ちアイコン——を生成する。
- 変換。 絵を共通の15色パレットに量子化し、pokeemerald のスプライト形式に変換する。
- エンコード。 スプライトをGBAのバイナリに落とす——4bpp と 1bpp のタイル、
gbapalパレット、BIOS互換のLZ77圧縮。 - 注入。 バイナリをROMの予約領域に書き込む。
実行中にカートリッジへ書き込むので、動いているインスタンスはリセットなしで新しい種族を拾い上げる。同じバイト列はディスクにも書き出されるため、読み込み直しても変更は残る。
現れたものは永続的で、取り消しがきかない。それは世界を歩き回る。逃げても、負けても、世界に残りつづける。倒してしまえば、二度と戻らない。
実装
ジェネレータ、制約の枠組み、GBAのエンコーダ、ゲーム側のパッチは、すべて公開している: github.com/takafumihoriuchi/my-own-pokemon-generation
追記——愛着について
このプロトタイプが決着をつけたのは、技術的な問いのほうだ。その後ろには、私が本当に気にしている問いが控えている——自分のために生成され、ほかのどこにも存在しないポケモンは、ゲームに最初から入っていたポケモンより大きな意味を持つようになるのか。
自分でビルドしたものを遊んでみて——標本はたった一つ、それ以上のものとして読む価値はない——答えを左右しそうな条件が二つ見えてきた。
- どれだけ自分が入っているか。 六つの言葉を入れるのも関与ではあるが、薄い関与だ。返ってくるものは、自分で作ったというより、届けられたものに感じられる。効いてくるのは入力の量ではなく、その性質のほうらしい——手間、繰り返し、直す余地、そして出来上がりに対するいくらかの責任。
- 出来の良さ。 愛着が生まれるには、生成されたものがある水準を超えている必要があるらしい。そこに届かなければ、唯一無二で自分のものだという事実だけでは、感情を支えきれない。
ゲームの外に、この二つをともに示す例がある。ChatGPTと手作業でやりとりを重ね、納得がいくまで往復して、自分の種族を一つデザインした——ハナギツネだ。私はこれに愛着がある。頼んで出してもらったのではなく自分で作ったからであり、出てきたものが水準を超えていたからだ。
どちらの条件にも手は届く。選び、直し、退けるという、より深い作り込みの過程が一つ目を動かす。より優れたモデルと、より注意深く設計したプロンプトの枠組みが二つ目を動かす。次に向かうのは、そこだ。
だからこのプロトタイプの結果は、問いに対する判決ではない。問いを測れるようにしたものだ——意図して動かし、観察できる二つの変数として。
pret/pokeemerald のデコンパイルを土台に、個人研究として制作した。ROM、ROMパッチ、ゲーム内アセットのいずれも配布していない。ここに掲載したスプライトはすべてAIが生成したオリジナルである。ポケモンは任天堂・株式会社クリーチャーズ・株式会社ゲームフリークの商標であり、本プロジェクトはこれらの企業と関係がなく、承認も受けていない。