- Added virtual getters for Z and TileID to TWorldItem
- Added ghost information to TMap - Added ghost tiles (currently for map tiles only)
This commit is contained in:
parent
2fdbc698ac
commit
be9d56f7c9
|
@ -56,7 +56,7 @@
|
|||
<MinVersion Major="4" Minor="5" Release="1" Valid="True"/>
|
||||
</Item5>
|
||||
</RequiredPackages>
|
||||
<Units Count="34">
|
||||
<Units Count="35">
|
||||
<Unit0>
|
||||
<Filename Value="CentrED.lpr"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
|
@ -268,6 +268,11 @@
|
|||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UMap"/>
|
||||
</Unit33>
|
||||
<Unit34>
|
||||
<Filename Value="../UOLib/UTiledata.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="UTiledata"/>
|
||||
</Unit34>
|
||||
</Units>
|
||||
</ProjectOptions>
|
||||
<CompilerOptions>
|
||||
|
|
|
@ -40,7 +40,7 @@ uses
|
|||
UfrmLargeScaleCommand, UfrmVirtualLayer, UfrmFilter, UfrmTileInfo,
|
||||
UGUIPlatformUtils, UPlatformTypes, UfrmRegionControl, UPackets,
|
||||
UPacketHandlers, UAdminHandling, UGameResources, ULandscape, UfrmToolWindow,
|
||||
Logging, UMap, UWorldItem, UStatics;
|
||||
Logging, UMap, UWorldItem, UStatics, UTiledata;
|
||||
|
||||
{$IFDEF WINDOWS}{$R CentrED.rc}{$ENDIF}
|
||||
|
||||
|
|
|
@ -541,7 +541,6 @@ var
|
|||
z: ShortInt;
|
||||
blockInfo: PBlockInfo;
|
||||
targetRect: TRect;
|
||||
tileX, tileY: Word;
|
||||
offsetX, offsetY: Integer;
|
||||
tile: TWorldItem;
|
||||
targetTiles: TWorldItemList;
|
||||
|
@ -1738,7 +1737,7 @@ var
|
|||
item: TWorldItem;
|
||||
drawX, drawY: Single;
|
||||
west, south, east: Single;
|
||||
z: SmallInt;
|
||||
z, rawZ: SmallInt;
|
||||
staticItem: TStaticItem;
|
||||
begin
|
||||
//add normals to map tiles and materials where possible
|
||||
|
@ -1748,9 +1747,14 @@ begin
|
|||
GetDrawOffset(item.X - FX, item.Y - FY, drawX, drawY);
|
||||
|
||||
if acFlat.Checked then
|
||||
z := 0
|
||||
else
|
||||
begin
|
||||
z := 0;
|
||||
rawZ := 0;
|
||||
end else
|
||||
begin
|
||||
z := item.Z;
|
||||
rawZ := item.RawZ;
|
||||
end;
|
||||
|
||||
if item is TMapCell then
|
||||
begin
|
||||
|
@ -1768,7 +1772,7 @@ begin
|
|||
end;
|
||||
|
||||
ABlockInfo^.LowRes := FTextureManager.GetArtMaterial(item.TileID);
|
||||
ABlockInfo^.ScreenRect := Bounds(Trunc(drawX - 22), Trunc(drawY - z * 4), 44, 44);
|
||||
ABlockInfo^.ScreenRect := Bounds(Trunc(drawX - 22), Trunc(drawY - rawZ * 4), 44, 44);
|
||||
|
||||
if ABlockInfo^.HighRes <> nil then
|
||||
begin
|
||||
|
@ -2074,9 +2078,6 @@ end;
|
|||
|
||||
procedure TfrmMain.ProcessToolState;
|
||||
var
|
||||
node: PVirtualNode;
|
||||
tileInfo: PTileInfo;
|
||||
i: Integer;
|
||||
blockInfo: PBlockInfo;
|
||||
begin
|
||||
if acSelect.Checked then
|
||||
|
@ -2098,40 +2099,6 @@ begin
|
|||
oglGameWindow.Cursor := crHandPoint;
|
||||
end;
|
||||
|
||||
if acDraw.Checked then
|
||||
begin
|
||||
tileInfo := nil;
|
||||
if frmDrawSettings.rbTileList.Checked then
|
||||
begin
|
||||
node := vdtTiles.GetFirstSelected;
|
||||
if node <> nil then
|
||||
tileInfo := vdtTiles.GetNodeData(node);
|
||||
end else if frmDrawSettings.rbRandom.Checked then
|
||||
begin
|
||||
node := vdtRandom.GetFirst;
|
||||
for i := 1 to Random(vdtRandom.RootNodeCount) do
|
||||
node := vdtRandom.GetNext(node);
|
||||
|
||||
if node <> nil then
|
||||
tileInfo := vdtRandom.GetNodeData(node);
|
||||
end;
|
||||
|
||||
if tileInfo <> nil then
|
||||
begin
|
||||
//TODO Update Ghost Tile
|
||||
{if tileInfo^.ID < $4000 then
|
||||
begin
|
||||
FGhostTile := TMapCell.Create(nil, nil, 0, 0);
|
||||
FGhostTile.TileID := tileInfo^.ID;
|
||||
end else
|
||||
begin
|
||||
FGhostTile := TStaticItem.Create(nil, nil, 0, 0);
|
||||
FGhostTile.TileID := tileInfo^.ID - $4000;
|
||||
TStaticItem(FGhostTile).Hue := frmHueSettings.lbHue.ItemIndex;
|
||||
end;}
|
||||
end;
|
||||
end;
|
||||
|
||||
FRepaintNeeded := True;
|
||||
end;
|
||||
|
||||
|
@ -2286,9 +2253,6 @@ begin
|
|||
end;
|
||||
|
||||
procedure TfrmMain.UpdateSelection;
|
||||
var
|
||||
selectedRect: TRect;
|
||||
blockInfo: PBlockInfo;
|
||||
|
||||
procedure SetHighlight(ABlockInfo: PBlockInfo; AHighlighted: Boolean);
|
||||
begin
|
||||
|
@ -2310,27 +2274,136 @@ var
|
|||
end;
|
||||
end;
|
||||
|
||||
procedure AddGhostTile(AX, AY: Word);
|
||||
var
|
||||
blockInfo: PBlockInfo;
|
||||
tileInfo: PTileInfo;
|
||||
node: PVirtualNode;
|
||||
cell: TMapCell;
|
||||
i: Integer;
|
||||
begin
|
||||
tileInfo := nil;
|
||||
if frmDrawSettings.rbTileList.Checked then
|
||||
begin
|
||||
node := vdtTiles.GetFirstSelected;
|
||||
if node <> nil then
|
||||
tileInfo := vdtTiles.GetNodeData(node);
|
||||
end else if frmDrawSettings.rbRandom.Checked then
|
||||
begin
|
||||
node := vdtRandom.GetFirst;
|
||||
for i := 1 to Random(vdtRandom.RootNodeCount) do
|
||||
node := vdtRandom.GetNext(node);
|
||||
|
||||
if node <> nil then
|
||||
tileInfo := vdtRandom.GetNodeData(node);
|
||||
end;
|
||||
|
||||
if tileInfo <> nil then
|
||||
begin
|
||||
//TODO Update Ghost Tile
|
||||
if tileInfo^.ID < $4000 then
|
||||
begin
|
||||
cell := FLandscape.MapCell[AX, AY];
|
||||
if cell <> nil then
|
||||
begin
|
||||
cell.IsGhost := True;
|
||||
cell.GhostID := tileInfo^.ID;
|
||||
{if (FGhostTile is TStaticItem) and (not frmDrawSettings.cbForceAltitude.Checked) then
|
||||
begin
|
||||
FGhostTile.Z := CurrentTile.Z;
|
||||
if CurrentTile is TStaticItem then
|
||||
Inc(FGhostTile.Z, ResMan.Tiledata.StaticTiles[CurrentTile.TileID].Height);
|
||||
end else}
|
||||
if frmDrawSettings.cbForceAltitude.Checked then
|
||||
cell.GhostZ := frmDrawSettings.seForceAltitude.Value
|
||||
else
|
||||
cell.GhostZ := cell.RawZ;
|
||||
|
||||
OnMapChanged(cell);
|
||||
end;
|
||||
end else
|
||||
begin
|
||||
{FGhostTile := TStaticItem.Create(nil, nil, 0, 0);
|
||||
FGhostTile.TileID := tileInfo^.ID - $4000;
|
||||
TStaticItem(FGhostTile).Hue := frmHueSettings.lbHue.ItemIndex;}
|
||||
end;
|
||||
|
||||
end;
|
||||
end;
|
||||
|
||||
var
|
||||
selectedRect: TRect;
|
||||
blockInfo: PBlockInfo;
|
||||
item: TWorldItem;
|
||||
cell: TMapCell;
|
||||
i, tileX, tileY: Integer;
|
||||
begin
|
||||
Logger.EnterMethod([lcClient, lcDebug], 'UpdateSelection');
|
||||
selectedRect := Rect(-1, -1, -1, -1);
|
||||
if CurrentTile = nil then
|
||||
selectedRect := Rect(-1, -1, -1, -1)
|
||||
else
|
||||
selectedRect := GetSelectedRect;
|
||||
|
||||
//clean up old ghost tiles
|
||||
Logger.Send([lcClient, lcDebug], 'Cleaning ghost tiles');
|
||||
for i := FVirtualTiles.Count - 1 downto 0 do
|
||||
begin
|
||||
item := FVirtualTiles[i];
|
||||
if (item is TGhostTile) and not IsInRect(item.X, item.Y, selectedRect) then
|
||||
begin
|
||||
FScreenBuffer.Delete(item);
|
||||
FVirtualTiles.Delete(i);
|
||||
end;
|
||||
end;
|
||||
Logger.Send([lcClient, lcDebug], 'FSelection', FSelection);
|
||||
if FSelection.Left > -1 then
|
||||
for tileX := FSelection.Left to FSelection.Right do
|
||||
for tileY := FSelection.Top to FSelection.Bottom do
|
||||
if not IsInRect(tileX, tileY, selectedRect) then
|
||||
begin
|
||||
cell := FLandscape.MapCell[tileX, tileY];
|
||||
if (cell <> nil) and cell.IsGhost then
|
||||
begin
|
||||
cell.IsGhost := False;
|
||||
OnMapChanged(cell);
|
||||
end;
|
||||
end;
|
||||
|
||||
if (CurrentTile <> nil) and (not acSelect.Checked) then
|
||||
begin
|
||||
if acDraw.Checked then
|
||||
begin
|
||||
if FSelection.Left = -1 then
|
||||
begin
|
||||
FSelection := Rect(CurrentTile.X - 1, CurrentTile.Y - 1,
|
||||
CurrentTile.X - 1, CurrentTile.Y - 1);
|
||||
AddGhostTile(CurrentTile.X, CurrentTile.Y);
|
||||
end else
|
||||
begin
|
||||
//set new ghost tiles
|
||||
for tileX := selectedRect.Left to selectedRect.Right do
|
||||
for tileY := selectedRect.Top to selectedRect.Bottom do
|
||||
if not IsInRect(tileX, tileY, FSelection) then
|
||||
AddGhostTile(tileX, tileY);
|
||||
end;
|
||||
end;
|
||||
|
||||
blockInfo := nil;
|
||||
if (SelectedTile <> nil) and (CurrentTile <> SelectedTile) then
|
||||
begin
|
||||
Logger.Send([lcClient, lcDebug], 'Multiple Targets');
|
||||
selectedRect := GetSelectedRect;
|
||||
Logger.Send([lcClient, lcDebug], 'SelectedRect', selectedRect);
|
||||
while FScreenBuffer.Iterate(blockInfo) do
|
||||
if (blockInfo^.State = ssNormal) then
|
||||
SetHighlight(blockInfo, IsInRect(blockInfo^.Item.X, blockInfo^.Item.Y,
|
||||
selectedRect));
|
||||
selectedRect) and not acDraw.Checked);
|
||||
end else
|
||||
begin
|
||||
Logger.Send([lcClient, lcDebug], 'Single Target');
|
||||
while FScreenBuffer.Iterate(blockInfo) do
|
||||
if blockInfo^.State = ssNormal then
|
||||
SetHighlight(blockInfo, (blockInfo^.Item = CurrentTile));
|
||||
SetHighlight(blockInfo, (blockInfo^.Item = CurrentTile) and
|
||||
not acDraw.Checked);
|
||||
end;
|
||||
end;
|
||||
FSelection := selectedRect;
|
||||
|
|
|
@ -43,11 +43,21 @@ type
|
|||
TMapCell = class(TWorldItem)
|
||||
constructor Create(AOwner: TWorldBlock; AData: TStream; AX, AY: Word); overload;
|
||||
constructor Create(AOwner: TWorldBlock; AData: TStream); overload;
|
||||
protected
|
||||
FIsGhost: Boolean;
|
||||
FGhostZ: ShortInt;
|
||||
FGhostID: Word;
|
||||
function GetTileID: Word; override;
|
||||
function GetZ: ShortInt; override;
|
||||
public
|
||||
property Altitude: ShortInt read GetZ write SetZ;
|
||||
property IsGhost: Boolean read FIsGhost write FIsGhost;
|
||||
property GhostZ: ShortInt write FGhostZ;
|
||||
property GhostID: Word write FGhostID;
|
||||
|
||||
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<TMapCell>;
|
||||
|
@ -58,14 +68,14 @@ type
|
|||
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;
|
||||
function Clone: TMapBlock; override;
|
||||
function GetSize: Integer; override;
|
||||
procedure Write(AData: TStream); override;
|
||||
end;
|
||||
|
||||
function GetMapCellOffset(ABlock: Integer): Integer;
|
||||
|
@ -87,13 +97,17 @@ end;
|
|||
constructor TMapCell.Create(AOwner: TWorldBlock; AData: TStream; AX, AY: Word);
|
||||
begin
|
||||
inherited Create(AOwner);
|
||||
|
||||
FX := AX;
|
||||
FY := AY;
|
||||
if assigned(AData) then
|
||||
if AData <> nil then
|
||||
begin
|
||||
AData.Read(FTileID, SizeOf(Word));
|
||||
AData.Read(FZ, SizeOf(ShortInt));
|
||||
end;
|
||||
|
||||
FIsGhost := False;
|
||||
|
||||
InitOriginalState;
|
||||
end;
|
||||
|
||||
|
@ -102,6 +116,22 @@ begin
|
|||
Create(AOwner, AData, 0, 0);
|
||||
end;
|
||||
|
||||
function TMapCell.GetTileID: Word;
|
||||
begin
|
||||
if FIsGhost then
|
||||
Result := FGhostID
|
||||
else
|
||||
Result := FTileID;
|
||||
end;
|
||||
|
||||
function TMapCell.GetZ: ShortInt;
|
||||
begin
|
||||
if FIsGhost then
|
||||
Result := FGhostZ
|
||||
else
|
||||
Result := FZ;
|
||||
end;
|
||||
|
||||
function TMapCell.Clone: TMapCell;
|
||||
begin
|
||||
Result := TMapCell.Create(nil, nil);
|
||||
|
|
|
@ -52,6 +52,8 @@ type
|
|||
FPriority: Integer;
|
||||
FPriorityBonus: ShortInt;
|
||||
FPrioritySolver: Integer;
|
||||
function GetTileID: Word; virtual;
|
||||
function GetZ: ShortInt; virtual;
|
||||
procedure SetTileID(ATileID: Word);
|
||||
procedure SetX(AX: Word);
|
||||
procedure SetY(AY: Word);
|
||||
|
@ -65,11 +67,12 @@ type
|
|||
procedure UpdatePos(AX, AY: Word; AZ: ShortInt);
|
||||
procedure Delete;
|
||||
procedure InitOriginalState; virtual;
|
||||
|
||||
property Owner: TWorldBlock read FOwner write SetOwner;
|
||||
property TileID: Word read FTileID write SetTileID;
|
||||
property TileID: Word read GetTileID write SetTileID;
|
||||
property X: Word read FX write SetX;
|
||||
property Y: Word read FY write SetY;
|
||||
property Z: ShortInt read FZ write SetZ;
|
||||
property Z: ShortInt read GetZ write SetZ;
|
||||
property Selected: Boolean read FSelected write SetSelected;
|
||||
property CanBeEdited: Boolean read FCanBeEdited write FCanBeEdited;
|
||||
property Locked: Boolean read FLocked write SetLocked;
|
||||
|
@ -77,6 +80,9 @@ type
|
|||
property Priority: Integer read FPriority write FPriority;
|
||||
property PriorityBonus: ShortInt read FPriorityBonus write FPriorityBonus;
|
||||
property PrioritySolver: Integer read FPrioritySolver write FPrioritySolver;
|
||||
|
||||
property RawTileID: Word read FTileID;
|
||||
property RawZ: ShortInt read FZ;
|
||||
end;
|
||||
|
||||
TWorldItemList = specialize TFPGObjectList<TWorldItem>;
|
||||
|
@ -151,6 +157,16 @@ begin
|
|||
FOwner := AOwner;
|
||||
end;
|
||||
|
||||
function TWorldItem.GetTileID: Word;
|
||||
begin
|
||||
Result := FTileID;
|
||||
end;
|
||||
|
||||
function TWorldItem.GetZ: ShortInt;
|
||||
begin
|
||||
Result := FZ;
|
||||
end;
|
||||
|
||||
procedure TWorldItem.Delete;
|
||||
begin
|
||||
SetSelected(False);
|
||||
|
|
Loading…
Reference in New Issue