diff --git a/Client/CentrED.lpi b/Client/CentrED.lpi index ad7ee4d..3e266af 100644 --- a/Client/CentrED.lpi +++ b/Client/CentrED.lpi @@ -281,6 +281,7 @@ + diff --git a/Client/ULandscape.pas b/Client/ULandscape.pas index 7b4c336..f919a74 100644 --- a/Client/ULandscape.pas +++ b/Client/ULandscape.pas @@ -90,7 +90,7 @@ type constructor Create(AData: TStream; AIndex: TGenericIndex); overload; destructor Destroy; override; public - Cells: array[0..63] of TList; + Cells: array[0..63] of TStaticItemList; { Methods } function Clone: TSeperatedStaticBlock; override; function GetSize: Integer; override; @@ -149,7 +149,7 @@ type function GetMapCell(AX, AY: Word): TMapCell; function GetNormals(AX, AY: Word): TNormals; function GetStaticBlock(AX, AY: Word): TSeperatedStaticBlock; - function GetStaticList(AX, AY: Word): TList; + function GetStaticList(AX, AY: Word): TStaticItemList; { Events } procedure OnRemoveCachedObject(AObject: TObject); procedure OnBlocksPacket(ABuffer: TEnhancedMemoryStream); @@ -166,7 +166,7 @@ type property CellWidth: Word read FCellWidth; property CellHeight: Word read FCellHeight; property MapCell[X, Y: Word]: TMapCell read GetMapCell; - property StaticList[X, Y: Word]: TList read GetStaticList; + property StaticList[X, Y: Word]: TStaticItemList read GetStaticList; property Normals[X, Y: Word]: TNormals read GetNormals; property OnChange: TLandscapeChangeEvent read FOnChange write FOnChange; property OnMapChanged: TMapChangedEvent read FOnMapChanged write FOnMapChanged; @@ -183,7 +183,7 @@ type function CanWrite(AX, AY: Word): Boolean; procedure FillDrawList(ADrawList: TScreenBuffer; AX, AY, AWidth, AHeight: Word; AMap, AStatics: Boolean; ANoDraw: Boolean; - AAdditionalTiles: TList = nil); + AAdditionalTiles: TWorldItemList = nil); function GetEffectiveAltitude(ATile: TMapCell): ShortInt; function GetLandAlt(AX, AY: Word; ADefault: ShortInt): ShortInt; procedure GetNormals(AX, AY: Word; var ANormals: TNormals); @@ -362,13 +362,13 @@ var block: TMemoryStream; begin inherited Create; - FItems := TList.Create; + FItems := TStaticItemList.Create(False); FX := AX; FY := AY; for i := 0 to 63 do - Cells[i] := TList.Create; + Cells[i] := TStaticItemList.Create; if (AData <> nil) and (AIndex.Lookup > 0) and (AIndex.Size > 0) then begin @@ -399,18 +399,7 @@ begin for i := 0 to 63 do begin if Cells[i] <> nil then - begin - for j := 0 to Cells[i].Count - 1 do - begin - if Cells[i][j] <> nil then - begin - TStaticItem(Cells[i][j]).Free; - Cells[i][j] := nil; - end; - end; - Cells[i].Free; - Cells[i] := nil; - end; + FreeAndNil(Cells[i]); end; inherited Destroy; @@ -588,7 +577,7 @@ begin end; end; -function TLandscape.GetStaticList(AX, AY: Word): TList; +function TLandscape.GetStaticList(AX, AY: Word): TStaticItemList; var block: TSeperatedStaticBlock; begin @@ -668,7 +657,7 @@ var x, y: Word; block: TSeperatedStaticBlock; staticItem: TStaticItem; - targetStaticList: TList; + targetStaticList: TStaticItemList; i: Integer; begin x := ABuffer.ReadWord; @@ -685,10 +674,10 @@ begin targetStaticList := block.Cells[(y mod 8) * 8 + x mod 8]; targetStaticList.Add(staticItem); for i := 0 to targetStaticList.Count - 1 do - TStaticItem(targetStaticList.Items[i]).UpdatePriorities( - ResMan.Tiledata.StaticTiles[TStaticItem(targetStaticList.Items[i]).TileID], + targetStaticList.Items[i].UpdatePriorities( + ResMan.Tiledata.StaticTiles[targetStaticList.Items[i].TileID], i); - targetStaticList.Sort(@CompareWorldItems); + targetStaticList.Sort(@CompareStaticItems); staticItem.Owner := block; staticItem.CanBeEdited := CanWrite(x, y); @@ -700,7 +689,7 @@ procedure TLandscape.OnDeleteStaticPacket(ABuffer: TEnhancedMemoryStream); var block: TSeperatedStaticBlock; i: Integer; - statics: TList; + statics: TStaticItemList; staticInfo: TStaticInfo; staticItem: TStaticItem; begin @@ -711,7 +700,7 @@ begin statics := block.Cells[(staticInfo.Y mod 8) * 8 + staticInfo.X mod 8]; for i := 0 to statics.Count - 1 do begin - staticItem := TStaticItem(statics.Items[i]); + staticItem := statics.Items[i]; if (staticItem.Z = staticInfo.Z) and (staticItem.TileID = staticInfo.TileID) and (staticItem.Hue = staticInfo.Hue) then @@ -730,7 +719,7 @@ procedure TLandscape.OnElevateStaticPacket(ABuffer: TEnhancedMemoryStream); var block: TSeperatedStaticBlock; i,j : Integer; - statics: TList; + statics: TStaticItemList; staticInfo: TStaticInfo; staticItem: TStaticItem; begin @@ -741,17 +730,17 @@ begin statics := block.Cells[(staticInfo.Y mod 8) * 8 + staticInfo.X mod 8]; for i := 0 to statics.Count - 1 do begin - staticItem := TStaticItem(statics.Items[i]); + staticItem := statics.Items[i]; if (staticItem.Z = staticInfo.Z) and (staticItem.TileID = staticInfo.TileID) and (staticItem.Hue = staticInfo.Hue) then begin staticItem.Z := ABuffer.ReadShortInt; for j := 0 to statics.Count - 1 do - TStaticItem(statics.Items[j]).UpdatePriorities( - ResMan.Tiledata.StaticTiles[TStaticItem(statics.Items[j]).TileID], + statics.Items[j].UpdatePriorities( + ResMan.Tiledata.StaticTiles[statics.Items[j].TileID], j); - statics.Sort(@CompareWorldItems); + statics.Sort(@CompareStaticItems); if Assigned(FOnStaticElevated) then FOnStaticElevated(staticItem); @@ -765,7 +754,7 @@ procedure TLandscape.OnMoveStaticPacket(ABuffer: TEnhancedMemoryStream); var sourceBlock, targetBlock: TSeperatedStaticBlock; i: Integer; - statics: TList; + statics: TStaticItemList; staticInfo: TStaticInfo; staticItem: TStaticItem; newX, newY: Word; @@ -783,7 +772,7 @@ begin i := 0; while (i < statics.Count) and (staticItem = nil) do begin - staticItem := TStaticItem(statics.Items[i]); + staticItem := statics.Items[i]; if (staticItem.Z <> staticInfo.Z) or (staticItem.TileID <> staticInfo.TileID) or (staticItem.Hue <> staticInfo.Hue) then @@ -815,7 +804,7 @@ begin TStaticItem(statics.Items[i]).UpdatePriorities( ResMan.Tiledata.StaticTiles[TStaticItem(statics.Items[i]).TileID], i); - statics.Sort(@CompareWorldItems); + statics.Sort(@CompareStaticItems); staticItem.Owner := targetBlock; staticItem.CanBeEdited := CanWrite(newX, newY); @@ -827,7 +816,7 @@ procedure TLandscape.OnHueStaticPacket(ABuffer: TEnhancedMemoryStream); var block: TSeperatedStaticBlock; i : Integer; - statics: TList; + statics: TStaticItemList; staticInfo: TStaticInfo; staticItem: TStaticItem; begin @@ -838,7 +827,7 @@ begin statics := block.Cells[(staticInfo.Y mod 8) * 8 + staticInfo.X mod 8]; for i := 0 to statics.Count - 1 do begin - staticItem := TStaticItem(statics.Items[i]); + staticItem := statics.Items[i]; if (staticItem.Z = staticInfo.Z) and (staticItem.TileID = staticInfo.TileID) and (staticItem.Hue = staticInfo.Hue) then @@ -858,15 +847,15 @@ end; procedure TLandscape.FillDrawList(ADrawList: TScreenBuffer; AX, AY, AWidth, AHeight: Word; AMap, AStatics: Boolean; ANoDraw: Boolean; - AAdditionalTiles: TList = nil); + AAdditionalTiles: TWorldItemList = nil); var drawMapCell: TMapCell; - drawStatics: TList; + drawStatics: TStaticItemList; i, x, y: Integer; - tempDrawList: TList; + tempDrawList: TWorldItemList; begin ADrawList.Clear; - tempDrawList := TList.Create; + tempDrawList := TWorldItemList.Create(False);; for x := AX to AX + AWidth do begin for y := AY to AY + AWidth do @@ -889,8 +878,8 @@ begin if drawStatics <> nil then for i := 0 to drawStatics.Count - 1 do begin - TStaticItem(drawStatics[i]).UpdatePriorities( - ResMan.Tiledata.StaticTiles[TStaticItem(drawStatics[i]).TileID], + drawStatics[i].UpdatePriorities( + ResMan.Tiledata.StaticTiles[drawStatics[i].TileID], ADrawList.GetSerial); tempDrawList.Add(drawStatics[i]); end; @@ -898,8 +887,8 @@ begin end; end; - if AAdditionalTiles <> nil then - tempDrawList.AddList(AAdditionalTiles); + for i := 0 to AAdditionalTiles.Count - 1 do + tempDrawList.Add(AAdditionalTiles[i]); tempDrawList.Sort(@CompareWorldItems); for i := 0 to tempDrawList.Count - 1 do @@ -1018,7 +1007,7 @@ end; procedure TLandscape.MoveStatic(AStatic: TStaticItem; AX, AY: Word); var sourceBlock, targetBlock: TSeperatedStaticBlock; - targetStaticList: TList; + targetStaticList: TStaticItemList; i: Integer; begin if (AX >= 0) and (AX <= FCellWidth) and (AY >= 0) and (AY <= FCellHeight) then @@ -1031,10 +1020,10 @@ begin targetStaticList := targetBlock.Cells[(AY mod 8) * 8 + AX mod 8]; targetStaticList.Add(AStatic); for i := 0 to targetStaticList.Count - 1 do - TStaticItem(targetStaticList.Items[i]).UpdatePriorities( - ResMan.Tiledata.StaticTiles[TStaticItem(targetStaticList.Items[i]).TileID], + targetStaticList.Items[i].UpdatePriorities( + ResMan.Tiledata.StaticTiles[targetStaticList.Items[i].TileID], i); - targetStaticList.Sort(@CompareWorldItems); + targetStaticList.Sort(@CompareStaticItems); AStatic.UpdatePos(AX, AY, AStatic.Z); AStatic.Owner := targetBlock; end; @@ -1309,7 +1298,7 @@ begin Result^.State := ssNormal; Result^.Highlighted := False; - if (FShortCuts[0] = nil) or (CompareWorldItems(AItem, FShortCuts[0]) < 0) then + if (FShortCuts[0] = nil) or (CompareWorldItems(AItem, FShortCuts[0]^.Item) < 0) then begin if FShortCuts[0] = nil then FShortCuts[-1] := Result; //Update last item @@ -1321,7 +1310,7 @@ begin //find best entry point shortcut := 0; while (shortcut <= 10) and (FShortCuts[shortcut] <> nil) and - (CompareWorldItems(AItem, FShortCuts[shortcut]) >= 0) do + (CompareWorldItems(AItem, FShortCuts[shortcut]^.Item) >= 0) do begin current := FShortCuts[shortcut]; Inc(shortcut); diff --git a/Client/UfrmMain.pas b/Client/UfrmMain.pas index 243482c..3fbd020 100644 --- a/Client/UfrmMain.pas +++ b/Client/UfrmMain.pas @@ -278,7 +278,7 @@ type FCurrentTile: TWorldItem; FSelectedTile: TWorldItem; FGhostTile: TWorldItem; - FVirtualTiles: TObjectList; + FVirtualTiles: TWorldItemList; FVLayerMaterial: TMaterial; FOverlayUI: TOverlayUI; FLocationsFile: string; @@ -776,7 +776,7 @@ begin virtualLayerGraphic); virtualLayerGraphic.Free; - FVirtualTiles := TObjectList.Create(True); + FVirtualTiles := TWorldItemList.Create(True); FRandomPresetLocation := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)) + 'RandomPresets' + PathDelim; if not DirectoryExists(FRandomPresetLocation) then CreateDir(FRandomPresetLocation); diff --git a/UOLib/UMap.pas b/UOLib/UMap.pas index 9d72a5a..5558c79 100644 --- a/UOLib/UMap.pas +++ b/UOLib/UMap.pas @@ -1,180 +1,192 @@ -(* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at - * http://www.opensource.org/licenses/cddl1.php. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at - * http://www.opensource.org/licenses/cddl1.php. If applicable, - * add the following below this CDDL HEADER, with the fields enclosed - * by brackets "[]" replaced with your own identifying * information: - * Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - * - * - * Portions Copyright 2007 Andreas Schneider - *) -unit UMap; - -{$mode objfpc}{$H+} - -interface - -uses - SysUtils, Classes, UMulBlock, UWorldItem; - -const - MapCellSize = 3; - MapBlockSize = 4 + (64 * MapCellSize); - -type - TMapCell = class(TWorldItem) - constructor Create(AOwner: TWorldBlock; AData: TStream; AX, AY: Word); overload; - constructor Create(AOwner: TWorldBlock; AData: TStream); overload; - function Clone: TMapCell; override; - function GetSize: Integer; override; - procedure Write(AData: TStream); override; - public - property Altitude: ShortInt read FZ write FZ; - end; - TMapBlock = class(TWorldBlock) - constructor Create(AData: TStream; AX, AY: Word); overload; - constructor Create(AData: TStream); overload; - destructor Destroy; override; - function Clone: TMapBlock; override; - function GetSize: Integer; override; - procedure Write(AData: TStream); override; - protected - FHeader: LongInt; - public - Cells: array[0..63] of TMapCell; - property Header: LongInt read FHeader write FHeader; - end; - -function GetMapCellOffset(ABlock: Integer): Integer; - -implementation - -function GetMapCellOffset(ABlock: Integer): Integer; -var - group, tile: Integer; -begin - group := ABlock div 64; - tile := ABlock mod 64; - - Result := group * MapBlockSize + 4 + tile * MapCellSize; -end; - -constructor TMapCell.Create(AOwner: TWorldBlock; AData: TStream; AX, AY: Word); -begin - inherited Create(AOwner); - FX := AX; - FY := AY; - if assigned(AData) then - begin - AData.Read(FTileID, SizeOf(Word)); - AData.Read(FZ, SizeOf(ShortInt)); - end; - InitOriginalState; -end; - -constructor TMapCell.Create(AOwner: TWorldBlock; AData: TStream); -begin - Create(AOwner, AData, 0, 0); -end; - -function TMapCell.Clone: TMapCell; -begin - Result := TMapCell.Create(nil, nil); - Result.FX := FX; - Result.FY := FY; - Result.FZ := FZ; - Result.FTileID := FTileID; -end; - -procedure TMapCell.Write(AData: TStream); -begin - AData.Write(FTileID, SizeOf(Word)); - AData.Write(FZ, SizeOf(ShortInt)); -end; - -function TMapCell.GetSize: Integer; -begin - Result := MapCellSize; -end; - -constructor TMapBlock.Create(AData: TStream; AX, AY: Word); -var - iX, iY: Integer; - buffer: TMemoryStream; -begin - inherited Create; - FX := AX; - FY := AY; - try - buffer := nil; - if Assigned(AData) then - begin - buffer := TMemoryStream.Create; - buffer.CopyFrom(AData, 196); - buffer.Position := 0; - buffer.Read(FHeader, SizeOf(LongInt)); - end; - for iY := 0 to 7 do - for iX := 0 to 7 do - Cells[iY * 8 + iX] := TMapCell.Create(Self, buffer, AX * 8 + iX, AY * 8 + iY); - finally - if Assigned(buffer) then FreeAndNil(buffer); - end; -end; - -constructor TMapBlock.Create(AData: TStream); -begin - Create(AData, 0, 0); -end; - -destructor TMapBlock.Destroy; -var - i: Integer; -begin - for i := 0 to 63 do - Cells[i].Free; - inherited; -end; - -function TMapBlock.Clone: TMapBlock; -var - i: Integer; -begin - Result := TMapBlock.Create(nil); - Result.FX := FX; - Result.FY := FY; - for i := 0 to 63 do - Result.Cells[i] := Cells[i].Clone; -end; - -procedure TMapBlock.Write(AData: TStream); -var - i: Integer; -begin - AData.Write(FHeader, SizeOf(LongInt)); - for i := 0 to 63 do - Cells[i].Write(AData); -end; - -function TMapBlock.GetSize: Integer; -begin - Result := MapBlockSize; -end; - -end. - +(* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at + * http://www.opensource.org/licenses/cddl1.php. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at + * http://www.opensource.org/licenses/cddl1.php. If applicable, + * add the following below this CDDL HEADER, with the fields enclosed + * by brackets "[]" replaced with your own identifying * information: + * Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + * + * + * Portions Copyright 2009 Andreas Schneider + *) +unit UMap; + +{$mode objfpc}{$H+} + +interface + +uses + SysUtils, Classes, fgl, UMulBlock, UWorldItem; + +const + MapCellSize = 3; + MapBlockSize = 4 + (64 * MapCellSize); + +type + + { TMapCell } + + TMapCell = class(TWorldItem) + constructor Create(AOwner: TWorldBlock; AData: TStream; AX, AY: Word); overload; + constructor Create(AOwner: TWorldBlock; AData: TStream); overload; + function Clone: TMapCell; override; + function GetSize: Integer; override; + procedure Write(AData: TStream); override; + public + property Altitude: ShortInt read FZ write FZ; + end; + + TMapCellList = specialize TFPGObjectList; + + { TMapBlock } + + TMapBlock = class(TWorldBlock) + constructor Create(AData: TStream; AX, AY: Word); overload; + constructor Create(AData: TStream); overload; + destructor Destroy; override; + function Clone: TMapBlock; override; + function GetSize: Integer; override; + procedure Write(AData: TStream); override; + protected + FHeader: LongInt; + public + Cells: array[0..63] of TMapCell; + property Header: LongInt read FHeader write FHeader; + end; + +function GetMapCellOffset(ABlock: Integer): Integer; + +implementation + +function GetMapCellOffset(ABlock: Integer): Integer; +var + group, tile: Integer; +begin + group := ABlock div 64; + tile := ABlock mod 64; + + Result := group * MapBlockSize + 4 + tile * MapCellSize; +end; + +{ TMapCell } + +constructor TMapCell.Create(AOwner: TWorldBlock; AData: TStream; AX, AY: Word); +begin + inherited Create(AOwner); + FX := AX; + FY := AY; + if assigned(AData) then + begin + AData.Read(FTileID, SizeOf(Word)); + AData.Read(FZ, SizeOf(ShortInt)); + end; + InitOriginalState; +end; + +constructor TMapCell.Create(AOwner: TWorldBlock; AData: TStream); +begin + Create(AOwner, AData, 0, 0); +end; + +function TMapCell.Clone: TMapCell; +begin + Result := TMapCell.Create(nil, nil); + Result.FX := FX; + Result.FY := FY; + Result.FZ := FZ; + Result.FTileID := FTileID; +end; + +procedure TMapCell.Write(AData: TStream); +begin + AData.Write(FTileID, SizeOf(Word)); + AData.Write(FZ, SizeOf(ShortInt)); +end; + +function TMapCell.GetSize: Integer; +begin + Result := MapCellSize; +end; + +{ TMapBlock } + +constructor TMapBlock.Create(AData: TStream; AX, AY: Word); +var + iX, iY: Integer; + buffer: TMemoryStream; +begin + inherited Create; + FX := AX; + FY := AY; + try + buffer := nil; + if Assigned(AData) then + begin + buffer := TMemoryStream.Create; + buffer.CopyFrom(AData, 196); + buffer.Position := 0; + buffer.Read(FHeader, SizeOf(LongInt)); + end; + for iY := 0 to 7 do + for iX := 0 to 7 do + Cells[iY * 8 + iX] := TMapCell.Create(Self, buffer, AX * 8 + iX, AY * 8 + iY); + finally + if Assigned(buffer) then FreeAndNil(buffer); + end; +end; + +constructor TMapBlock.Create(AData: TStream); +begin + Create(AData, 0, 0); +end; + +destructor TMapBlock.Destroy; +var + i: Integer; +begin + for i := 0 to 63 do + Cells[i].Free; + inherited; +end; + +function TMapBlock.Clone: TMapBlock; +var + i: Integer; +begin + Result := TMapBlock.Create(nil); + Result.FX := FX; + Result.FY := FY; + for i := 0 to 63 do + Result.Cells[i] := Cells[i].Clone; +end; + +procedure TMapBlock.Write(AData: TStream); +var + i: Integer; +begin + AData.Write(FHeader, SizeOf(LongInt)); + for i := 0 to 63 do + Cells[i].Write(AData); +end; + +function TMapBlock.GetSize: Integer; +begin + Result := MapBlockSize; +end; + +end. + diff --git a/UOLib/UStatics.pas b/UOLib/UStatics.pas index 0a4b9ef..bcd4a75 100644 --- a/UOLib/UStatics.pas +++ b/UOLib/UStatics.pas @@ -30,7 +30,7 @@ unit UStatics; interface uses - SysUtils, Classes, UGenericIndex, UWorldItem, UTiledata; + SysUtils, Classes, fgl, UGenericIndex, UWorldItem, UTiledata; type { TStaticItem } @@ -58,6 +58,8 @@ type procedure Write(AData: TStream); override; end; + TStaticItemList = specialize TFPGObjectList; + { TStaticBlock} TStaticBlock = class(TWorldBlock) @@ -66,10 +68,10 @@ type destructor Destroy; override; protected { Members } - FItems: TList; + FItems: TStaticItemList; public { Fields } - property Items: TList read FItems write FItems; + property Items: TStaticItemList read FItems write FItems; { Methods } function Clone: TStaticBlock; override; @@ -79,8 +81,15 @@ type procedure Write(AData: TStream); override; end; +function CompareStaticItems(const AStatic1, AStatic2: TStaticItem): Integer; + implementation +function CompareStaticItems(const AStatic1, AStatic2: TStaticItem): Integer; +begin + Result := CompareWorldItems(AStatic1, AStatic2); +end; + { TStaticItem } constructor TStaticItem.Create(AOwner: TWorldBlock; AData: TStream; ABlockX, ABlockY: Word); @@ -176,8 +185,8 @@ begin FX := AX; FY := AY; - FItems := TList.Create; - if assigned(AData) and (AIndex.Lookup > 0) and (AIndex.Size > 0) then + FItems := TStaticItemList.Create(True); + if (AData <> nil) and (AIndex.Lookup > 0) and (AIndex.Size > 0) then begin AData.Position := AIndex.Lookup; block := TMemoryStream.Create; @@ -198,17 +207,7 @@ destructor TStaticBlock.Destroy; var i: Integer; begin - if Assigned(FItems) then - begin - for i := 0 to FItems.Count - 1 do - if Assigned(FItems[i]) then - begin - TStaticItem(FItems[i]).Free; - FItems[i] := nil; - end; - FItems.Free; - FItems := nil; - end; + FreeAndNil(FItems); inherited; end; @@ -218,7 +217,7 @@ var begin Result := TStaticBlock.Create(nil, nil, FX, FY); for i := 0 to FItems.Count - 1 do - Result.FItems.Add(TStaticItem(FItems.Items[i]).Clone); + Result.FItems.Add(FItems.Items[i].Clone); end; function TStaticBlock.GetSize: Integer; @@ -231,14 +230,12 @@ var i: Integer; begin for i := FItems.Count - 1 downto 0 do - begin - TStaticItem(FItems[i]).Write(AData); - end; + FItems[i].Write(AData); end; procedure TStaticBlock.Sort; begin - FItems.Sort(@CompareWorldItems); + FItems.Sort(@CompareStaticItems); end; procedure TStaticBlock.Write(AData: TStream); @@ -246,7 +243,7 @@ var i: Integer; begin for i := 0 to FItems.Count - 1 do - TStaticItem(FItems[i]).Write(AData); + FItems[i].Write(AData); end; end. diff --git a/UOLib/UWorldItem.pas b/UOLib/UWorldItem.pas index 7a7d18f..0192313 100644 --- a/UOLib/UWorldItem.pas +++ b/UOLib/UWorldItem.pas @@ -21,7 +21,7 @@ * CDDL HEADER END * * - * Portions Copyright 2007 Andreas Schneider + * Portions Copyright 2009 Andreas Schneider *) unit UWorldItem; @@ -30,7 +30,7 @@ unit UWorldItem; interface uses - Classes, UMulBlock; + Classes, fgl, UMulBlock; type TWorldBlock = class; @@ -79,6 +79,8 @@ type property PrioritySolver: Integer read FPrioritySolver write FPrioritySolver; end; + TWorldItemList = specialize TFPGObjectList; + { TWorldBlock } TWorldBlock = class(TMulBlock) @@ -103,39 +105,39 @@ type TVirtualTile = class(TWorldItem); -function CompareWorldItems(AItem1, AItem2: Pointer): Integer; +function CompareWorldItems(const AItem1, AItem2: TWorldItem): Integer; implementation uses UMap, UStatics; -function CompareWorldItems(AItem1, AItem2: Pointer): Integer; +function CompareWorldItems(const AItem1, AItem2: TWorldItem): Integer; begin - if TWorldItem(AItem1).X <> TWorldItem(AItem2).X then - Exit(TWorldItem(AItem1).X - TWorldItem(AItem2).X); + if AItem1.X <> AItem2.X then + Exit(AItem1.X - AItem2.X); - if TWorldItem(AItem1).Y <> TWorldItem(AItem2).Y then - Exit(TWorldItem(AItem1).Y - TWorldItem(AItem2).Y); + if AItem1.Y <> AItem2.Y then + Exit(AItem1.Y - AItem2.Y); - Result := TWorldItem(AItem1).Priority - TWorldItem(AItem2).Priority; + Result := AItem1.Priority - AItem2.Priority; if Result = 0 then begin - if (TObject(AItem1) is TMapCell) and (TObject(AItem2) is TStaticItem) then + if (AItem1 is TMapCell) and (AItem2 is TStaticItem) then Result := -1 - else if (TObject(AItem1) is TStaticItem) and (TObject(AItem2) is TMapCell) then + else if (AItem1 is TStaticItem) and (AItem2 is TMapCell) then Result := 1 - else if (TObject(AItem1) is TMapCell) and (TObject(AItem2) is TVirtualTile) then + else if (AItem1 is TMapCell) and (AItem2 is TVirtualTile) then Result := -1 - else if (TObject(AItem1) is TVirtualTile) and (TObject(AItem2) is TMapCell) then + else if (AItem1 is TVirtualTile) and (AItem2 is TMapCell) then Result := 1; end; if Result = 0 then - Result := TWorldItem(AItem1).PriorityBonus - TWorldItem(AItem2).PriorityBonus; + Result := AItem1.PriorityBonus - AItem2.PriorityBonus; if Result = 0 then - Result := TWorldItem(AItem1).PrioritySolver - TWorldItem(AItem2).PrioritySolver; + Result := AItem1.PrioritySolver - AItem2.PrioritySolver; end; { TWorldItem }