文化財修復ってこんな感じなんだろうか。
過去内容は伝説のスターブロブ2様に提供済み (没テキストの件/没画像の件)
先週は「いくぞーのつもり」と近い内部番号のものを片っ端から鳴らして没サウンドの発掘を試みました。今回はパネルでポンGBの操作キャラ変更っぽい設定項目を見つけたので、それに紐付いたサウンドを鳴らしてみました。
設定項目というか、変更用のメニューは用意されていないのですが、CEC0の値を変えると変わるようです。
「いくぞーのつもり」を含めて全13種、たぶんストーリーへの登場順です。mp3ファイル置いときます。
「前景用・背景用が各7で計14パレット」って書きましたが、よく考えたら0番から7番までだから各8の計16パレット, 背景用8個×4色+前景用8個×3色(+透明)の計56色でした。訂正。
顔は対称になるだろうとの推定に基づき、それっぽいパーツを再配置してみました。
この画像のサイズは160×88で、これはステージクリアのジムリーダーの絵と同じ、ゲームボーイの画面横幅にぴったり収まるものです。
頭部、モンスターボールと建物は、前景用タイルとして別に存在します。「動かすため」というよりは色数の都合が大きいように思いますが、別で重ねて表示させる
という推測にはかなりリアリティがありそうです。
没じゃないデータをよく観察することでデータ構造への理解を深めれば、より没データの捜索・解釈がはかどるのではないかという仮説を立てました。
で、ポインタテーブルのようなものを見つけました
56 49 4A - 圧縮済み前景タイル FD 41 4A - 圧縮済み背景タイル 6A 4C 4A - 背景構成図 60 4D 4A - 不明 AA 4D 4A - パレット E2 4D 4A - パレット A7 4E 4A - 不明 (7B) AE 4E 4A - 不明 1C 4F 4A - 不明 (7B) 23 4F 4A - 不明 1A 4E 4A - 前景構成図
タイルとパレットとの対応関係や背景・前景の構成図は画像と同じ方式で圧縮されているようです。
画像以外のデータ圧縮も同じ方式らしいので、tcrf.netで制作されたデータ解凍プログラムを改造し画像以外も抽出できるようにして、それをゲームボーイカラーのVRAMシミュレータに繋げてみました。
調整不足なので性能も操作性も酷いもんですが、色々分かってきました。
とりあえず解凍してみて、解凍後のサイズなどから何のデータなのか推測するという方向性で調査を進めます。
データの種類 | 展開後 サイズ (単位: byte) |
詳細 |
---|---|---|
タイル 画像 |
16×タイル数 |
4階調(=2bit)×8×8マス = 128bit = 16bytes |
BG マップ |
|
具体的には320 (=0x168), 576 (=0x240)バイトが多いです。 GBではシステム上256×256マスの背景データを保持することができて、その中から任意の部分を切り取るように表示を行います。"32"という数字は、このシステム上の背景の横幅に由来します。 しかし、パネルでポンで横スクロールをするシーンはほぼありません。オープニングのアニメーションでほんの少し使われている程度ではないかと思います(メニュー画面などの背景のモンスターボールはタイル画像を書き換えることでスクロールっぽく見せており、システムの機能は使っていません)。そういうことで、大部分のグラフィックは実際の画面の幅160px丁度で制作されており、余分な部分をカットした状態で保存されているものが多いです。 このデータの中身は、タイル番号をひたすら並べて記したものです。たいていの場合連続して1個ずつ値が増える部分が含まれます。 |
BG 属性 |
タイルを反転表示するかどうか、どのパレットを使って着色するのか、といった属性データが、BGデータと丁度同じ長さだけ存在します。BGデータの直後にペアで記録されていることが多いです。 |
|
パレット | 8×n |
GBCの色データは赤・緑・青が各5bitずつ、計15bitですが、最上位ビットは使われません。つまり最大値は7FFFですが、GBはリトルエンディアンなので、"FF 7F"のように下位ビットが先に記録されています。 この2バイトデータを4つまとめたものがパレットです。2バイト目が80h未満のデータが16~64個連続する場合はこれを疑います。 前景用・背景用がセットで連続して記録されている場合が多いです。 |
それで、どんなデータか見当を付けたら、それをシミュレータに突っ込んでみます。
没データを発掘する上で役立つかもしれない知識ですが、たぶん面白くはないので読み飛ばし推奨です。特に, 小さい字の部分は役にも立ちません.
タイルは8000hから97FFhまでに格納されます. 8000hから87FFhまではOBJ専用で, 9000h以降はBG専用, 8800hから8FFFhまでは共用です. 正確には, 9000h以降をBG専用として使うことができるだけで, 87FFh以前をBGで使えないわけではないのですが, このゲームでは9000h以降を使うモードになっています.
タイル番号は, タイルの保存先アドレスに対応します. 16進数表記で「XYY0」に格納されたタイルの番号はYYになります.
なお, タイルの保存先は2バンクを切り替え可能で, 両バンクのタイルを同時に呼び出すこともできます. どちらのバンクから呼び出すかは属性データの一部として指定します.
ゲームボーイの画面は, 大別してBGとOBJの2種類で構成されます.
BGはタイルを隙間無く敷き詰めたメインの画像データで, OBJはそれに重ねて表示させるタイルです. 分かりやすいように背景と前景と呼びたかったりするのですが, 背景の後ろにOBJを置くこともできるので, 必ずしも前・背の関係は成り立ちません。(ちなみに, その場合BGの背景色が透過します) BGと同じ形式のデータを強制最前面表示にする「ウインドウ」という機能があったり、背景タイルの一部分だけ強制最前面に描画するような属性指定もあったりして, この辺の概念はちょっとややこしいですが, とにかく2種類あります.
BGに使うタイルの番号を書き連ねたものを, BGマップと呼びます. 32×32の方眼紙上に使うタイルの番号を埋めていくイメージで, 方眼紙上での位置が画面上での位置に対応します. このマップはアドレス9800hまたは9C00hのバンク0に格納されます.
同じアドレスのバンク1に, 同じ要領でタイル属性を書き込みます. 方眼紙が2枚重なっていて, 1枚目にタイル番号・2枚目の同じ位置にそのタイルの属性を書き込むわけです.
OBJは、(Y座標, X座標, タイル番号, タイル属性) 4バイト1セットのデータとして, FE00hからFE9Fhまでに格納されます. このデータはOAM (Object Attribute Memory = オブジェクト属性メモリ) と呼ばれます. 同時に使用できるOBJは最大40個です.
OBJはタイル1枚ずつ表示するモードと, タイル番号2nと2n+1のタイルを縦に連結して表示するモードがあります.
色のあるよろこび。
GBCの液晶はちょっと特殊で、一般的なディスプレイと少し発色が違うのですが、その辺の補正方法をあまり良く知らないので、データ上の値をそのまま書き出しています。実際のゲームボーイカラーでは全体的にもう少しマイルドな色になると思われます。3DSのバーチャルコンソールでもその辺は無視しているらしいので、3DS画質だということにしといてください。
(サイト追記⇒画像は数枚にまとめて、順番を少し変えさせてもらいました。)OAMデータが見つからなかったため、OBJは疑問の余地がないもののみ推定で合成し、微妙なものは無視しています。単に合成に疲れたという説もあります。横幅が画面の半分サイズ(80px)のシリーズのリップの合成に失敗してたり。
80pxシリーズのBGデータは、一部が黒く欠けている状態で記録されているものが多いです。ここにはOBJ用タイルが合成表示されるのですが、このタイルは透明色が主線となっていて、背景が黒いことを前提に作られています。
ほとんどがタイルデータ2枚→BGマップ・属性→パレットの順に並んでいました。タイルのロード先は、BG用1枚目の先頭が8800h, 同2枚目の終端が97FFhになるケースが多く見られましたが、一部OBJ用タイルとBG用タイルの1枚目が同居しているケースがあり、そのような場合は8600hにロードするとうまくいきました。
データはほぼすべて圧縮されていましたが、パレットデータは非圧縮のものもありました。
F0000hおよびF4000hからはタイルデータばかりが連続して記録されていますが、これに対応するマップやパレットもまた同種のデータ同士が連続して記録されていました。
画像先頭アドレス | マップ/属性先頭アドレス | パレット先頭アドレス |
---|---|---|
F0000h | FCD9Fh | FD5A6h |
F4000h | FB674h | FD9FCh |
ジルバとカインのFINAL的な画像、データ通りに組み立ててみたらHPバーっぽい空きができました。戦う前のシーンではなく、戦っている間に右側に表示されるイラストだった説が濃厚です。残念ながら色は分からず。
横80pxシリーズのサナトスは、画像とパレットデータはあったのにBGマップが存在しませんでした。
タイトル画面など残念ながら色データを見つけられなかったものもいくつかあります。見落としなのか、ポケモンで上書きされてしまったのか...?