X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fshared%2FMAPREADER.pas;h=4ea7beb5918f081fdf18b595ab3091b371a3c880;hb=ac2e89f41056b04a25126b6109cf6cfc71f2cb58;hp=0c8849bc5727f46c5b94b9a3ed8705077816da31;hpb=ac201b02f10ef558087d50f6b03b4519ab567558;p=d2df-sdl.git diff --git a/src/shared/MAPREADER.pas b/src/shared/MAPREADER.pas index 0c8849b..4ea7beb 100644 --- a/src/shared/MAPREADER.pas +++ b/src/shared/MAPREADER.pas @@ -1,4 +1,19 @@ -{$MODE DELPHI} +(* 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 . + *) +{$INCLUDE a_modes.inc} 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: NativeUInt; 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(NativeUInt(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: NativeUInt; 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(NativeUInt(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: NativeUInt; 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(NativeUInt(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: NativeUInt; 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(NativeUInt(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: NativeUInt; 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(NativeUInt(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: NativeUInt; + 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(NativeUInt(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: NativeUInt; _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(NativeUInt(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(NativeUInt(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(NativeUInt(Data)+adr), FDataBlocks[_id].Block.BlockSize); adr := adr+FDataBlocks[_id].Block.BlockSize; until FDataBlocks[_id].Block.BlockType = BLOCK_NONE;