ファンタジーゾーンコンプリートコレクション uPdate!

ROM抽出,エミュレーターFinalBurnNEO,エミュレーター

前半戦

お約束

抽出は全て自己責任でお願いします

手順などの不備がありましたら
お手数ですがコメントをいただけると幸いです
あらかたぶん投げてるので、補完のコメントも大歓迎です。

後半戦があります
MAMEでは残念ながらバージョンが限られますが
ファンタジーゾーン2のSYSTEM16C版の変換などを記載しています。

事前準備

当初から10年ほど時間が経過もしてるので、忘備録的な感じで一つ
なお変換と解析は丸投げなので、デキる人は現行用に書き換える方がよいかと。

当該のPS2用ゲームディスクからBIN.BAKをコピーしておきます

こちらから
ファンタジーゾーン・コンプリートコレクション データファイル展開
をクリック、抽出ソフトをダウンロードし解凍します

fzcc_unpackを実行して
事前にディスクからコピーしておいたBIN.PAKを選択、アンパックします
数分はかかると思うので、完了表示が出るまで待ちましょう。



正常に実行がおわれば、BINフォルダが生成され
BINフォルダー配下に全てアンパックされています

ROM変換

ファンタジーゾーン(unprotect)

Python版にリニューアルしました
問題があった場合はコメントをお願いします

fantasyz_convert.pyとしてテキストにコピペで保存
同一フォルダーにfz1_07382.p00/fantasyz.obj/fantasyz.scr/fanta_jp.sndを配置
コマンドプロンプトでpython fantasyz_convert.pyを実行すると解凍するので
epr-7***.**をfanntzone1.zipとして圧縮してROMフォルダーに配置します。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from pathlib import Path


# --------------------------------------------------
# HSP: #deffunc writedata str filename,int ofs,int size
# --------------------------------------------------
def writedata(filedat: bytes, filename: str, ofs: int, size: int):
    buf2 = bytearray(size)
    for i in range(size):
        buf2[i] = filedat[i * 2 + ofs]
    Path(filename).write_bytes(buf2)


def main():
    # ==================================================
    # CPU
    # ==================================================
    filedat = Path("fz1_07382.p00").read_bytes()
    filesize = len(filedat)

    writedata(filedat, "epr-7385.43", 0x000001, 0x8000)
    writedata(filedat, "epr-7382.26", 0x000000, 0x8000)
    writedata(filedat, "epr-7386.42", 0x010001, 0x8000)
    writedata(filedat, "epr-7383.25", 0x010000, 0x8000)
    writedata(filedat, "epr-7387.41", 0x020001, 0x8000)
    writedata(filedat, "epr-7384.24", 0x020000, 0x8000)

    # ==================================================
    # SPRITE
    # ==================================================
    filedat = Path("fantasyz.obj").read_bytes()
    filesize = len(filedat)

    writedata(filedat, "epr-7392.10", 0x00001, 0x8000)
    writedata(filedat, "epr-7396.11", 0x00000, 0x8000)
    writedata(filedat, "epr-7393.17", 0x10001, 0x8000)
    writedata(filedat, "epr-7397.18", 0x10000, 0x8000)
    writedata(filedat, "epr-7394.23", 0x20001, 0x8000)
    writedata(filedat, "epr-7398.24", 0x20000, 0x8000)

    # ==================================================
    # BG
    # ==================================================
    filedat = Path("fantasyz.scr").read_bytes()
    filesize = len(filedat)

    if filesize % 4 != 0:
        raise ValueError("fantasyz.scr のサイズが4の倍数ではありません")

    word_count = filesize // 4

    outbuf = [
        bytearray(word_count),
        bytearray(word_count),
        bytearray(word_count),
    ]

    for i in range(word_count):
        ofs1 = i * 4
        ofs2 = i

        # 4バイト → 32bit(ビッグエンディアン)
        tmp = 0
        for j in range(4):
            tmp = (tmp << 8) | filedat[ofs1 + j]

        bytebuf = [0, 0, 0]

        for bit in range(8):
            tmp2 = (tmp & (0x70000000 >> (bit * 4))) >> (28 - bit * 4)
            mask = 0x80 >> bit

            if (tmp2 & 0x01) != 0:
                bytebuf[0] |= mask
            if (tmp2 & 0x02) != 0:
                bytebuf[1] |= mask
            if (tmp2 & 0x04) != 0:
                bytebuf[2] |= mask

        for p in range(3):
            outbuf[p][ofs2] = bytebuf[p]

    Path("epr-7388.95").write_bytes(outbuf[0])
    Path("epr-7389.94").write_bytes(outbuf[1])
    Path("epr-7390.93").write_bytes(outbuf[2])

    # ==================================================
    # SOUND
    # ==================================================
    filedat = Path("fanta_jp.snd").read_bytes()
    filesize = len(filedat)
    Path("epr-7535.12").write_bytes(filedat)

    print("Conversion completed successfully.")


if __name__ == "__main__":
    main()

以下旧版

ツールダウンロードサイトにある
謎のテキスト(「特定の使い方」をする人向け)にある
後半のスクリプトを使う事で変換出来ます。
ただしHSP3.1でないと動作しません。3.6や3.7beta、2.6では正常動作しないので注意!

(直接リンクでお行儀悪いですが)
上記より3.1をダウンロードして解凍した後に
エディター(hsed3le.exe)を起動させコピー&ペーストします。

その後、メニューから実行ファイル自動作成よりEXEファイルを作成します

デフォルトでは(マイ)ドキュメントフォルダーに作られる
hsptmp.exeとなります。コレをBINフォルダーにコピーしてから実行します。

上記画像のようにepr-7***.**が沢山できあがるので
これを全てfanntzone1.zipとして圧縮すれば完了です
おそらくMAMEでもそのまま動作すると思われます。

Fantasy Zone II – The Tears of Opa-Opa (System 16C, PS2 data file)

こちらはFinalBurnNeoでのみ動作すると思われます。



事前解凍したBINフォルダーに含まれている
下記ファイルを圧縮しfantzn2xps2.zipとして圧縮します。

fz2_s16c.p00
fz2_s16c.p01
fz2_s16c.scr
fz2_s16c.spr
fz2_s16c.snd

まさかの変換せずに、そのまま読み込ませるドライバーみたいです・・・

動くんだ・・・理論上は読み込み側を対応させる事は可能ですけど

Fantasy Zone Time Attack (System 16B, PS2 data file)

fz1_s16b_ta.p00
fz1_s16b.scr
fz1_s16b_ta.obj
fz1_s16b.snd

こちらもFinalBurnNeoの場合、必要ファイルを圧縮するだけの直読みドライバー型です
BINフォルダー内にある、4つのファイルをZIP圧縮しfantznta.zipにするだけ。


通常版と異なるのは基地破壊時、ミス時、リスタート時に時間表示が出ます
得点ではなく、クリア時間がスコアになったタイムアタックバージョンですね。

しめ

現在だと5000円~位で価格2倍のプレミアが付いていますから
既に所有している人が、思い出して変換するケースかなぁ・・・と
そういえば、PS2アーカイブスという入手方法もありましたね。

ちなみに今回取り上げたPAKアンパックツールですが
SegaAges2500の後期に発売された、他タイトルでも使えるようです
SEGAマーク3やメガドライブ用イメージなどがそのまま取り出せます

海外フォーラムでもコマンドライン用ですが
同様のアンパッカーを見つけました

体験版がまだ公開されていました。

2008年という所に時代を感じますね。

最後になりますが、変換ツールを今も公開し続けて下さっている
zaralaさんに感謝を、ありがとうございました。