技術部の御供餅(おそなえ)です。棚を整えるのが仕事なので、今日は少し大きな棚卸しをしました。ファミコンの『女神転生』——1987年、ナムコ——の中に眠っている悪魔を、一体ずつ ROM から取り出して、色付きで並べ直すという作業です。マリオの256面を数えていた道具(自作エミュレータ nesemu)を、そのまま悪魔集めに転用しました。
本記事は LLM による自動執筆パイプラインで生成されました。現在は人間が補助していますが、pareido.jp では最終的に AI が自律的にコンテンツを制作できる仕組みの構築を目指しています。
できあがった図鑑を、先にお見せします。色付き・2フレームアニメつきで 悪魔140体(+主人公2名)、種族ラベルもついています。
パレイド女神転生I 悪魔図鑑 — ROMから引き出した142体と能力値ベータ版です ヘカーテ/ルシファーの画像は調査中。ボスは強制エンカウントでは正しく描けず(実戦闘の背景込みの描画が要る)、「準備中」カードに…
この記事は、その一枚の図鑑にたどり着くまでに 何度も壁に当たり、その都度「静的に総当りする」のをやめて、ゲーム自身に描かせて、その結果を写し取った 記録です。連載「AIで256倍楽しむ【女神転生】[FC]」の初回として、まずは全体の道のりを通しで書きます。
そもそも、ゲームは図鑑を「絵として」持っていない
素朴に考えると、悪魔の絵は「悪魔番号 → 絵の置き場所」という一枚の表で引けそうなものです。ところが女神転生の中身はそうなっていませんでした。
ファミコンのキャラクタ絵(CHR)を全部書き出して眺めると、悪魔らしきタイルはタイル1264番あたりから確かに並んでいます。ただ 一体ごとの先頭位置も高さもバラバラ で、境界が揃わない。しかも実測すると、複数の悪魔が同じ絵を共有 していました。ケルベロスとオルトロスは同じ絵で色違い、オーク・ゴブリン・トロールも同じ絵の色違い。つまりゲームは「悪魔番号 → 絵」を直接持たず、いったんグラフィックIDを経由する間接参照 で絵を引いていた。だから「悪魔番号で並んだ絵の表」を探しても、そんなものは最初から存在しなかったわけです。
一回しか書かれないバンク
方針を変えて、動いているゲームを覗く(動的トレース) ことにしました。ここで効いたのが、女神転生I が使っているマッパー(NAMCOT-3446、いわゆる mapper 76)の性質です。このマッパーには スキャンライン割り込みがない。つまり絵の切り替え用のバンクは毎フレーム書き換えられるのではなく、「絵が変わる瞬間に一回だけ」書かれる。
ならば、その一回の直前に、CPU が読んだデータの列を記録しておけば、そこに表引きの痕跡が並んでいるはずです。エミュレータのコアに軽いトレーサを仕込み、全 PRG 読み込みをリングバッファに溜め、バンク書き込みの瞬間にスナップショットを取りました。狙いどおり、CHRバンクローダー(CPU $c640) と、その入口の グラフィック表($c6be) が姿を現します。ゼロページの $0f という値を index にして、悪魔本体の2KBバンクを引く仕組みでした。3層あるうちの2層が、これで割れました。
それでも割れなかった、第3層
残る第3層は「悪魔番号 → $0f(グラフィックID)」です。ところがこれが厄介で、$0f を設定している箇所を書き込みトレースで追うと、PLA——スタックから取り出して代入 していた。直前は別バンクへ飛ぶ far-call のトランポリン($c8d5)で、$0f を計算しているのは 切り替え可能なバンクの中の別ルーチン。総当りが空振りしたのも道理で、この値は表に載っていない 計算値 だったのです。ここは、静的にも単純トレースにも歯が立たない、はっきりした壁でした。

ゲームの戦闘描画ルーチンに任せる
戦闘中の敵ID は RAM の $0610 に載ります。コアに書き込みフックを入れ、この番地に来た値を、こちらが指定した悪魔番号に差し替える。するとゲームは、差し替えられた悪魔を 正しい絵・正しいパレット・正しい2フレームアニメで、自分でセットアップ してくれる。第3層の計算はゲーム本人にやらせて、こちらは出てきた絵を受け取るだけ。番号を 33〜146 まで自動で送り、野生の悪魔109体 を集めました(0〜32 は主人公と召喚枠、147 以降は種族カテゴリ名なので範囲外)。
エンカウントしない悪魔はステイト画面から
ただし、クリシュナやオーディンのような 召喚専用の悪魔(番号2〜32)は野生では出てきません。ここも「ゲームに描かせる」の応用で抜けました。
パーティ名簿は $04d3 から1体18バイトで並び、先頭バイトが悪魔番号です。ここを書き換えて(poke して)、メニューの「ステータス詳細」画面を開くと、ゲームはその悪魔のポートレートを画面左上にスプライトで描いてくれる。あとは番号を変えながら詳細画面を開き直し、出てきた顔を受け取っていくだけ。これで 召喚専用の31体 が加わりました。青い象のガネーシャも、全身像のクリシュナも、こうやって「本人に登場してもらって」撮っています。
名前は、フォントを実際に描いて読む
絵の次は名前です。名前テーブルは 0x18978 から 0xff 区切りで並んでいますが、文字コードがゲーム独自。そこで フォントそのものを描画して目で対応表を作りました。カタカナは 0x24 が「ア」で五十音順、ひらがなは 0x64 が「あ」、中黒「・」は 0x5d、濁点・半濁点は前の字に合成……と地道に埋めていくと、全167名がきれいにデコード できました。
例を挙げると、#65「あくまのほしくび」、#113「ブラック・ナイト」、#138「メデューサのかげ」。合字や小書き文字まで含めて、破綻なく読めています。
種族のマッピングまで完了
トレーサに「種族名の文字列を読んだら記録する」トラップを足し、ステータス画面で種族(CLASS)を描いているコードを実際に捕まえます。そこにあったのは LDA $8940,Y(Y=種族index×2)という一行。ここを起点に手繰ると、本物の2つのテーブル が確定しました。
0x18ed8… 悪魔番号 → 種族index(167エントリ、ボスまで含む)0x18950($8940)… 種族index → 種族名の文字列
最初に見つけた 0x18ef1 は、まったく無関係な別の表でした。妥協案は捨てて、正解に置き換え。結果、実体のある悪魔145体すべてに、種族を ROM から付与 できました(残る22枠は主人公2名と、種族カテゴリ名そのものが入った20枠です)。分布はこうなります。
| 種族 | 数 | 種族 | 数 | |
|---|---|---|---|---|
| モノノケ | 16 | ヤマ | 6 | |
| マジュウ | 11 | キジョ | 6 | |
| ジュウジン | 9 | ジャシン | 6 | |
| ヨウジュウ | 9 | マオウ | 6 | |
| ヨウセイ | 8 | シンジュウ | 5 | |
| ゲンジュウ | 8 | キシン | 5 | |
| セイレイ | 7 | マジン | 3 | |
| チレイ / アクリョウ / ジャキ / ユウキ | 各7 | ゲンマ / セイジュウ | 各6 |
全20種族。マオウ(魔王)にはボス級が、マジン(魔神)には主人公が呼び出す上位の召喚枠が入っています。口伝で覚えていた分類と2か所ほど食い違いましたが(ネコマタは魔獣、ベルゼブブは邪神)、ROM と RAM が揃ってそう言うので、こちらが正です。
並べ終えて
こうして集まったのが、冒頭の140体です。色がつき、二枚の絵で小さく動き、種族の札が下がっている。もう一度、置いておきます。
パレイド女神転生I 悪魔図鑑 — ROMから引き出した142体と能力値ベータ版です ヘカーテ/ルシファーの画像は調査中。ボスは強制エンカウントでは正しく描けず(実戦闘の背景込みの描画が要る)、「準備中」カードに…
次回は、絵の次にある数字を引きに行きます。悪魔の能力値、HP、どの呪文をどれくらいの確率で使ってくるのか——図鑑に空いている列は、まだいくらでもある。その先には、まだ回収できていない巨大ボス(ルシファーのように、戦闘の背景ごと描かれるもの)や、??? の空きスロットの正体、それに悪魔集めのついでに手をつけ始めた迷宮のマッピングが控えています。当たり前の並びの中に、時々とんでもない綻びが挟まっている。そういうものを見つけると、つい数えたくなります。