砂場

wikiの編集方法を練習したりするところ。
wiki全体に関わるページ修正案を掲示したい場合はwiki情報管理・改善案でお願いします。

参考リンク

【作られているもの一覧】

以下、練習用部分


わーい砂場だー

MUGENのsffファイルフォーマットについて。
確認されているバージョンはSFFv1, SFFv2, SFFv2.1
先頭の16バイトで判別。
ElecbyteSpr\0\x01\0\x01
v2の場合\0\x01\0\x01の部分が\0\0\0\x02になり、v2.1の場合\0\x01\0\x02になります。

ファイルの先頭64バイトぐらいには重要な情報が詰め込まれています。v1とv2ではフォーマットがガラリとかわるので
とりあえずv1から。
v1は先頭から20バイトの位置にsffが持つ総画像数が保管され、続いて、最初の画像情報のオフセットがあります。
数値は両方uint32_tで、リトルエンディアンです。 (すべての数値がリトルエンディアンです。)それ以外に
いろいろなデータはありますが、あまり重要ではない

画像情報のオフセットから、32バイト読み出すと、画像の付加情報が読み出せます。
これらの情報は、グループid, イメージid などの情報です。
具体的な内容は、先頭から、次の画像情報のオフセット, 格納されている画像のサイズ(uint32_t x 2),
X中心座標, Y中心座標 (int16_t x 2), グループNo, イメージNo, リンクindex (uint16_t x 3), パレットモード (uint8_t)です。あまりは
PADです。
画像データーはそのままPCXデータです。画像情報オフセットに32バイト足した位置から、画像サイズバイト分です。
パレットモードは、1か0の2択で, 1の場合パレット情報としてsffの一番初めの画像のパレットを使うと言う意味に
なります。前の画像のを参照するともありましたが、よく分かりません。しかしこれでうまく動きます。
そのままデーター部分をファイルに出力するとpcxファイルとして開けます。状況によってパレット
データーをつけてあげる必要もあります。
画像のサイズが0の場合, 実際の画像データが格納されない代わりに、リンクindexにsff内の何番目の画像に
実際のデーターが入っているかというデータが入ります。(同じ画像で中心座標をずらしたりするときに使われる)

 一方でsffv2は少し複雑な作りになっています。パレットをファイル内に格納できるようになり、
画像データとしてLZ5 RLE5 RAW RLE8 PNG が選べるようになり、画像情報と実際のファイルが陸続きではなくなりました。
v2とv2.1のフォーマットは同じです。先頭から36バイトの位置に、画像情報オフセット、総画像数、パレット情報オフセット、総パレット数、Lオフセット、そして4バイト抜かしてTオフセット (uint32_t x 6) となります。

画像情報オフセットから、画像情報のデータを28バイトづつ、画像個数分読み出せます。それぞれのデータの意味は、
グループno, イメージno, 画像幅, 画像高さ (uint16_t x 4) , x中心座標, y中心座標 (int16_t x 2), リンクindex (uint16_t),
イメージ形式, イメージ色深度 (uint8_t x 2), イメージオフセットとサイズ (uint32_t x 2), パレットindex, フラグ (uint16_t x 2)
実際のイメージは、イメージオフセット+Lオフセット(フラグが0じゃないなら+Tオフセット)からサイズ分格納されています。
sffv2で特徴的なのは、パレットindexを参考にして、該当するパレットを引っ張り出して画像に適用する点です。sffv1は
画像にくっついていますがv2は別腹。
イメージのデーター形式はイメージ形式2(RLE8)、ほとんどこれです。先頭の4ビットが非圧縮状態でのバイト数です。uint32_t。
その後はMSBの2ビットが01 (0x40 - 0x70)の場合、後のビットがそのビットで表された数-0x40個続くという意味です。
それ以外の場合はそのままです。
イメージ形式が0(RAW)の場合単純に画像幅x高さ分のカラーインデックス(uint8_t)配列です。
イメージ色深度は8である必要があり、5の場合どうするかわからないです。

パレットの情報は、パレット情報オフセットからパレット個数分、16バイトずつ読み出せます。
それぞれ, GroupNo, PaletteNo, nCols, リンクid (uint16_t x 4), パレットのオフセットとサイズ (uint32_t x 2) です。
実際のオフセットはTオフセットが加算されます。データは大抵RGBA8888 (uint32_t)が256個連なった1024バイトの配列です。
カラーインデックス順にRGBARGBARGBA... とそれぞれuint8_tが4個ずつで、対応した画像データと合わせて使用します。

RLE8の例:
Ex1: 00 11 22 33 45 00 --> 00 11 22 33 00 00 00 00 00
Ex2: 41 40 41 50 41 60 --> 40 50 60


最終更新:2023年08月20日 05:44