5 -----------------------------------
6 MAPREADER.PAS ÂÅÐÑÈß ÎÒ 13.11.07
8 Ïîääåðæêà êàðò âåðñèè 1
9 -----------------------------------
18 TDataBlock
= packed record
23 TDataBlocksArray
= packed array of TDataBlock
;
25 TMapReader
= class(TObject
)
29 FDataBlocks
: TDataBlocksArray
;
30 function GetBlocks(BlocksType
: Byte): TDataBlocksArray
;
33 destructor Destroy(); override;
34 function LoadMap(Data
: Pointer): Boolean;
36 function HandledVersion(): Byte; virtual;
38 property GetError
: Byte read FError
;
39 property GetVersion
: Byte read FVersion
;
42 TMapReader_1
= class(TMapReader
)
45 function GetMapHeader(): TMapHeaderRec_1
;
46 function GetTextures(): TTexturesRec1Array
;
47 function GetPanels(): TPanelsRec1Array
;
48 function GetItems(): TItemsRec1Array
;
49 function GetAreas(): TAreasRec1Array
;
50 function GetMonsters(): TMonsterRec1Array
;
51 function GetTriggers(): TTriggersRec1Array
;
52 function HandledVersion(): Byte; override;
57 MAP_ERROR_SIGNATURE
= $01;
58 MAP_ERROR_VERSION
= $02;
65 function g_Texture_NumNameFindStart(name
: String): Boolean;
66 function g_Texture_NumNameFindNext(var newName
: String): Byte;
74 NNF_PureName
: String; // Èìÿ òåêñòóðû áåç öèôð â êîíöå
75 NNF_FirstNum
: Integer; // ×èñëî ó íà÷àëüíîé òåêñòóðû
76 NNF_CurrentNum
: Integer; // Ñëåäóþùåå ÷èñëî ó òåêñòóðû
78 function g_Texture_NumNameFindStart(name
: String): Boolean;
88 for i
:= Length(name
) downto 1 do
89 if (name
[i
] = '_') then // "_" - ñèìâîë íà÷àëà íîìåðíîãî ïîñòôèêñà
91 if i
= Length(name
) then
92 begin // Íåò öèôð â êîíöå ñòðîêè
97 NNF_PureName
:= Copy(name
, 1, i
);
103 // Íå ïåðåâåñòè â ÷èñëî:
104 if not TryStrToInt(name
, NNF_FirstNum
) then
112 function g_Texture_NumNameFindNext(var newName
: String): Byte;
114 if (NNF_PureName
= '') or (NNF_CurrentNum
< 0) then
117 Result
:= NNF_NO_NAME
;
121 newName
:= NNF_PureName
+ IntToStr(NNF_CurrentNum
);
123 if NNF_CurrentNum
< NNF_FirstNum
then
124 Result
:= NNF_NAME_BEFORE
126 if NNF_CurrentNum
> NNF_FirstNum
then
127 Result
:= NNF_NAME_AFTER
129 Result
:= NNF_NAME_EQUALS
;
134 { T M a p R e a d e r _ 1 : }
136 function TMapReader_1
.GetAreas(): TAreasRec1Array
;
138 TempDataBlocks
: TDataBlocksArray
;
144 TempDataBlocks
:= GetBlocks(BLOCK_AREAS
);
146 if TempDataBlocks
= nil then Exit
;
148 size
:= SizeOf(TAreaRec_1
);
150 for a
:= 0 to High(TempDataBlocks
) do
151 for b
:= 0 to (TempDataBlocks
[a
].Block
.BlockSize
div size
)-1 do
153 SetLength(Result
, Length(Result
)+1);
154 CopyMemory(@Result
[High(Result
)], Pointer(LongWord(TempDataBlocks
[a
].Data
)+b
*size
), size
);
157 TempDataBlocks
:= nil;
160 function TMapReader_1
.GetItems(): TItemsRec1Array
;
162 TempDataBlocks
: TDataBlocksArray
;
168 TempDataBlocks
:= GetBlocks(BLOCK_ITEMS
);
170 if TempDataBlocks
= nil then Exit
;
172 size
:= SizeOf(TItemRec_1
);
174 for a
:= 0 to High(TempDataBlocks
) do
175 for b
:= 0 to (TempDataBlocks
[a
].Block
.BlockSize
div size
)-1 do
177 SetLength(Result
, Length(Result
)+1);
178 CopyMemory(@Result
[High(Result
)], Pointer(LongWord(TempDataBlocks
[a
].Data
)+b
*size
), size
);
181 TempDataBlocks
:= nil;
184 function TMapReader_1
.GetMapHeader(): TMapHeaderRec_1
;
186 TempDataBlocks
: TDataBlocksArray
;
188 ZeroMemory(@Result
, SizeOf(TMapHeaderRec_1
));
190 TempDataBlocks
:= GetBlocks(BLOCK_HEADER
);
192 if TempDataBlocks
= nil then Exit
;
194 CopyMemory(@Result
, TempDataBlocks
[0].Data
, SizeOf(TMapHeaderRec_1
));
196 TempDataBlocks
:= nil;
199 function TMapReader_1
.GetMonsters(): TMonsterRec1Array
;
201 TempDataBlocks
: TDataBlocksArray
;
207 TempDataBlocks
:= GetBlocks(BLOCK_MONSTERS
);
209 if TempDataBlocks
= nil then Exit
;
211 size
:= SizeOf(TMonsterRec_1
);
213 for a
:= 0 to High(TempDataBlocks
) do
214 for b
:= 0 to (TempDataBlocks
[a
].Block
.BlockSize
div size
)-1 do
216 SetLength(Result
, Length(Result
)+1);
217 CopyMemory(@Result
[High(Result
)], Pointer(LongWord(TempDataBlocks
[a
].Data
)+b
*size
), size
);
220 TempDataBlocks
:= nil;
223 function TMapReader_1
.GetPanels(): TPanelsRec1Array
;
225 TempDataBlocks
: TDataBlocksArray
;
231 TempDataBlocks
:= GetBlocks(BLOCK_PANELS
);
233 if TempDataBlocks
= nil then Exit
;
235 size
:= SizeOf(TPanelRec_1
);
237 for a
:= 0 to High(TempDataBlocks
) do
238 for b
:= 0 to (TempDataBlocks
[a
].Block
.BlockSize
div size
)-1 do
240 SetLength(Result
, Length(Result
)+1);
241 CopyMemory(@Result
[High(Result
)], Pointer(LongWord(TempDataBlocks
[a
].Data
)+b
*size
), size
);
244 TempDataBlocks
:= nil;
247 function TMapReader_1
.GetTextures(): TTexturesRec1Array
;
249 TempDataBlocks
: TDataBlocksArray
;
255 TempDataBlocks
:= GetBlocks(BLOCK_TEXTURES
);
257 if TempDataBlocks
= nil then Exit
;
259 size
:= SizeOf(TTextureRec_1
);
261 for a
:= 0 to High(TempDataBlocks
) do
262 for b
:= 0 to (TempDataBlocks
[a
].Block
.BlockSize
div size
)-1 do
264 SetLength(Result
, Length(Result
)+1);
265 CopyMemory(@Result
[High(Result
)], Pointer(LongWord(TempDataBlocks
[a
].Data
)+b
*size
), size
);
268 TempDataBlocks
:= nil;
271 function TMapReader_1
.GetTriggers(): TTriggersRec1Array
;
273 TempDataBlocks
: TDataBlocksArray
;
279 TempDataBlocks
:= GetBlocks(BLOCK_TRIGGERS
);
281 if TempDataBlocks
= nil then Exit
;
283 size
:= SizeOf(TTriggerRec_1
);
285 for a
:= 0 to High(TempDataBlocks
) do
286 for b
:= 0 to (TempDataBlocks
[a
].Block
.BlockSize
div size
)-1 do
288 SetLength(Result
, Length(Result
)+1);
289 CopyMemory(@Result
[High(Result
)], Pointer(LongWord(TempDataBlocks
[a
].Data
)+b
*size
), size
);
292 TempDataBlocks
:= nil;
295 function TMapReader_1
.HandledVersion
: Byte;
300 { T M a p R e a d e r : }
302 constructor TMapReader
.Create();
305 FError
:= MAP_ERROR_NONE
;
309 destructor TMapReader
.Destroy();
316 procedure TMapReader
.FreeMap();
320 if FDataBlocks
<> nil then
321 for a
:= 0 to High(FDataBlocks
) do
322 if FDataBlocks
[a
].Data
<> nil then FreeMem(FDataBlocks
[a
].Data
);
326 FError
:= MAP_ERROR_NONE
;
329 function TMapReader
.GetBlocks(BlocksType
: Byte): TDataBlocksArray
;
335 if FDataBlocks
= nil then Exit
;
337 for a
:= 0 to High(FDataBlocks
) do
338 if FDataBlocks
[a
].Block
.BlockType
= BlocksType
then
340 SetLength(Result
, Length(Result
)+1);
341 Result
[High(Result
)] := FDataBlocks
[a
];
345 function TMapReader
.HandledVersion(): Byte;
350 function TMapReader
.LoadMap(Data
: Pointer): Boolean;
354 Sign
: array[0..2] of Char;
359 CopyMemory(@Sign
[0], Data
, 3);
360 if Sign
<> MAP_SIGNATURE
then
362 FError
:= MAP_ERROR_SIGNATURE
;
367 CopyMemory(@Ver
, Pointer(LongWord(Data
)+adr
), 1);
369 if Ver
> HandledVersion() then
371 FError
:= MAP_ERROR_VERSION
;
377 SetLength(FDataBlocks
, Length(FDataBlocks
)+1);
378 _id
:= High(FDataBlocks
);
380 CopyMemory(@FDataBlocks
[_id
].Block
, Pointer(LongWord(Data
)+adr
), SizeOf(TBlock
));
381 adr
:= adr
+SizeOf(TBlock
);
383 FDataBlocks
[_id
].Data
:= GetMemory(FDataBlocks
[_id
].Block
.BlockSize
);
385 CopyMemory(FDataBlocks
[_id
].Data
, Pointer(LongWord(Data
)+adr
), FDataBlocks
[_id
].Block
.BlockSize
);
387 adr
:= adr
+FDataBlocks
[_id
].Block
.BlockSize
;
388 until FDataBlocks
[_id
].Block
.BlockType
= BLOCK_NONE
;