7879d15840e4383d8b8e154c59b187acee34f0ef
5 -----------------------------------
6 MAPWRITER.PAS ÂÅÐÑÈß ÎÒ 24.09.06
8 Ïîääåðæêà êàðò âåðñèè 1
9 -----------------------------------
18 TDataBlock
= packed record
23 TDataBlocksArray
= packed array of TDataBlock
;
25 TMapWriter
= class(TObject
)
27 FDataBlocks
: TDataBlocksArray
;
30 destructor Destroy(); override;
32 function SaveMap(var Data
: Pointer): LongWord;
33 function HandledVersion(): Byte; virtual;
36 TMapWriter_1
= class(TMapWriter
)
38 function AddTextures(Textures
: TTexturesRec1Array
): Boolean;
39 function AddPanels(Panels
: TPanelsRec1Array
): Boolean;
40 function AddItems(Items
: TItemsRec1Array
): Boolean;
41 function AddMonsters(Monsters
: TMonsterRec1Array
): Boolean;
42 function AddAreas(Areas
: TAreasRec1Array
): Boolean;
43 function AddTriggers(Triggers
: TTriggersRec1Array
): Boolean;
44 function AddHeader(MapHeader
: TMapHeaderRec_1
): Boolean;
45 function HandledVersion(): Byte; override;
56 constructor TMapWriter
.Create();
61 destructor TMapWriter
.Destroy();
68 procedure TMapWriter
.FreeMap();
72 if FDataBlocks
<> nil then
73 for a
:= 0 to High(FDataBlocks
) do
74 if FDataBlocks
[a
].Data
<> nil then FreeMem(FDataBlocks
[a
].Data
);
79 function TMapWriter
.SaveMap(var Data
: Pointer): LongWord;
83 Sign
: array[0..2] of Char;
86 b
:= 3+1+SizeOf(TBlock
)*(Length(FDataBlocks
)+1);
88 if FDataBlocks
<> nil then
89 for a
:= 0 to High(FDataBlocks
) do
90 b
:= b
+FDataBlocks
[a
].Block
.BlockSize
;
96 Sign
:= MAP_SIGNATURE
;
97 CopyMemory(Data
, @Sign
[0], 3);
100 Ver
:= HandledVersion();
101 CopyMemory(Pointer(LongWord(Data
)+c
), @Ver
, 1);
104 if FDataBlocks
<> nil then
105 for a
:= 0 to High(FDataBlocks
) do
107 CopyMemory(Pointer(LongWord(Data
)+c
), @FDataBlocks
[a
].Block
, SizeOf(TBlock
));
108 c
:= c
+SizeOf(TBlock
);
109 CopyMemory(Pointer(LongWord(Data
)+c
), FDataBlocks
[a
].Data
, FDataBlocks
[a
].Block
.BlockSize
);
110 c
:= c
+FDataBlocks
[a
].Block
.BlockSize
;
113 ZeroMemory(Pointer(LongWord(Data
)+c
), SizeOf(TBlock
));
116 function TMapWriter
.HandledVersion(): Byte;
123 function TMapWriter_1
.AddAreas(Areas
: TAreasRec1Array
): Boolean;
133 SetLength(FDataBlocks
, Length(FDataBlocks
)+1);
135 size
:= SizeOf(TAreaRec_1
);
137 with FDataBlocks
[High(FDataBlocks
)] do
139 Block
.BlockType
:= BLOCK_AREAS
;
140 Block
.Reserved
:= $00000000;
141 Block
.BlockSize
:= LongWord(Length(Areas
))*size
;
143 Data
:= GetMemory(Block
.BlockSize
);
145 for a
:= 0 to High(Areas
) do
146 CopyMemory(Pointer(LongWord(Data
)+a
*Size
), @Areas
[a
], size
);
152 function TMapWriter_1
.AddItems(Items
: TItemsRec1Array
): Boolean;
162 SetLength(FDataBlocks
, Length(FDataBlocks
)+1);
164 size
:= SizeOf(TItemRec_1
);
166 with FDataBlocks
[High(FDataBlocks
)] do
168 Block
.BlockType
:= BLOCK_ITEMS
;
169 Block
.Reserved
:= $00000000;
170 Block
.BlockSize
:= LongWord(Length(Items
))*size
;
172 Data
:= GetMemory(Block
.BlockSize
);
174 for a
:= 0 to High(Items
) do
175 CopyMemory(Pointer(LongWord(Data
)+a
*size
), @Items
[a
], size
);
181 function TMapWriter_1
.AddMonsters(Monsters
: TMonsterRec1Array
): Boolean;
185 if Monsters
= nil then
191 SetLength(FDataBlocks
, Length(FDataBlocks
)+1);
193 size
:= SizeOf(TMonsterRec_1
);
195 with FDataBlocks
[High(FDataBlocks
)] do
197 Block
.BlockType
:= BLOCK_MONSTERS
;
198 Block
.Reserved
:= $00000000;
199 Block
.BlockSize
:= LongWord(Length(Monsters
))*size
;
201 Data
:= GetMemory(Block
.BlockSize
);
203 for a
:= 0 to High(Monsters
) do
204 CopyMemory(Pointer(LongWord(Data
)+a
*Size
), @Monsters
[a
], size
);
210 function TMapWriter_1
.AddPanels(Panels
: TPanelsRec1Array
): Boolean;
220 SetLength(FDataBlocks
, Length(FDataBlocks
)+1);
222 size
:= SizeOf(TPanelRec_1
);
224 with FDataBlocks
[High(FDataBlocks
)] do
226 Block
.BlockType
:= BLOCK_PANELS
;
227 Block
.Reserved
:= $00000000;
228 Block
.BlockSize
:= LongWord(Length(Panels
))*size
;
230 Data
:= GetMemory(Block
.BlockSize
);
232 for a
:= 0 to High(Panels
) do
233 CopyMemory(Pointer(LongWord(Data
)+a
*size
), @Panels
[a
], size
);
239 function TMapWriter_1
.AddTextures(Textures
: TTexturesRec1Array
): Boolean;
243 if Textures
= nil then
249 SetLength(FDataBlocks
, Length(FDataBlocks
)+1);
251 size
:= SizeOf(TTextureRec_1
);
253 with FDataBlocks
[High(FDataBlocks
)] do
255 Block
.BlockType
:= BLOCK_TEXTURES
;
256 Block
.Reserved
:= $00000000;
257 Block
.BlockSize
:= LongWord(Length(Textures
))*size
;
259 Data
:= GetMemory(Block
.BlockSize
);
261 for a
:= 0 to High(Textures
) do
262 CopyMemory(Pointer(LongWord(Data
)+a
*size
), @Textures
[a
], size
);
268 function TMapWriter_1
.AddTriggers(Triggers
: TTriggersRec1Array
): Boolean;
272 if Triggers
= nil then
278 SetLength(FDataBlocks
, Length(FDataBlocks
)+1);
280 size
:= SizeOf(TTriggerRec_1
);
282 with FDataBlocks
[High(FDataBlocks
)] do
284 Block
.BlockType
:= BLOCK_TRIGGERS
;
285 Block
.Reserved
:= $00000000;
286 Block
.BlockSize
:= LongWord(Length(Triggers
))*size
;
288 Data
:= GetMemory(Block
.BlockSize
);
290 for a
:= 0 to High(Triggers
) do
291 CopyMemory(Pointer(LongWord(Data
)+a
*size
), @Triggers
[a
], size
);
297 function TMapWriter_1
.AddHeader(MapHeader
: TMapHeaderRec_1
): Boolean;
301 SetLength(FDataBlocks
, Length(FDataBlocks
)+1);
303 size
:= SizeOf(TMapHeaderRec_1
);
305 with FDataBlocks
[High(FDataBlocks
)] do
307 Block
.BlockType
:= BLOCK_HEADER
;
308 Block
.Reserved
:= $00000000;
309 Block
.BlockSize
:= size
;
311 Data
:= GetMemory(Block
.BlockSize
);
313 CopyMemory(Pointer(LongWord(Data
)), @MapHeader
, size
);
319 function TMapWriter_1
.HandledVersion(): Byte;