開発メモ/仕様解析/Mapデータ仕様
@contents
前置き
主に構造体のメンバ説明と、データの取得、設定、デフォルト値、追加方法などを記していきます。Pforte2のソースコードとAlephOneのソースコードを参考にしています。
線のlengthやポリゴンの中心位置など、見れば分かるだろうとか編集で動かすたびに計算するのが面倒だと思うようなものもありますが、実行を早くするための工夫かと思われます。
「?」がついているものは使い方、設定方法が良く分からないものです。
unused[]は使われていない領域。
基本事項
特になければ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)
メンバ説明
- flags
- データの取得参照
- ?highest_adjacent_floor_height
- 床の高さ
- ?lowest_adjacent_ceiling_height
- 天井の高さ
- vertex
- 絶対座標
- ?transformed
- OverHeadMapで使用(内部データ)?
- supporting_polygon_index
- 含んでいるポリゴン(どれかひとつ)
利用方法
データの取得、設定
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*)
- 高さが複数存在する通り抜けできる・できないは、周りが全て塗りつぶされたポリゴンがあるかどうかだと思われます。
データの追加
その他
line_data 構造体(map.h)
メンバ説明
- 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
- 左回りで見たときに含まれるポリゴンインデックスポリゴンには *右回りと左回り* があるので、それも設定しないといけないのです
利用方法
データの取得、設定
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)
メンバ説明
- type
- 種類
タイプ 説明 _full_side 床から天井まで1枚の壁 _high_side 天井から途中で切れる(窓の上側など) _low_side 床から途中で切れる(窓の下側など) _composite_side 1枚の壁の真ん中で切れる(スイッチなど) _split_side 途中の点から両側に伸びる(2方向に伸びるドアなど)
- 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
- ?
利用方法
データ取得、設定
- get_side_data(int)
- データ取得
ポリゴンデータ
メンバ説明
- type
- flags
- ?permutation
- vertex_count
- ポリゴンが持つ実際の頂点の数(<=8)
- endpoint_indexes
- 頂点のendpoint_dataのインデックス
- line_indexes
- 所持する線のインデックス
- floor_texture
- ceiling_texture
- floor_height
- 床の高さ
- ceiling_height
- 天井の高さ
- floor_lightsource_index
- ceiling_lightsource_index
- ?area
- ?first_object
利用方法
データ取得、設定
Last Modified: 2007-01-28 12:05:59