Revision 152:2c10e1ad6647 UOLib/UWorldItem.pas
| b/UOLib/UWorldItem.pas | ||
|---|---|---|
| 40 | 40 |
TWorldItem = class(TMulBlock) |
| 41 | 41 |
constructor Create(AOwner: TWorldBlock); |
| 42 | 42 |
protected |
| 43 |
FOwner, FOrgOwner: TWorldBlock;
|
|
| 44 |
FTileID, FOrgTileID: Word;
|
|
| 45 |
FX, FOrgX: Word;
|
|
| 46 |
FY, FOrgY: Word;
|
|
| 47 |
FZ, FOrgZ: ShortInt;
|
|
| 43 |
FOwner: TWorldBlock; |
|
| 44 |
FTileID: Word; |
|
| 45 |
FX: Word; |
|
| 46 |
FY: Word; |
|
| 47 |
FZ: ShortInt; |
|
| 48 | 48 |
FSelected: Boolean; |
| 49 | 49 |
FCanBeEdited: Boolean; |
| 50 | 50 |
FLocked: Boolean; |
| 51 |
FChanged: Boolean; |
|
| 52 | 51 |
FPriority: Integer; |
| 53 | 52 |
FPriorityBonus: ShortInt; |
| 54 | 53 |
FPrioritySolver: Integer; |
| 55 |
function GetTileID: Word; virtual; |
|
| 56 |
function GetZ: ShortInt; virtual; |
|
| 57 |
procedure SetTileID(ATileID: Word); |
|
| 58 |
procedure SetX(AX: Word); |
|
| 59 |
procedure SetY(AY: Word); |
|
| 60 |
procedure SetZ(AZ: ShortInt); |
|
| 54 |
procedure DoChanged; |
|
| 55 |
function GetTileID: Word; virtual; |
|
| 56 |
function GetZ: ShortInt; virtual; |
|
| 57 |
procedure SetLocked(ALocked: Boolean); |
|
| 58 |
procedure SetOwner(AOwner: TWorldBlock); |
|
| 61 | 59 |
procedure SetSelected(ASelected: Boolean); |
| 62 |
procedure SetOwner(AOwner: TWorldBlock);
|
|
| 63 |
procedure SetLocked(ALocked: Boolean);
|
|
| 64 |
procedure DoChanged;
|
|
| 65 |
function HasChanged: Boolean; virtual;
|
|
| 60 |
procedure SetTileID(AValue: Word);
|
|
| 61 |
procedure SetX(AValue: Word);
|
|
| 62 |
procedure SetY(AValue: Word);
|
|
| 63 |
procedure SetZ(AValue: ShortInt);
|
|
| 66 | 64 |
public |
| 67 | 65 |
procedure UpdatePos(AX, AY: Word; AZ: ShortInt); |
| 68 | 66 |
procedure Delete; |
| 69 |
procedure InitOriginalState; virtual; |
|
| 70 | 67 |
|
| 71 | 68 |
property Owner: TWorldBlock read FOwner write SetOwner; |
| 72 | 69 |
property TileID: Word read GetTileID write SetTileID; |
| ... | ... | |
| 76 | 73 |
property Selected: Boolean read FSelected write SetSelected; |
| 77 | 74 |
property CanBeEdited: Boolean read FCanBeEdited write FCanBeEdited; |
| 78 | 75 |
property Locked: Boolean read FLocked write SetLocked; |
| 79 |
property Changed: Boolean read FChanged; |
|
| 80 | 76 |
property Priority: Integer read FPriority write FPriority; |
| 81 | 77 |
property PriorityBonus: ShortInt read FPriorityBonus write FPriorityBonus; |
| 82 | 78 |
property PrioritySolver: Integer read FPrioritySolver write FPrioritySolver; |
| ... | ... | |
| 95 | 91 |
FX: Word; |
| 96 | 92 |
FY: Word; |
| 97 | 93 |
FRefCount: Integer; |
| 98 |
FChanges: Integer; |
|
| 99 |
function GetChanged: Boolean; |
|
| 100 |
procedure SetChanged(AChanged: Boolean); |
|
| 101 |
procedure DoStateChanged; |
|
| 94 |
FChanged: Boolean; |
|
| 102 | 95 |
public |
| 103 | 96 |
property X: Word read FX write FX; |
| 104 | 97 |
property Y: Word read FY write FY; |
| 105 | 98 |
property RefCount: Integer read FRefCount; |
| 106 |
property Changed: Boolean read GetChanged write SetChanged;
|
|
| 99 |
property Changed: Boolean read FChanged write FChanged;
|
|
| 107 | 100 |
procedure AddRef; |
| 108 | 101 |
procedure RemoveRef; |
| 109 |
procedure CleanUp; |
|
| 110 | 102 |
end; |
| 111 | 103 |
|
| 112 | 104 |
TVirtualTile = class(TWorldItem); |
| ... | ... | |
| 140 | 132 |
end; |
| 141 | 133 |
|
| 142 | 134 |
if Result = 0 then |
| 143 |
Result := AItem1.PriorityBonus - AItem2.PriorityBonus; |
|
| 144 |
|
|
| 145 |
if Result = 0 then |
|
| 146 | 135 |
Result := AItem1.PrioritySolver - AItem2.PrioritySolver; |
| 147 | 136 |
end; |
| 148 | 137 |
|
| ... | ... | |
| 153 | 142 |
inherited Create; |
| 154 | 143 |
FSelected := False; |
| 155 | 144 |
FLocked := False; |
| 156 |
FChanged := False; |
|
| 157 | 145 |
FOwner := AOwner; |
| 158 | 146 |
end; |
| 159 | 147 |
|
| 148 |
procedure TWorldItem.DoChanged; |
|
| 149 |
begin |
|
| 150 |
if FOwner <> nil then |
|
| 151 |
FOwner.Changed := True; |
|
| 152 |
end; |
|
| 153 |
|
|
| 160 | 154 |
function TWorldItem.GetTileID: Word; |
| 161 | 155 |
begin |
| 162 | 156 |
Result := FTileID; |
| ... | ... | |
| 171 | 165 |
begin |
| 172 | 166 |
SetSelected(False); |
| 173 | 167 |
SetLocked(False); |
| 174 |
if (FOwner <> FOrgOwner) then |
|
| 175 |
FOwner.Changed := False |
|
| 176 |
else if Assigned(FOrgOwner) and (not FChanged) then |
|
| 177 |
FOrgOwner.Changed := True; |
|
| 178 |
end; |
|
| 179 |
|
|
| 180 |
procedure TWorldItem.DoChanged; |
|
| 181 |
var |
|
| 182 |
blockChanged: Boolean; |
|
| 183 |
begin |
|
| 184 |
blockChanged := HasChanged; |
|
| 185 |
if Assigned(FOwner) then |
|
| 186 |
begin |
|
| 187 |
if FChanged and (not blockChanged) then |
|
| 188 |
FOwner.Changed := False |
|
| 189 |
else if (not FChanged) and blockChanged then |
|
| 190 |
FOwner.Changed := True; |
|
| 191 |
end; |
|
| 192 |
FChanged := blockChanged; |
|
| 193 |
if Assigned(FOnChanged) then |
|
| 194 |
FOnChanged(Self); |
|
| 195 |
end; |
|
| 196 |
|
|
| 197 |
function TWorldItem.HasChanged: Boolean; |
|
| 198 |
begin |
|
| 199 |
Result := (FX <> FOrgX) or (FY <> FOrgY) or (FZ <> FOrgZ) or |
|
| 200 |
(FTileID <> FOrgTileID) or (FOrgOwner <> FOwner); |
|
| 201 |
end; |
|
| 202 |
|
|
| 203 |
procedure TWorldItem.InitOriginalState; |
|
| 204 |
begin |
|
| 205 |
{if Assigned(FOrgOwner) and (FOwner <> FOrgOwner) then
|
|
| 206 |
FOrgOwner.Changed := False;} |
|
| 207 |
FOrgOwner := FOwner; |
|
| 208 |
FOrgTileID := FTileID; |
|
| 209 |
FOrgX := FX; |
|
| 210 |
FOrgY := FY; |
|
| 211 |
FOrgZ := FZ; |
|
| 212 | 168 |
DoChanged; |
| 213 | 169 |
end; |
| 214 | 170 |
|
| ... | ... | |
| 217 | 173 |
if FLocked <> ALocked then |
| 218 | 174 |
begin |
| 219 | 175 |
FLocked := ALocked; |
| 220 |
if Assigned(FOwner) then
|
|
| 176 |
if FOwner <> nil then
|
|
| 221 | 177 |
if FLocked then |
| 222 | 178 |
FOwner.AddRef |
| 223 | 179 |
else |
| ... | ... | |
| 229 | 185 |
begin |
| 230 | 186 |
if FOwner <> AOwner then |
| 231 | 187 |
begin |
| 232 |
if Assigned(FOwner) then
|
|
| 188 |
if FOwner <> nil then
|
|
| 233 | 189 |
begin |
| 234 |
if FOwner <> FOrgOwner then |
|
| 235 |
FOwner.Changed := False; |
|
| 190 |
FOwner.Changed := True; |
|
| 236 | 191 |
if FLocked then FOwner.RemoveRef; |
| 237 | 192 |
if FSelected then FOwner.RemoveRef; |
| 238 | 193 |
end; |
| 239 | 194 |
FOwner := AOwner; |
| 240 |
if Assigned(FOwner) then
|
|
| 195 |
if FOwner <> nil then
|
|
| 241 | 196 |
begin |
| 242 |
if FOwner <> FOrgOwner then |
|
| 243 |
FOwner.Changed := True; |
|
| 197 |
FOwner.Changed := True; |
|
| 244 | 198 |
if FLocked then FOwner.AddRef; |
| 245 | 199 |
if FSelected then FOwner.AddRef; |
| 246 | 200 |
end; |
| 247 |
DoChanged; |
|
| 248 | 201 |
end; |
| 249 | 202 |
end; |
| 250 | 203 |
|
| ... | ... | |
| 258 | 211 |
FSelected := ASelected; |
| 259 | 212 |
end; |
| 260 | 213 |
|
| 261 |
procedure TWorldItem.SetTileID(ATileID: Word);
|
|
| 214 |
procedure TWorldItem.SetTileID(AValue: Word);
|
|
| 262 | 215 |
begin |
| 263 |
FTileID := ATileID; |
|
| 216 |
if FTileID = AValue then |
|
| 217 |
Exit; |
|
| 218 |
|
|
| 219 |
FTileID := AValue; |
|
| 264 | 220 |
DoChanged; |
| 265 | 221 |
end; |
| 266 | 222 |
|
| 267 |
procedure TWorldItem.SetX(AX: Word);
|
|
| 223 |
procedure TWorldItem.SetX(AValue: Word);
|
|
| 268 | 224 |
begin |
| 269 |
FX := AX; |
|
| 225 |
if FX = AValue then |
|
| 226 |
Exit; |
|
| 227 |
|
|
| 228 |
FX := AValue; |
|
| 270 | 229 |
DoChanged; |
| 271 | 230 |
end; |
| 272 | 231 |
|
| 273 |
procedure TWorldItem.SetY(AY: Word);
|
|
| 232 |
procedure TWorldItem.SetY(AValue: Word);
|
|
| 274 | 233 |
begin |
| 275 |
FY := AY; |
|
| 276 |
DoChanged |
|
| 234 |
if FY = AValue then |
|
| 235 |
Exit; |
|
| 236 |
|
|
| 237 |
FY := AValue; |
|
| 238 |
DoChanged; |
|
| 277 | 239 |
end; |
| 278 | 240 |
|
| 279 |
procedure TWorldItem.SetZ(AZ: ShortInt);
|
|
| 241 |
procedure TWorldItem.SetZ(AValue: ShortInt);
|
|
| 280 | 242 |
begin |
| 281 |
FZ := AZ; |
|
| 243 |
if FZ = AValue then |
|
| 244 |
Exit; |
|
| 245 |
|
|
| 246 |
FZ := AValue; |
|
| 282 | 247 |
DoChanged; |
| 283 | 248 |
end; |
| 284 | 249 |
|
| ... | ... | |
| 295 | 260 |
procedure TWorldBlock.AddRef; |
| 296 | 261 |
begin |
| 297 | 262 |
Inc(FRefCount); |
| 298 |
DoStateChanged; |
|
| 299 |
end; |
|
| 300 |
|
|
| 301 |
procedure TWorldBlock.CleanUp; |
|
| 302 |
begin |
|
| 303 |
FChanges := 0; |
|
| 304 |
DoStateChanged; |
|
| 305 | 263 |
end; |
| 306 | 264 |
|
| 307 | 265 |
constructor TWorldBlock.Create; |
| 308 | 266 |
begin |
| 309 | 267 |
inherited Create; |
| 310 | 268 |
FRefCount := 0; |
| 311 |
FChanges := 0; |
|
| 312 |
end; |
|
| 313 |
|
|
| 314 |
procedure TWorldBlock.DoStateChanged; |
|
| 315 |
begin |
|
| 316 |
if Assigned(FOnChanged) then |
|
| 317 |
FOnChanged(Self); |
|
| 318 |
end; |
|
| 319 |
|
|
| 320 |
function TWorldBlock.GetChanged: Boolean; |
|
| 321 |
begin |
|
| 322 |
Result := (FChanges <> 0); |
|
| 269 |
FChanged := False; |
|
| 323 | 270 |
end; |
| 324 | 271 |
|
| 325 | 272 |
procedure TWorldBlock.RemoveRef; |
| 326 | 273 |
begin |
| 327 | 274 |
if FRefCount > 0 then |
| 328 | 275 |
Dec(FRefCount); |
| 329 |
DoStateChanged; |
|
| 330 |
end; |
|
| 331 |
|
|
| 332 |
procedure TWorldBlock.SetChanged(AChanged: Boolean); |
|
| 333 |
begin |
|
| 334 |
if AChanged then |
|
| 335 |
Inc(FChanges) |
|
| 336 |
else |
|
| 337 |
Dec(FChanges); |
|
| 338 |
DoStateChanged; |
|
| 339 | 276 |
end; |
| 340 | 277 |
|
| 341 | 278 |
end. |
Also available in: Unified diff