3 {$INCLUDE ../shared/a_modes.inc}
6 -----------------------------------
7 MAPWRITER.PAS ÂÅÐÑÈß ÎÒ 24.09.06
9 Ïîääåðæêà êàðò âåðñèè 1
10 -----------------------------------
19 TDataBlock
= packed record
24 TDataBlocksArray
= packed array of TDataBlock
;
26 TMapWriter
= class(TObject
)
28 FDataBlocks
: TDataBlocksArray
;
31 destructor Destroy(); override;
33 function SaveMap(var Data
: Pointer): LongWord;
34 function HandledVersion(): Byte; virtual;
37 TMapWriter_1
= class(TMapWriter
)
39 function AddTextures(Textures
: TTexturesRec1Array
): Boolean;
40 function AddPanels(Panels
: TPanelsRec1Array
): Boolean;
41 function AddItems(Items
: TItemsRec1Array
): Boolean;
42 function AddMonsters(Monsters
: TMonsterRec1Array
): Boolean;
43 function AddAreas(Areas
: TAreasRec1Array
): Boolean;
44 function AddTriggers(Triggers
: TTriggersRec1Array
): Boolean;
45 function AddHeader(MapHeader
: TMapHeaderRec_1
): Boolean;
46 function HandledVersion(): Byte; override;
53 MAPDEF
, BinEditor
, SysUtils
, Math
;
57 constructor TMapWriter
.Create();
62 destructor TMapWriter
.Destroy();
69 procedure TMapWriter
.FreeMap();
73 if FDataBlocks
<> nil then
74 for a
:= 0 to High(FDataBlocks
) do
75 if FDataBlocks
[a
].Data
<> nil then FreeMem(FDataBlocks
[a
].Data
);
80 function TMapWriter
.SaveMap(var Data
: Pointer): LongWord;
84 Sign
: array[0..2] of Char;
88 b
:= 3+1+SizeOf(TBlock
)*(Length(FDataBlocks
)+1);
90 if FDataBlocks
<> nil then
91 for a
:= 0 to High(FDataBlocks
) do
92 b
:= b
+FDataBlocks
[a
].Block
.BlockSize
;
98 Sign
:= MAP_SIGNATURE
;
99 CopyMemory(Data
, @Sign
[0], 3);
102 Ver
:= HandledVersion();
103 CopyMemory(Pointer(PtrUInt(Data
)+c
), @Ver
, 1);
106 if FDataBlocks
<> nil then
107 for a
:= 0 to High(FDataBlocks
) do
109 blk
:= FDataBlocks
[a
].Block
;
110 {$IFDEF FPC_BIG_ENDIAN}
111 blk
.Reserved
:= NtoLE(blk
.Reserved
);
112 blk
.BlockSize
:= NtoLE(blk
.BlockSize
);
114 CopyMemory(Pointer(PtrUInt(Data
)+c
), @blk
, SizeOf(TBlock
));
115 c
:= c
+SizeOf(TBlock
);
116 CopyMemory(Pointer(PtrUInt(Data
)+c
), FDataBlocks
[a
].Data
, FDataBlocks
[a
].Block
.BlockSize
);
117 c
:= c
+FDataBlocks
[a
].Block
.BlockSize
;
120 ZeroMemory(Pointer(PtrUInt(Data
)+c
), SizeOf(TBlock
));
123 function TMapWriter
.HandledVersion(): Byte;
130 function TMapWriter_1
.AddAreas(Areas
: TAreasRec1Array
): Boolean;
141 SetLength(FDataBlocks
, Length(FDataBlocks
)+1);
143 size
:= SizeOf(TAreaRec_1
);
145 with FDataBlocks
[High(FDataBlocks
)] do
147 Block
.BlockType
:= BLOCK_AREAS
;
148 Block
.Reserved
:= $00000000;
149 Block
.BlockSize
:= LongWord(Length(Areas
))*size
;
151 Data
:= GetMemory(Block
.BlockSize
);
153 for a
:= 0 to High(Areas
) do
156 {$IFDEF FPC_BIG_ENDIAN}
157 area
.X
:= NtoLE(area
.X
);
158 area
.Y
:= NtoLE(area
.Y
);
160 CopyMemory(Pointer(PtrUInt(Data
)+a
*Size
), @area
, size
);
167 function TMapWriter_1
.AddItems(Items
: TItemsRec1Array
): Boolean;
178 SetLength(FDataBlocks
, Length(FDataBlocks
)+1);
180 size
:= SizeOf(TItemRec_1
);
182 with FDataBlocks
[High(FDataBlocks
)] do
184 Block
.BlockType
:= BLOCK_ITEMS
;
185 Block
.Reserved
:= $00000000;
186 Block
.BlockSize
:= LongWord(Length(Items
))*size
;
188 Data
:= GetMemory(Block
.BlockSize
);
190 for a
:= 0 to High(Items
) do
193 {$IFDEF FPC_BIG_ENDIAN}
194 item
.X
:= NtoLE(item
.X
);
195 item
.Y
:= NtoLE(item
.Y
);
197 CopyMemory(Pointer(PtrUInt(Data
)+a
*size
), @item
, size
);
204 function TMapWriter_1
.AddMonsters(Monsters
: TMonsterRec1Array
): Boolean;
209 if Monsters
= nil then
215 SetLength(FDataBlocks
, Length(FDataBlocks
)+1);
217 size
:= SizeOf(TMonsterRec_1
);
219 with FDataBlocks
[High(FDataBlocks
)] do
221 Block
.BlockType
:= BLOCK_MONSTERS
;
222 Block
.Reserved
:= $00000000;
223 Block
.BlockSize
:= LongWord(Length(Monsters
))*size
;
225 Data
:= GetMemory(Block
.BlockSize
);
227 for a
:= 0 to High(Monsters
) do
230 {$IFDEF FPC_BIG_ENDIAN}
231 mon
.X
:= NtoLE(mon
.X
);
232 mon
.Y
:= NtoLE(mon
.Y
);
234 CopyMemory(Pointer(PtrUInt(Data
)+a
*Size
), @mon
, size
);
241 function TMapWriter_1
.AddPanels(Panels
: TPanelsRec1Array
): Boolean;
252 SetLength(FDataBlocks
, Length(FDataBlocks
)+1);
254 size
:= SizeOf(TPanelRec_1
);
256 with FDataBlocks
[High(FDataBlocks
)] do
258 Block
.BlockType
:= BLOCK_PANELS
;
259 Block
.Reserved
:= $00000000;
260 Block
.BlockSize
:= LongWord(Length(Panels
))*size
;
262 Data
:= GetMemory(Block
.BlockSize
);
264 for a
:= 0 to High(Panels
) do
267 {$IFDEF FPC_BIG_ENDIAN}
268 panel
.X
:= NtoLE(panel
.X
);
269 panel
.Y
:= NtoLE(panel
.Y
);
270 panel
.Width
:= NtoLE(panel
.Width
);
271 panel
.Height
:= NtoLE(panel
.Height
);
272 panel
.TextureNum
:= NtoLE(panel
.TextureNum
);
273 panel
.PanelType
:= NtoLE(panel
.PanelType
);
275 CopyMemory(Pointer(PtrUInt(Data
)+a
*size
), @panel
, size
);
282 function TMapWriter_1
.AddTextures(Textures
: TTexturesRec1Array
): Boolean;
286 if Textures
= nil then
292 SetLength(FDataBlocks
, Length(FDataBlocks
)+1);
294 size
:= SizeOf(TTextureRec_1
);
296 with FDataBlocks
[High(FDataBlocks
)] do
298 Block
.BlockType
:= BLOCK_TEXTURES
;
299 Block
.Reserved
:= $00000000;
300 Block
.BlockSize
:= LongWord(Length(Textures
))*size
;
302 Data
:= GetMemory(Block
.BlockSize
);
304 for a
:= 0 to High(Textures
) do
305 CopyMemory(Pointer(PtrUInt(Data
)+a
*size
), @Textures
[a
], size
);
311 function TMapWriter_1
.AddTriggers(Triggers
: TTriggersRec1Array
): Boolean;
313 a
, i
, size
: LongWord;
317 if Triggers
= nil then
323 SetLength(FDataBlocks
, Length(FDataBlocks
)+1);
325 size
:= SizeOf(TTriggerRec_1
);
327 FDataBlocks
[High(FDataBlocks
)].Block
.BlockType
:= BLOCK_TRIGGERS
;
328 FDataBlocks
[High(FDataBlocks
)].Block
.Reserved
:= $00000000;
329 FDataBlocks
[High(FDataBlocks
)].Block
.BlockSize
:= LongWord(Length(Triggers
))*size
;
331 FDataBlocks
[High(FDataBlocks
)].Data
:= GetMemory(FDataBlocks
[High(FDataBlocks
)].Block
.BlockSize
);
333 for a
:= 0 to High(Triggers
) do
338 case tr
.TriggerType
of
339 TRIGGER_MUSIC
: data
.MusicAction
:= Min(Max(data
.MusicAction
, 0), 1);
342 {$IFDEF FPC_BIG_ENDIAN}
345 tr
.Width
:= NtoLE(tr
.Width
);
346 tr
.Height
:= NtoLE(tr
.Height
);
347 tr
.TexturePanel
:= NtoLE(tr
.TexturePanel
);
348 case tr
.TriggerType
of
352 data
.TargetPoint
.X
:= NtoLE(data
.TargetPoint
.X
);
353 data
.TargetPoint
.Y
:= NtoLE(data
.TargetPoint
.Y
);
355 TRIGGER_OPENDOOR
, TRIGGER_CLOSEDOOR
, TRIGGER_DOOR
, TRIGGER_DOOR5
,
356 TRIGGER_CLOSETRAP
, TRIGGER_TRAP
, TRIGGER_LIFTUP
, TRIGGER_LIFTDOWN
,
358 data
.PanelID
:= NtoLE(data
.PanelID
);
359 TRIGGER_PRESS
, TRIGGER_ON
, TRIGGER_OFF
, TRIGGER_ONOFF
:
361 data
.tX
:= NtoLE(data
.tX
);
362 data
.tY
:= NtoLE(data
.tY
);
363 data
.tWidth
:= NtoLE(data
.tWidth
);
364 data
.tHeight
:= NtoLE(data
.tHeight
);
365 data
.Wait
:= NtoLE(data
.Wait
);
366 data
.Count
:= NtoLE(data
.Count
);
367 data
.MonsterID
:= NtoLE(data
.MonsterID
);
372 TRIGGER_SPAWNMONSTER
:
374 data
.MonPos
.X
:= NtoLE(data
.MonPos
.X
);
375 data
.MonPos
.Y
:= NtoLE(data
.MonPos
.Y
);
376 data
.MonHealth
:= NtoLE(data
.MonHealth
);
377 data
.MonCount
:= NtoLE(data
.MonCount
);
378 data
.MonMax
:= NtoLE(data
.MonMax
);
379 data
.MonDelay
:= NtoLE(data
.MonDelay
);
383 data
.ItemPos
.X
:= NtoLE(data
.ItemPos
.X
);
384 data
.ItemPos
.Y
:= NtoLE(data
.ItemPos
.Y
);
385 data
.ItemCount
:= NtoLE(data
.ItemCount
);
386 data
.ItemMax
:= NtoLE(data
.ItemMax
);
387 data
.ItemDelay
:= NtoLE(data
.ItemDelay
);
391 data
.PushAngle
:= NtoLE(data
.PushAngle
);
394 data
.MessageTime
:= NtoLE(data
.MessageTime
);
397 data
.DamageValue
:= NtoLE(data
.DamageValue
);
398 data
.DamageInterval
:= NtoLE(data
.DamageInterval
);
402 data
.HealValue
:= NtoLE(data
.HealValue
);
403 data
.HealInterval
:= NtoLE(data
.HealInterval
);
407 data
.ShotPos
.X
:= NtoLE(data
.ShotPos
.X
);
408 data
.ShotPos
.Y
:= NtoLE(data
.ShotPos
.Y
);
409 data
.ShotPanelID
:= NtoLE(data
.ShotPanelID
);
410 data
.ShotIntSight
:= NtoLE(data
.ShotIntSight
);
411 data
.ShotAngle
:= NtoLE(data
.ShotAngle
);
412 data
.ShotWait
:= NtoLE(data
.ShotWait
);
413 data
.ShotAccuracy
:= NtoLE(data
.ShotAccuracy
);
414 data
.ShotAmmo
:= NtoLE(data
.ShotAmmo
);
415 data
.ShotIntReload
:= NtoLE(data
.ShotIntReload
);
419 data
.FXWait
:= NtoLE(data
.FXWait
);
420 data
.FXVelX
:= NtoLE(data
.FXVelX
);
421 data
.FXVelY
:= NtoLE(data
.FXVelY
);
425 CopyMemory(Pointer(PtrUInt(FDataBlocks
[High(FDataBlocks
)].Data
)+a
*size
), @tr
, size
);
431 function TMapWriter_1
.AddHeader(MapHeader
: TMapHeaderRec_1
): Boolean;
434 hdr
: TMapHeaderRec_1
;
436 SetLength(FDataBlocks
, Length(FDataBlocks
)+1);
438 size
:= SizeOf(TMapHeaderRec_1
);
440 with FDataBlocks
[High(FDataBlocks
)] do
442 Block
.BlockType
:= BLOCK_HEADER
;
443 Block
.Reserved
:= $00000000;
444 Block
.BlockSize
:= size
;
446 Data
:= GetMemory(Block
.BlockSize
);
449 {$IFDEF FPC_BIG_ENDIAN}
450 hdr
.Width
:= NtoLE(hdr
.Width
);
451 hdr
.Height
:= NtoLE(hdr
.Height
);
453 CopyMemory(Pointer(PtrUInt(Data
)), @hdr
, size
);
459 function TMapWriter_1
.HandledVersion(): Byte;