前置き

主に構造体のメンバ説明と、データの取得、設定、デフォルト値、追加方法などを記していきます。 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_side1枚の壁の真ん中で切れる(スイッチなど)
_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

利用方法

データ取得、設定