Windows95版ぷよぷよSUN 解析

もしかしたら、バージョンによってフォーマットやパレットの位置が違うかもしれません。
私が解析した各ファイルの更新日時はこのようになっていました。
puyo3.exe 1998年3月12日、3:51:36
grp.dat 1998年3月11日、16:40:14
comic.scr 1998年3月10日、22:43:12

BはByteの略です。


基本
DATファイル
BGファイル
SPRファイル
パレット位置一覧

基本

画像データは「grp.dat」に格納されています。ほとんどが無圧縮のベタ画像です。ただ「grp.dat」には画像とそのサイズに関する情報のみで、パレットデータは一切含まれていません。

アトリエの画像以外、すべて色深度8bitです。 たとえ16色しか使用していない場合でも1ピクセルあたり1Bです。

■パレット■

パレットデータは「puyo3.exe」と「comic.scr」に格納されています。
16bitカラー(つまり1色あたり2B)で、下位ビットからR5G5B5A1です。

■キャラクター順■

パレットデータはこのように並ぶことが多いです。
SKEL  スケルトンT
HAPY  ハーピー
CHOP  ちょっぷん
DRAC  ドラコケンタウロス
INCU  インキュバス
TARA  すけとうだら
KIKI  キキーモラ
NOHO  のほほ
KODO  コドモドラゴン
WICH  ウィッチ
ZOH   ぞう大魔王
HONY  ハニービー
LUGN  勇者ラグナス・ビシャシ
RULU  ルルー
SHEZ  シェゾ・ウィグィィ
SATN  サタンさま
ARLE  アルル・ナジャ
CARB  カーバンクル

*.dat

複数のファイルを格納したアーカイブファイルです。ファイル先頭に、各ファイルへの位置やサイズの情報があります。

DATファイルのヘッダ構造
size内容
4B格納ファイル数
4BDATファイルのサイズ
格納ファイル数分、以下の8Bが続く
4Bファイル位置
4Bファイルサイズ

ファイルサイズが0の場合、ファイル位置は0xffffffffになっています。

grp.datに格納されているファイルの名前は、
puyo3.exeのオフセット0xD3764から、grp.dat内での格納順に並んでいます。

以降に出てくるBGファイルやSPRファイルやDATファイルは、grp.datから抽出したものです。

■end_dr.dat open.dat result.dat の圧縮について■

grp.dat内には、end_dr.dat、open.dat、result.datというDATファイルがあります。
ヘッダ部分は無圧縮ですが、格納ファイルはそれぞれ先頭からLZSS圧縮されています。

C言語で復号ルーチンを書いてみたので参考にして下さい。
(2009/8/12 constの位置を修正)
int decode_puyo3lz(unsigned char *const src    /*圧縮データの開始位置*/
                  ,unsigned char *const dest   /*展開先の位置*/
                  ,unsigned char *const s_end  /*圧縮データの終了位置*/
                  ){

  unsigned char flags,*sp,*dp;
  unsigned long i,j,len,offset;

  sp=src;
  dp=dest;

  while(1){
    flags=*(sp++);
    for(i=0;i<8;i++){
      if(flags & 1){
        *(dp++)=*(sp++);
      }else{
        if(*sp & 0x80){
          if(*sp & 0x40){
            len   =((sp[0]>>2) & 0xf) +4;
            offset=((sp[0]<<8) | sp[1]) & 0x3ff;
            sp+=2;
          }else{
            len   =((sp[0]>>5) & 1) +2;
            offset=sp[0] & 0x1f;
            if(offset){
              sp++;
            }else{
              offset=((sp[0]<<8) | sp[1]) & 0x3ff;
              sp+=2;
            }
          }
        }else{
          if(*sp == 0x7f){
            len   =((sp[2]<<8) | sp[1]) +2;
            offset=(sp[4]<<8) | sp[3];
            sp+=5;
          }else{
            len   = sp[0] +4;
            offset=(sp[2]<<8) | sp[1];
            sp+=3;
          }
        }
        for(j=0;j<len;j++,dp++) *dp=*(dp-offset);
      }
      if(sp == s_end) return (int)(dp-dest);
      if(sp > s_end){
        printf("ERROR!\n");
        return -1;
      }
      flags>>=1;
    }
  }

}

このコードをそのまま使う場合は、不正メモリアクセスに注意して下さい。(特に展開先)
まあopen.datとresult.datは既存のファイルを圧縮してあるだけなので、特に復号する必要ありませんけどね(^_^;

*.bg

BG(背景)を格納したファイルです。
ひとつの画像が複数に分割されていて、ファイル先頭に各画像への位置、横幅、縦幅などの情報があります。
分割画像は大抵タイル状に並びます。画像が配置されなかった部分は0で埋めます。

ファイル構造は、先頭から「索引1」、「索引2」、「画像」の順です。
索引1
size内容
4B総画像数 (常に1)
4B不明
総画像数分、以下の8Bが続く
2B完成画像の横幅
2B完成画像の縦幅
2B不明 (常に0)
2B不明


索引2
size内容
4B格納画像数
格納画像数分、以下の16Bが続く
2B画像の横幅
2B画像の縦幅
2B位置X(左方向のパディング数)
2B位置Y(上方向のパディング数)
4B不明
4B「画像」開始位置からのオフセット


「画像」は色深度8bitのベタです。

以下に、いくつか例を紹介します。

■com_*.bg■

漫才デモの背景です。索引データどおりに画像を並べると、このようなタイル状になります
【例:com_chop.bg】
com_chop

パレットは「puyo3.exe」のオフセット0xD0320から512Bずつ格納されています。 com_chop.bgからアルファベット順です。

■bak_*.bg■

各キャラの対戦フィールドです。索引データどおりに画像を並べると、このようなタイル状になります。
【例:bak_arle.bg】
bak_arle

パレットは「puyo3.exe」のオフセット0xCDB10から256Bずつ格納されています。bak_skel.bgからキャラクター順です。
これらは128色しか使用していないので、パレットのサイズも256Bずつになっています。

*.spr

スプライトを格納したファイルです。ファイル構造はBGファイルとほぼ同じです。
BGファイルとの違いは、索引1の「総画像数」と索引2の「格納画像数」が同数で、
索引1が画像全体のサイズ、索引2が実際に格納されている画像サイズをそれぞれ示していることです。図で表すと、

ex

赤枠が索引1で示される、全体のサイズ、
青枠が索引2で示される、格納されている画像サイズになります。
BGファイル同様、余白は0で埋めます。

索引1
size内容
4B総画像数
4B不明
総画像数分、以下の8Bが続く
2B画像の横幅
2B画像の縦幅
2B不明 (画像の番号?)
2B不明


索引2
size内容
4B格納画像数
格納画像数分、以下の16Bが続く
2B画像の横幅
2B画像の縦幅
2B位置X(左方向のパディング数)
2B位置Y(上方向のパディング数)
4B不明
4B「画像」開始位置からのオフセット


以下に、いくつか例を紹介します。

■at_*.spr■

オプションのアトリエで使用されている画像です。これらの画像のみ色深度16bitです。
色の構成はパレットと同じで、最下位ビットからR5G5B5A1です。

■chr_sel.spr■

「ふたりでぷよぷよ」のキャラ選択で使用されているスプライトです。
パレットは「puyo3.exe」のオフセット0xCF520に、32Bずつ格納されています。
chr_sel

■comi??es.spr、comic??s.spr■

漫才デモで使用されているスプライトです。
comic??s.sprがプレイキャラクター用、comi??es.sprが敵キャラクター用です。

【例:comic19s.spr パレット適用済】
comic19s

パレットは「chr_sel.spr」と同じく、 「puyo3.exe」のオフセット0xCF520に、32Bずつキャラクター順に格納されています。
各キャラクターに合わせて使用パレットを決定します。

ミノタウロスは「puyo3.exe」のオフセット0xCF7E0から32B、
対ちょっぷんでの波のパレットは場所が分かりませんでした。(特に調べていません)

■cut_*.spr■

連鎖カットインなどのスプライトです。
これらの画像に関しては、キャラ毎にパレットの位置がバラバラで規則性は分かりませんでした。

【例:cut_arle.spr パレット適用済】
cut_arle

パレット位置 一覧

私が調べた分しかありませんが、以下がpuyo3.exeにあるパレットの場所です。

「バイナリエディタで見て、パレットっぽいデータを見つけては片っ端から試す」という方法で調べていったので間違いがあるかもしれません。

puyo3.exe内のパレット位置
offsetsizefile備考
0xCA9C864Bcut_wich.spr32Bx2
0xCAAB0256Bentr01s.spr32Bx8
0xCABD0512Bentr01b.bg
0xCC650128Bcut_incu.spr32Bx4
0xCDB104608Bbak_*.bg256Bx18 キャラクター順
0xCF520704Bchr_sel.spr32Bx22
0xCF7E032Bミノタウロス
0xCFB80416Bmenu_1.spr32Bx13
0xD0240224Bcont_*.spr32Bx7
0xD03208192Bcom_*.bg512Bx16 ABC順
0xD332064Bcut_huny.spr32Bx2
0xEED20352Bcut_skel.spr32Bx11
0xEEEA032Bcut_zoh.spr
0xF0110512Baaa_comp.bg
aaabks.bg
0xF031032Bcut_kiki.spr
0xF0718512Bsnd_bak.bg
0xF09B8480Bst_*_*.spr32Bx15 ABC順
0xF376864Bcut_cabn.spr32Bx2
0xF37A832Bcut_lagn.spr
0xF3808160Bopen.spr32Bx5
0xF38A832Bopsat.spr
0xF3A88512Bopbg1.bg
0xF3C88512Bopsora.bg
0xF40681536Bopbgsat.bg512Bx3
0xF48683072Bop02.bg512Bx6
0xF5468512Bopdrac.bg
0xF5668512Bopdora3.bg
0xF5868512Bdoukutu.bg
0xF5CC8512Bop_dra1.spr
0xF5EC832Bcut_shez.spr
0xF76D0512Btrav01b.bg
0xF78D032Bcut_noho.spr
0xF8738384Bcut_kodo.spr32Bx12
0xF8EB896Bcut_chop.spr32Bx3
0xFA340608Brk_face.spr32Bx19
0xFA5A096Brk_????.spr32Bx3 ABC順
0xFA600512Brank01b.bg
0xFAB1864Bcut_arle.spr32Bx2
0xFB240480Bcut_tara.spr32Bx15
0xFB42032Bcut_satn.spr
0xFB440128Bcut_rulu.spr32Bx4
0xFCAB0128Bstaff.spr32Bx4
0xFCC7832Bcut_drac.spr
0xFD2A0160Bend_dr.dat 03,0832Bx5
0xFD340512Bend_dr.dat 05,06,07
0xFD540512Bend_dr.dat 10
0xFD740512Bend_dr.dat 11
0xFDB401216Bend_shez.spr32Bx38
0xFE0001024Bed_shiro.bg512Bx2
0xFE400576Bend_arle.spr32Bx18
0xFE800512Bmoon.bg
0xFEA00512Bshiro.bg
0xFEC001024Bshiro2.bg512Bx2
0xFF000512Byozora.bg
0xFF220128Bcut_hapy.spr32Bx4

HOME > Win95版ぷよぷよSUN