SDK2/ DKC2 データフォーマット

SDK2/ DKC2 データフォーマット

Postby Quaraage » April 8th, 2017, 4:14 pm

※汎用フォーマット(画像・圧縮データなど)についてはhttp://www.dkc-atlas.com/forum/viewtopic.php?f=69&t=2275を参照してください。
基本的に日本語版V1.0のアドレスで書いています。したがって、そのほかのバージョンでは適宜読み替えてください。
バージョンによってデータ構造が異なることはありません。

これらのデータは(未執筆のものも含め)すべてSuper Gorilla Maker 2 の開発に当たって解析されたものです。

もくじ(順次情報追加予定)
ステージ設定
ステージスタイル設定
BGM追加指定
タイルセット
Trainee Trekker
Bananas received 37
Posts: 57
Joined: 2015

Re: SDK2/ DKC2 データフォーマット

Postby Quaraage » April 8th, 2017, 4:49 pm

ステージ設定

ステージ設定は可変長のデータであり、バンク$FD内に存在します。(生のROMを参照している場合はバンクは$3Dに読み替えること)
このデータは日本語版・北米版ともに所在アドレスは同じです。

$FD:0000 ステージ設定データの配列ポインタ(1要素2バイト、標準206個)
$FD:XXXX ステージ設定データ本体(可変長。最低2バイト)

ステージ設定データの読出しは、まず配列ポインタ領域から対応するステージのポインタを拾ってきます。
間接の取り方は絶対参照ですので、拾ってきたポインタがそのままステージ設定データの先頭アドレスとなります。

次にステージ設定データ本体の先頭アドレスから2バイトを読み出し、これをステージの種類(LevelType)とします。この値によって以降の処理が変わります。

〇LevelType == 0, 2, 3, 6
通常ステージの設定です。ボスステージやワープ先など、使用用途でLevelTypeの値が変わりますが、ステージ設定の読み込み処理に関してはすべて同じです。
LevelTypeの後のデータは次のようになります。それぞれのデータについては後述します。

ステージスタイル (LevelISD): 2バイト
地形番号 (TilemapAreaNo): 1バイト
ステージパラメータ(LevelParams): 1バイト*5
カメラ制御設定 (CameraControll): 1バイト
スタート地点 (LevelEntrance): 1要素5バイト
スタート地点定義終了宣言: 1バイト、常に0xFF
移動先ステージ (Destination): 1要素2バイト
移動先ステージ定義終了宣言: 4バイト、常に0xFF 0xFF 0x00 0x00
ワールドマップ接続設定(Connection): 1要素4バイト
ワールドマップ接続設定終了宣言:2バイト、常に0xFF 0xFF

〇LevelType == 1
ボーナスステージ用の設定です。直後にボーナスステージの種類を表す値が1バイト存在します。
この1バイトを読取った後は通常と同じ処理を行います。

〇LevelType == 4, 5
施設やワールドマップ等で使用されているものと思われます。この2バイトを読込んで定義終了です。

〇上記以外
無効な設定。フリーズします。SGM2では、便宜上この2バイトを読み込んで定義終了としていますが、実際には動作しません。

設定値の詳細
〇 LevelType
ステージの種類を表します。通常、ワールドマップから突入するマップに対しては0を指定します。
ボーナスステージには1を、小部屋には2を、ボスステージには3を、ジャンプ先マップには6を指定します。

〇 BonusType
ステージの種類が1の時のみこの設定は有効です。
0:ボーナスなし
1:みんなやっつけろ
2:星を集めろ
3:コインを探せ

〇LevelISD
統合スタイルデータ(ISD)の所在アドレスを指定します。

〇TilemapAreaNo
ISDで指定されたタイルマップのうち、どの部分を使用するかを指定します。
タイルマップは別々のステージが使用するマップを集約した大きなマップであり、その一部分を切り分けて使用するようになっています。
この切り分け方はマップ設定で規定されており、この値は、マップ設定で規定されたサブマップの番号を表します。

〇LevelParams
それぞれ独立した作用を持つ設定値が5バイトあります。具体的にどういう効果を持つのかは不明ですが、
アニマルの持ち込み可否、ボーナスステージの退場処理などを操作していることが経験的に知られています。
コースターに乗ったままコインを取得させた後、退場演出がかからない場合は、このパラメータを適切に設定することで修正することができます。

〇CameraControll
カメラアングルの設定を行います。元々は正体不明のLevelParamsの第6バイトとされていたものです。(SDK2Editorではパラメータの第6バイトがこの設定です)
0: 標準(やや下寄りのアングル)
1: ぶれ(デッキ面標準設定)
2: 上より(やや上の方を広く映します。縦面、特に上に登るような構成のマップではこの設定が使われています)

〇LevelEntrance
構造化された5バイトのデータです。
第1バイト:パラメータ (不明な点が多いが、スタート時の向きなどを操作している)
第2バイト:X座標 (符号なし16ビット。実際の座標はここから256を減じたもの。)
第4バイト:Y座標 (同上)

〇Destination
クリアした後に進むことができるステージはもちろん、ボーナスステージのマップなど、このマップから直接移動することができるステージの番号の配列です。
1要素2バイトとなっていますが、実際には上位バイトは使用されません。

〇Connection
クリア後に現在のマップとそこから直接つながるマップ以外に、ワールドマップ上で接続すべきマップがある場合に指定されます。
1要素4バイトで、前半2バイトが始点、後半2バイトが終点となります。実際にはどちらも上位バイトは使用されません。
具体的な使用例は、実例とワールドマップを照らし合わせながら確認するとよく理解できると思います。
Trainee Trekker
Bananas received 37
Posts: 57
Joined: 2015

Re: SDK2/ DKC2 データフォーマット

Postby Quaraage » April 8th, 2017, 5:13 pm

ステージスタイル設定

ステージスタイル(ISD)は固定長のデータで、バンク$FD内に存在します。
各ステージが使用するISDは、ステージ設定にて規定されており、ISDそのものの配列ポインタなどはありません。

ISDのデータ構造は次の通りです。
追加パレット指定(2バイト)
効果1(2バイト)
BGM(2バイト)
ベースパレット(2バイト)
不明データ1(2バイト)
不明データ2(2バイト)
描画メソッド(1バイト)
タイルセット(1バイト)
画面更新処理(2バイト)
マップスクロール処理(2バイト)
タイルマップ番号(1バイト)
効果2(1バイト)
特殊効果(1バイト)

〇追加パレット指定
CGRAMにロードされたパレットの一部または全部を、動的に書き換えるための追加アセンブリのポインタです。
2バイトでの指定ですが、実際には上位バイトは無効です。

〇効果1
主に水中設定や背景などを司りますが、詳しい内容は不明です。
2バイトでの指定ですが、実際には上位バイトは無効です。

〇BGM
ステージ内で鳴らすBGMの番号です。実際には、BGM追加指定で破棄されることがあるため、この設定は基本設定と考えてください。
2バイトでの指定ですが、実際には上位バイトは無効です。

〇ベースパレット
CGRAMに転送する地形用128色パレットの先頭アドレスを指定します。バンクは$FD内です。
マップ設定に書かれた基本設定を継承する場合には、ヌルポインタ0を指定します。

〇不明データ1/2
具体的詳細については不明ですが、ステージ入場時の処理を司っている模様。

〇描画メソッド
画面モードや各BG面の使用するデータのアドレス、ウィンドウマスクなどの特殊効果など、PPUの画面レンダリング全体を司るデータを指定します。
SGM2の[総合グラフィックエディタ]内、[描画方式の設定]で内容を編集できます。
PPUのハードウェアレジスタに直接値をセットするため、非常に低レベルなデータとなります。

〇タイルセット
このISDを適用するマップで使用するグラフィックファイルを指定します。この設定により地形の画像や背景の画像が規定されます。
正しい描画メソッドと正しいタイルマップを使用しなければ描画は崩壊します。

〇画面更新処理
レイヤスクロールなどを司っているようですが、詳しいことは分かっていません。設定値はアセンブリへのポインタです。

〇地形のスクロール
レイヤスクロールなどを司っているようですが、詳しいことは分かっていません。設定値はアセンブリへのポインタです。
2バイトでの指定ですが、実際には上位バイトは無効です。

〇タイルマップ番号
このISDを適用するステージで使用するタイルマップを指定します。各マップチップの構成データはこのデータに関連付けられているため、
地形のグラフィックを変更する場合は、描画メソッドだけではなくタイルマップも変更する必要があります。

〇効果2
ロープ判定など、一部の設定を切り替えるなどします。詳しいことはよくわかっていません。

〇特殊効果
追加で様々な効果を付与できます。異なる8つのフラグセットです。
bit7: 風の音を有効にする (効果音が鳴るだけで、実際に風が吹くわけではない)
bit6: コースターで使用 (具体的にどういう効果があるのかは不明)
bit5: 足場が滑る
bit4: 沼・氷ステージで使用 (具体的にどういう効果があるのかは不明)
bit3: 蜂蜜を有効にする (マップチップコリジョンデータ側で蜂蜜設定を有効にしても、このビットが立っていない限り無効)
bit2: 未使用設定
bit1: 茨ステージで使用 (具体的にどういう効果があるのかは不明)
bit0: 足場で滑らない (主に熱気球用。スプライト製の足場上での左右移動を禁止します。この設定を使用した場合、蜘蛛の巣も歩けなくなる。)
Trainee Trekker
Bananas received 37
Posts: 57
Joined: 2015

Re: SDK2/ DKC2 データフォーマット

Postby Quaraage » April 8th, 2017, 5:21 pm

BGM追加指定

通常、ステージ内のBGMは、ISDで規定されたBGMを使用しますが、一部のマップ(主にボーナスステージとボスステージ)では、ISDでの指定を無視しています。
このような設定を可能にするのがBGM追加指定です。
※「追加指定」とあるが実際には複数のBGMを鳴らせるようにするわけではない。ISDの設定を上書きするのが目的。

BGM追加指定はアドレス$BB:94B7に存在します。1要素1バイト、標準206要素です。
現在のマップのBGM追加指定を取得する場合、$BB:94B7に現在のステージ番号を足したアドレスにある1バイトを参照すれば構いません。

0が設定されている場合、ISDの指定を継承します。
0以外の値が設定されている場合、ISDの指定をこの値に上書きします。値はBGM番号であり、ISDで指定するBGM番号と同一のものです。

BGM追加指定が存在する理由ですが、(主に使用する効果音の都合で)BGMだけが違う複数のISDを定義せずに済み、容量の節約となるということが考えられます。
BGM追加指定を適切に利用することで、ボスステージで別のBGMを鳴らしたり、ボーナスステージ内での音バグを改善したりすることができます。
Trainee Trekker
Bananas received 37
Posts: 57
Joined: 2015

Re: SDK2/ DKC2 データフォーマット

Postby Quaraage » April 8th, 2017, 5:30 pm

タイルセット

タイルセットとは、ステージ内で使用するスプライト以外のグラフィックデータを束ねた管理ファイルです。
このデータは構造化されており、このタイルセットを通して、実際の地形/背景用グラフィックファイルをVRAMに転送しています。

タイルセットは1項目7バイトで、そのデータは次のようになっています。
転送するグラフィックファイルのバンク (1バイト)
転送するグラフィックファイルの16bitアドレス (2バイト)
グラフィックファイルの転送先VRAMアドレスおよびデータフォーマット指定 (2バイト)
VRAMに転送するサイズ (2バイト)

〇バンク
文字通り、転送するグラフィックファイルのバンクを指定します。0の場合、タイルセット定義の終了です。

〇グラフィックファイルのアドレス
文字通り、転送するグラフィックファイルの16bitアドレスです。上位8bitを先に読込んだバンク、下位16bitをこのアドレスとした場所からタイルセットは転送されます。

〇転送先VRAMアドレスおよびフォーマット指定
下位15bitが転送先のアドレスとなります。なお、実際の転送先アドレスはこの値の2倍です。
最上位ビットが立っている場合、このグラフィックファイルは圧縮されていることを示します。したがって、VRAMへの転送前に解凍処理が行われます。
最上位ビットがクリアされている場合、非圧縮生データですので直接VRAMへの転送が行われます。

〇転送サイズ
VARMに転送するサイズを指定します。このサイズ設定は、展開後のデータを基準にして行うため、
必ずしも個々のグラフィックファイルそのもののサイズではないことに注意してください。

なお、グラフィックファイルの転送はDMAを介して高速に行われます。

以下、タイルセット処理コードの逆アセンブリ(日本語版 V1.0)
Spoiler!
Code: Select all
タイルセット転送
エントリポイント BB:80B0

BB:8CB5  8B      PHB         ;
BB:8CB6  F4 81 FD   PEA   #$FD81      ;
BB:8CB9  AB      PLB         ;
BB:8CBA  AB      PLB         ; DB=$FD
BB:8CBB  0A      ASL   A      ; タイルセット番号
BB:8CBC  A8      TAY         ;
BB:8CBD  BE 9A 81   LDX   $819A,Y      ; タイルセットポインタ
BB:8CC0  E2 20      SEP   #$20      ; A:8
BB:8CC2  BD 9A 81   LDA   $819A,X      ; バンク
BB:8CC5  F0 4D      BEQ   $8D14      ;
BB:8CC7  BD 9E 81   LDA   $819E,X      ; VRAMエントリ上位
BB:8CCA  30 4C      BMI   $8D18      ;
BB:8CCC  C2 20      REP   #$20      ; A:16
BB:8CCE  82 83 00   BRL   $8D54      ;

//DMA転送準備
BB:8D54  E2 20      SEP   #$20      ; A:8
BB:8D56  BD 9A 81   LDA   $819A,X      ; バンク
BB:8D59  85 28      STA   $28      ;
BB:8D5B  A9 7F      LDA   #$7F      ; コピーデータの所在バンク(常に$7F)
BB:8D5D  8F 04 43 00   STA   $00:4304   ; DMA A1B0
BB:8D61  C2 20      REP   #$20      ; A:16
BB:8D63  A9 00 00   LDA   #$0000      ; コピーデータの所在アドレス(常に$0000)
BB:8D66  8F 02 43 00   STA   $00:4302   ; DMA A1T0L
BB:8D6A  BD 9B 81   LDA   $819B,X      ; データアドレス
BB:8D6D  85 26      STA   $26      ;
BB:8D6F  BD 9D 81   LDA   $819D,X      ; VRAMエントリ
BB:8D72  8F 16 21 00   STA   $00:2116   ; PPU VMADDL
BB:8D76  DA      PHX         ;
BB:8D77  BD 9F 81   LDA   $819F,X      ; 転送サイズ
BB:8D7A  1A      INC   A      ;
BB:8D7B  29 FE FF   AND   #$FFFE      ; 2バイトずつ転送するので偶数に切り上げ
BB:8D7E  A8      TAY         ;
BB:8D7F  AA      TAX         ;
BB:8D80  B7 26      LDA   [$26],Y      ;
BB:8D82  9F 00 00 7F   STA   $7F:0000,X   ; 転送するデータを7F:0000にコピー
BB:8D86  88      DEY         ;
BB:8D87  88      DEY         ;
BB:8D88  BB      TYX         ;
BB:8D89  10 F5      BPL   $8D80      ;
BB:8D8B  FA      PLX         ; コピー終了
BB:8D8C  E2 20      SEP   #$20      ; A:8
BB:8D8E  82 5B FF   BRL   $8CEC      ;

BB:8CEC  BD 9F 81   LDA   $819F,X      ; 転送サイズ下位
BB:8CEF  8F 05 43 00   STA   $00:4305   ; DMA DAS0L
BB:8CF3  BD A0 81   LDA   $81A0,X      ; 転送サイズ上位
BB:8CF6  8F 06 43 00   STA   $00:4306   ; DMA DAS0H
BB:8CFA  A9 18      LDA   #$18      ;
BB:8CFC  8F 01 43 00   STA   $00:4301   ; DMA BBAD0
BB:8D00  A9 01      LDA   #$01      ;
BB:8D02  8F 00 43 00   STA   $00:4300   ; DMA DMAP0
BB:8D06  8F 0B 42 00   STA   $00:420B   ; CPU MDMAEN DMA転送開始
BB:8D0A  C2 20      REP   #$20      ; A:16
BB:8D0C  8A      TXA         ;
BB:8D0D  18      CLC         ;
BB:8D0E  69 07 00   ADC   #$0007      ; 次のデータを読み込む
BB:8D11  AA      TAX         ;
BB:8D12  80 AC      BRA   $8CC0      ;

//タイルセット読込終了処理
BB:8D14  C2 20      REP   #$20      ; A:16
BB:8D16  AB      PLB         ;
BB:8D17  60      RTS         ;

//VRAMエントリ上位が負数のとき:圧縮データ
BB:8D18  C2 20      REP   #$20      ; A:16
BB:8D1A  BC 9B 81   LDY   $819B,X      ; データアドレス
BB:8D1D  BD 9A 81   LDA   $819A,X      ; バンク
BB:8D20  29 FF 00   AND   #$00FF      ;
BB:8D23  DA      PHX         ;
BB:8D24  BB      TYX         ;
BB:8D25  A8      TAY         ;
BB:8D26  8B      PHB         ;
BB:8D27  4B      PHK         ;
BB:8D28  AB      PLB         ;
BB:8D29  22 9E 8D BB   JSL   $BB:8D9E   ; 解凍ルーチン(割愛)

//DMA転送準備
BB:8D2D  AB      PLB         ;
BB:8D2E  FA      PLX         ;
BB:8D2F  E2 20      SEP   #$20      ; A:8
BB:8D31  BD 9D 81   LDA   $819D,X      ; VRAMエントリ下位
BB:8D34  8F 16 21 00   STA   $00:2116   ; PPU VMADDL
BB:8D38  BD 9E 81   LDA   $819E,X      ; VRAMエントリ上位
BB:8D3B  29 7F      AND   #$7F      ; 正数にする
BB:8D3D  8F 17 21 00   STA   $00:2117   ; PPU VMADDH
BB:8D41  A9 7F      LDA   #$7F      ; 展開後データの所在バンク(常に7F)
BB:8D43  8F 04 43 00   STA   $00:4304   ; DMA A1B0
BB:8D47  C2 20      REP   #$20      ; A:16
BB:8D49  A9 00 00   LDA   #$0000      ; 展開後データの所在アドレス(常に0000)
BB:8D4C  8F 02 43 00   STA   $00:4302   ; DMA A1T0L
BB:8D50  E2 20      SEP   #$20      ; A:8
BB:8D52  80 98      BRA   $8CEC      ;

//未使用?
//ROMから直読みするようにDMAを設定している以外は処理は同じ。
//おそらくROMからの直読みの場合、前回のDMA転送が間に合わずバッティングすることがあるため、コピー処理で時間稼ぎをするようになっていると思われる。
BB:8CD1  E2 20      SEP   #$20      ; A:8
BB:8CD3  BD 9A 81   LDA   $819A,X      ;
BB:8CD6  8F 04 43 00   STA   $00:4304   ; DMA A1B0
BB:8CDA  C2 20      REP   #$20      ; A:16
BB:8CDC  BD 9B 81   LDA   $819B,X      ;
BB:8CDF  8F 02 43 00   STA   $00:4302   ; DMA A1T0L
BB:8CE3  BD 9D 81   LDA   $819D,X      ;
BB:8CE6  8F 16 21 00   STA   $00:2116   ; PPU VMADDL
BB:8CEA  E2 20      SEP   #$20      ; A:8
Trainee Trekker
Bananas received 37
Posts: 57
Joined: 2015


Return to 日本語フォーラム (Japanese Forum)

Who is online

Users browsing this forum: No registered users and 1 guest