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}
20 -----------------------------------
21 MAPREADER.PAS ÂÅÐÑÈß ÎÒ 13.11.07
23 Ïîääåðæêà êàðò âåðñèè 1
24 -----------------------------------
33 TDataBlock
= packed record
38 TDataBlocksArray
= packed array of TDataBlock
;
40 TMapReader
= class(TObject
)
44 FDataBlocks
: TDataBlocksArray
;
45 function GetBlocks(BlocksType
: Byte): TDataBlocksArray
;
48 destructor Destroy(); override;
49 function LoadMap(Data
: Pointer): Boolean;
51 function HandledVersion(): Byte; virtual;
53 property GetError
: Byte read FError
;
54 property GetVersion
: Byte read FVersion
;
57 TMapReader_1
= class(TMapReader
)
60 function GetMapHeader(): TMapHeaderRec_1
;
61 function GetTextures(): TTexturesRec1Array
;
62 function GetPanels(): TPanelsRec1Array
;
63 function GetItems(): TItemsRec1Array
;
64 function GetAreas(): TAreasRec1Array
;
65 function GetMonsters(): TMonsterRec1Array
;
66 function GetTriggers(): TTriggersRec1Array
;
67 function HandledVersion(): Byte; override;
72 MAP_ERROR_SIGNATURE
= $01;
73 MAP_ERROR_VERSION
= $02;
80 function g_Texture_NumNameFindStart(name
: String): Boolean;
81 function g_Texture_NumNameFindNext(var newName
: String): Byte;
86 SysUtils
, BinEditor
, MAPDEF
;
89 NNF_PureName
: String; // Èìÿ òåêñòóðû áåç öèôð â êîíöå
90 NNF_FirstNum
: Integer; // ×èñëî ó íà÷àëüíîé òåêñòóðû
91 NNF_CurrentNum
: Integer; // Ñëåäóþùåå ÷èñëî ó òåêñòóðû
93 function g_Texture_NumNameFindStart(name
: String): Boolean;
101 NNF_CurrentNum
:= -1;
103 for i
:= Length(name
) downto 1 do
104 if (name
[i
] = '_') then // "_" - ñèìâîë íà÷àëà íîìåðíîãî ïîñòôèêñà
106 if i
= Length(name
) then
107 begin // Íåò öèôð â êîíöå ñòðîêè
112 NNF_PureName
:= Copy(name
, 1, i
);
118 // Íå ïåðåâåñòè â ÷èñëî:
119 if not TryStrToInt(name
, NNF_FirstNum
) then
127 function g_Texture_NumNameFindNext(var newName
: String): Byte;
129 if (NNF_PureName
= '') or (NNF_CurrentNum
< 0) then
132 Result
:= NNF_NO_NAME
;
136 newName
:= NNF_PureName
+ IntToStr(NNF_CurrentNum
);
138 if NNF_CurrentNum
< NNF_FirstNum
then
139 Result
:= NNF_NAME_BEFORE
141 if NNF_CurrentNum
> NNF_FirstNum
then
142 Result
:= NNF_NAME_AFTER
144 Result
:= NNF_NAME_EQUALS
;
149 { T M a p R e a d e r _ 1 : }
151 function TMapReader_1
.GetAreas(): TAreasRec1Array
;
153 TempDataBlocks
: TDataBlocksArray
;
159 TempDataBlocks
:= GetBlocks(BLOCK_AREAS
);
161 if TempDataBlocks
= nil then Exit
;
163 size
:= SizeOf_TAreaRec_1
;
165 for a
:= 0 to High(TempDataBlocks
) do
166 for b
:= 0 to (TempDataBlocks
[a
].Block
.BlockSize
div size
)-1 do
168 SetLength(Result
, Length(Result
)+1);
169 //CopyMemory(@Result[High(Result)], Pointer(LongWord(TempDataBlocks[a].Data)+b*size), size);
170 mb_Read_TAreaRec_1(Result
[High(Result
)], Pointer(NativeUInt(TempDataBlocks
[a
].Data
)+b
*size
)^, size
);
173 TempDataBlocks
:= nil;
176 function TMapReader_1
.GetItems(): TItemsRec1Array
;
178 TempDataBlocks
: TDataBlocksArray
;
184 TempDataBlocks
:= GetBlocks(BLOCK_ITEMS
);
186 if TempDataBlocks
= nil then Exit
;
188 size
:= SizeOf_TItemRec_1
;
190 for a
:= 0 to High(TempDataBlocks
) do
191 for b
:= 0 to (TempDataBlocks
[a
].Block
.BlockSize
div size
)-1 do
193 SetLength(Result
, Length(Result
)+1);
194 //CopyMemory(@Result[High(Result)], Pointer(LongWord(TempDataBlocks[a].Data)+b*size), size);
195 mb_Read_TItemRec_1(Result
[High(Result
)], Pointer(NativeUInt(TempDataBlocks
[a
].Data
)+b
*size
)^, size
);
198 TempDataBlocks
:= nil;
201 function TMapReader_1
.GetMapHeader(): TMapHeaderRec_1
;
203 TempDataBlocks
: TDataBlocksArray
;
205 ZeroMemory(@Result
, SizeOf(TMapHeaderRec_1
));
207 TempDataBlocks
:= GetBlocks(BLOCK_HEADER
);
209 if TempDataBlocks
= nil then Exit
;
211 //CopyMemory(@Result, TempDataBlocks[0].Data, SizeOf(TMapHeaderRec_1));
212 mb_Read_TMapHeaderRec_1(Result
, TempDataBlocks
[0].Data
^, SizeOf_TMapHeaderRec_1
);
214 TempDataBlocks
:= nil;
217 function TMapReader_1
.GetMonsters(): TMonsterRec1Array
;
219 TempDataBlocks
: TDataBlocksArray
;
225 TempDataBlocks
:= GetBlocks(BLOCK_MONSTERS
);
227 if TempDataBlocks
= nil then Exit
;
229 size
:= SizeOf_TMonsterRec_1
;
231 for a
:= 0 to High(TempDataBlocks
) do
232 for b
:= 0 to (TempDataBlocks
[a
].Block
.BlockSize
div size
)-1 do
234 SetLength(Result
, Length(Result
)+1);
235 //CopyMemory(@Result[High(Result)], Pointer(LongWord(TempDataBlocks[a].Data)+b*size), size);
236 mb_Read_TMonsterRec_1(Result
[High(Result
)], Pointer(NativeUInt(TempDataBlocks
[a
].Data
)+b
*size
)^, size
);
239 TempDataBlocks
:= nil;
242 function TMapReader_1
.GetPanels(): TPanelsRec1Array
;
244 TempDataBlocks
: TDataBlocksArray
;
250 TempDataBlocks
:= GetBlocks(BLOCK_PANELS
);
252 if TempDataBlocks
= nil then Exit
;
254 size
:= SizeOf_TPanelRec_1
;
256 for a
:= 0 to High(TempDataBlocks
) do
257 for b
:= 0 to (TempDataBlocks
[a
].Block
.BlockSize
div size
)-1 do
259 SetLength(Result
, Length(Result
)+1);
260 //CopyMemory(@Result[High(Result)], Pointer(LongWord(TempDataBlocks[a].Data)+b*size), size);
261 mb_Read_TPanelRec_1(Result
[High(Result
)], Pointer(NativeUInt(TempDataBlocks
[a
].Data
)+b
*size
)^, size
);
264 TempDataBlocks
:= nil;
267 function TMapReader_1
.GetTextures(): TTexturesRec1Array
;
269 TempDataBlocks
: TDataBlocksArray
;
275 TempDataBlocks
:= GetBlocks(BLOCK_TEXTURES
);
277 if TempDataBlocks
= nil then Exit
;
279 size
:= SizeOf_TTextureRec_1
;
281 for a
:= 0 to High(TempDataBlocks
) do
282 for b
:= 0 to (TempDataBlocks
[a
].Block
.BlockSize
div size
)-1 do
284 SetLength(Result
, Length(Result
)+1);
285 //CopyMemory(@Result[High(Result)], Pointer(LongWord(TempDataBlocks[a].Data)+b*size), size);
286 mb_Read_TTextureRec_1(Result
[High(Result
)], Pointer(NativeUInt(TempDataBlocks
[a
].Data
)+b
*size
)^, size
);
289 TempDataBlocks
:= nil;
292 function TMapReader_1
.GetTriggers(): TTriggersRec1Array
;
294 TempDataBlocks
: TDataBlocksArray
;
298 trdata
: TTriggerData
;
302 TempDataBlocks
:= GetBlocks(BLOCK_TRIGGERS
);
304 if TempDataBlocks
= nil then Exit
;
306 size
:= SizeOf_TTriggerRec_1
;
308 for a
:= 0 to High(TempDataBlocks
) do
309 for b
:= 0 to (TempDataBlocks
[a
].Block
.BlockSize
div size
)-1 do
311 SetLength(Result
, Length(Result
)+1);
312 //CopyMemory(@Result[High(Result)], Pointer(LongWord(TempDataBlocks[a].Data)+b*size), size);
313 mb_Read_TTriggerRec_1(Result
[High(Result
)], Pointer(NativeUInt(TempDataBlocks
[a
].Data
)+b
*size
)^, size
);
314 if (Result
[High(Result
)].TriggerType
<> 0) then
316 // preprocess trigger data
317 ZeroMemory(@trdata
, SizeOf(trdata
));
318 mb_Read_TriggerData(trdata
, Result
[High(Result
)].TriggerType
, Result
[High(Result
)].DATA
, sizeof(trdata
));
319 Result
[High(Result
)].DATA
:= trdata
.Default
;
323 TempDataBlocks
:= nil;
326 function TMapReader_1
.HandledVersion
: Byte;
331 { T M a p R e a d e r : }
333 constructor TMapReader
.Create();
336 FError
:= MAP_ERROR_NONE
;
340 destructor TMapReader
.Destroy();
347 procedure TMapReader
.FreeMap();
351 if FDataBlocks
<> nil then
352 for a
:= 0 to High(FDataBlocks
) do
353 if FDataBlocks
[a
].Data
<> nil then FreeMem(FDataBlocks
[a
].Data
);
357 FError
:= MAP_ERROR_NONE
;
360 function TMapReader
.GetBlocks(BlocksType
: Byte): TDataBlocksArray
;
366 if FDataBlocks
= nil then Exit
;
368 for a
:= 0 to High(FDataBlocks
) do
369 if FDataBlocks
[a
].Block
.BlockType
= BlocksType
then
371 SetLength(Result
, Length(Result
)+1);
372 Result
[High(Result
)] := FDataBlocks
[a
];
376 function TMapReader
.HandledVersion(): Byte;
381 function TMapReader
.LoadMap(Data
: Pointer): Boolean;
385 Sign
: array[0..2] of Char;
390 CopyMemory(@Sign
[0], Data
, 3);
391 if Sign
<> MAP_SIGNATURE
then
393 FError
:= MAP_ERROR_SIGNATURE
;
398 CopyMemory(@Ver
, Pointer(NativeUInt(Data
)+adr
), 1);
400 if Ver
> HandledVersion() then
402 FError
:= MAP_ERROR_VERSION
;
408 SetLength(FDataBlocks
, Length(FDataBlocks
)+1);
409 _id
:= High(FDataBlocks
);
411 CopyMemory(@FDataBlocks
[_id
].Block
, Pointer(NativeUInt(Data
)+adr
), SizeOf(TBlock
));
412 adr
:= adr
+SizeOf(TBlock
);
414 FDataBlocks
[_id
].Data
:= GetMemory(FDataBlocks
[_id
].Block
.BlockSize
);
416 CopyMemory(FDataBlocks
[_id
].Data
, Pointer(NativeUInt(Data
)+adr
), FDataBlocks
[_id
].Block
.BlockSize
);
418 adr
:= adr
+FDataBlocks
[_id
].Block
.BlockSize
;
419 until FDataBlocks
[_id
].Block
.BlockType
= BLOCK_NONE
;