ロックマンエグゼシリーズで共通のスプライトデータ構造に関する解説記事です。
英語得意な人いたら加筆お願いします。



スプライトのファイル構成


[ヘッダー]
[アニメーションポインタ]
[アニメーションデータ]
[グラフィックデータ]
[パレットデータ]
[ミニアニメーション]
[OAMデータ]


[ヘッダー]

ヘッダーは4バイトのデータで、変更してもスプライトデータには影響しない。

0x00: スプライト内にある最も大きいタイルセットのタイル数?
0x01: 定数0x00
0x02: 定数0x01
0x03: アニメーションの数

[アニメーションポインタテーブル]

各ポインタは4バイトのlong値で、アニメーションデータの位置を示す。
1つめのポインタが示すアニメーションのアドレスまでがアニメーションポインタの領域として処理される。
このテーブルの開始アドレスが以降のポインタの基点となる。

スプライトデータの例


[アニメーションデータ]

アニメーションデータは1フレームあたり20バイトで、各4バイトのパート5セットで構成されている。

パート1: グラフィックサイズへのポインタ

ロードするグラフィックデータのサイズがあるアドレスへのポインタ。
このポインタが示すサイズ情報の直後にグラフィックデータ(タイルセット)が続く。

パート2: パレットサイズへのポインタ

ロードするパレットデータのサイズがあるアドレスへのポインタ。

パート3: ミニアニメーションへのポインタ

詳細不明。

パート4: OAMデータポインタへのポインタ

OAMデータへのポインタがあるアドレスへのポインタ。
このポインタが示すアドレスにある値はほとんど0x00000004(4バイト先にOAMデータが続く)。
顔アイコン(Mugshot)は通常のスプライトに比べて多くのポインタを使用している。

パート5: アニメーションタイプデータ

フレームの遅延とアニメーションタイプを決定する2組の2バイト(16bit)のデータ(00XX 00YY)。
00XX: XXはフレーム遅延の値である。(毎秒60フレーム)
00YY: YYはアニメーションタイプである。
  • 00 = アニメーションを再生(フレーム遅延の値だけ表示し次のフレームに移る)
  • 80 = アニメーションの終了(アニメーションはこの値によって終了する必要がある)
  • C0 = アニメーションのループ (この値を持つフレームは再生したあと最初のフレームに戻る)

[グラフィックデータ]

グラフィックデータ(タイルセット)の先頭にはグラフィックデータのサイズを示す4バイトの値があり、その後にそのサイズ分のグラフィックデータが続く。
グラフィックデータは1ピクセルを4ビットで表現する(つまり1バイトで2ピクセル)。

タイルセットの例。見やすさのために並び替え、パレットを適用している。

[パレットデータ]

パレットデータ領域は、1パレットあたりのサイズを示す4バイトから始まる。
パレットデータは16色からなり、最初の色は透過色である。
1色あたり2バイト(16bitのBGRカラー)で表現される。
サイズ情報の後にパレットデータが複数続くが、これらがポインタによって直接指定されることはない(OAMデータが持つインデックス番号で指定される)。

[ミニアニメーション]

滅多に使われていないのでジャンクデータと思われていた。
会話用のグラフィックで使われているらしい。
詳細は元記事を参照。

[OAMデータ]

どのタイルをどのような形に並べるのか、何番目のパレットを使用するのか、
どこに描画するのかなどを決定するデータ。
各OAMは5バイトのデータで構築されている。
タイルは1枚あたり8x8(px)の画像データ。

0x00: 開始タイル番号。グラフィックデータ内のどのタイルから構築するのかを設定する。
0x01: タイルの左上カドのX座標(FFは負、01は正の値である:つまりsigned charということ)。
0x02: タイルの左上カドのY座標。
0x03: Flags 1
0x04: Flags 2

Flags 1

1バイト=8bit (VHNNNNSS)で以下の情報を設定する。
  • bits SS: オブジェクトサイズ
  • bits NNNN: 未使用
  • bit H: 水平反転フラグ
  • bit V: 垂直反転フラグ

Flags 2

1バイト=8bit (PPPPNNSS)で以下の情報を設定する。
  • bits SS: オブジェクト形状
  • bits NN: 未使用
  • bits PPPP: 使用パレット番号

OAMサイズ&形状表

オブジェクトサイズとオブジェクト形状の組み合わせによって使用するタイルの数と並べ方が決定される。
下の表ではタイル1枚を■で表現しています。

サイズ 形状 操作 タイル領域
0 0 Nothing 8x8
0 1 Width x2 16x8
■■
0 2 Height x2 8x16

1 0 Nothing 16x16
■■
■■
1 1 Width x2,Height /2 32x8
以下省略
1 2 Width /2,Height x2 8x32
2 0 Nothing 32x32
2 1 Height /2 32x16
2 2 Width /2 16x32
3 0 Nothing 64x64
3 1 Height /2 64x32
3 2 Width /2 32x64

0 8X8 16x8 8x16
1 16x16 32x8 8x32
2 32x32 32x16 16x32
3 64x64 64x32 32x64
0 1 2

|