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