DEADSOFTWARE

map reader now independent of record size and alignment
[d2df-sdl.git] / src / shared / MAPREADER.pas
index 0c8849bc5727f46c5b94b9a3ed8705077816da31..6c9e86326551d7b0d24ba7e8151aed028e565c01 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; // Èìÿ òåêñòóðû áåç öèôð â êîíöå
@@ -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(LongWord(TempDataBlocks[a].Data)+b*size)^, size);
   end;
 
  TempDataBlocks := 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(LongWord(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;
@@ -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(LongWord(TempDataBlocks[a].Data)+b*size)^, size);
   end;
 
  TempDataBlocks := 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(LongWord(TempDataBlocks[a].Data)+b*size)^, size);
   end;
 
  TempDataBlocks := 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(LongWord(TempDataBlocks[a].Data)+b*size)^, size);
   end;
 
  TempDataBlocks := nil;
@@ -273,6 +294,7 @@ var
   TempDataBlocks: TDataBlocksArray;
   a: Integer;
   b, Size: LongWord;
+  trdata: TTriggerData;
 begin
  Result := nil;
 
@@ -280,13 +302,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(LongWord(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;