DEADSOFTWARE

Fix access violation on x86_64
[d2df-sdl.git] / src / shared / MAPREADER.pas
index 0c8849bc5727f46c5b94b9a3ed8705077816da31..a122bee5cb0b13d6f47ba5679edf30d3cdc0c31f 100644 (file)
@@ -1,3 +1,18 @@
+(* Copyright (C)  DooM 2D:Forever Developers
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *)
 {$MODE DELPHI}
 unit MAPREADER;
 
@@ -68,7 +83,7 @@ function g_Texture_NumNameFindNext(var newName: String): Byte;
 implementation
 
 uses
-  SysUtils, BinEditor;
+  SysUtils, BinEditor, MAPDEF;
 
 var
   NNF_PureName: String; // Èìÿ òåêñòóðû áåç öèôð â êîíöå
@@ -137,7 +152,7 @@ function TMapReader_1.GetAreas(): TAreasRec1Array;
 var
   TempDataBlocks: TDataBlocksArray;
   a: Integer;
-  b, Size: LongWord;
+  b, Size: NativeInt;
 begin
  Result := nil;
 
@@ -145,13 +160,14 @@ begin
 
  if TempDataBlocks = nil then Exit;
 
- size := SizeOf(TAreaRec_1);
+ size := SizeOf_TAreaRec_1;
 
  for a := 0 to High(TempDataBlocks) do
   for b := 0 to (TempDataBlocks[a].Block.BlockSize div size)-1 do
   begin
    SetLength(Result, Length(Result)+1);
-   CopyMemory(@Result[High(Result)], Pointer(LongWord(TempDataBlocks[a].Data)+b*size), size);
+   //CopyMemory(@Result[High(Result)], Pointer(LongWord(TempDataBlocks[a].Data)+b*size), size);
+   mb_Read_TAreaRec_1(Result[High(Result)], Pointer(NativeInt(TempDataBlocks[a].Data)+b*size)^, size);
   end;
 
  TempDataBlocks := nil;
@@ -161,7 +177,7 @@ function TMapReader_1.GetItems(): TItemsRec1Array;
 var
   TempDataBlocks: TDataBlocksArray;
   a: Integer;
-  b, Size: LongWord;
+  b, Size: NativeInt;
 begin
  Result := nil;
 
@@ -169,13 +185,14 @@ begin
 
  if TempDataBlocks = nil then Exit;
 
- size := SizeOf(TItemRec_1);
+ size := SizeOf_TItemRec_1;
 
  for a := 0 to High(TempDataBlocks) do
   for b := 0 to (TempDataBlocks[a].Block.BlockSize div size)-1 do
   begin
    SetLength(Result, Length(Result)+1);
-   CopyMemory(@Result[High(Result)], Pointer(LongWord(TempDataBlocks[a].Data)+b*size), size);
+   //CopyMemory(@Result[High(Result)], Pointer(LongWord(TempDataBlocks[a].Data)+b*size), size);
+   mb_Read_TItemRec_1(Result[High(Result)], Pointer(NativeInt(TempDataBlocks[a].Data)+b*size)^, size);
   end;
 
  TempDataBlocks := nil;
@@ -191,7 +208,8 @@ begin
 
  if TempDataBlocks = nil then Exit;
 
- CopyMemory(@Result, TempDataBlocks[0].Data, SizeOf(TMapHeaderRec_1));
+ //CopyMemory(@Result, TempDataBlocks[0].Data, SizeOf(TMapHeaderRec_1));
+ mb_Read_TMapHeaderRec_1(Result, TempDataBlocks[0].Data^, SizeOf_TMapHeaderRec_1);
 
  TempDataBlocks := nil;
 end;
@@ -200,7 +218,7 @@ function TMapReader_1.GetMonsters(): TMonsterRec1Array;
 var
   TempDataBlocks: TDataBlocksArray;
   a: Integer;
-  b, Size: LongWord;
+  b, Size: NativeInt;
 begin
  Result := nil;
 
@@ -208,13 +226,14 @@ begin
 
  if TempDataBlocks = nil then Exit;
 
- size := SizeOf(TMonsterRec_1);
+ size := SizeOf_TMonsterRec_1;
 
  for a := 0 to High(TempDataBlocks) do
   for b := 0 to (TempDataBlocks[a].Block.BlockSize div size)-1 do
   begin
    SetLength(Result, Length(Result)+1);
-   CopyMemory(@Result[High(Result)], Pointer(LongWord(TempDataBlocks[a].Data)+b*size), size);
+   //CopyMemory(@Result[High(Result)], Pointer(LongWord(TempDataBlocks[a].Data)+b*size), size);
+   mb_Read_TMonsterRec_1(Result[High(Result)], Pointer(NativeInt(TempDataBlocks[a].Data)+b*size)^, size);
   end;
 
  TempDataBlocks := nil;
@@ -224,7 +243,7 @@ function TMapReader_1.GetPanels(): TPanelsRec1Array;
 var
   TempDataBlocks: TDataBlocksArray;
   a: Integer;
-  b, Size: LongWord;
+  b, Size: NativeInt;
 begin
  Result := nil;
 
@@ -232,13 +251,14 @@ begin
 
  if TempDataBlocks = nil then Exit;
 
- size := SizeOf(TPanelRec_1);
+ size := SizeOf_TPanelRec_1;
 
  for a := 0 to High(TempDataBlocks) do
   for b := 0 to (TempDataBlocks[a].Block.BlockSize div size)-1 do
   begin
    SetLength(Result, Length(Result)+1);
-   CopyMemory(@Result[High(Result)], Pointer(LongWord(TempDataBlocks[a].Data)+b*size), size);
+   //CopyMemory(@Result[High(Result)], Pointer(LongWord(TempDataBlocks[a].Data)+b*size), size);
+   mb_Read_TPanelRec_1(Result[High(Result)], Pointer(NativeInt(TempDataBlocks[a].Data)+b*size)^, size);
   end;
 
  TempDataBlocks := nil;
@@ -248,7 +268,7 @@ function TMapReader_1.GetTextures(): TTexturesRec1Array;
 var
   TempDataBlocks: TDataBlocksArray;
   a: Integer;
-  b, Size: LongWord;
+  b, Size: NativeInt;
 begin
  Result := nil;
 
@@ -256,13 +276,14 @@ begin
 
  if TempDataBlocks = nil then Exit;
 
- size := SizeOf(TTextureRec_1);
+ size := SizeOf_TTextureRec_1;
 
  for a := 0 to High(TempDataBlocks) do
   for b := 0 to (TempDataBlocks[a].Block.BlockSize div size)-1 do
   begin
    SetLength(Result, Length(Result)+1);
-   CopyMemory(@Result[High(Result)], Pointer(LongWord(TempDataBlocks[a].Data)+b*size), size);
+    //CopyMemory(@Result[High(Result)], Pointer(LongWord(TempDataBlocks[a].Data)+b*size), size);
+    mb_Read_TTextureRec_1(Result[High(Result)], Pointer(NativeInt(TempDataBlocks[a].Data)+b*size)^, size);
   end;
 
  TempDataBlocks := nil;
@@ -272,7 +293,9 @@ function TMapReader_1.GetTriggers(): TTriggersRec1Array;
 var
   TempDataBlocks: TDataBlocksArray;
   a: Integer;
-  b, Size: LongWord;
+  b: NativeInt;
+  Size: LongWord;
+  trdata: TTriggerData;
 begin
  Result := nil;
 
@@ -280,13 +303,21 @@ begin
 
  if TempDataBlocks = nil then Exit;
 
- size := SizeOf(TTriggerRec_1);
+ size := SizeOf_TTriggerRec_1;
 
  for a := 0 to High(TempDataBlocks) do
   for b := 0 to (TempDataBlocks[a].Block.BlockSize div size)-1 do
   begin
    SetLength(Result, Length(Result)+1);
-   CopyMemory(@Result[High(Result)], Pointer(LongWord(TempDataBlocks[a].Data)+b*size), size);
+   //CopyMemory(@Result[High(Result)], Pointer(LongWord(TempDataBlocks[a].Data)+b*size), size);
+   mb_Read_TTriggerRec_1(Result[High(Result)], Pointer(NativeInt(TempDataBlocks[a].Data)+b*size)^, size);
+   if (Result[High(Result)].TriggerType <> 0) then
+   begin
+     // preprocess trigger data
+     ZeroMemory(@trdata, SizeOf(trdata));
+     mb_Read_TriggerData(trdata, Result[High(Result)].TriggerType, Result[High(Result)].DATA, sizeof(trdata));
+     Result[High(Result)].DATA := trdata.Default;
+   end;
   end;
 
  TempDataBlocks := nil;
@@ -338,7 +369,7 @@ begin
   if FDataBlocks[a].Block.BlockType = BlocksType then
   begin
    SetLength(Result, Length(Result)+1);
-   Result[High(Result)] := FDataBlocks[a];
+    Result[High(Result)] := FDataBlocks[a];
   end;
 end;
 
@@ -349,7 +380,7 @@ end;
 
 function TMapReader.LoadMap(Data: Pointer): Boolean;
 var
-  adr: LongWord;
+  adr: NativeInt;
   _id: Integer;
   Sign: array[0..2] of Char;
   Ver: Byte;
@@ -364,7 +395,7 @@ begin
  end;
  adr := 3;
 
- CopyMemory(@Ver, Pointer(LongWord(Data)+adr), 1);
+ CopyMemory(@Ver, Pointer(NativeInt(Data)+adr), 1);
  FVersion := Ver;
  if Ver > HandledVersion() then
  begin
@@ -377,12 +408,12 @@ begin
   SetLength(FDataBlocks, Length(FDataBlocks)+1);
   _id := High(FDataBlocks);
 
-  CopyMemory(@FDataBlocks[_id].Block, Pointer(LongWord(Data)+adr), SizeOf(TBlock));
+  CopyMemory(@FDataBlocks[_id].Block, Pointer(NativeInt(Data)+adr), SizeOf(TBlock));
   adr := adr+SizeOf(TBlock);
 
   FDataBlocks[_id].Data := GetMemory(FDataBlocks[_id].Block.BlockSize);
 
-  CopyMemory(FDataBlocks[_id].Data, Pointer(LongWord(Data)+adr), FDataBlocks[_id].Block.BlockSize);
+  CopyMemory(FDataBlocks[_id].Data, Pointer(NativeInt(Data)+adr), FDataBlocks[_id].Block.BlockSize);
 
   adr := adr+FDataBlocks[_id].Block.BlockSize;
  until FDataBlocks[_id].Block.BlockType = BLOCK_NONE;