読者です 読者をやめる 読者になる 読者になる

chikuchikugonzalezの雑記帳

趣味とか日記とかメモとか(∩゚д゚)

SFFv2Paletteにスプライト処理機能を追加してみた

名づけて、SFFv2Tool!
SFFv2Paletteとの違いは

  1. コマンドラインインターフェイスが変わった (オプションの変更)
  2. スプライトファイルを取り出せるようになった
    1. Windows用BMPファイルのみ
  3. BMPファイルを元にスプライトを追加できるようになった
    1. Windows用BMPかつ256色のインデックスカラーのみ

DLはMediaFireまたはSkyDriveから

MediaFire SFFTool20101017.7z
SkyDrive
注意点

色々注意点あります。

  • SFFv2Palette同様、既存ファイルを問答無用で上書きするので使用の際はバックアップを推奨します
    • SFFがぶっ壊れても泣かない
    • 壊れているかどうかはsff2pngで展開してみるのが楽
  • LZ5でスプライトデータが圧縮されているSFF解凍できません
    • LZ5のデータ構造とか解凍アルゴリズムがわけわからんため無理でした(´・ω・`)
  • 追加するスプライトは問答無用でRLE8アルゴリズムで圧縮されます。
    • 突貫RLE8なので、おそらく無駄なデータが混じりまくりです。きっとsprmake2で圧縮しなおしたほうが効率はいいはず
使い方

単なるusage出力ですがこんなことになりました。

Usage: SFFv2Tool.py [options]

Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  --input=INPUT         SFF file for input. (default:sys.stdin)
  --output=OUTPUT       SFF file for output (APPEND, MODIFY, DELETE), or
                        output directory (EXTRACT). (default:sys.stdout
                        [APPEND/MODIFY/DELETE], Current Directory [EXTRACT])
  -E, --extract         Extracting sprites or palettes
  -A, --append          Append a sprite or palette
  -M, --modify          Modify a specified sprite or palette data
  -D, --delete          Delete a specified sprite or palette data
  -T TARGET, --target=TARGET
                        Operation Target ('spr', 'pal' or 'both'.)
  -G GROUP, --group=GROUP
                        Sprite or Palette Group Number
  -N NUMBER, --number=NUMBER
                        Sprite or Palette Number
  --clone               Extracting cloned sprites
  --noclone             Except cloned sprites in EXTRACT mode
  -I INDEX, --index=INDEX
                        Inserting index of Sprite or Palette except EXTRACT
                        mode
  -P PALETTENUMBER, --palette=PALETTENUMBER
                        Set sprite used palette number in APPEND or MODIFY
                        mode
  -F SOURCE, --file=SOURCE
                        A file contains Sprite or Palette data
  --xaxis=AXISX         Set a x-axis of sprite for MODIFY or APPEND
  --yaxis=AXISY         Set a y-axis of sprite for MODIFY or APPEND
  --palno=PALNO         Set palette number to default palette of specified
                        sprite
  --debug               Enable Debug Print
  --nodebug             Disable Debug Print (default)

以下余談

色々面倒だったのよ

何が面倒ってデータの並び的に

SFFヘッダ パレットヘッダ×パレット数 スプライトヘッダ×スプライト数 パレットデータ×パレット数 スプライトデータ×パレット数

なので、先にパレットヘッダを読み込んで、データを読みにいってまた戻るを繰り返すこと。ついでにパレットデータの構造がRGBAなのとかスプライトデータがインデックスカラーのパレット番号の羅列を圧縮した物とかなので、どうしても変換作業が必要になるとかね。
特に困ったのがスプライトデータ。ElecbyteのMain Page - M.U.G.E.N Wikiに圧縮方式のサンプルコードはあったもののRLE8とRLE5だけでLZ5が謎なこと。*1 *2

BMP変換とか

あれも面倒だった。パレット並びがまさかのBGRAにしなきゃいけないとか上下反転して記録しなきゃいけないとか面倒すぐるでしょう。
まぁSFFv1は楽なフォーマットであることはこれで自明なんですが。パレットのないPCXデータの羅列なのでPCXヘッダが見つかればあとはライブラリ何なりで読み出せます。
SFFv2だと内部がおそらくほぼ独自なので力技で読み込んでます。もしかしたら圧縮済みBMPデータかもしれませんが、5bit形式のBMPなんてないのでRLE5とかは結局解析が必要になるのではと思います。

LZ5って結局どうすりゃいいの?

これだけはホント謎です。どうにかしたいけどどうにもなりそうもない。でもコレに対応しないとMUGEN1.0付属のkfm.sffが展開できないという状態になるのでどうにかしたいなー。*3

*1:RLE8

*2:ちなみにSFFv2の形式はRomhack氏のものと違うことが書いてあった

*3:workディレクトリに画像とかdefがあるので、rle5/rle8で作り直せばいいんですけどね