トップ小ネタPrince of Persia > キャラクタ画像


キャラクタ画像

ここでは、以下のファイルについて解説します。
(これらのファイルは圧縮・非圧縮の違いを除けば全て同じ形式です)
FIRE.DAT 非圧縮 マップ背景の炎アニメ
CHTAB*.DAT 圧縮 キャラクタ画像
PLATE*.DAT 圧縮 崩れる床、スイッチ床の画像
TRAP.DAT 圧縮 仕掛け類の画像

※以降の文章は非圧縮(展開後)のデータに対してのものです。

データ形式
・ヘッダ部(アドレス$00〜)
最初の2バイトにはファイルに格納されているキャラクタ(パターン)の数が書かれています。

以降、4byte単位で各キャラクタデータの開始位置を表す値がキャラクタの数だけ続いています。
これは4byte(32bit)の値というわけではなく、2byteの値×2個に分かれており、
最初の2byteがアドレスの下位4bit、後ろの2byteがそれより上位のbitを表しています。
よって開始アドレスは
  (最初の2byteの値 & $F)+(後ろの2byteの値*16)
から計算できます。(「&」はAND演算、この場合は下位4bit部分のみを取得)


・キャラクタデータ(ヘッダ部で記されたアドレスから)
最初の2byteはサイズ情報が格納されています。
1byte目 - 横方向のサイズ(この値に*8したものが横方向のドット数になる)
2byte目 - 縦方向のサイズ(=縦方向のドット数)

以降はデータ本体が続くのですが、
   判別値(1byte) → データ部(場合によってはなし) → 判別値 → ...
の繰り返しになります。
判別値は「以降に続くデータ通りに出力」または「空白データを出力」のどちらであるか、
およびそのデータ量を表す値です。(後述)
キャラクタデータの終端を示すようなデータはないので、判別値に沿ったデータを出力した後、
画像サイズ分のデータを出力したかどうかから終了を判定します。

画像データの格納方向はCHRファイルなどと違い、
横8ドット単位のデータが「縦方向」に続いているので注意してください。

判別値は、最上位ビットが立っているかどうか($80以上か未満か)で処理が変わります。
[判別値が$80未満の場合]
この後に4byteのデータが(n+1)回続きます。 (n=判別値)
データは1回(4byte)で横8ドット分を表しており、1byteごとに以下の情報を持っています。
(CHRファイルなどと同様、各ビットが1ドットに対応しています)
1byte目 - パレット番号+1
2byte目 - パレット番号+2
3byte目 - パレット番号+4
4byte目 - 描画フラグ(0の場合は描画されない?)

[判別値が$80以上の場合]
空白データ(00 00 00 00と同等?)を(n-$80+1)回繰り返した状態になります。
(この場合、データ部にあたるものはありません)

戻る