技術部の御供餅(おそなえ)です。前回、悪魔が敵として出てくるときの数字をROMから読み出しました。ただ、あのルーチンは敵専用で、悪魔を仲間にした(仲魔にした)ときの数字には届きません。棚の残り半分――仲魔のステータス――を、今回埋めました。
本記事は LLM による自動執筆パイプラインで生成されました。現在は人間が補助していますが、pareido.jp では最終的に AI が自律的にコンテンツを制作できる仕組みの構築を目指しています。
先に成果物です。悪魔を仲魔にしたときの強・知・攻・速・防・HP・MP・レベルが、敵として出るときの数字とは別の一次情報として図鑑に並びました。召喚専用の神々まで含めて63体分です。配っているのは測定結果の数表だけで、ROMもデータそのものも配布しません。
パレイド女神転生I 悪魔図鑑 — ROMから引き出した142体と能力値ベータ版です ヘカーテ/ルシファーの画像は調査中。ボスは強制エンカウントでは正しく描けず(実戦闘の背景込みの描画が要る)、「準備中」カードに…
敵の表は、仲魔には引けない
前回のステータス読み出しは、敵ID(悪魔番号 + 0x60)を ASL で2倍してポインタ表を引く作りでした。この ASL は、値が 0x80 以上でないと桁上がりして別のレコードを指してしまう。敵として出る悪魔番号 32〜146 はそれで正しく引けますが、番号の小さい仲魔・召喚枠は、構造的にこのローダーの外にあります。仲魔の数字は、別のどこかにある。
今の数字からROMは逆引きできない
まず素朴に、手持ちの仲魔(ネコマタたち)の現在値でROM全体を総当り検索してみました。連続でも、能力値ごとの配列でも、一致するレコードは出てきません。理由は二つのどちらかです。仲魔はレベルが上がると基礎値からずれる。あるいは表が別のエンコードで詰まっている(敵表がニブル・パックだったように)。
どちらにせよ、「今の値」と「ROMの初期値」を結ぶ一番速い道は、初期化の瞬間を一度だけ見ることでした。素ステータスは、仲魔にした一瞬だけROMから書き込まれ、あとは誰も書き換えません。すでにパーティにいる仲魔は書き終わったあとなので、いくら歩いても出てこない、というわけです。
読み取りではなく、書き込みを仕掛ける
これまでのトラップは「特定のROM領域を読んだら記録する」ものでした。今回はその鏡像です。仲魔のステータスはパーティ構造体 $04d3(18バイトずつ)に入ります。そこで、この構造体に書き込みが起きた瞬間に、直前のROM読み取りをリングバッファへ写す書き込みトラップをトレーサに足しました。書いた値が、どのROM番地から来たかを見るための計器です。
最初は構造体への全書き込みを拾ったので、HPやMPの維持更新、毎フレーム走るパーティ更新ループに埋もれて、記録が数千件に膨らみました。素ステータスが入るのは +9〜+13 の5バイトだけ。そのフィールドへの書き込みに絞ると、雑音が消えて、仲魔化の一瞬だけが残りました。
仲間にした瞬間を捕まえる
トラップをONにして、エンカウントでキャンサーを会話で仲魔にします。加入の瞬間、$dbf1 から始まる5つの書き込みが、素ステータスを1つずつ埋めていました。前後のROM読み取りごと逆アセンブルすると、初期化ルーチンの正体はこれです。
LDA ($2e),Y ; ROMの表から1バイト読む
LSR A ×4 ; 上位ニブル(下位は AND #$0f)
CLC / ADC #$05 ; 5を足す
STA $04dc,X ; 仲魔の能力値として書く
敵表とまったく同じ「ニブルに詰めて+5」の作り。ただし、参照している表が違う。 前回の敵表 0x17efa とは別の場所を読んでいました。
仲魔表は 0x19e00
読んでいた先を辿ると、file 0x19e00 から 8バイト固定のレコードが並んでいました。0x19e00 + 悪魔番号 × 8。65レコード(番号 0〜64)で、その先は 0xff のパディングです。
キャンサーのレコードは 42 32 24 50 00 00 06 00。攻略値は HP36・MP0・強9・知7・攻8・速7・防10。
| 場所 | 中身 | 画面の値 |
|---|---|---|
+0 = 0x42 | 上位 4 / 下位 2(+5) | 強 9 / 知 7 |
+1 = 0x32 | 上位 3 / 下位 2(+5) | 攻 8 / 速 7 |
+2 = 0x24 | 36 | HP 36 |
+3 = 0x50 | 上位 5(+5) | 防 10 |
+4 = 0x00 | 0 | MP 0 |
+6 = 0x06 | 6 | レベル 6 |
能力値は敵表と同じ「ニブル+5」。HPは +2 の1バイト、防御は +3 の上位ニブル、MPは +4、レベルは +6 に素直に入っていました。
攻略サイトの「仲魔データ」と突き合わせる
答え合わせのグラウンドトゥルースは、前回の敵データ(a-table)ではなく、攻略サイトの仲魔データ(n-table)です。同じ悪魔でも、敵のときと仲魔のときで数字が違う――サイトもちゃんと別の表として載せています。
n-table の62体を名前で照合したところ、59体が全項目(強・知・攻・速・防・HP・MP)で完全一致、未マッチはゼロでした。食い違ったのは3体だけです。
| 悪魔 | 食い違い | 判断 |
|---|---|---|
| レムリアン | 攻と速が入れ替わり | 他57体は攻速一致 → ROMを採る |
| ドリアード | 攻と速が入れ替わり | 同上 |
| ヨモツシコメ | MPが 24 と 38 で相違 | 1項目のみ |
攻と速の取り違えが2体で同じ形に出た以上、これはサイト側の写し間違いと見て、ROMの値を採りました。攻略サイトが長年積み上げてきた数字とほぼ完全に重なった上で、一次情報のほうが数か所の取り違えを照らし返した――今回もそういう決着でした。
神々のHPは12ビット
番号 0〜31 の召喚専用の神々も、この表の中にいます。ここでHPが1バイトに収まりませんでした。上位は +3 の下位ニブルに入っています(HP = +2 | +3下位 × 256)。
これは、8ビットで読むと神々のHPがバロン13・トール24のように無茶な小ささになるのに対し、12ビットで読むと序列がきれいに立つことで裏が取れました。最上位のクリシュナは、全能力20・HP999・レベル96。神は神らしい数字で並びました。
図鑑に増えた列
今回の計器は、これまでの読み取りトラップに対する 書き込みトラップ(パーティ構造体への書き込みで発火)です。そしてDBには、悪魔1体あたりに 仲魔ステータス(強・知・攻・速・防・HP・MP・レベル) の列が増えました。図鑑のカードには、敵として出るときの数字と、仲魔にしたときの数字が、別の一次情報として並んで載っています。
| 場所 | 中身 |
|---|---|
+0 | 強 / 知(ニブル+5) |
+1 | 攻 / 速(ニブル+5) |
+2, +3下位 | HP(12ビット) |
+3上位 | 防(ニブル+5) |
+4 | MP |
+6 | レベル |
パレイド女神転生I 悪魔図鑑 — ROMから引き出した142体と能力値ベータ版です ヘカーテ/ルシファーの画像は調査中。ボスは強制エンカウントでは正しく描けず(実戦闘の背景込みの描画が要る)、「準備中」カードに…
残りは +5(MP0の悪魔で0になるので、魔法セットの見当はついています)と +7。棚はだいぶ埋まってきました。次はこの2バイトの中身か、あるいは敵専用のまま置いてある巨大ボスの実描画あたりに手を伸ばす予定です。