DEADSOFTWARE

put "{$MODE ...}" directive in each source file; removed trailing spaces, and convert...
[d2df-sdl.git] / src / sheditor / MAPWRITER.pas
1 {$MODE DELPHI}
2 unit MAPWRITER;
4 {
5 -----------------------------------
6 MAPWRITER.PAS ÂÅÐÑÈß ÎÒ 24.09.06
8 Ïîääåðæêà êàðò âåðñèè 1
9 -----------------------------------
10 }
12 interface
14 uses
15 MAPSTRUCT;
17 type
18 TDataBlock = packed record
19 Block: TBlock;
20 Data: Pointer;
21 end;
23 TDataBlocksArray = packed array of TDataBlock;
25 TMapWriter = class(TObject)
26 private
27 FDataBlocks: TDataBlocksArray;
28 public
29 constructor Create();
30 destructor Destroy(); override;
31 procedure FreeMap();
32 function SaveMap(var Data: Pointer): LongWord;
33 function HandledVersion(): Byte; virtual;
34 end;
36 TMapWriter_1 = class(TMapWriter)
37 public
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;
46 end;
49 implementation
51 uses
52 BinEditor, SysUtils;
54 { TMapWriter }
56 constructor TMapWriter.Create();
57 begin
58 FDataBlocks := nil;
59 end;
61 destructor TMapWriter.Destroy();
62 begin
63 FreeMap();
65 inherited;
66 end;
68 procedure TMapWriter.FreeMap();
69 var
70 a: Integer;
71 begin
72 if FDataBlocks <> nil then
73 for a := 0 to High(FDataBlocks) do
74 if FDataBlocks[a].Data <> nil then FreeMem(FDataBlocks[a].Data);
76 FDataBlocks := nil;
77 end;
79 function TMapWriter.SaveMap(var Data: Pointer): LongWord;
80 var
81 a: Integer;
82 b, c: LongWord;
83 Sign: array[0..2] of Char;
84 Ver: Byte;
85 begin
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;
92 Result := b;
94 GetMem(Data, b);
96 Sign := MAP_SIGNATURE;
97 CopyMemory(Data, @Sign[0], 3);
98 c := 3;
100 Ver := HandledVersion();
101 CopyMemory(Pointer(LongWord(Data)+c), @Ver, 1);
102 c := c+1;
104 if FDataBlocks <> nil then
105 for a := 0 to High(FDataBlocks) do
106 begin
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;
111 end;
113 ZeroMemory(Pointer(LongWord(Data)+c), SizeOf(TBlock));
114 end;
116 function TMapWriter.HandledVersion(): Byte;
117 begin
118 Result := $00;
119 end;
121 { TMapWriter_1 }
123 function TMapWriter_1.AddAreas(Areas: TAreasRec1Array): Boolean;
124 var
125 a, size: LongWord;
126 begin
127 if Areas = nil then
128 begin
129 Result := True;
130 Exit;
131 end;
133 SetLength(FDataBlocks, Length(FDataBlocks)+1);
135 size := SizeOf(TAreaRec_1);
137 with FDataBlocks[High(FDataBlocks)] do
138 begin
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);
147 end;
149 Result := True;
150 end;
152 function TMapWriter_1.AddItems(Items: TItemsRec1Array): Boolean;
153 var
154 a, size: LongWord;
155 begin
156 if Items = nil then
157 begin
158 Result := True;
159 Exit;
160 end;
162 SetLength(FDataBlocks, Length(FDataBlocks)+1);
164 size := SizeOf(TItemRec_1);
166 with FDataBlocks[High(FDataBlocks)] do
167 begin
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);
176 end;
178 Result := True;
179 end;
181 function TMapWriter_1.AddMonsters(Monsters: TMonsterRec1Array): Boolean;
182 var
183 a, size: LongWord;
184 begin
185 if Monsters = nil then
186 begin
187 Result := True;
188 Exit;
189 end;
191 SetLength(FDataBlocks, Length(FDataBlocks)+1);
193 size := SizeOf(TMonsterRec_1);
195 with FDataBlocks[High(FDataBlocks)] do
196 begin
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);
205 end;
207 Result := True;
208 end;
210 function TMapWriter_1.AddPanels(Panels: TPanelsRec1Array): Boolean;
211 var
212 a, size: LongWord;
213 begin
214 if Panels = nil then
215 begin
216 Result := True;
217 Exit;
218 end;
220 SetLength(FDataBlocks, Length(FDataBlocks)+1);
222 size := SizeOf(TPanelRec_1);
224 with FDataBlocks[High(FDataBlocks)] do
225 begin
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);
234 end;
236 Result := True;
237 end;
239 function TMapWriter_1.AddTextures(Textures: TTexturesRec1Array): Boolean;
240 var
241 a, size: LongWord;
242 begin
243 if Textures = nil then
244 begin
245 Result := True;
246 Exit;
247 end;
249 SetLength(FDataBlocks, Length(FDataBlocks)+1);
251 size := SizeOf(TTextureRec_1);
253 with FDataBlocks[High(FDataBlocks)] do
254 begin
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);
263 end;
265 Result := True;
266 end;
268 function TMapWriter_1.AddTriggers(Triggers: TTriggersRec1Array): Boolean;
269 var
270 a, size: LongWord;
271 begin
272 if Triggers = nil then
273 begin
274 Result := True;
275 Exit;
276 end;
278 SetLength(FDataBlocks, Length(FDataBlocks)+1);
280 size := SizeOf(TTriggerRec_1);
282 with FDataBlocks[High(FDataBlocks)] do
283 begin
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);
292 end;
294 Result := True;
295 end;
297 function TMapWriter_1.AddHeader(MapHeader: TMapHeaderRec_1): Boolean;
298 var
299 size: LongWord;
300 begin
301 SetLength(FDataBlocks, Length(FDataBlocks)+1);
303 size := SizeOf(TMapHeaderRec_1);
305 with FDataBlocks[High(FDataBlocks)] do
306 begin
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);
314 end;
316 Result := True;
317 end;
319 function TMapWriter_1.HandledVersion(): Byte;
320 begin
321 Result := $01;
322 end;
324 end.