トップ小ネタPrince of Persia > マップデータ


マップデータ

MAPファイル(LEV00.MAP〜LEV15.MAP)にはマップデータが入っています。
まだ謎な部分もありますが、ここでは判明している部分だけを載せておきます。

・MAPファイルは圧縮されています。以降に記してあるアドレスは展開後のものです。
 圧縮データの展開方法はここを参照してください。

基本事項
・マップデータのサイズ(展開後)は$1400(5,120)byte
・1つの面は24の部屋(24画面)からなり、各部屋は横10マス*縦3マスのマップパーツからなる
 (さらに、各マップパーツは小さいパーツが組み合わさってできています)
・部屋番号はデータの先頭から順に、1から割り振られる(0からではありません)
・特定の面固有の仕掛けについてはマップデータには入っていない?
 (プログラム側で決めうちしていて、自分でいじることは不可能?)

・面とファイルの対応(12面は4つに分かれています)
ファイル名レベル(面)CHRファイル
(小パーツ画像)
PLATEファイル
(仕掛け床画像)
LEV00.MAPデモ画面LEV01.CHRPLATE1.DAT
LEV01.MAP〜LEV03.MAP1面〜3面
LEV04.MAP〜LEV06.MAP4面〜6面LEV04.CHRPLATE4.DAT
LEV07.MAP〜LEV09.MAP7面〜9面LEV07.CHRPLATE7.DAT
LEV10.MAP〜LEV11.MAP10面〜11面LEV10.CHRPLATEA.DAT
LEV12.MAP12面(前半)LEV12.CHRPLATEC.DAT
LEV13.MAP12面(分身と合体した後)
LEV14.MAP12面(ラスボスまでの通路)LEV14.CHRPLATEE.DAT
LEV15.MAP12面(ラスボス戦)LEV15.CHR

データ構造
$0〜$7FF パーツの組み合わせ(小→中)
$800〜$9FF パーツの組み合わせ(中→大)
$A00〜$AFF マップパーツの属性
$B00〜$DCF マップ構造
$DD0〜$109F 各マスのパラメータ?
$10A0〜$129Fスイッチ設定
$12A0〜$12FFマップ(部屋)のつながり
$1300〜$133F???
$1340〜$1342スタート位置設定
$1343〜$1346???
$1347〜$135E各部屋の敵の初期位置
$135F〜$13A6???
$13A7〜$13BE敵の思考パターン
$13BF〜 ???

(パーツの組み合わせについて)
CHRファイルには16*16ドットの小さいパーツ(以降「小パーツ」と呼ぶことにします)が格納されています。
これをまず縦横4*4個(計16個)組み合わせて64*64ドットの中サイズのパーツ(中パーツ)を作ります。
この中パーツを縦に2個並べ、さらに2層(手前・奥)に重ね合わせた64*128ドット(*2層)のパーツ(大パーツ)が
実際にマップに配置される「マップパーツ」となります。

・小パーツ→中パーツへの組み合わせ($0〜$7FF : $800byte)
指定した16個(4*4)の小パーツを組み合わせて、1つの中パーツを作成(登録)します。
データは1つの中パーツあたり16byteで、1byte単位で左上から横方向に小パーツ番号が格納されます。
(小パーツ番号はCHRファイルの格納順で$00〜$FFの256個から指定します)
最大128個($00〜$7F)作成可能です。

・中パーツ→大パーツへの組み合わせ($800〜$9FF : $200byte)
上の項目で作成した中パーツをさらに縦に2個、2層に組み合わせて大パーツ(マップパーツ)を作成します。
$800からは下層(奥)、$900からは上層(手前)のデータです。
それぞれ大パーツごとに2byte単位で、1byte目に上側、2byte目に下側の中パーツ番号が格納されます。
大パーツ(マップパーツ)も$00〜$7Fの128個まで作成可能です。
大パーツ$00 大パーツ$01 ... 大パーツ$7F
下層(奥) $800
$801
$802
$803
... $8FE
$8FF
上層(手前) $900
$901
$902
$903
... $9FE
$9FF

・マップパーツの属性($A00〜$AFF : $100byte)
1パーツごとに2byte単位で格納されていますが、2byte目(上位16bit)については不明です。

○基本
+$01
$02
+$04 たいまつ(炎アニメ表示)
※床(+1)およびたいまつ属性(+4)は同時に指定できます。
 また、以降の仕掛け類との同時指定も可能です。

○仕掛け・オブジェクト類
 ※*印のものは通常、床属性も設定します。(値を+1する)
$08 崩れる床
$10* スイッチ床(開)
$18* スイッチ床(閉)
$20* 鉄格子
$28* スパイク
$30* 回復薬
$38* ダメージ薬
$40* 体力UP薬
$48* 画面反転薬
$50* 浮遊薬
$58* ギロチン
$60*
$68*
$70* 出入り口
$78* 骸骨
$80
$88 背景の星
※鉄格子と出入り口は該当マスの1つ右に設置されます。
※$80は鉄格子の上のマスに設定されていますが詳細は不明です。

・マップ構造($B00〜$DCF : $2D0byte)
ここで指定した番号のマップパーツが配置されます。
データの先頭から順に、左上から横方向に配置されていき、
これが横10マス*縦3段*24部屋分続きます。

・各マスのパラメータ($DD0〜$109F : $2D0byte)
仕掛けなどのパラメータ情報が格納されます。
(データの格納順はマップ構造と同じです)
スイッチ床 作動させるスイッチ番号
鉄格子 01だと上がった(開いた)状態でスタート
その他の仕掛け
(ギロチンなど)
00以外だと作動しない?

・スイッチ設定($10A0〜$129F : $200byte)
スイッチを踏んだときに対象となる鉄格子の位置が格納されます。
データは$10A0〜$119Fと$11A0〜$129Fの2つに分かれており、
それぞれ1byte単位でスイッチ番号$00〜$FFに対応しています。
(例えばスイッチ番号$05の場合、$10A5と$11A5の値から対象となる位置が決定されます)
値はビット単位で表のように複数の情報を含んでいます。

bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
$10A0〜 同時起動フラグ 部屋番号の下位2bit 部屋内の対象位置
(マス単位)
$11A0〜 部屋番号の上位3bit(bit4〜2) 未使用?
「同時起動フラグ」は、このbitが0の場合(1では無い点に注意)、次の番号のスイッチも同時に起動します。
(つまり、1つのスイッチで複数の鉄格子を動かすことができます)
そのスイッチの同時起動フラグが0ならば、さらに次のスイッチも起動しますが、
6つ以上同時に動かそうとするとゲームの動作がおかしくなってしまいます。

・マップ(部屋)のつながり($12A0〜$12FF : $60byte)
画面端へ来たときの移動先(部屋番号)が格納されます。
各部屋ごとに4byte単位で、1byte目から順に左、右、上、下方向への移動先が格納されます。
(移動先を指定しない場合は0になります)
その部屋自身の番号を指定することは出来ません。(ゲームが止まります)

なお、移動先は部屋ごとに別々に指定できるので、ねじれたマップ構成にすることも可能です。
(どの方向へ行っても同じ部屋へ行く、来た方向へ戻ると別の部屋へ行く、など)
※実際のゲーム(元々入っているデータ)ではこのようなことはなく、全ての部屋の画像をつなげると
 1つの大きなマップをつくることができます。

・スタート位置設定($1340〜$1342 : $3byte)
$1340 部屋番号
$1341 位置(マス単位)
$1342 向き($00=右向き $FF=左向き)
ただし、1面と13面では逆になります。
(スタート時の振り向き動作がないため)

・各部屋の敵の初期位置($1347〜$135E : $18byte)
部屋番号順に敵キャラの初期位置(マス単位)が格納されます。($1Fの場合はOFF)
(このデータ構造からもわかりますが、敵キャラは1部屋に一人しか配置できません)

・敵の思考パターン($13A7〜$13BE : $18byte)
敵の思考パターンを指定します。
(データの格納順は敵の初期位置と同様、部屋番号順です。)
この値によって敵の動き(強さ)が変わります。

注意点など
・グラフィックの関係上、床・壁などの地形の判定は、ゲーム中では半マス分程右にずれています。
 画面左端の半マス分は、つながっている部屋の右端マスの判定(属性)が適用されます。
 (左側がどの部屋ともつながっていない場合(00の場合)は壁扱いになります。)
・崩れる床が落下したり、アイテムを取得した場合、そのマスのパーツ番号が+1されます。
 このため、これらのパーツの次の番号には、同じグラフィックで該当する属性をOFFにした
 ものを設定します。
 (グラフィックが違う場合でも、画面を切り替えるまではそのマスの画像は更新されません)

戻る