DEADSOFTWARE

fix invalid value for TRIGGER_MUSIC.action
[d2df-editor.git] / src / shared / MAPWRITER.pas
index 0759931c7ec65ec04fdbaa256884a805db269699..95a181d0f056596e37b7b0650173777b8fe9f502 100644 (file)
@@ -1,12 +1,12 @@
 unit MAPWRITER;
 
-{$MODE Delphi}
+{$INCLUDE ../shared/a_modes.inc}
 
 {
 -----------------------------------
-MAPWRITER.PAS ВЕРСИЯ ОТ 24.09.06
+MAPWRITER.PAS ÂÅÐÑÈß ÎÒ 24.09.06
 
-Поддержка карт версии 1
+Ïîääåðæêà êàðò âåðñèè 1
 -----------------------------------
 }
 
@@ -50,7 +50,7 @@ type
 implementation
 
 uses
-  BinEditor, SysUtils;
+  MAPDEF, BinEditor, SysUtils, Math;
 
 { TMapWriter }
 
@@ -99,19 +99,19 @@ begin
  c := 3;
 
  Ver := HandledVersion();
- CopyMemory(Pointer(LongWord(Data)+c), @Ver, 1);
+ CopyMemory(Pointer(PtrUInt(Data)+c), @Ver, 1);
  c := c+1;
 
  if FDataBlocks <> nil then
   for a := 0 to High(FDataBlocks) do
   begin
-   CopyMemory(Pointer(LongWord(Data)+c), @FDataBlocks[a].Block, SizeOf(TBlock));
+   CopyMemory(Pointer(PtrUInt(Data)+c), @FDataBlocks[a].Block, SizeOf(TBlock));
    c := c+SizeOf(TBlock);
-   CopyMemory(Pointer(LongWord(Data)+c), FDataBlocks[a].Data, FDataBlocks[a].Block.BlockSize);
+   CopyMemory(Pointer(PtrUInt(Data)+c), FDataBlocks[a].Data, FDataBlocks[a].Block.BlockSize);
    c := c+FDataBlocks[a].Block.BlockSize;
   end;
 
- ZeroMemory(Pointer(LongWord(Data)+c), SizeOf(TBlock));
+ ZeroMemory(Pointer(PtrUInt(Data)+c), SizeOf(TBlock));
 end;
 
 function TMapWriter.HandledVersion(): Byte;
@@ -144,7 +144,7 @@ begin
   Data := GetMemory(Block.BlockSize);
 
   for a := 0 to High(Areas) do
-   CopyMemory(Pointer(LongWord(Data)+a*Size), @Areas[a], size);
+   CopyMemory(Pointer(PtrUInt(Data)+a*Size), @Areas[a], size);
  end;
  
  Result := True;
@@ -173,7 +173,7 @@ begin
   Data := GetMemory(Block.BlockSize);
 
   for a := 0 to High(Items) do
-   CopyMemory(Pointer(LongWord(Data)+a*size), @Items[a], size);
+   CopyMemory(Pointer(PtrUInt(Data)+a*size), @Items[a], size);
  end;
  
  Result := True;
@@ -202,7 +202,7 @@ begin
   Data := GetMemory(Block.BlockSize);
 
   for a := 0 to High(Monsters) do
-   CopyMemory(Pointer(LongWord(Data)+a*Size), @Monsters[a], size);
+   CopyMemory(Pointer(PtrUInt(Data)+a*Size), @Monsters[a], size);
  end;
  
  Result := True;
@@ -231,7 +231,7 @@ begin
   Data := GetMemory(Block.BlockSize);
 
   for a := 0 to High(Panels) do
-   CopyMemory(Pointer(LongWord(Data)+a*size), @Panels[a], size);
+   CopyMemory(Pointer(PtrUInt(Data)+a*size), @Panels[a], size);
  end;
  
  Result := True;
@@ -260,7 +260,7 @@ begin
   Data := GetMemory(Block.BlockSize);
 
   for a := 0 to High(Textures) do
-   CopyMemory(Pointer(LongWord(Data)+a*size), @Textures[a], size);
+   CopyMemory(Pointer(PtrUInt(Data)+a*size), @Textures[a], size);
  end;
 
  Result := True;
@@ -268,7 +268,8 @@ end;
 
 function TMapWriter_1.AddTriggers(Triggers: TTriggersRec1Array): Boolean;
 var
-  a, size: LongWord;
+  a, i, size: LongWord;
+  tr: ^TTriggerData;
 begin
  if Triggers = nil then
  begin
@@ -276,6 +277,15 @@ begin
   Exit;
  end;
 
+ // fix broken maps
+ for i := 0 to High(Triggers) do
+ begin
+   tr := @Triggers[i].data;
+   case Triggers[i].TriggerType of
+     TRIGGER_MUSIC: tr.MusicAction := Min(Max(tr.MusicAction, 0), 1);
+   end
+ end;
+
  SetLength(FDataBlocks, Length(FDataBlocks)+1);
 
  size := SizeOf(TTriggerRec_1);
@@ -289,7 +299,7 @@ begin
   Data := GetMemory(Block.BlockSize);
 
   for a := 0 to High(Triggers) do
-   CopyMemory(Pointer(LongWord(Data)+a*size), @Triggers[a], size);
+   CopyMemory(Pointer(PtrUInt(Data)+a*size), @Triggers[a], size);
  end;
 
  Result := True;
@@ -311,7 +321,7 @@ begin
 
   Data := GetMemory(Block.BlockSize);
 
-  CopyMemory(Pointer(LongWord(Data)), @MapHeader, size);
+  CopyMemory(Pointer(PtrUInt(Data)), @MapHeader, size);
  end;
  
  Result := True;