4 -----------------------------------
5 MAPREADER.PAS ÂÅÐÑÈß ÎÒ 13.11.07
7 Ïîääåðæêà êàðò âåðñèè 1
8 -----------------------------------
17 TDataBlock
= packed record
22 TDataBlocksArray
= packed array of TDataBlock
;
24 TMapReader
= class(TObject
)
28 FDataBlocks
: TDataBlocksArray
;
29 function GetBlocks(BlocksType
: Byte): TDataBlocksArray
;
32 destructor Destroy(); override;
33 function LoadMap(Data
: Pointer): Boolean;
35 function HandledVersion(): Byte; virtual;
37 property GetError
: Byte read FError
;
38 property GetVersion
: Byte read FVersion
;
41 TMapReader_1
= class(TMapReader
)
44 function GetMapHeader(): TMapHeaderRec_1
;
45 function GetTextures(): TTexturesRec1Array
;
46 function GetPanels(): TPanelsRec1Array
;
47 function GetItems(): TItemsRec1Array
;
48 function GetAreas(): TAreasRec1Array
;
49 function GetMonsters(): TMonsterRec1Array
;
50 function GetTriggers(): TTriggersRec1Array
;
51 function HandledVersion(): Byte; override;
56 MAP_ERROR_SIGNATURE
= $01;
57 MAP_ERROR_VERSION
= $02;
64 function g_Texture_NumNameFindStart(name
: String): Boolean;
65 function g_Texture_NumNameFindNext(var newName
: String): Byte;
73 NNF_PureName
: String; // Èìÿ òåêñòóðû áåç öèôð â êîíöå
74 NNF_FirstNum
: Integer; // ×èñëî ó íà÷àëüíîé òåêñòóðû
75 NNF_CurrentNum
: Integer; // Ñëåäóþùåå ÷èñëî ó òåêñòóðû
77 function g_Texture_NumNameFindStart(name
: String): Boolean;
87 for i
:= Length(name
) downto 1 do
88 if (name
[i
] = '_') then // "_" - ñèìâîë íà÷àëà íîìåðíîãî ïîñòôèêñà
90 if i
= Length(name
) then
91 begin // Íåò öèôð â êîíöå ñòðîêè
96 NNF_PureName
:= Copy(name
, 1, i
);
102 // Íå ïåðåâåñòè â ÷èñëî:
103 if not TryStrToInt(name
, NNF_FirstNum
) then
111 function g_Texture_NumNameFindNext(var newName
: String): Byte;
113 if (NNF_PureName
= '') or (NNF_CurrentNum
< 0) then
116 Result
:= NNF_NO_NAME
;
120 newName
:= NNF_PureName
+ IntToStr(NNF_CurrentNum
);
122 if NNF_CurrentNum
< NNF_FirstNum
then
123 Result
:= NNF_NAME_BEFORE
125 if NNF_CurrentNum
> NNF_FirstNum
then
126 Result
:= NNF_NAME_AFTER
128 Result
:= NNF_NAME_EQUALS
;
133 { T M a p R e a d e r _ 1 : }
135 function TMapReader_1
.GetAreas(): TAreasRec1Array
;
137 TempDataBlocks
: TDataBlocksArray
;
143 TempDataBlocks
:= GetBlocks(BLOCK_AREAS
);
145 if TempDataBlocks
= nil then Exit
;
147 size
:= SizeOf(TAreaRec_1
);
149 for a
:= 0 to High(TempDataBlocks
) do
150 for b
:= 0 to (TempDataBlocks
[a
].Block
.BlockSize
div size
)-1 do
152 SetLength(Result
, Length(Result
)+1);
153 CopyMemory(@Result
[High(Result
)], Pointer(LongWord(TempDataBlocks
[a
].Data
)+b
*size
), size
);
156 TempDataBlocks
:= nil;
159 function TMapReader_1
.GetItems(): TItemsRec1Array
;
161 TempDataBlocks
: TDataBlocksArray
;
167 TempDataBlocks
:= GetBlocks(BLOCK_ITEMS
);
169 if TempDataBlocks
= nil then Exit
;
171 size
:= SizeOf(TItemRec_1
);
173 for a
:= 0 to High(TempDataBlocks
) do
174 for b
:= 0 to (TempDataBlocks
[a
].Block
.BlockSize
div size
)-1 do
176 SetLength(Result
, Length(Result
)+1);
177 CopyMemory(@Result
[High(Result
)], Pointer(LongWord(TempDataBlocks
[a
].Data
)+b
*size
), size
);
180 TempDataBlocks
:= nil;
183 function TMapReader_1
.GetMapHeader(): TMapHeaderRec_1
;
185 TempDataBlocks
: TDataBlocksArray
;
187 ZeroMemory(@Result
, SizeOf(TMapHeaderRec_1
));
189 TempDataBlocks
:= GetBlocks(BLOCK_HEADER
);
191 if TempDataBlocks
= nil then Exit
;
193 CopyMemory(@Result
, TempDataBlocks
[0].Data
, SizeOf(TMapHeaderRec_1
));
195 TempDataBlocks
:= nil;
198 function TMapReader_1
.GetMonsters(): TMonsterRec1Array
;
200 TempDataBlocks
: TDataBlocksArray
;
206 TempDataBlocks
:= GetBlocks(BLOCK_MONSTERS
);
208 if TempDataBlocks
= nil then Exit
;
210 size
:= SizeOf(TMonsterRec_1
);
212 for a
:= 0 to High(TempDataBlocks
) do
213 for b
:= 0 to (TempDataBlocks
[a
].Block
.BlockSize
div size
)-1 do
215 SetLength(Result
, Length(Result
)+1);
216 CopyMemory(@Result
[High(Result
)], Pointer(LongWord(TempDataBlocks
[a
].Data
)+b
*size
), size
);
219 TempDataBlocks
:= nil;
222 function TMapReader_1
.GetPanels(): TPanelsRec1Array
;
224 TempDataBlocks
: TDataBlocksArray
;
230 TempDataBlocks
:= GetBlocks(BLOCK_PANELS
);
232 if TempDataBlocks
= nil then Exit
;
234 size
:= SizeOf(TPanelRec_1
);
236 for a
:= 0 to High(TempDataBlocks
) do
237 for b
:= 0 to (TempDataBlocks
[a
].Block
.BlockSize
div size
)-1 do
239 SetLength(Result
, Length(Result
)+1);
240 CopyMemory(@Result
[High(Result
)], Pointer(LongWord(TempDataBlocks
[a
].Data
)+b
*size
), size
);
243 TempDataBlocks
:= nil;
246 function TMapReader_1
.GetTextures(): TTexturesRec1Array
;
248 TempDataBlocks
: TDataBlocksArray
;
254 TempDataBlocks
:= GetBlocks(BLOCK_TEXTURES
);
256 if TempDataBlocks
= nil then Exit
;
258 size
:= SizeOf(TTextureRec_1
);
260 for a
:= 0 to High(TempDataBlocks
) do
261 for b
:= 0 to (TempDataBlocks
[a
].Block
.BlockSize
div size
)-1 do
263 SetLength(Result
, Length(Result
)+1);
264 CopyMemory(@Result
[High(Result
)], Pointer(LongWord(TempDataBlocks
[a
].Data
)+b
*size
), size
);
267 TempDataBlocks
:= nil;
270 function TMapReader_1
.GetTriggers(): TTriggersRec1Array
;
272 TempDataBlocks
: TDataBlocksArray
;
278 TempDataBlocks
:= GetBlocks(BLOCK_TRIGGERS
);
280 if TempDataBlocks
= nil then Exit
;
282 size
:= SizeOf(TTriggerRec_1
);
284 for a
:= 0 to High(TempDataBlocks
) do
285 for b
:= 0 to (TempDataBlocks
[a
].Block
.BlockSize
div size
)-1 do
287 SetLength(Result
, Length(Result
)+1);
288 CopyMemory(@Result
[High(Result
)], Pointer(LongWord(TempDataBlocks
[a
].Data
)+b
*size
), size
);
291 TempDataBlocks
:= nil;
294 function TMapReader_1
.HandledVersion
: Byte;
299 { T M a p R e a d e r : }
301 constructor TMapReader
.Create();
304 FError
:= MAP_ERROR_NONE
;
308 destructor TMapReader
.Destroy();
315 procedure TMapReader
.FreeMap();
319 if FDataBlocks
<> nil then
320 for a
:= 0 to High(FDataBlocks
) do
321 if FDataBlocks
[a
].Data
<> nil then FreeMem(FDataBlocks
[a
].Data
);
325 FError
:= MAP_ERROR_NONE
;
328 function TMapReader
.GetBlocks(BlocksType
: Byte): TDataBlocksArray
;
334 if FDataBlocks
= nil then Exit
;
336 for a
:= 0 to High(FDataBlocks
) do
337 if FDataBlocks
[a
].Block
.BlockType
= BlocksType
then
339 SetLength(Result
, Length(Result
)+1);
340 Result
[High(Result
)] := FDataBlocks
[a
];
344 function TMapReader
.HandledVersion(): Byte;
349 function TMapReader
.LoadMap(Data
: Pointer): Boolean;
353 Sign
: array[0..2] of Char;
358 CopyMemory(@Sign
[0], Data
, 3);
359 if Sign
<> MAP_SIGNATURE
then
361 FError
:= MAP_ERROR_SIGNATURE
;
366 CopyMemory(@Ver
, Pointer(LongWord(Data
)+adr
), 1);
368 if Ver
> HandledVersion() then
370 FError
:= MAP_ERROR_VERSION
;
376 SetLength(FDataBlocks
, Length(FDataBlocks
)+1);
377 _id
:= High(FDataBlocks
);
379 CopyMemory(@FDataBlocks
[_id
].Block
, Pointer(LongWord(Data
)+adr
), SizeOf(TBlock
));
380 adr
:= adr
+SizeOf(TBlock
);
382 FDataBlocks
[_id
].Data
:= GetMemory(FDataBlocks
[_id
].Block
.BlockSize
);
384 CopyMemory(FDataBlocks
[_id
].Data
, Pointer(LongWord(Data
)+adr
), FDataBlocks
[_id
].Block
.BlockSize
);
386 adr
:= adr
+FDataBlocks
[_id
].Block
.BlockSize
;
387 until FDataBlocks
[_id
].Block
.BlockType
= BLOCK_NONE
;