- Moved WriteMap handling from TdmNetwork to TLandscape

- Added repainting when accesslevel display changes (toolstate, update write map)
This commit is contained in:
Andreas Schneider 2009-10-02 23:52:02 +02:00
parent f888443ed0
commit c3bdc98219
3 changed files with 74 additions and 67 deletions

View File

@ -45,7 +45,7 @@ type
{ TMaterial } //TODO : add ref counting
TMaterial = class(TObject)
TMaterial = class
constructor Create(AWidth, AHeight: Integer; AGraphic: TSingleImage);
destructor Destroy; override;
protected
@ -69,7 +69,7 @@ type
{ TLandTextureManager }
TLandTextureManager = class(TObject)
TLandTextureManager = class
constructor Create;
destructor Destroy; override;
function GetArtMaterial(ATileID: Word): TMaterial; overload;
@ -96,10 +96,12 @@ type
function GetSize: Integer; override;
procedure RebuildList;
end;
TLandscape = class;
{ TBlock }
TBlock = class(TObject)
TBlock = class
constructor Create(AMap: TMapBlock; AStatics: TStaticBlock);
destructor Destroy; override;
protected
@ -111,7 +113,7 @@ type
property Map: TMapBlock read FMapBlock;
property Static: TStaticBlock read FStaticBlock;
{ Methods }
procedure UpdateBlockAcess;
procedure UpdateBlockAcess(ALandscape: TLandscape);
end;
TLandscapeChangeEvent = procedure of object;
@ -123,7 +125,7 @@ type
{ TLandscape }
TLandscape = class(TObject)
TLandscape = class
constructor Create(AWidth, AHeight: Word);
destructor Destroy; override;
protected
@ -141,6 +143,7 @@ type
FOnStaticElevated: TStaticChangedEvent;
FOnStaticHued: TStaticChangedEvent;
FOpenRequests: TBits;
FWriteMap: TBits;
{ Methods }
function GetMapBlock(AX, AY: Word): TMapBlock;
function GetMapCell(AX, AY: Word): TMapCell;
@ -177,6 +180,7 @@ type
property OnStaticHued: TStaticChangedEvent read FOnStaticHued
write FOnStaticHued;
{ Methods }
function CanWrite(AX, AY: Word): Boolean;
procedure FillDrawList(ADrawList: TScreenBuffer; AX, AY, AWidth,
AHeight: Word; AMap, AStatics: Boolean; ANoDraw: Boolean;
AAdditionalTiles: TList = nil);
@ -186,6 +190,7 @@ type
procedure MoveStatic(AStatic: TStaticItem; AX, AY: Word);
procedure PrepareBlocks(AX1, AY1, AX2, AY2: Word);
procedure UpdateBlockAccess;
procedure UpdateWriteMap(AStream: TEnhancedMemoryStream);
end;
TScreenState = (ssNormal, ssFiltered, ssGhost);
@ -205,7 +210,7 @@ type
{ TScreenBuffer }
TScreenBuffer = class(TObject)
TScreenBuffer = class
constructor Create; virtual;
destructor Destroy; override;
protected
@ -240,7 +245,7 @@ type
implementation
uses
UGameResources, UdmNetwork, UPackets, UPacketHandlers;
UGameResources, UdmNetwork, UPackets, UPacketHandlers, Logging;
const
mMap = 0;
@ -452,7 +457,6 @@ begin
inherited Create;
FMapBlock := AMap;
FStaticBlock := AStatics;
UpdateBlockAcess;
end;
destructor TBlock.Destroy;
@ -462,15 +466,15 @@ begin
inherited Destroy;
end;
procedure TBlock.UpdateBlockAcess;
procedure TBlock.UpdateBlockAcess(ALandscape: TLandscape);
var
staticItem: TStaticItem;
i: Integer;
begin
for i := Low(FMapBlock.Cells) to High(FMapBlock.Cells) do
begin
FMapBlock.Cells[i].CanBeEdited := dmNetwork.CanWrite(
FMapBlock.Cells[i].X, FMapBlock.Cells[i].Y);
FMapBlock.Cells[i].CanBeEdited := ALandscape.CanWrite(FMapBlock.Cells[i].X,
FMapBlock.Cells[i].Y);
end;
if FStaticBlock is TSeperatedStaticBlock then
@ -479,8 +483,8 @@ begin
for i := 0 to FStaticBlock.Items.Count - 1 do
begin
staticItem := TStaticItem(FStaticBlock.Items[i]);
staticItem.CanBeEdited := dmNetwork.CanWrite(
staticItem.X, staticItem.Y);
staticItem.CanBeEdited := ALandscape.CanWrite(staticItem.X,
staticItem.Y);
end;
end;
@ -488,7 +492,7 @@ end;
constructor TLandscape.Create(AWidth, AHeight: Word);
var
blockID: Integer;
blockID, i: Integer;
begin
inherited Create;
FWidth := AWidth;
@ -506,7 +510,10 @@ begin
FOnStaticInserted := nil;
FOpenRequests := TBits.Create(FWidth * FHeight);
FOpenRequests.Clearall;
FOpenRequests.Clearall; //set all to 0
FWriteMap := TBits.Create(FCellWidth * FCellHeight);
for i := 0 to FWriteMap.Size - 1 do
FWriteMap[i] := True;
RegisterPacketHandler($04, TPacketHandler.Create(0, @OnBlocksPacket));
RegisterPacketHandler($06, TPacketHandler.Create(8, @OnDrawMapPacket));
@ -524,6 +531,9 @@ begin
FBlockCache.OnRemoveObject := nil;
FreeAndNil(FBlockCache);
end;
FreeAndNil(FOpenRequests);
FreeAndNil(FWriteMap);
RegisterPacketHandler($04, nil);
RegisterPacketHandler($06, nil);
@ -627,6 +637,7 @@ begin
FBlockCache.RemoveID(id);
block := TBlock.Create(map, statics);
block.UpdateBlockAcess(Self);
FBlockCache.StoreID(id, block);
FOpenRequests[coords.Y * FWidth + coords.X] := False;
@ -650,7 +661,6 @@ begin
cell.TileID := ABuffer.ReadWord;
if Assigned(FOnMapChanged) then FOnMapChanged(cell);
end;
//TODO : update surrounding normals
end;
procedure TLandscape.OnInsertStaticPacket(ABuffer: TEnhancedMemoryStream);
@ -680,7 +690,7 @@ begin
i);
targetStaticList.Sort(@CompareWorldItems);
staticItem.Owner := block;
staticItem.CanBeEdited := dmNetwork.CanWrite(x, y);
staticItem.CanBeEdited := CanWrite(x, y);
if Assigned(FOnStaticInserted) then FOnStaticInserted(staticItem);
end;
@ -807,7 +817,7 @@ begin
i);
statics.Sort(@CompareWorldItems);
staticItem.Owner := targetBlock;
staticItem.CanBeEdited := dmNetwork.CanWrite(newX, newY);
staticItem.CanBeEdited := CanWrite(newX, newY);
if Assigned(FOnStaticInserted) then FOnStaticInserted(staticItem);
end;
@ -841,6 +851,11 @@ begin
end;
end;
function TLandscape.CanWrite(AX, AY: Word): Boolean;
begin
Result := FWriteMap[AX * FCellHeight + AY];
end;
procedure TLandscape.FillDrawList(ADrawList: TScreenBuffer; AX, AY, AWidth,
AHeight: Word; AMap, AStatics: Boolean; ANoDraw: Boolean;
AAdditionalTiles: TList = nil);
@ -1063,7 +1078,41 @@ var
begin
cacheEntry := nil;
while FBlockCache.Iterate(cacheEntry) do
TBlock(cacheEntry^.Obj).UpdateBlockAcess;
if cacheEntry^.Obj <> nil then
TBlock(cacheEntry^.Obj).UpdateBlockAcess(Self);
end;
procedure TLandscape.UpdateWriteMap(AStream: TEnhancedMemoryStream);
var
x1, y1, x2, y2: Word;
i, areaCount, cellX, cellY: Integer;
begin
Logger.EnterMethod([lcLandscape, lcDebug], 'TLandscape.UpdateWriteMap');
areaCount := AStream.ReadWord;
Logger.Send([lcLandscape, lcDebug], 'AreaCount', areaCount);
if areaCount > 0 then
begin
FWriteMap.Clearall;
for i := 0 to areaCount - 1 do
begin
x1 := AStream.ReadWord;
y1 := AStream.ReadWord;
x2 := AStream.ReadWord;
y2 := AStream.ReadWord;
for cellX := x1 to x2 do
for cellY := y1 to y2 do
FWriteMap[cellX * FCellHeight + cellY] := True;
end;
end else
for i := 0 to FWriteMap.Size - 1 do
FWriteMap[i] := True;
Logger.Send([lcLandscape, lcDebug], 'WriteMap @ 0,0', FWriteMap[0]);
UpdateBlockAccess;
Logger.ExitMethod([lcLandscape, lcDebug], 'TLandscape.UpdateWriteMap');
end;
{ TMaterial }

View File

@ -31,8 +31,7 @@ interface
uses
Classes, SysUtils, LResources, Forms, Controls, Dialogs, lNetComponents, lNet,
UEnhancedMemoryStream, UPacket, UEnums, ExtCtrls, dateutils, URectList,
LCLIntf;
UEnhancedMemoryStream, UPacket, UEnums, ExtCtrls, dateutils;
type
@ -57,7 +56,6 @@ type
FAccessLevel: TAccessLevel;
FDataDir: string;
FLastPacket: TDateTime;
FWriteMap: TRectList;
procedure OnCanSend(ASocket: TLSocket);
procedure OnConnectionHandlingPacket(ABuffer: TEnhancedMemoryStream);
procedure ProcessQueue;
@ -65,11 +63,9 @@ type
public
property Username: string read FUsername;
property AccessLevel: TAccessLevel read FAccessLevel write FAccessLevel;
function CanWrite(AX, AY: Word): Boolean;
procedure Send(APacket: TPacket);
procedure Disconnect;
procedure CheckClose(ASender: TForm);
procedure UpdateWriteMap(AStream: TEnhancedMemoryStream);
end;
var
@ -102,7 +98,6 @@ begin
if FSendQueue <> nil then FreeAndNil(FSendQueue);
if FReceiveQueue <> nil then FreeAndNil(FReceiveQueue);
if PacketHandlers[$02] <> nil then FreeAndNil(PacketHandlers[$02]);
if FWriteMap <> nil then FreeAndNil(FWriteMap);
end;
procedure TdmNetwork.TCPClientConnect(aSocket: TLSocket);
@ -199,11 +194,7 @@ begin
width := ABuffer.ReadWord;
height := ABuffer.ReadWord;
ResMan.InitLandscape(width, height);
{FWriteMap := TBits.Create(ResMan.Landscape.CellWidth * ResMan.Landscape.CellHeight);
FWriteMap.XorBits(FWriteMap); //set all to 1}
FWriteMap := TRectList.Create;
UpdateWriteMap(ABuffer);
ResMan.Landscape.UpdateWriteMap(ABuffer);
frmMain := TfrmMain.Create(dmNetwork);
frmRadarMap := TfrmRadarMap.Create(frmMain);
@ -320,7 +311,6 @@ begin
frmMain.ApplicationProperties1.OnIdle := nil;
FreeAndNil(frmMain);
end;
if FWriteMap <> nil then FreeAndNil(FWriteMap);
if GameResourceManager <> nil then FreeAndNil(GameResourceManager);
frmInitialize.Hide;
while frmLogin.ShowModal = mrOK do
@ -340,23 +330,6 @@ begin
FreeAndNil(frmLogin);
end;
function TdmNetwork.CanWrite(AX, AY: Word): Boolean;
var
i: Integer;
pt: TPoint;
begin
if FWriteMap.Count > 0 then
begin
pt := Point(AX, AY);
for i := 0 to FWriteMap.Count - 1 do
if PtInRect(FWriteMap.Rects[i], pt) then
Exit(True);
Result := False;
end else
Result := True;
end;
procedure TdmNetwork.Send(APacket: TPacket);
var
source: TEnhancedMemoryStream;
@ -386,23 +359,6 @@ begin
end;
end;
procedure TdmNetwork.UpdateWriteMap(AStream: TEnhancedMemoryStream);
var
x1, y1, x2, y2: Word;
i, areaCount: Integer;
begin
FWriteMap.Clear;
areaCount := AStream.ReadWord;
for i := 0 to areaCount - 1 do
begin
x1 := AStream.ReadWord;
y1 := AStream.ReadWord;
x2 := AStream.ReadWord;
y2 := AStream.ReadWord;
FWriteMap.Add(x1, y1, x2, y2);
end;
end;
initialization
{$I UdmNetwork.lrs}

View File

@ -2296,6 +2296,8 @@ begin
end;
end;
end;
FRepaintNeeded := True;
end;
procedure TfrmMain.ProcessAccessLevel;
@ -2546,8 +2548,8 @@ begin
$07: //access changed
begin
accessLevel := TAccessLevel(ABuffer.ReadByte);
dmNetwork.UpdateWriteMap(ABuffer); //TODO : movie writemap to landscape
FLandscape.UpdateBlockAccess; //TODO : could be handled by updatewritemap
FLandscape.UpdateWriteMap(ABuffer);
FRepaintNeeded := True;
if accessLevel <> dmNetwork.AccessLevel then
begin