DEADSOFTWARE

6399330fcfb71bf08e9de22c0a92ca874d2fdd05
[d2df-sdl.git] / src / sheditor / MAPWRITER.pas
1 unit MAPWRITER;
3 {
4 -----------------------------------
5 MAPWRITER.PAS ÂÅÐÑÈß ÎÒ 24.09.06
7 Ïîääåðæêà êàðò âåðñèè 1
8 -----------------------------------
9 }
11 interface
13 uses
14 MAPSTRUCT;
16 type
17 TDataBlock = packed record
18 Block: TBlock;
19 Data: Pointer;
20 end;
22 TDataBlocksArray = packed array of TDataBlock;
24 TMapWriter = class(TObject)
25 private
26 FDataBlocks: TDataBlocksArray;
27 public
28 constructor Create();
29 destructor Destroy(); override;
30 procedure FreeMap();
31 function SaveMap(var Data: Pointer): LongWord;
32 function HandledVersion(): Byte; virtual;
33 end;
35 TMapWriter_1 = class(TMapWriter)
36 public
37 function AddTextures(Textures: TTexturesRec1Array): Boolean;
38 function AddPanels(Panels: TPanelsRec1Array): Boolean;
39 function AddItems(Items: TItemsRec1Array): Boolean;
40 function AddMonsters(Monsters: TMonsterRec1Array): Boolean;
41 function AddAreas(Areas: TAreasRec1Array): Boolean;
42 function AddTriggers(Triggers: TTriggersRec1Array): Boolean;
43 function AddHeader(MapHeader: TMapHeaderRec_1): Boolean;
44 function HandledVersion(): Byte; override;
45 end;
48 implementation
50 uses
51 BinEditor, SysUtils;
53 { TMapWriter }
55 constructor TMapWriter.Create();
56 begin
57 FDataBlocks := nil;
58 end;
60 destructor TMapWriter.Destroy();
61 begin
62 FreeMap();
64 inherited;
65 end;
67 procedure TMapWriter.FreeMap();
68 var
69 a: Integer;
70 begin
71 if FDataBlocks <> nil then
72 for a := 0 to High(FDataBlocks) do
73 if FDataBlocks[a].Data <> nil then FreeMem(FDataBlocks[a].Data);
75 FDataBlocks := nil;
76 end;
78 function TMapWriter.SaveMap(var Data: Pointer): LongWord;
79 var
80 a: Integer;
81 b, c: LongWord;
82 Sign: array[0..2] of Char;
83 Ver: Byte;
84 begin
85 b := 3+1+SizeOf(TBlock)*(Length(FDataBlocks)+1);
87 if FDataBlocks <> nil then
88 for a := 0 to High(FDataBlocks) do
89 b := b+FDataBlocks[a].Block.BlockSize;
91 Result := b;
93 GetMem(Data, b);
95 Sign := MAP_SIGNATURE;
96 CopyMemory(Data, @Sign[0], 3);
97 c := 3;
99 Ver := HandledVersion();
100 CopyMemory(Pointer(LongWord(Data)+c), @Ver, 1);
101 c := c+1;
103 if FDataBlocks <> nil then
104 for a := 0 to High(FDataBlocks) do
105 begin
106 CopyMemory(Pointer(LongWord(Data)+c), @FDataBlocks[a].Block, SizeOf(TBlock));
107 c := c+SizeOf(TBlock);
108 CopyMemory(Pointer(LongWord(Data)+c), FDataBlocks[a].Data, FDataBlocks[a].Block.BlockSize);
109 c := c+FDataBlocks[a].Block.BlockSize;
110 end;
112 ZeroMemory(Pointer(LongWord(Data)+c), SizeOf(TBlock));
113 end;
115 function TMapWriter.HandledVersion(): Byte;
116 begin
117 Result := $00;
118 end;
120 { TMapWriter_1 }
122 function TMapWriter_1.AddAreas(Areas: TAreasRec1Array): Boolean;
123 var
124 a, size: LongWord;
125 begin
126 if Areas = nil then
127 begin
128 Result := True;
129 Exit;
130 end;
132 SetLength(FDataBlocks, Length(FDataBlocks)+1);
134 size := SizeOf(TAreaRec_1);
136 with FDataBlocks[High(FDataBlocks)] do
137 begin
138 Block.BlockType := BLOCK_AREAS;
139 Block.Reserved := $00000000;
140 Block.BlockSize := LongWord(Length(Areas))*size;
142 Data := GetMemory(Block.BlockSize);
144 for a := 0 to High(Areas) do
145 CopyMemory(Pointer(LongWord(Data)+a*Size), @Areas[a], size);
146 end;
148 Result := True;
149 end;
151 function TMapWriter_1.AddItems(Items: TItemsRec1Array): Boolean;
152 var
153 a, size: LongWord;
154 begin
155 if Items = nil then
156 begin
157 Result := True;
158 Exit;
159 end;
161 SetLength(FDataBlocks, Length(FDataBlocks)+1);
163 size := SizeOf(TItemRec_1);
165 with FDataBlocks[High(FDataBlocks)] do
166 begin
167 Block.BlockType := BLOCK_ITEMS;
168 Block.Reserved := $00000000;
169 Block.BlockSize := LongWord(Length(Items))*size;
171 Data := GetMemory(Block.BlockSize);
173 for a := 0 to High(Items) do
174 CopyMemory(Pointer(LongWord(Data)+a*size), @Items[a], size);
175 end;
177 Result := True;
178 end;
180 function TMapWriter_1.AddMonsters(Monsters: TMonsterRec1Array): Boolean;
181 var
182 a, size: LongWord;
183 begin
184 if Monsters = nil then
185 begin
186 Result := True;
187 Exit;
188 end;
190 SetLength(FDataBlocks, Length(FDataBlocks)+1);
192 size := SizeOf(TMonsterRec_1);
194 with FDataBlocks[High(FDataBlocks)] do
195 begin
196 Block.BlockType := BLOCK_MONSTERS;
197 Block.Reserved := $00000000;
198 Block.BlockSize := LongWord(Length(Monsters))*size;
200 Data := GetMemory(Block.BlockSize);
202 for a := 0 to High(Monsters) do
203 CopyMemory(Pointer(LongWord(Data)+a*Size), @Monsters[a], size);
204 end;
206 Result := True;
207 end;
209 function TMapWriter_1.AddPanels(Panels: TPanelsRec1Array): Boolean;
210 var
211 a, size: LongWord;
212 begin
213 if Panels = nil then
214 begin
215 Result := True;
216 Exit;
217 end;
219 SetLength(FDataBlocks, Length(FDataBlocks)+1);
221 size := SizeOf(TPanelRec_1);
223 with FDataBlocks[High(FDataBlocks)] do
224 begin
225 Block.BlockType := BLOCK_PANELS;
226 Block.Reserved := $00000000;
227 Block.BlockSize := LongWord(Length(Panels))*size;
229 Data := GetMemory(Block.BlockSize);
231 for a := 0 to High(Panels) do
232 CopyMemory(Pointer(LongWord(Data)+a*size), @Panels[a], size);
233 end;
235 Result := True;
236 end;
238 function TMapWriter_1.AddTextures(Textures: TTexturesRec1Array): Boolean;
239 var
240 a, size: LongWord;
241 begin
242 if Textures = nil then
243 begin
244 Result := True;
245 Exit;
246 end;
248 SetLength(FDataBlocks, Length(FDataBlocks)+1);
250 size := SizeOf(TTextureRec_1);
252 with FDataBlocks[High(FDataBlocks)] do
253 begin
254 Block.BlockType := BLOCK_TEXTURES;
255 Block.Reserved := $00000000;
256 Block.BlockSize := LongWord(Length(Textures))*size;
258 Data := GetMemory(Block.BlockSize);
260 for a := 0 to High(Textures) do
261 CopyMemory(Pointer(LongWord(Data)+a*size), @Textures[a], size);
262 end;
264 Result := True;
265 end;
267 function TMapWriter_1.AddTriggers(Triggers: TTriggersRec1Array): Boolean;
268 var
269 a, size: LongWord;
270 begin
271 if Triggers = nil then
272 begin
273 Result := True;
274 Exit;
275 end;
277 SetLength(FDataBlocks, Length(FDataBlocks)+1);
279 size := SizeOf(TTriggerRec_1);
281 with FDataBlocks[High(FDataBlocks)] do
282 begin
283 Block.BlockType := BLOCK_TRIGGERS;
284 Block.Reserved := $00000000;
285 Block.BlockSize := LongWord(Length(Triggers))*size;
287 Data := GetMemory(Block.BlockSize);
289 for a := 0 to High(Triggers) do
290 CopyMemory(Pointer(LongWord(Data)+a*size), @Triggers[a], size);
291 end;
293 Result := True;
294 end;
296 function TMapWriter_1.AddHeader(MapHeader: TMapHeaderRec_1): Boolean;
297 var
298 size: LongWord;
299 begin
300 SetLength(FDataBlocks, Length(FDataBlocks)+1);
302 size := SizeOf(TMapHeaderRec_1);
304 with FDataBlocks[High(FDataBlocks)] do
305 begin
306 Block.BlockType := BLOCK_HEADER;
307 Block.Reserved := $00000000;
308 Block.BlockSize := size;
310 Data := GetMemory(Block.BlockSize);
312 CopyMemory(Pointer(LongWord(Data)), @MapHeader, size);
313 end;
315 Result := True;
316 end;
318 function TMapWriter_1.HandledVersion(): Byte;
319 begin
320 Result := $01;
321 end;
323 end.