サムライスピリッツネオジオコレクションから変換

2022年7月1日

サムライスピリッツ ネオジオコレクションから変換

サムライスピリッツ零SPFE (Final Edition)
(10数年前にSNKによって即差し止められたロケテ版、赤スペ)を変換します
完成するとsamsh5fe.zipになります

©YUKI enterprise ©SNK PLAYMORE 2004

FinalBurnNEO(nightly builds)やArcade (Final Burn Neo)のコアで利用可能です
Steam版で行っていますが、おそらく無料配布のEPIC版でも問題ないかと。

サマーセールでお値打ちでした

ただし、いつもの事ですが全ては自己責任。筆者は責任を負いません。

作業環境にLinux用WindowsサブシステムかLINUX環境が必要になります
変換ツールでポチポチ~完了!みたいな、楽なやり方ではないので注意
そういうのは出来る人が作ってくれるでしょう・・・既存ツールうまく使えばいけるかも?

Windows10でLinux 用 Windows サブシステムを導入する

インストールした製品

導入の仕方は各自でおこなってください。さすがにそこまではね・・・(参考)
基本コマンドも最低限は覚えておくとよいかと(参考)

Ubuntuは複数の長期サポート製品がありますが、自分が導入したのは上記の製品です
LINUX環境がある人は、そのまま使えばたぶん大丈夫。

ファイルの解凍と必要ファイルの確認

必要なファイルは拡張子mbundleに含まれているので解凍します。
ツールはいくつかあります
QuickBMS&Sf30 Mbundle(ページ真ん中辺)とか

sf30ac-extractorのがフォルダ生成してくれるので楽です

初代から天草降臨まで変換できるsf30ac-extractorでも行けるはずです。
全部解凍しましたが、bundleSamuraiShodown5Special.mbundleで行けるかと(たぶん
見てもらうと分かりますがFEは2個だけ、多くは5SPと共用になっています。

変換元変換先
samsh5sp.cslot1_audiocrypt.decM rename 272-m1d.bin
samsh5sp.cslot1_fixed.decS rename 272-s1.bin
samsho5_fe.cslot1_maincpuP(作業が必要)
SamuraiShodown5_FE.sprites.swizzledC(作業が必要)
samsh5sp.cslot1_ymsnd.decV(作業が必要)
MとSの二つは、そのままコピーしてリネームすれば完了なので省略

Pの変換と分割

samsho5_fe.cslot1_maincpu.swapを生成します。(出典元
samsho5_fe.cslot1_maincpuファイルのあるフォルダーに移動したら以下のコマンドを入力

dd if=samsho5_fe.cslot1_maincpu of=samsho5_fe.cslot1_maincpu.swap conv=swab

何も表示されませんが、samsho5_fe.cslot1_maincpu.swapが作られています。
(サブシステムではmnt/配下にドライブレターがありますので、そこから任意のディレクトリに移動してください)

次に下のコードを1行ずつ入力します。

dd if=samsho5_fe.cslot1_maincpu.swap of=272-p1.bin count=$((8388608/2)) bs=1
dd if=samsho5_fe.cslot1_maincpu.swap of=272-p2.bin skip=$((8388608/2)) count=$((8388608/2)) bs=1

入力後、反応がしばらくありませんが数分待てば完了するはずです。
2つとも行ったら、これでP変換は完了です。(出典元)

Vの分割とバイナリ修正作業

samsh5sp.cslot1_ymsnd.decを分割します(出典元)

dd if=samsh5sp.cslot1_ymsnd.dec of=272-v1d.bin count=$((16777216/2)) bs=1
dd if=samsh5sp.cslot1_ymsnd.dec of=272-v2d.bin skip=$((16777216/2)) count=$((16777216/2)) bs=1

ひとつ毎に変換してください、ちょっと待たされると思います。
初期はこのままで完了だったのですが・・・V1のdumpミスが指摘された事で
ROMセットに変更が入りました、修正しないとバッドになります(出典元)
復号化ミスのあるダンプROMが、なぜ製品に含まれるのか(以下省略

バイナリエディターで272-v1d.binを開き、アドレス毎に元の数字を書き換えてください。

00006bc0  ab => 08
0000ed41 08 => 89
00016bc0  6e => 82
0001ed41 da => 8f

この書き換えが完了したら、チェックサム(CRC32)が下記にかわるはずです。
272-v1d.bin 3bf61586 => updated 272-v1d.bin 28d57d10

うまく行かない場合は出典元のバイナリ差分とにらめっこしてください・・・
もしくはパッチ当てちゃうのもありかと思います。

これでVの変換作業は終了です。

Cの変換と分割(要コンパイル)

ここではコンパイルが必要になります
gccが必要なのでサブシステムの人はインストールしましょう。

sudo apt install gcc

パスワードを聞かれますから入力
後は容量150MB必要だけど?と聞いてくるので
Y→エンターキーでインストールが終わるまで待ちましょう。

完了したら下記コードをss_unswizzle.cとしてコピペでメモ帳などで保存します(出典元)。

#include <stdio.h>
#include <unistd.h>
#include <stdint.h>

int main(int argc, char **argv) {
  FILE *input, *output1, *output2;
  uint8_t tile[128];
  uint8_t* offset;
  uint8_t x_offset,y_offset,block, data,row;
  int i;
  uint8_t planes[4];

  if(argc < 4) {
    printf("ss-unsizzle <input file> <output odd> <ouput even>\n");
    return 1;
  }

  input = fopen(argv[1], "r");
  if(!input) {
    printf("Error: unable to open %s for reading.\n", argv[1]);
    return 1;
  }

  output1 = fopen(argv[2], "w");
  if(!output1) {
    printf("Error: unable to open %s for writing.\n", argv[2]);
    return 1;
  }

  output2 = fopen(argv[3], "w");
  if(!output2) {
    printf("Error: unable to open %s for writing.\n", argv[3]);
    return 1;
  }

  while(fread(tile, 1, 128, input) == 128) {
    for(block = 0;block < 4;block++) {

      // x/y_offset get us into the correct block
      switch(block) {
        case 0:
          x_offset = 4;
          y_offset = 0;
          break;
        case 1:
          x_offset = 4;
          y_offset = 8;
          break;
        case 2:
          x_offset = 0;
          y_offset = 0;
          break;
        case 3:
          x_offset = 0;
          y_offset = 8;
          break;
      }

      // traverse each row of the block
      for(row = 0;row < 8;row++) {
        planes[0] = 0;
        planes[1] = 0;
        planes[2] = 0;
        planes[3] = 0;

        offset = &tile[x_offset + (y_offset * 8) + (row * 8)];

        for(i = 3;i >= 0;i--) {
          data = offset[i];

          planes[0] = planes[0] << 1;
          planes[0] = planes[0] | ((data >> 4) & 0x1);
          planes[0] = planes[0] << 1;
          planes[0] = planes[0] | ((data >> 0) & 0x1);

          planes[1] = planes[1] << 1;
          planes[1] = planes[1] | ((data >> 5) & 0x1);
          planes[1] = planes[1] << 1;
          planes[1] = planes[1] | ((data >> 1) & 0x1);

          planes[2] = planes[2] << 1;
          planes[2] = planes[2] | ((data >> 6) & 0x1);
          planes[2] = planes[2] << 1;
          planes[2] = planes[2] | ((data >> 2) & 0x1);

          planes[3] = planes[3] << 1;
          planes[3] = planes[3] | ((data >> 7) & 0x1);
          planes[3] = planes[3] << 1;
          planes[3] = planes[3] | ((data >> 3) & 0x1);

        }
        fwrite(&planes[0],1, 1, output1);
        fwrite(&planes[1],1, 1, output1);
        fwrite(&planes[2],1, 1, output2);
        fwrite(&planes[3],1, 1, output2);
      }
    }
  }

  fclose(input);
  fclose(output1);
  fclose(output2);
}

Windows環境でコンパイルすると32KBのファイルしか作れません(やらかした)
かならずコンパイルはサブシステムかLINUX環境下で作業を行ってください。

gcc -o ss_unswizzle ss_unswizzle.c

コンパイルに問題なければ、なにも表示されずにss_unswizzleと言うファイルができています。
今度はこの実行ファイルを/BINにコピーします。(実行ファイルはBINに入れないと動きません)

cp ss_unswizzle /bin

完了したら今度はODDとEVENの分割を行います。

ss_unswizzle SamuraiShodown5_FE.sprites.swizzled odd even

ODDEVENと言う拡張子なしのファイルができあがります。

次は分割です(出典元)

$ split -n 4 odd

4分割されたファイルを順に

xaa => rename 272-c1d.bin
xab => rename 272-c3d.bin
xac => rename 272-c5d.bin
xad => rename 272-c7d.bin

にリネームします。

2回連続でコマンドを打ってしまうと、上書きされてしまうので(やった)
1回ごとにリネームしてから、次の作業をおこなってください。

$ split -n 4 even

4分割されたファイルを順に

xaa => rename 272-c2d.bin
xab => rename 272-c4d.bin
xac => rename 272-c6d.bin
xad => rename 272-c8d.bin

にリネームします。

ファイルの確認と圧縮

生成できたファイルをZIPで圧縮しファイル名はsamsh5fe.zipにします。
動作はFinalBurnNEOのnightly buildsで確認しました
ファイル詳細はdatに記載されている物を引用しています。

samsh5fe.zip
272-p1.bin size="4194304" crc="9e72cc83"
272-p2.bin size="4194304" crc="1f5469bc"
272-s1.bin size="131072" crc="c297f973"
272-c1d.bin size="8388608" crc="ec9fda8d"
272-c2d.bin size="8388608" crc="d2fc888d"
272-c3d.bin size="8388608" crc="b0ea781b"
272-c4d.bin size="8388608" crc="d34ac591"
272-c5d.bin size="8388608" crc="1b5c1ea2"
272-c6d.bin size="8388608" crc="deeaad58"
272-c7d.bin size="8388608" crc="dce0119f"
272-c8d.bin size="8388608" crc="3bf256c5"
272-m1d.bin size="524288" crc="203d744e"
272-v1d.bin size="8388608" crc="28d57d10"
272-v2d.bin size="8388608" crc="95fe7646"

crc32はEXPLZHで圧縮すると、すぐ確認できるので便利です。
面倒くさい作業ですが、コレで動作に問題なければ変換完了です~
お疲れ様でした!

sf30ac-extractor-mameのソースコードを見ると
SplitGameFileUnswizzleがあるので、おそらく同じような処理をしていると思います
が、パラメーターが分からないので出来る人はそっちに追加する方が楽です
自由にぜひともやってください。そしてプルリクに追加して下さい(他人任せ

赤スペの経緯

なんともはや、そう言う話だったのですね・・・

完全版との違い

タイトル画面が違います。

王虎なんで出演作少ないん?

別タイトルですから、別物です。(解散したとは言え)悠紀エンタープライズの表記もありません。

最後に

arcade-projects.comのフォーラムから、この変換記事は成り立っています
2年前に書き込みをしてくださった人々に感謝を、ありがとうございました。

追記 たぶん5SPとか5も似たような感じで変換出来るかも?(未確認)
次記事で検証しました。
結論から言うと(零)5はHBMAME限定で動作
(零SP)5SPは適合するROMセットが存在しません
そのため、GOGかHumbleのLINUX版インストーラーから抽出を推奨。

海外勢により英語ストーリー追加とタイトル表記をPerfectに変更した
パーフェクト版ハックはここのIPSで対応可能なようです(要登録・未確認)