2-658氏のサブマップ解析メモをまるコピペ


380500- サブマップデータオフセット[2byte] 0x380000にこの値を足す
380C00- サブマップデータ[可変長]

7ED0A7[2byte]現在のサブマップID

●サブマップデータ
4つのブロックに分かれている

◆ブロック1(表示関連)
フラグ1[1byte]
レイヤー1オフセット[3byte] 最前面
レイヤー2オフセット[3byte] フラグ1の0x40が立っていない場合は無し
レイヤー3オフセット?[3byte] フラグ1の0x20が立っていない場合は無し
プロパティオフセット[3byte]
マップチップID[1byte]
パレットセットID[1byte]
不明[1byte] フラグ1の0x20が立っていない場合は無し
不明[1byte] フラグ1の0x20が立っていない場合は無し
オブジェクト構成ID[1byte]
表示位置X[1byte]
表示位置Y[1byte]
サイズX[1byte]
サイズY[1byte]
マップ名称ID[1byte]
禁止操作など[1byte]
フラグ2[1byte]
フラグ3[1byte]
不明[2byte] フラグ2の0x01が立っていない場合は無し
下のデータの個数[1byte] フラグ2の0x02が立っていない場合は無し
不明[4byte] 上の値分繰り返す フラグ2の0x02が立っていない場合は無し

◆ブロック2(配置キャラクタ関連 フラグ3の0x80が立っていない場合は無し)
フラグ4[1byte]
設置可否判定[2byte] フラグ4の0x20が立っていない場合は無し
表示位置X[1byte] フラグ4の0x10が立っていない場合は無し
表示位置Y[1byte] フラグ4の0x10が立っていない場合は無し
向き[1byte] フラグ4の0x10が立っていない場合は無し
グラフィックID[1byte] フラグ4の0x08が立っていない場合は無し
イベントID[2byte] フラグ4の0x04が立っていない場合は無し
性質[2byte] フラグ4の0x02が立っていない場合は無し
※以上を人数分繰り返す。フラグ4の0x80が立ったらブロック2終了

◆ブロック3(イベント関連)
  • 宝箱(フラグ3の0x40が立っていない場合は無し)
宝箱の数[1byte]			中身フラグ〜イベントIDを宝箱の数だけ繰り返す
解放後オブジェクトID[1byte]
解放前オブジェクトID[1byte]
中身フラグ[1byte]
中身ID[1byte]			中身フラグのbit2-3が0x08なら無し
開放フラグID[1byte]
X座標[1byte]
Y座標[1byte]
イベントID[2byte]		中身フラグのbit2-3が0x08以外なら無し
  • 表示範囲切り替え設定(フラグ3の0x20が立っていない場合は無し)
マスクサイズXY?[1byte]
マスクオブジェクトID1[1byte]
マスクオブジェクトID2[1byte]
マスクオブジェクトID3[1byte]
マスクオブジェクトID4[1byte]
  • 透過処理(フラグ3の0x10が立っていない場合は無し)
フラグ+メインスクリーン[1byte]	0x10=キャラ、0x04=レイヤー3、0x02=レイヤー2、0x01=レイヤー1
不明[1byte]			フラグの0x20が立っていない場合は無し
不明[1byte]			フラグの0x20が立っていない場合は無し
サブスクリーン[1byte]
カラー演算設定[1byte]
カラー演算式[1byte]
カラー演算固定色[1byte]
  • 不明(フラグ3の0x08が立っていない場合は無し)
カウンタ[1byte]			以下2byteをカウンタ分繰り返す
不明[1byte]
不明[1byte]
  • アニメーション設定(フラグ3の0x04が立っていない場合は無し)
設定数[1byte]			以下2byteを設定数分繰り返す
アニメーション設定[2byte]	下位10bit=オブジェクトID、上位6bit=アニメーションパターン?
  • Xボタンで発生するイベント(フラグ3の0x02が立っていない場合は無し)
XボタンイベントID[2byte]
  • 不明(フラグ2の0x80が立っていない場合は無し)
不明[2byte]
  • マップ端で発生するイベント(フラグ2の0x40が立っていない場合は無し)
マップ北端イベントID[2byte]
マップ南端イベントID[2byte]
マップ西端イベントID[2byte]
マップ東端イベントID[2byte]
  • 戦闘関連(フラグ2の0x20が立っていない場合は無し)
デフォルトの戦闘背景[1byte]	陣形変更時の背景にも使用される
不明[1byte]			フラグ3の0x01が立っている場合は無し
敵行動選択加速[1byte]		フラグ3の0x01が立っている場合は無し
  • 不明(フラグ2の0x10が立っていない場合は無し)
1byteのフラグと、それに続く何かのデータ。詳細不明。
  • 移動関連(フラグ2の0x08が立っていない場合は無し)
エフェクト?[1byte]
効果音(奇数)[1byte]
効果音(偶数)[1byte]
  • イベント発生ポイント設定(必ず必要)
イベント[2byte]		イベント発生ポイントの数だけ繰り返す。FFで終了。
			移動イベントの場合はイベントID10xxになり、ブロック4の移動ポイントに関連付けられる。
			xxは01からの連番でそのマップ内でのみ有効なイベントID。

◆ブロック4(移動イベントの移動先 10xxのイベントの数だけ繰り返す)
5byteのデータをイベント数分繰り返す。
内容は11xxイベントと同じ。



●表示レイヤーの構造
基本構造は、基礎チップでマップを埋め尽くして、木や建物などのオブジェクトを指定座標に配置していく。

サイズXY[1byte] 上位4bit*32=サイズX 下位4bit*32=サイズY
基礎チップ[2byte] ここで指定するのは通常、オブジェクトIDではなくチップID+パレットID。
			オブジェクト構成の項でかかれているチップIDとパレット[2byte]の値に+0x0100したもの。
			ただし、bit8-9が0の場合は下位1バイトがオブジェクトIDを表す。
データサイズ[2byte] ヘッダを含めたサイズ

以降配置オブジェクトを繰り返す
X座標[1byte]
Y座標[1byte]
フラグ[1byte]
以降フラグによって可変

フラグ
  • bit0-1が0の場合
 4byte目のオブジェクトを配置
  • bit0-1が1-2の場合
 フラグのbit0-1から1引いた値を上位1byte、次の1byteを下位1バイト、フラグのbit2-4をパレットとするチップを直接配置。
 直接配置可能なチップは1FFまで。
  • bit7=上下反転
  • bit6=左右反転
  • bit0-1が3の場合
 bit2-5の値で以下の処理に分岐
03
07 XX YY 07 XY増分 XY表示間隔 ID(上位) ID(下位)
同一オブジェクトを右下方向に並べる
0B
0F
13
17
1B
1F
23 XX YY 23 XY増分 XY表示間隔 ID(上位) ID(下位)
同一オブジェクトを左下方向に並べる
27
2B
2F
33



●プロパティのデータ構造
2つのブロックに分かれている。

◆ブロック1
マップ内に移動ポイントなどを配置するためのデータ
同じエリアに同じ意味のフラグを2回設定すると、フラグが無効になる。(3回設定すると有効になる。)

データサイズ[2byte] この2byteは含まない。フラグ〜サイズをデータサイズ分繰り返す
フラグ[1byte]
X座標[1byte]
Y座標[1byte]
XYサイズ[1or2byte] フラグが偶数の場合2byte(XX YYの順番)
			フラグが奇数の場合1byte(上位4bitがX 下位4bitがY)

  • フラグごとの意味
02,03
04,05
08,09 イベント発生ポイント(扉で移動など)。左上から順にマップデータブロック3のイベントポイント設定に関連付けられる。
10,11
20,21 表示範囲切り替え機能のマスク範囲
40,41
80,81 背景をキャラの前面に表示(本来キャラの後ろに表示されるチップに対して使う)

◆ブロック2
キャラ移動後に足跡を残したりするためのデータ。
(オブジェクト構成の先頭4byteもこの機能に関係あるらしい。)
圧縮?されている。展開方法はわかったけどデータの意味が不明。
使わないなら00 00 00 00で良い(と思う)。



●マップチップデータ構造
1つのマップには5つのチップセットを含めることが出来る
ブロック1に指定するのはセット番号
各セット内のチップIDの一覧は39A800から5byte単位で書かれている。
チップのオフセットは39AD00から3byte単位で書かれている。
チップグラフィックデータは39AD00のオフセットをたどった先にあり、圧縮されている。
展開方法は以下のとおり。

1byte目がフラグで2byte目以降が可変長の実データ。
フラグ 01-7F 次の1byteをフラグの値+1回繰り返す
80-FF	フラグの値AND7F+1バイト分次のデータを読み込む
00	データ終了
上記の処理を00が4回出てくるまで繰り返し、4ブロックのデータを作成する。この4ブロックは必ず同一サイズになる。
4ブロックのデータを以下のように並べ替える。(100は1ブロックの00バイト目、30Aは3ブロックの0Aバイト目の意味)
100 200 101 201 102 202 103 203 104 204 105 205 106 206 107 207
300 400 301 401 302 402 303 403 304 404 305 405 306 406 307 407
108 208 109 209 10A 20A 10B 20B 10C 20C 10D 20D 10E 20E 10F 20F
308 408 309 409 30A 40A 30B 40B 30C 40C 30D 40D 30E 40E 30F 40F
110 210 111 211 112 212 113 213 114 214 115 215 116 216 117 217
310 410 311 411 312 412 313 413 314 414 315 415 316 416 317 417
118 218 119 219 11A 21A 11B 21B 11C 21C 11D 21D 11E 21E 11F 21F
318 418 319 419 31A 41A 31B 41B 31C 41C 31D 41D 31E 41E 31F 41F

以下データ終了までこのパターンを繰り返す



●パレットデータの構造
1つのマップには7つのパレットを含めることが出来る
ブロック1に指定するのはセット番号
各セット内のパレットIDの一覧は3CF400から7byte単位で書かれている。
このセット内の値にフラグ1のbit0-1をbit8-9として加えたものが実際のパレットIDになる。
たとえばパレットセット内の7byteのデータが 80 81 82 83 84 85 86 で、フラグ1がE1だった場合は
実際のパレットIDは 180 181 182 183 184 185 186 になる。
パレットデータは2CA400から32バイト固定長で並んでいる。



●オブジェクト構成
※ここでいうオブジェクトとは、木や建物などのマップを構成する要素のこと。
 ロマサガ3のマップは固定サイズのチップを単純に並べて構成されているわけでは無く、
 基本となるチップでマップ全体を埋めた後に、可変サイズのオブジェクトを指定座標に
 配置していくことで作成されている。

オフセットは370000〜3byte単位
圧縮されたデータで展開方法は後述。

展開後のデータは以下のようになる

オブジェクトを構成するチップの数(-1)[1byte]
チップIDとパレット[2byte]
チップ配置座標[1byte]
 (上記3byteをチップ数分繰り返す)
チッププロパティ[1byte]
 (上記1byteをチップ数分繰り返す)

上記のセットをオブジェクト数分繰り返す。

  • チップIDとパレット
1つのマップには5つのチップセットを含めることが出来、1つのチップセットには
8*8ドットのチップが128個存在する。
したがって、1マップには128*5=640個のチップが使用でき、これに000〜27FのIDが付けられる。
チップIDとパレットは2byteリトルエンディアンで表記され、
bit0〜9はチップID、
bit10〜12から1を引いた値がパレット番号、
bit13は不明、
bit14は左右反転表示
bit15は上下反転表示


  • チップ配置座標
複数チップで1つのオブジェクトを構成する場合に、
どのチップをどの位置に配置するかを決める。
上位4bitがX座標で、下位4bitがY座標。

  • チッププロパティ
進入可否や、キャラクタの前に表示するか後ろに表示するか等を
設定していると思われるが詳細不明。


  • 圧縮データの展開手順
基本構造は、8x8ドットのチップを配置する格子状の領域を確保し、左上から横方向に
指定チップで埋めていくことでオブジェクトを作成する。
このとき透明色のみの部分はスキップされ、必要チップ数としてはカウントされない。
XY座標は00からスタートし、1データ書き込むごとにXをカウントアップ。XがX幅を超えたらYがカウントアップし、Xが0になる。
チップID書き込み時にXY座標も書き込む。(以下の説明では省略)

変化オブジェクト設定1[1byte] 詳細不明
変化オブジェクト設定2[1byte] 詳細不明 変化オブジェクト設定1が0なら無し
変化オブジェクト設定3[1byte] 詳細不明
変化オブジェクト設定4[1byte] 詳細不明 変化オブジェクト設定3が0なら無し

      • オブジェクト形成処理 00FFFFを読み込むまで繰り返す---
チップ数(-1)[1byte] 透明チップは含まない。
次の1byteがFFならさらに次の1byteがオブジェクトのX幅になる。
FF以外の場合は、X幅を0x10固定にして、ここで読み込んだ1byteはそのままチップID配置処理の先頭byteとして処理する。
※チップ数00、X幅FFFFで処理終了
      • チップID配置処理 必要チップが埋まるまで繰り返す---
1byte読み込んで、その値により以下の処理に分岐。
1.FFで、共通パレットが設定されている場合
次の1byteを読み込み、bit2-3の値により処理を分岐。
X0		X+1チップ分スキップ(スキップしたチップは全体の個数にカウントしない。XY座標のみカウントする)
X4		X+1個同じチップを並べる(チップIDは次の1byte、共通パレットがなければもう1バイト読み込む)
X8		次の1byteを共通パレット(&チップID上位バイト)として設定
0C		共通パレット解除
XC		チップID#$FFを配置する(パレットは共通を使用)
2.下位2bitが03で共通パレットが設定されていない場合
bit2-3の値により上記の処理に分岐。
3.その他
共通パレットが設定されていれば、読み込んだ値をチップIDの下位バイトとして書き込む。
共通パレットが設定されていなければ、読み込んだ値をパレットとして書き込み、もう1byte読み込んで下位バイトとする。
      • チップID配置処理 ここまでチップ数分繰り返し---
      • チッププロパティ配置処理 必要チップが埋まるまで繰り返す---
1byte読み込んで、その値により以下の処理に分岐。
1.FFの場合
次の1byteを読み込みその値+1回FFを書き込む。
2.その他
その値をそのまま書き込む。
      • チッププロパティ配置処理 ここまでチップ数分繰り返し---
      • オブジェクト形成処理 ここまで 00FFFFを読み込むまで繰り返す---


●シナリオコード11xxのワープ先設定
xxがワープ先IDになっている。
ワープ先の設定は3CFB00から5byte単位で並んでいる。
空きは無いっぽい。
各byteの意味は以下の通り。
1byte目 :bit4-7 画面切り替えエフェクト(0=通常:1=落下:2=画面が揺れる?:3=ホワイトアウト:その他未調査)
          bit3   キャラ非表示?
          bit2   音楽変更有効
          bit0-1 切り替え後のキャラの向き
2-3byte目:音楽ID+マップID(上位6bitが音楽ID。指定できるのは3Fまで。)
4byte目 :X座標
5byte目 :Y座標
最終更新:2012年06月18日 12:25