1 (* Copyright (C) DooM 2D:Forever Developers
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 3 of the License, or
6 * (at your option) any later version.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 {$INCLUDE a_modes.inc}
27 MAP_SIGNATURE
= 'MAP';
31 TEXTURE_NAME_WATER
= '_water_0';
32 TEXTURE_NAME_ACID1
= '_water_1';
33 TEXTURE_NAME_ACID2
= '_water_2';
37 TDFPoint
= packed record
42 constructor Create (ax
, ay
: LongInt);
44 function isZero (): Boolean; inline;
47 Char16
= packed array[0..15] of Char;
48 Char32
= packed array[0..31] of Char;
49 Char64
= packed array[0..63] of Char;
50 Char100
= packed array[0..99] of Char;
51 Char256
= packed array[0..255] of Char;
52 Byte128
= packed array[0..127] of Byte;
56 // various helpers to access map structures
58 TDynRecordHelper
= class helper
for TDynRecord
60 function getFieldWithType (const aname
: AnsiString; atype
: TDynField
.TType
): TDynField
; inline;
62 function getPanelByIdx (idx
: Integer): TDynRecord
; inline;
64 function getPanelId (): Integer; inline;
65 //procedure setPanelId (v: Integer); inline;
67 function getTexturePanel (): Integer; inline;
68 //procedure setTexturePanel (v: Integer); inline;
70 function getPanelIndex (pan
: TDynRecord
): Integer;
72 function getPointField (const aname
: AnsiString): TDFPoint
; inline;
75 function panelCount (): Integer; inline;
78 function mapName (): AnsiString; inline;
79 function mapAuthor (): AnsiString; inline;
80 function mapDesc (): AnsiString; inline;
81 function musicName (): AnsiString; inline;
82 function skyName (): AnsiString; inline;
85 function X (): Integer; inline;
86 function Y (): Integer; inline;
87 function Width (): Word; inline;
88 function Height (): Word; inline;
89 function TextureNum (): Word; inline;
90 function TextureRec (): TDynRecord
; inline;
91 function PanelType (): Word; inline;
92 function Alpha (): Byte; inline;
93 function Flags (): Byte; inline;
95 function moveSpeed (): TDFPoint
; inline;
96 function moveStart (): TDFPoint
; inline;
97 function moveEnd (): TDFPoint
; inline;
100 function Resource (): AnsiString; inline;
101 function Anim (): Boolean; inline;
104 function ItemType (): Byte; inline;
105 function Options (): Byte; inline;
108 function MonsterType (): Byte; inline; // type, ubyte
109 function Direction (): Byte; inline; // direction, ubyte
112 function AreaType (): Byte; inline; // type, ubyte
113 //function Direction (): Byte; inline; // direction, ubyte
116 function trigRec (): TDynRecord
; inline;
117 function Enabled (): Boolean; inline; // enabled, bool
118 function TriggerType (): Byte; inline; // type, ubyte
119 function ActivateType (): Byte; inline; // activatetype, ubyte
120 function Keys (): Byte; inline; // keys, ubyte
121 //function DATA (): Byte128; inline; // triggerdata, trigdata[128]; // the only special nested structure
123 {$INCLUDE mapdef_help.inc}
124 function trigMonsterId (): Integer; inline;
128 function getUserPanelId (): Integer; inline;
129 procedure setUserPanelId (v
: Integer); inline;
131 function getUserTrigRef (): Boolean; inline;
132 procedure setUserTrigRef (v
: Boolean); inline;
135 property panel
[idx
: Integer]: TDynRecord read getPanelByIdx
;
136 property panelIndex
[pan
: TDynRecord
]: Integer read getPanelIndex
;
138 property tgPanelID
: Integer read getPanelId
{write setPanelId};
139 property tgShotPanelID
: Integer read getPanelId
{write setPanelId};
140 property TexturePanel
: Integer read getTexturePanel
{write setTexturePanel}; // texturepanel, int
142 property userPanelId
: Integer read getUserPanelId write setUserPanelId
;
143 property userPanelTrigRef
: Boolean read getUserTrigRef write setUserTrigRef
;
149 SysUtils
, {e_log,} utils
, xparser
, xstreams
;
152 // ////////////////////////////////////////////////////////////////////////// //
153 constructor TDFPoint
.Create (ax
, ay
: LongInt); begin X
:= ax
; Y
:= ay
; end;
154 function TDFPoint
.isZero (): Boolean; inline; begin result
:= (X
= 0) and (Y
= 0); end;
157 // ////////////////////////////////////////////////////////////////////////// //
158 function TDynRecordHelper
.getUserPanelId (): Integer; inline;
162 fld
:= field
['userPanelId'];
163 //if (fld = nil) or (fld.baseType <> TDynField.TType.TInt) then result := -1 else result := fld.ival;
164 if (fld
= nil) then result
:= -1 else result
:= Integer(fld
.varvalue
);
168 procedure TDynRecordHelper
.setUserPanelId (v
: Integer); inline;
170 user
['userPanelId'] := v
;
174 function TDynRecordHelper
.getUserTrigRef (): Boolean; inline;
178 fld
:= field
['userPanelTrigRef'];
179 if (fld
= nil) then result
:= false else result
:= Boolean(fld
.varvalue
);
180 //if (fld = nil) or (fld.baseType <> TDynField.TType.TBool) then result := false else result := (fld.ival <> 0);
184 procedure TDynRecordHelper
.setUserTrigRef (v
: Boolean); inline;
186 user
['userPanelTrigRef'] := v
;
190 // ////////////////////////////////////////////////////////////////////////// //
191 function TDynRecordHelper
.moveSpeed (): TDFPoint
; inline; begin result
:= getPointField('move_speed'); end;
192 function TDynRecordHelper
.moveStart (): TDFPoint
; inline; begin result
:= getPointField('move_start'); end;
193 function TDynRecordHelper
.moveEnd (): TDFPoint
; inline; begin result
:= getPointField('move_end'); end;
196 // ////////////////////////////////////////////////////////////////////////// //
197 function TDynRecordHelper
.getFieldWithType (const aname
: AnsiString; atype
: TDynField
.TType
): TDynField
; inline;
199 result
:= field
[aname
];
200 if (result
= nil) then raise Exception
.Create(Format('field ''%s'' not found in record ''%s'' of type ''%s''', [aname
, name
, id
]));
201 if (result
.baseType
<> atype
) then raise Exception
.Create(Format('field ''%s'' in record ''%s'' of type ''%s'' has invalid data type', [aname
, name
, id
]));
205 function TDynRecordHelper
.getPointField (const aname
: AnsiString): TDFPoint
; inline;
210 if (fld
= nil) then raise Exception
.Create(Format('field ''%s'' not found in record ''%s'' of type ''%s''', [aname
, name
, id
]));
211 if (fld
.baseType
<> TPoint
) then raise Exception
.Create(Format('field ''%s'' in record ''%s'' of type ''%s'' has invalid data type', [aname
, name
, id
]));
212 result
:= TDFPoint
.Create(fld
.ival
, fld
.ival2
);
216 function TDynRecordHelper
.getPanelByIdx (idx
: Integer): TDynRecord
; inline;
220 fld
:= headerRec
['panel'];
221 if (fld
<> nil) then result
:= fld
.item
[idx
] else result
:= nil;
225 function TDynRecordHelper
.getPanelIndex (pan
: TDynRecord
): Integer;
233 fld
:= headerRec
['panel'];
236 for f
:= 0 to fld
.count
-1 do if (fld
.item
[f
] = pan
) then begin result
:= f
; exit
; end;
242 function TDynRecordHelper
.panelCount (): Integer; inline;
246 fld
:= headerRec
['panel'];
247 if (fld
<> nil) then result
:= fld
.count
else result
:= 0;
251 function TDynRecordHelper
.TextureNum (): Word; inline;
256 fld
:= getFieldWithType('texture', TDynField
.TType
.TUShort
);
257 idx
:= fld
.recrefIndex
;
258 if (idx
< 0) then result
:= Word(TEXTURE_NONE
) else result
:= Word(idx
);
262 // ////////////////////////////////////////////////////////////////////////// //
264 function TDynRecordHelper
.trigRec (): TDynRecord
; inline;
268 fld
:= getFieldWithType('triggerdata', TDynField
.TType
.TTrigData
);
269 if (fld
<> nil) then result
:= fld
.recref
else result
:= nil;
273 function TDynRecordHelper
.trigMonsterId (): Integer; inline;
277 fld
:= getFieldWithType('monsterid', TDynField
.TType
.TInt
);
278 result
:= fld
.recrefIndex
;
282 // ////////////////////////////////////////////////////////////////////////// //
283 function TDynRecordHelper
.mapName (): AnsiString; inline; begin result
:= utf2win(getFieldWithType('name', TDynField
.TType
.TChar
).sval
); end;
284 function TDynRecordHelper
.mapAuthor (): AnsiString; inline; begin result
:= utf2win(getFieldWithType('author', TDynField
.TType
.TChar
).sval
); end;
285 function TDynRecordHelper
.mapDesc (): AnsiString; inline; begin result
:= utf2win(getFieldWithType('description', TDynField
.TType
.TChar
).sval
); end;
286 function TDynRecordHelper
.musicName (): AnsiString; inline; begin result
:= utf2win(getFieldWithType('music', TDynField
.TType
.TChar
).sval
); end;
287 function TDynRecordHelper
.skyName (): AnsiString; inline; begin result
:= utf2win(getFieldWithType('sky', TDynField
.TType
.TChar
).sval
); end;
288 function TDynRecordHelper
.X (): Integer; inline; begin result
:= getFieldWithType('position', TDynField
.TType
.TPoint
).ival
; end;
289 function TDynRecordHelper
.Y (): Integer; inline; begin result
:= getFieldWithType('position', TDynField
.TType
.TPoint
).ival2
; end;
290 function TDynRecordHelper
.Width (): Word; inline; begin result
:= Word(getFieldWithType('size', TDynField
.TType
.TSize
).ival
); end;
291 function TDynRecordHelper
.Height (): Word; inline; begin result
:= Word(getFieldWithType('size', TDynField
.TType
.TSize
).ival2
); end;
292 function TDynRecordHelper
.PanelType (): Word; inline; begin result
:= Word(getFieldWithType('type', TDynField
.TType
.TUShort
).ival
); end;
293 function TDynRecordHelper
.TextureRec (): TDynRecord
; inline; begin result
:= getFieldWithType('texture', TDynField
.TType
.TUShort
).recref
; end;
294 function TDynRecordHelper
.Alpha (): Byte; inline; begin result
:= Byte(getFieldWithType('alpha', TDynField
.TType
.TUByte
).ival
); end;
295 function TDynRecordHelper
.Flags (): Byte; inline; begin result
:= Byte(getFieldWithType('flags', TDynField
.TType
.TUByte
).ival
); end;
296 function TDynRecordHelper
.Resource (): AnsiString; inline; begin result
:= utf2win(getFieldWithType('path', TDynField
.TType
.TChar
).sval
); end;
297 function TDynRecordHelper
.Anim (): Boolean; inline; begin result
:= (getFieldWithType('animated', TDynField
.TType
.TBool
).ival
<> 0); end;
298 function TDynRecordHelper
.ItemType (): Byte; inline; begin result
:= Byte(getFieldWithType('type', TDynField
.TType
.TUByte
).ival
); end;
299 function TDynRecordHelper
.Options (): Byte; inline; begin result
:= Byte(getFieldWithType('options', TDynField
.TType
.TUByte
).ival
); end;
300 function TDynRecordHelper
.MonsterType (): Byte; inline; begin result
:= Byte(getFieldWithType('type', TDynField
.TType
.TUByte
).ival
); end;
301 function TDynRecordHelper
.Direction (): Byte; inline; begin result
:= Byte(getFieldWithType('direction', TDynField
.TType
.TUByte
).ival
); end;
302 function TDynRecordHelper
.AreaType (): Byte; inline; begin result
:= Byte(getFieldWithType('type', TDynField
.TType
.TUByte
).ival
); end;
303 function TDynRecordHelper
.Enabled (): Boolean; inline; begin result
:= (getFieldWithType('enabled', TDynField
.TType
.TBool
).ival
<> 0); end;
304 function TDynRecordHelper
.TriggerType (): Byte; inline; begin result
:= Byte(getFieldWithType('type', TDynField
.TType
.TUByte
).ival
); end;
305 function TDynRecordHelper
.ActivateType (): Byte; inline; begin result
:= Byte(getFieldWithType('activatetype', TDynField
.TType
.TUByte
).ival
); end;
306 function TDynRecordHelper
.Keys (): Byte; inline; begin result
:= Byte(getFieldWithType('keys', TDynField
.TType
.TUByte
).ival
); end;
308 function TDynRecordHelper
.getPanelId (): Integer; inline; begin result
:= getFieldWithType('panelid', TDynField
.TType
.TInt
).recrefIndex
; end;
309 function TDynRecordHelper
.getTexturePanel (): Integer; begin result
:= getFieldWithType('texturepanel', TDynField
.TType
.TInt
).recrefIndex
; end;
311 {$INCLUDE mapdef_impl.inc}