X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fshared%2FMAPREADER.pas;h=0c0c7974d820470326804d13058f833adc27265c;hb=54c1d58fb3e3b6b99b2ad73de6a9eb6509ef0bc4;hp=736123eb0a64fee25bf53ed07a04a2b7fff98f91;hpb=b72e164f0fb64e3301ae8ca217449daf6a9d301d;p=d2df-editor.git diff --git a/src/shared/MAPREADER.pas b/src/shared/MAPREADER.pas index 736123e..0c0c797 100644 --- a/src/shared/MAPREADER.pas +++ b/src/shared/MAPREADER.pas @@ -1,12 +1,12 @@ unit MAPREADER; -{$MODE Delphi} +{$INCLUDE ../shared/a_modes.inc} { ----------------------------------- -MAPREADER.PAS ВЕРСИЯ ОТ 13.11.07 +MAPREADER.PAS ÂÅÐÑÈß ÎÒ 13.11.07 -Поддержка карт версии 1 +Ïîääåðæêà êàðò âåðñèè 1 ----------------------------------- } @@ -69,12 +69,12 @@ function g_Texture_NumNameFindNext(var newName: String): Byte; implementation uses - SysUtils, BinEditor; + SysUtils, BinEditor, MAPDEF; var - NNF_PureName: String; // Имя текстуры без цифр в конце - NNF_FirstNum: Integer; // Число у начальной текстуры - NNF_CurrentNum: Integer; // Следующее число у текстуры + NNF_PureName: String; // Èìÿ òåêñòóðû áåç öèôð â êîíöå + NNF_FirstNum: Integer; // ×èñëî ó íà÷àëüíîé òåêñòóðû + NNF_CurrentNum: Integer; // Ñëåäóþùåå ÷èñëî ó òåêñòóðû function g_Texture_NumNameFindStart(name: String): Boolean; var @@ -87,10 +87,10 @@ begin NNF_CurrentNum := -1; for i := Length(name) downto 1 do - if (name[i] = '_') then // "_" - символ начала номерного постфикса + if (name[i] = '_') then // "_" - ñèìâîë íà÷àëà íîìåðíîãî ïîñòôèêñà begin if i = Length(name) then - begin // Нет цифр в конце строки + begin // Íåò öèôð â êîíöå ñòðîêè Exit; end else @@ -101,7 +101,7 @@ begin end; end; -// Не перевести в число: +// Íå ïåðåâåñòè â ÷èñëî: if not TryStrToInt(name, NNF_FirstNum) then Exit; @@ -152,9 +152,17 @@ begin 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(PtrUInt(TempDataBlocks[a].Data)+b*size), size); end; + {$IFDEF FPC_BIG_ENDIAN} + for a := 0 to High(Result) do + begin + Result[a].X := LEtoN(Result[a].X); + Result[a].Y := LEtoN(Result[a].Y); + end; + {$ENDIF} + TempDataBlocks := nil; end; @@ -176,9 +184,17 @@ begin 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(PtrUInt(TempDataBlocks[a].Data)+b*size), size); end; + {$IFDEF FPC_BIG_ENDIAN} + for a := 0 to High(Result) do + begin + Result[a].X := LEtoN(Result[a].X); + Result[a].Y := LEtoN(Result[a].Y); + end; + {$ENDIF} + TempDataBlocks := nil; end; @@ -194,6 +210,11 @@ begin CopyMemory(@Result, TempDataBlocks[0].Data, SizeOf(TMapHeaderRec_1)); + {$IFDEF FPC_BIG_ENDIAN} + Result.Width := LEtoN(Result.Width); + Result.Height := LEtoN(Result.Height); + {$ENDIF} + TempDataBlocks := nil; end; @@ -215,9 +236,17 @@ begin 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(PtrUInt(TempDataBlocks[a].Data)+b*size), size); end; + {$IFDEF FPC_BIG_ENDIAN} + for a := 0 to High(Result) do + begin + Result[a].X := LEtoN(Result[a].X); + Result[a].Y := LEtoN(Result[a].Y); + end; + {$ENDIF} + TempDataBlocks := nil; end; @@ -239,8 +268,20 @@ begin 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(PtrUInt(TempDataBlocks[a].Data)+b*size), size); + end; + + {$IFDEF FPC_BIG_ENDIAN} + for a := 0 to High(Result) do + begin + Result[a].X := LEtoN(Result[a].X); + Result[a].Y := LEtoN(Result[a].Y); + Result[a].Width := LEtoN(Result[a].Width); + Result[a].Height := LEtoN(Result[a].Height); + Result[a].TextureNum := LEtoN(Result[a].TextureNum); + Result[a].PanelType := LEtoN(Result[a].PanelType); end; + {$ENDIF} TempDataBlocks := nil; end; @@ -263,17 +304,20 @@ begin 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(PtrUInt(TempDataBlocks[a].Data)+b*size), size); end; TempDataBlocks := nil; end; function TMapReader_1.GetTriggers(): TTriggersRec1Array; +type + PTriggerData = ^TTriggerData; var TempDataBlocks: TDataBlocksArray; a: Integer; b, Size: LongWord; + data: PTriggerData; begin Result := nil; @@ -287,8 +331,96 @@ begin 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(PtrUInt(TempDataBlocks[a].Data)+b*size), size); + end; + + {$IFDEF FPC_BIG_ENDIAN} + for a := 0 to High(Result) do + begin + Result[a].X := LEtoN(Result[a].X); + Result[a].Y := LEtoN(Result[a].Y); + Result[a].Width := LEtoN(Result[a].Width); + Result[a].Height := LEtoN(Result[a].Height); + Result[a].TexturePanel := LEtoN(Result[a].TexturePanel); + data := PTriggerData(@Result[a].DATA); + case Result[a].TriggerType of + //TRIGGER_EXIT: ; + TRIGGER_TELEPORT: + begin + data.TargetPoint.X := LEtoN(data.TargetPoint.X); + data.TargetPoint.Y := LEtoN(data.TargetPoint.Y); + end; + TRIGGER_OPENDOOR, TRIGGER_CLOSEDOOR, TRIGGER_DOOR, TRIGGER_DOOR5, + TRIGGER_CLOSETRAP, TRIGGER_TRAP, TRIGGER_LIFTUP, TRIGGER_LIFTDOWN, + TRIGGER_LIFT: + data.PanelID := LEtoN(data.PanelID); + TRIGGER_PRESS, TRIGGER_ON, TRIGGER_OFF, TRIGGER_ONOFF: + begin + data.tX := LEtoN(data.tX); + data.tY := LEtoN(data.tY); + data.tWidth := LEtoN(data.tWidth); + data.tHeight := LEtoN(data.tHeight); + data.Wait := LEtoN(data.Wait); + data.Count := LEtoN(data.Count); + data.MonsterID := LEtoN(data.MonsterID); + end; + //TRIGGER_SECRET: ; + //TRIGGER_TEXTURE: ; + //TRIGGER_SOUND: ; + TRIGGER_SPAWNMONSTER: + begin + data.MonPos.X := LEtoN(data.MonPos.X); + data.MonPos.Y := LEtoN(data.MonPos.Y); + data.MonHealth := LEtoN(data.MonHealth); + data.MonCount := LEtoN(data.MonCount); + data.MonMax := LEtoN(data.MonMax); + data.MonDelay := LEtoN(data.MonDelay); + end; + TRIGGER_SPAWNITEM: + begin + data.ItemPos.X := LEtoN(data.ItemPos.X); + data.ItemPos.Y := LEtoN(data.ItemPos.Y); + data.ItemCount := LEtoN(data.ItemCount); + data.ItemMax := LEtoN(data.ItemMax); + data.ItemDelay := LEtoN(data.ItemDelay); + end; + //TRIGGER_MUSIC: + TRIGGER_PUSH: + data.PushAngle := LEtoN(data.PushAngle); + //TRIGGER_SCORE: + TRIGGER_MESSAGE: + data.MessageTime := LEtoN(data.MessageTime); + TRIGGER_DAMAGE: + begin + data.DamageValue := LEtoN(data.DamageValue); + data.DamageInterval := LEtoN(data.DamageInterval); + end; + TRIGGER_HEALTH: + begin + data.HealValue := LEtoN(data.HealValue); + data.HealInterval := LEtoN(data.HealInterval); + end; + TRIGGER_SHOT: + begin + data.ShotPos.X := LEtoN(data.ShotPos.X); + data.ShotPos.Y := LEtoN(data.ShotPos.Y); + data.ShotPanelID := LEtoN(data.ShotPanelID); + data.ShotIntSight := LEtoN(data.ShotIntSight); + data.ShotAngle := LEtoN(data.ShotAngle); + data.ShotWait := LEtoN(data.ShotWait); + data.ShotAccuracy := LEtoN(data.ShotAccuracy); + data.ShotAmmo := LEtoN(data.ShotAmmo); + data.ShotIntReload := LEtoN(data.ShotIntReload); + end; + TRIGGER_EFFECT: + begin + data.FXWait := LEtoN(data.FXWait); + data.FXVelX := LEtoN(data.FXVelX); + data.FXVelY := LEtoN(data.FXVelY); + end; + end; end; + {$ENDIF} TempDataBlocks := nil; end; @@ -365,7 +497,7 @@ begin end; adr := 3; - CopyMemory(@Ver, Pointer(LongWord(Data)+adr), 1); + CopyMemory(@Ver, Pointer(PtrUInt(Data)+adr), 1); FVersion := Ver; if Ver > HandledVersion() then begin @@ -378,12 +510,16 @@ begin SetLength(FDataBlocks, Length(FDataBlocks)+1); _id := High(FDataBlocks); - CopyMemory(@FDataBlocks[_id].Block, Pointer(LongWord(Data)+adr), SizeOf(TBlock)); + CopyMemory(@FDataBlocks[_id].Block, Pointer(PtrUInt(Data)+adr), SizeOf(TBlock)); + {$IFDEF FPC_BIG_ENDIAN} + FDataBlocks[_id].Block.Reserved := LEtoN(FDataBlocks[_id].Block.Reserved); + FDataBlocks[_id].Block.BlockSize := LEtoN(FDataBlocks[_id].Block.BlockSize); + {$ENDIF} 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(PtrUInt(Data)+adr), FDataBlocks[_id].Block.BlockSize); adr := adr+FDataBlocks[_id].Block.BlockSize; until FDataBlocks[_id].Block.BlockType = BLOCK_NONE;