Backup of Mapデータ仕様 (3) Back


Back to History list

#contents

*前置き [#p60f5373]
主に構造体のメンバ説明と、データの取得、設定、デフォルト値、追加方法などを記していきます。
Pforte2のソースコードとAlephOneのソースコードを参考にしています。

線のlengthやポリゴンの中心位置など、見れば分かるだろうとか編集で動かすたびに計算するのが面倒だと思うようなものもありますが、実行を早くするための工夫かと思われます。

「?」がついているものは使い方、設定方法が良く分からないものです。

unused[]は使われていない領域。

*基本事項 [#n83efeba]
特になければworld.h
:uint16|unsigned short
:int16|signed short
:uint32,int32|unsigned/signed int
:world_distance|int16(world.h参照)[-32767,32767]=[INT_MIN,INT_MAX]
:angle|0-512を用いて0-360を表現。度=angle / 512 * 360
:world_point2d|世界の絶対座標。world_distanceで表現
:shape_descriptor|Shapesの画像データのID。Bitでの指定。
(shapes_descriptors.h)
|CLUT(パレットID)(3ビット)|コレクションID(5ビット)|画像ID(8ビット)|
次のマクロを利用する。
-壁テクスチャ
 s = BUILD_DESCRIPTOR(コレクションID, 壁テクスチャID)
-モンスター、プレイヤー、アイテム、武器等
 int collection = BUILD_COLLECTION(コレクションID, 画像ID)
 s = BUILD_DESCRIPTOR(collection, 壁テクスチャID)

*endpoint_data 構造体(map.h) [#j881b82b]
**メンバ説明 [#j13006cf]
:flags|データの取得参照
:?highest_adjacent_floor_height|床の高さ
:?lowest_adjacent_ceiling_height|天井の高さ
:vertex|絶対座標
:?transformed|?
:supporting_polygon_index|含んでいるポリゴン(どれかひとつ)
**利用方法 [#zbc740c5]
***データの取得、設定 [#dc72f0c3]
endpoint_data*自体は
:get_endpoint_data(int)|インデックスを指定してデータ取得(index∈[0,Max))

endpoint_data::flagsは次のマクロを使って取得&操作すること
:ENDPOINT_IS_SOLID(endpoint_data*)|この点は通り抜けできない(デフォルト)
:SET_ENDPOINT_SOLIDITY(endpoint_data*, bool)|↑の設定
以下同様であるのでSEt_*については詳細は省略。map.hを参照
:ENDPOINT_IS_TRANSPARENT(endpoint_data*)|この点は通り抜けできる
:?ENDPOINT_IS_ELEVATION(endpoint_data*)|高さが複数存在する
通り抜けできる・できないは、周りが全て塗りつぶされたポリゴンがあるかどうかだと思われます。
***データの追加 [#adceddfd]
***その他 [#naa41847]

*line_data 構造体(map.h) [#g7575710]
**メンバ説明 [#uf5f3d58]
:endpoint_indexes[2]|線の視点[0]と終点[1]の点データです
:flags|線の特性
:length|線の長さ
:?highest_adjacent_floor|床の高さ
:?lowest_adjacent_ceiling|天井の高さ
:clockwise_polygon_side_index|右回りで見たときのside_dataインデックス
:counterclockwise_polygon_side_index|左回りで見たときのside_dataインデックス
:clockwise_polygon_owner|右回りで見たときに含まれるポリゴンインデックス
:counterclockwise_polygon_owner|左回りで見たときに含まれるポリゴンインデックス
ポリゴンには''右回り''と''左回り''があるので、それも設定しないといけないのです
**利用方法 [#wf72432b]
***データの取得、設定 [#n4c7c286]
line_data自体は
:get_line_data(int)|インデックスで指定した線データ取得
で取得できます。

flagsは以下の項目があります
:LINE_IS_SOLID(l)|普通の壁
:?LINE_IS_TRANSPARENT(l)|通過できる
:?LINE_IS_LANDSCAPED(l)|壁が「背景」。弾が消え、テクスチャが伸びる。
:?LINE_IS_ELEVATION(l)|隣接するポリゴンの高さが異なるか
:?LINE_IS_VARIABLE_ELEVATION(l)|高さが複数存在するか
:?LINE_HAS_TRANSPARENT_SIDE(l)|通過オプションのあるside_dataを持つか

lengthは
 #include <cmath>
 endpoint_data *start = get_endpoint_data(line->endpoint_indexes[0]);
 endpoint_data *end = get_endpoint_data(line->endpoint_indexes[1]);
 int dx = start->vertex.x - end->vertex.x;
 int dy = start->vertex.y - end->vertex.y;
 line->length = static_cast<short>(sqrt(dx * dx + dy * dy));
などで求めましょう

*side_data 構造体(map.h) [#r6f62a53]
**メンバ説明 [#fd20ba89]
:type|種類
|タイプ|説明|
|_full_side||
|_high_side||
|_low_side||
|_composite_side||
|_split_side||

:flags|特性
:primary_texture|第一テクスチャ。side_texture_definitionはU,VとテクスチャIDを指定
:?secondary_texture|第二テクスチャ
:transparent_texture|網目テクスチャ。.textureNONEを指定するとなし
:?exclusion_zone|?
:control_panel_type|コントロールパネルの場合その種類
:control_panel_permutation|スイッチなら照明番号、プラットフォーム番号など
:?primary_transfer_mode|?
:secondary_transfer_mode|
:transparent_transfer_mode|
:polygon_index|あるポリゴンのひとつの線にはsideデータはひとつしかない。
:line_index|所属する線のデータ
:?primary_lightsource_index|?
:secondary_lightsource_index|
:transparent_lightsource_index|
:?ambient_delta|?

**利用方法 [#nadf4fe2]
***データ取得、設定 [#l67f0cf9]