マップ構成データの形式

マップ構成データの形式を説明します。
自作プログラムで「方眼紙マッピング」のデータを流用する場合には、参考にしてみてください。


ファイル出力の「マップ構成データ(方眼紙マッピング独自形式)を出力」で出力されるファイル内にはマップを構成する壁や床などの配置,マップの名称やサイズなどが記録されています、それを「方眼紙マッピング」独自の形式に従って読み込むことで、自作のゲームなどへのデータの流用が可能になります。
ただし、コマンドの[文字]でマップ上に書き込まれた文字データは出力されません。

マップを構成する各データについて、下記に説明をいたします。

1.迷宮名
2.フロア名
3.階層数
4.マップのサイズ
5.パーツ配置データ
6.壁のタイプが の場合の床データについて

迷宮名

マップデータのファイルから、下記の文字列を探してください。

MapName =

この文字列の後ろに、マップの名称が記録されています。

例:
MapName = 名称不明の迷宮

先頭へ戻る

フロア名

マップデータのファイルから、下記の文字列を探してください。

FloorName[0] =

この文字列の後ろに、各階層に付けられた名称が記録されています。

「FloorName」の後ろに付けられた[0]という数値は、階層の番号です。
階層数が3階層のマップの場合、下記のように三つの名称が並んで記録されています。

FloorName[0] = 1階
FloorName[1] = 2階
FloorName[2] = 3階

[ ]で囲まれた数値は0から始まる数値となっていますので、1階の名称が[0]に記録されるという形式になります。

先頭へ戻る

階層数

マップデータのファイルから、下記の文字列を探してください。

Floor =

この文字列の後ろに、マップの階層数が記録されています。
ただし、ここに記録されている数値は0から始まる数値になっています。
つまり、最下層が10階のマップの場合、9という数値が記録されていることになります。

例:
Floor = 9

先頭へ戻る

マップのサイズ

マップデータのファイルから、下記の文字列を探してください。

MapSizeX =
MapSizeY =

この文字列の後ろに、マップのサイズが記録されています。
MapSizeX には横方向のサイズが。MapSizeY には縦方向のサイズが記録されています。

ただし、ここに記録されている数値は0から始まる数値になっています。
つまり、横方向のサイズが20マスのマップの場合、MapSizeXには19という数値が記録されていることになります。

例:横方向が20マス。縦方向が10マスの場合
MapSizeX = 19
MapSizeY = 9

先頭へ戻る

パーツ配置データ

マップを構成する壁や床などの配置を記録している箇所の形式を説明します。
マップデータのファイルから、下記の文字列を探してください。

[MapData]

この文字列の下の行から、マップの構成データが下記のような文字列として並んでいます。

00000000000101000101010100010001010100010001000100000101010101000100000000000000000000000000000000000000000000000000000000
00000000000101000101010100010101000001000102000101000001000000000100000000000000000000000000000000000000000000000000000000

これは、マップの内容を16進数という数値で記録したものです。
16進数とは、0から始まって16で桁上がりする形式の数値です。
(日常で私たちが使っている数値は、0から始まって10で桁上がりする10進数です。)

10進数での0から16までの数値を、16進数では下記の形式で表記します。

0→00
1→01
2→02
3→03
4→04
5→05
6→06
7→07
8→08
9→09
10→0A
11→0B
12→0C
13→0D
14→0E
15→0F
16→10 桁上がりして、左側の数値が1になっています。

「方眼紙マッピング」では、マップを構成するパーツひとつひとつに番号を割り振っています。
パーツには「壁」「床」「空間」「物」の4種類があり、種類別に00番から始まる数値が割り振られています。

起動時に表示される、何もない床だけのマップ。これは、00番が割り振られた床のパーツで埋められている状態です。

壁,空間,物の3種のパーツでは、00番は「何もない」という状態を示しています。ですので、画面上に何もない状態でも、データとしては壁,空間,物のデータにも00という数値が入ってる状態になっています。

これらの数値を、プログラムから配列データに読み込んで使用します。

マップデータは、下記の4種類の配列データを重ね合わせて構成されています。

縦壁
横壁

空間


メッセージデータはまた違う形式となるので、別途説明をいたします。

まずは、壁と床のみを例にとって説明をします。

マップのサイズが3*3の場合、何も配置されていない状態の床と壁のデータは下記の状態になります。
ここでは見やすいように、ひとつひとつの数値をスペースで区切って表記しています。

【縦壁】

00 00 00 00
00 00 00 00
00 00 00 00

【横壁】

00 00 00
00 00 00
00 00 00
00 00 00

【床】

00 00 00
00 00 00
00 00 00

まずは床のデータを見てください。
3*3のサイズに対して、00の数も縦横共に3個になっています。

これがマス目にそのまま対応した形のデータになります。
空間と物についても、これと同じ状態になります。

次に縦壁のデータを見てください。
横方向への00の数が4個になっています。
そして、横壁については縦方向の00の数が4個になっています。

これは、「壁」がマス目とマス目の間に存在するものである事から生じる違いになります。

縦壁は、床のマスの左右に存在します。
そのため、左端の床の左側にある縦壁を1番目とすると、右端の床の右側にある縦壁は4番目となるのです。


同様に、横壁は床のマスの上下に存在します。
そのため、一番上の床の上部にある横壁が1番目とすると、一番下の床の下部にある横壁が4番目となるわけです。

これを踏まえた上で、上部右端の縦壁と上部右端の横壁、そして上部右端の床にエレベーター(パーツ番号:03)が配置された状態を見てみましょう。

【縦壁】

00 00 00 01
00 00 00 00
00 00 00 00

【横壁】

00 00 01
00 00 00
00 00 00
00 00 00

【床】

00 00 03
00 00 00
00 00 00

これで、上部右端のマス目にエレベーターが設置されていて、エレベーターの上と右に壁があるという状態が出来あがります。

空間と物のデータについては、床と同じ扱いになります。
上記のエレベーターの箇所がダークゾーン(パーツ番号:01)になっていて、さらに宝箱(パーツ番号:01)が設置されているという場合には下記のようなデータとなります。

【空間】

00 00 01
00 00 00
00 00 00

【物】

00 00 01
00 00 00
00 00 00

では、実際のデータの形式を見てみましょう。

データそのものは、これまでに説明した通りの形式となります。
ただし、例に挙げたようにスペースで区切られた形にはなっていません。
上で説明したようにエレベーターが設置された床を実際の形式で表記すると、下記のようになります。

000003
000000
000000

マップの横方向のマス数毎に、データは改行されています。
「方眼紙マッピング」のマップデータで扱う16進数は二桁となっていますので、横方向のマップサイズが3の場合6文字毎に改行が入ることになります。

[MapData]の下の行から始まるマップデータは、下記の通りの順番で記録されています。

1.縦壁
2.横壁
3.床
4.空間
5.物

それぞれ、階層数の数だけ連続して記録されています。
階層数が3階のマップの場合、縦壁のデータのみ3階層分連続して記録され、そのあとに横壁のデータが3階層分連続して記録されている事になります。

それぞれの種類の区切りにはなにも目印はありませんので、先に説明した【マップのサイズ】から読み取る行数を判断してください。

例を挙げます。

マップのサイズ
MapSizeX = 4
MapSizeY = 2

階層数
Floor = 1

マップのサイズはそれぞれの数値に1を足したものがマップのマス数となりますので、横5マス,縦3マスのサイズのマップとなります。
階層数も同じく1を足したものが階層数になりますので、2階層のマップであるということになります。

先に挙げたエレベーターの例と同じく、1階の上部右端にエレベーターとダークゾーンと宝箱と壁が設置されているとして、実際のデータは次のようになります。

[MapData]
000000000001
000000000000
000000000000
000000000000
000000000000
000000000000
0000000001
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000003
0000000000
0000000000
0000000000
0000000000
0000000000
0000000001
0000000000
0000000000
0000000000
0000000000
0000000000
0000000001
0000000000
0000000000
0000000000
0000000000
0000000000

わかりやすいように、種類別の区切りと説明を加えます。

[MapData]

[縦壁]
[1階]
00 00 00 00 00 01
00 00 00 00 00 00
00 00 00 00 00 00
[2階]
00 00 00 00 00 00
00 00 00 00 00 00
00 00 00 00 00 00

[横壁]
[1階]
00 00 00 00 01
00 00 00 00 00
00 00 00 00 00
00 00 00 00 00
[2階]
00 00 00 00 00
00 00 00 00 00
00 00 00 00 00
00 00 00 00 00

[床]
[1階]
00 00 00 00 03
00 00 00 00 00
00 00 00 00 00
[2階]
00 00 00 00 00
00 00 00 00 00
00 00 00 00 00

[空間]
[1階]
00 00 00 00 01
00 00 00 00 00
00 00 00 00 00
[2階]
00 00 00 00 00
00 00 00 00 00
00 00 00 00 00

[物]
[1階]
00 00 00 00 01
00 00 00 00 00
00 00 00 00 00
[2階]
00 00 00 00 00
00 00 00 00 00
00 00 00 00 00

次に、メッセージデータの形式について説明します。
マップデータのファイルから、下記の文字列を探してください。

[MessageXY]

この文字列の下の行から、メッセージデータが記録されています。

まずは、[FloorTop]という文字列が記録されています。
これは、「最初の階層です」という目印です。
「メッセージデータが始まる」という意味合いのみのデータだと思っていただいて結構です。

[FloorTop]の後には、次のような4文字の文字列が続きます。

012e

これは、メッセージの配置された座標を16進数で記録したものです。
前半の二文字がX軸。後半の二文字がY軸を示しています。

上記の文字列の場合、[01]がX軸。[2e」がY軸です。

X軸の[01]は、左側の文字が[0]なので、そのまま1になります。

Y軸の[2e]は、左側の文字が[2]なので16*2で32。
右側の文字が[e]なので、10進数に直すと14。
32+14で、46となります。

ということで、その次の行から記録されているメッセージの座標は、X軸:1 Y軸:46ということになります。

メッセージは、複数行にわたるものである場合もあります。
その場合、マップデータにも改行を含む形で記録されています。

[Message_End]という文字列が記録されている行までたどり着いたところで、ひとつのメッセージが終わります。

[Message_End]の次の行に別のメッセージが記録されている場合、再び[012e]のような座標を示すデータが記録されています。

次の階層のデータへ移る場合、[FloorNext]の文字列が記録されています。
それまで読み込んでいたデータが1階層目のデータである場合、[FloorNext]の次の行から始まるメッセージデータは、2階層目のデータであるという事になります。

その階層にメッセージデータが設定されていない場合、すぐに次の行に[FloorNext]が記録されています。
メッセージが記録されている場合は、再び[012e]のような座標を示すデータが記録されています。

最後の階層のデータが終了した時点に[FloorBottom]という文字列が入ります。

[FloorBottom]の行で、メッセージデータは終了です。

先頭へ戻る

壁のタイプが の場合の床データについて

壁のタイプが の状態で壁を配置した場合、床データにも壁のデータが記録されます。
床のデータに100以上の数値が記録されている場合、それは壁のデータに99をプラスした数値が記録されている状態です。

これは、壁の位置を塗りつぶすか否かを判断するために使用しています。
これにより、壁の場合は塗りつぶし、扉の場合は塗りつぶさないという違いを出すことができます。

塗りつぶしの判断基準となるデータは、paper.ini ファイルに記録されています。
詳しくは[パーツの自作]のページをご覧ください。

先頭へ戻る