ゲーム中のマップは64*128ドット(*2層)からなるマップパーツ単位で構成されています。
CHRファイル(*.CHR)にはこのマップパーツの元となる画像データが格納されています。
CHRファイルは16*16ドットのキャラクタが256個含まれており、
これを組み合わせて1つのマップパーツにします。
(正確には縦横4*4で組み合わせた64*64ドットの中サイズのパーツ(中パーツ)を作り、
この「中パーツ」を組み合わせてマップパーツを作ります)
※キャラクタ(パーツ)の組み合わせはCHRファイルではなく、マップファイル(*.MAP)で指定します。
詳細は
マップデータのページを参照してください。
※CHRファイルは圧縮されています。以降に書かれているアドレスは展開後のものです。
圧縮データの展開方法は
圧縮データのページを参照してください。
$20byte単位のデータが4セット分($80byte)で1つのキャラクタのデータになります。
各セット内のデータは
フォントデータと同様、1byteで横8ドットを表す形式(各ドットがbit単位で対応)で、
キャラクタの左上から横方向に格納されています。
各セットの内容は以下の通りです。
$00〜 | パレット番号+1 |
$20〜 | パレット番号+2 |
$40〜 | パレット番号+4 |
$60〜 | 描画フラグ(後述) |
このようなデータがキャラクタ数分(256)続いています。
例: ※カッコ内は2進表記
アドレス | 値 |
$00 | $84(10000100) |
$20 | $C4(11000100) |
$40 | $7F(01111111) |
$60 | $C4(11000100) |
このような場合、キャラクタの左上から横8ドットは次のようになります。
パレット番号+1 |
$84(10000100) |
+1 (001) |
|
|
|
|
+1 (001) |
|
|
パレット番号+2 |
$C4(11000100) |
+2 (010) |
+2 (010) |
|
|
|
+2 (010) |
|
|
パレット番号+4 |
$7F(01111111) |
|
+4 (100) |
+4 (100) |
+4 (100) |
+4 (100) |
+4 (100) |
+4 (100) |
+4 (100) |
描画フラグ |
$C4(11000100) |
1 |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
表示色 |
|
3 (101) |
6 (110) |
4 (100) |
4 (100) |
4 (100) |
7 (111) |
4 (100) |
4 (100) |
|
※以降の説明はおそらく正確ではないと思います
CHRファイルでは、各ドットに対してパレット番号の情報(3bit)の他に、もう1bit分の情報(フラグ)を持っています。
マップパーツは2つの層(上層・下層)に分かれていますが、層によってこのフラグの意味も変わってきます。
上層 | フラグ0 | 下層のドットのパレット番号とOR演算を行う
(奥・手前に関しては下層のフラグに依存) |
フラグ1 | 最も手前(炎を除く)に描画される |
下層 | フラグ0 | 最も奥に描画される |
フラグ1 | 壁属性のマスでは上層・炎以外の全てのキャラクタ、
床属性では特定のキャラクタよりも手前に描画される |
下層のフラグ1の「特定のキャラクタ」とは、
・落下中のプレイヤーや敵
・スイッチ床、落下床の「右のマスにはみ出している部分」
などのことです。