author | unC0Rr |
Wed, 11 Nov 2015 13:31:31 +0300 | |
changeset 11363 | 9fc4dc5f8446 |
parent 11046 | 47a8c19ecb60 |
child 11862 | cb137eb71556 |
permissions | -rw-r--r-- |
9287 | 1 |
(* |
2 |
* Hedgewars, a free turn based strategy game |
|
11046 | 3 |
* Copyright (c) 2004-2015 Andrey Korotaev <unC0Rr@gmail.com> |
9287 | 4 |
* |
5 |
* This program is free software; you can redistribute it and/or modify |
|
6 |
* it under the terms of the GNU General Public License as published by |
|
7 |
* the Free Software Foundation; version 2 of the License |
|
8 |
* |
|
9 |
* This program is distributed in the hope that it will be useful, |
|
10 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 |
* GNU General Public License for more details. |
|
13 |
* |
|
14 |
* You should have received a copy of the GNU General Public License |
|
15 |
* along with this program; if not, write to the Free Software |
|
10108
c68cf030eded
update FSF address. note: two sdl include files (by Sam Lantinga) still have the old FSF address in their copyright - but I ain't gonna touch their copyright headers
sheepluva
parents:
10015
diff
changeset
|
16 |
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
9287 | 17 |
*) |
18 |
||
19 |
{$INCLUDE "options.inc"} |
|
20 |
||
21 |
unit uVisualGearsList; |
|
22 |
interface |
|
23 |
uses uTypes; |
|
24 |
||
25 |
function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType): PVisualGear; inline; |
|
26 |
function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType; State: LongWord): PVisualGear; inline; |
|
9769
5814e0c47c99
Experiment in adding a "boing" graphic for bouncing. It has no text right now (was thinking l10n) and colour is fixed.
nemo
parents:
9287
diff
changeset
|
27 |
function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType; State: LongWord; Critical: Boolean): PVisualGear; inline; |
5814e0c47c99
Experiment in adding a "boing" graphic for bouncing. It has no text right now (was thinking l10n) and colour is fixed.
nemo
parents:
9287
diff
changeset
|
28 |
function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType; State: LongWord; Critical: Boolean; Layer: LongInt): PVisualGear; |
9287 | 29 |
procedure DeleteVisualGear(Gear: PVisualGear); |
30 |
function VisualGearByUID(uid : Longword) : PVisualGear; |
|
31 |
||
10015 | 32 |
const |
9287 | 33 |
cExplFrameTicks = 110; |
34 |
||
35 |
var VGCounter: LongWord; |
|
36 |
VisualGearLayers: array[0..6] of PVisualGear; |
|
37 |
||
38 |
implementation |
|
10354 | 39 |
uses uCollisions, uFloat, uVariables, uConsts, uTextures, uVisualGearsHandlers; |
9287 | 40 |
|
41 |
function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType): PVisualGear; inline; |
|
42 |
begin |
|
10352 | 43 |
// adjust some visual gear types if underwater |
10354 | 44 |
if CheckCoordInWater(X, Y) and ((Kind = vgtBeeTrace) or (Kind = vgtSmokeTrace) or (Kind = vgtEvilTrace)) then |
10352 | 45 |
Kind:= vgtBubble; |
46 |
||
9769
5814e0c47c99
Experiment in adding a "boing" graphic for bouncing. It has no text right now (was thinking l10n) and colour is fixed.
nemo
parents:
9287
diff
changeset
|
47 |
AddVisualGear:= AddVisualGear(X, Y, Kind, 0, false, -1); |
9287 | 48 |
end; |
49 |
||
50 |
function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType; State: LongWord): PVisualGear; inline; |
|
51 |
begin |
|
9769
5814e0c47c99
Experiment in adding a "boing" graphic for bouncing. It has no text right now (was thinking l10n) and colour is fixed.
nemo
parents:
9287
diff
changeset
|
52 |
AddVisualGear:= AddVisualGear(X, Y, Kind, State, false, -1); |
9287 | 53 |
end; |
54 |
||
9769
5814e0c47c99
Experiment in adding a "boing" graphic for bouncing. It has no text right now (was thinking l10n) and colour is fixed.
nemo
parents:
9287
diff
changeset
|
55 |
function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType; State: LongWord; Critical: Boolean): PVisualGear; inline; |
5814e0c47c99
Experiment in adding a "boing" graphic for bouncing. It has no text right now (was thinking l10n) and colour is fixed.
nemo
parents:
9287
diff
changeset
|
56 |
begin |
5814e0c47c99
Experiment in adding a "boing" graphic for bouncing. It has no text right now (was thinking l10n) and colour is fixed.
nemo
parents:
9287
diff
changeset
|
57 |
AddVisualGear:= AddVisualGear(X, Y, Kind, State, Critical, -1); |
5814e0c47c99
Experiment in adding a "boing" graphic for bouncing. It has no text right now (was thinking l10n) and colour is fixed.
nemo
parents:
9287
diff
changeset
|
58 |
end; |
5814e0c47c99
Experiment in adding a "boing" graphic for bouncing. It has no text right now (was thinking l10n) and colour is fixed.
nemo
parents:
9287
diff
changeset
|
59 |
|
5814e0c47c99
Experiment in adding a "boing" graphic for bouncing. It has no text right now (was thinking l10n) and colour is fixed.
nemo
parents:
9287
diff
changeset
|
60 |
function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType; State: LongWord; Critical: Boolean; Layer: LongInt): PVisualGear; |
9287 | 61 |
var gear: PVisualGear; |
62 |
t: Longword; |
|
63 |
sp: real; |
|
64 |
begin |
|
65 |
AddVisualGear:= nil; |
|
66 |
if ((GameType = gmtSave) or (fastUntilLag and (GameType = gmtNet)) or fastScrolling) and // we are scrolling now |
|
67 |
((Kind <> vgtCloud) and (not Critical)) then |
|
68 |
exit; |
|
69 |
||
70 |
if ((cReducedQuality and rqAntiBoom) <> 0) and |
|
71 |
(not Critical) and |
|
72 |
(not (Kind in |
|
73 |
[vgtTeamHealthSorter, |
|
74 |
vgtSmallDamageTag, |
|
75 |
vgtSpeechBubble, |
|
76 |
vgtHealthTag, |
|
77 |
vgtExplosion, |
|
78 |
vgtSmokeTrace, |
|
79 |
vgtEvilTrace, |
|
80 |
vgtNote, |
|
10876 | 81 |
vgtFeather, |
9287 | 82 |
vgtSmoothWindBar])) then |
10015 | 83 |
|
9287 | 84 |
exit; |
85 |
||
86 |
inc(VGCounter); |
|
87 |
New(gear); |
|
88 |
FillChar(gear^, sizeof(TVisualGear), 0); |
|
89 |
gear^.X:= real(X); |
|
90 |
gear^.Y:= real(Y); |
|
91 |
gear^.Kind := Kind; |
|
9960 | 92 |
gear^.doStep:= doStepVGHandlers[Kind]; |
9287 | 93 |
gear^.Tint:= $FFFFFFFF; |
94 |
gear^.uid:= VGCounter; |
|
95 |
||
96 |
with gear^ do |
|
97 |
case Kind of |
|
98 |
vgtFlake: |
|
99 |
begin |
|
100 |
Timer:= 0; |
|
101 |
tdX:= 0; |
|
102 |
tdY:= 0; |
|
103 |
Scale:= 1.0; |
|
104 |
if SuddenDeathDmg then |
|
105 |
begin |
|
10625
125e120165aa
flake FrameTicks value of 0 now indicades that the frame should not be changed
sheepluva
parents:
10354
diff
changeset
|
106 |
if vobSDFrameTicks > 0 then |
125e120165aa
flake FrameTicks value of 0 now indicades that the frame should not be changed
sheepluva
parents:
10354
diff
changeset
|
107 |
FrameTicks:= random(vobSDFrameTicks); |
9287 | 108 |
Frame:= random(vobSDFramesCount); |
109 |
end |
|
110 |
else |
|
111 |
begin |
|
10625
125e120165aa
flake FrameTicks value of 0 now indicades that the frame should not be changed
sheepluva
parents:
10354
diff
changeset
|
112 |
if vobFrameTicks > 0 then |
125e120165aa
flake FrameTicks value of 0 now indicades that the frame should not be changed
sheepluva
parents:
10354
diff
changeset
|
113 |
FrameTicks:= random(vobFrameTicks); |
9287 | 114 |
Frame:= random(vobFramesCount); |
115 |
end; |
|
116 |
Angle:= random(360); |
|
117 |
dx:= 0.0000038654705 * random(10000); |
|
118 |
dy:= 0.000003506096 * random(7000); |
|
119 |
if random(2) = 0 then |
|
120 |
dx := -dx; |
|
121 |
if SuddenDeathDmg then |
|
122 |
dAngle:= (random(2) * 2 - 1) * (vobSDVelocity + random(vobSDVelocity)) / 1000 |
|
123 |
else |
|
124 |
dAngle:= (random(2) * 2 - 1) * (vobVelocity + random(vobVelocity)) / 1000 |
|
125 |
end; |
|
126 |
vgtCloud: |
|
127 |
begin |
|
128 |
Frame:= random(4); |
|
129 |
dx:= 0.5 + 0.1 * random(5); // how much the cloud will be affected by wind |
|
130 |
timer:= random(4096); |
|
131 |
Scale:= 1.0 |
|
132 |
end; |
|
133 |
vgtExplPart, |
|
134 |
vgtExplPart2: |
|
135 |
begin |
|
136 |
t:= random(1024); |
|
137 |
sp:= 0.001 * (random(95) + 70); |
|
138 |
dx:= hwFloat2Float(AngleSin(t)) * sp; |
|
139 |
dy:= hwFloat2Float(AngleCos(t)) * sp; |
|
140 |
if random(2) = 0 then |
|
141 |
dx := -dx; |
|
142 |
if random(2) = 0 then |
|
143 |
dy := -dy; |
|
144 |
Frame:= 7 - random(3); |
|
145 |
FrameTicks:= cExplFrameTicks |
|
146 |
end; |
|
147 |
vgtFire: |
|
148 |
begin |
|
149 |
t:= random(1024); |
|
150 |
sp:= 0.001 * (random(85) + 95); |
|
151 |
dx:= hwFloat2Float(AngleSin(t)) * sp; |
|
152 |
dy:= hwFloat2Float(AngleCos(t)) * sp; |
|
153 |
if random(2) = 0 then |
|
154 |
dx := -dx; |
|
155 |
if random(2) = 0 then |
|
156 |
dy := -dy; |
|
157 |
FrameTicks:= 650 + random(250); |
|
158 |
Frame:= random(8) |
|
159 |
end; |
|
160 |
vgtEgg: |
|
161 |
begin |
|
162 |
t:= random(1024); |
|
163 |
sp:= 0.001 * (random(85) + 95); |
|
164 |
dx:= hwFloat2Float(AngleSin(t)) * sp; |
|
165 |
dy:= hwFloat2Float(AngleCos(t)) * sp; |
|
166 |
if random(2) = 0 then |
|
167 |
dx := -dx; |
|
168 |
if random(2) = 0 then |
|
169 |
dy := -dy; |
|
170 |
FrameTicks:= 650 + random(250); |
|
171 |
Frame:= 1 |
|
172 |
end; |
|
173 |
vgtShell: FrameTicks:= 500; |
|
174 |
vgtSmallDamageTag: |
|
175 |
begin |
|
176 |
gear^.FrameTicks:= 1100 |
|
177 |
end; |
|
178 |
vgtBubble: |
|
179 |
begin |
|
180 |
dx:= 0.0000038654705 * random(10000); |
|
181 |
dy:= 0; |
|
182 |
if random(2) = 0 then |
|
183 |
dx := -dx; |
|
184 |
FrameTicks:= 250 + random(1751); |
|
185 |
Frame:= random(5) |
|
186 |
end; |
|
187 |
vgtSteam: |
|
188 |
begin |
|
189 |
dx:= 0.0000038654705 * random(10000); |
|
190 |
dy:= 0.001 * (random(85) + 95); |
|
191 |
if random(2) = 0 then |
|
192 |
dx := -dx; |
|
193 |
Frame:= 7 - random(3); |
|
194 |
FrameTicks:= cExplFrameTicks * 2; |
|
195 |
end; |
|
196 |
vgtAmmo: |
|
197 |
begin |
|
198 |
alpha:= 1.0; |
|
199 |
scale:= 1.0 |
|
200 |
end; |
|
201 |
vgtSmokeWhite, |
|
202 |
vgtSmoke: |
|
203 |
begin |
|
204 |
Scale:= 1.0; |
|
205 |
dx:= 0.0002 * (random(45) + 10); |
|
206 |
dy:= 0.0002 * (random(45) + 10); |
|
207 |
if random(2) = 0 then |
|
208 |
dx := -dx; |
|
209 |
Frame:= 7 - random(2); |
|
210 |
FrameTicks:= cExplFrameTicks * 2; |
|
211 |
end; |
|
212 |
vgtDust: |
|
213 |
begin |
|
214 |
dx:= 0.005 * (random(15) + 10); |
|
215 |
dy:= 0.001 * (random(40) + 20); |
|
216 |
if random(2) = 0 then dx := -dx; |
|
217 |
if random(2) = 0 then Tag:= 1 |
|
218 |
else Tag:= -1; |
|
219 |
Frame:= 7 - random(2); |
|
220 |
FrameTicks:= random(20) + 15; |
|
221 |
end; |
|
222 |
vgtSplash: |
|
223 |
begin |
|
224 |
dx:= 0; |
|
225 |
dy:= 0; |
|
226 |
FrameTicks:= 740; |
|
227 |
Frame:= 19; |
|
228 |
Scale:= 0.75; |
|
229 |
Timer:= 1; |
|
230 |
end; |
|
231 |
vgtDroplet: |
|
232 |
begin |
|
233 |
dx:= 0.001 * (random(180) - 90); |
|
234 |
dy:= -0.001 * (random(160) + 40); |
|
235 |
FrameTicks:= 250 + random(1751); |
|
236 |
Frame:= random(3) |
|
237 |
end; |
|
238 |
vgtBeeTrace: |
|
239 |
begin |
|
240 |
FrameTicks:= 1000; |
|
241 |
Frame:= random(16); |
|
242 |
end; |
|
243 |
vgtSmokeRing: |
|
244 |
begin |
|
245 |
dx:= 0; |
|
246 |
dy:= 0; |
|
247 |
FrameTicks:= 600; |
|
248 |
Timer:= 0; |
|
249 |
Frame:= 0; |
|
250 |
scale:= 0.6; |
|
251 |
alpha:= 1; |
|
252 |
angle:= random(360); |
|
253 |
end; |
|
254 |
vgtFeather: |
|
255 |
begin |
|
256 |
t:= random(1024); |
|
257 |
sp:= 0.001 * (random(85) + 95); |
|
258 |
dx:= hwFloat2Float(AngleSin(t)) * sp; |
|
259 |
dy:= hwFloat2Float(AngleCos(t)) * sp; |
|
260 |
if random(2) = 0 then |
|
261 |
dx := -dx; |
|
262 |
if random(2) = 0 then |
|
263 |
dy := -dy; |
|
264 |
FrameTicks:= 650 + random(250); |
|
265 |
Frame:= 1 |
|
266 |
end; |
|
267 |
vgtHealthTag: |
|
268 |
begin |
|
269 |
Frame:= 0; |
|
270 |
Timer:= 1500; |
|
271 |
dY:= -0.08; |
|
272 |
dX:= 0; |
|
273 |
//gear^.Z:= 2002; |
|
274 |
end; |
|
275 |
vgtSmokeTrace, |
|
276 |
vgtEvilTrace: |
|
277 |
begin |
|
278 |
gear^.X:= gear^.X - 16; |
|
279 |
gear^.Y:= gear^.Y - 16; |
|
280 |
gear^.State:= 8; |
|
281 |
//gear^.Z:= cSmokeZ |
|
282 |
end; |
|
283 |
vgtBigExplosion: |
|
284 |
begin |
|
285 |
gear^.Angle:= random(360); |
|
286 |
end; |
|
287 |
vgtChunk: |
|
288 |
begin |
|
289 |
gear^.Frame:= random(4); |
|
290 |
t:= random(1024); |
|
291 |
sp:= 0.001 * (random(85) + 47); |
|
292 |
dx:= hwFloat2Float(AngleSin(t)) * sp; |
|
293 |
dy:= hwFloat2Float(AngleCos(t)) * sp * -2; |
|
294 |
if random(2) = 0 then |
|
295 |
dx := -dx; |
|
296 |
end; |
|
10015 | 297 |
vgtNote: |
9287 | 298 |
begin |
299 |
dx:= 0.005 * (random(15) + 10); |
|
300 |
dy:= -0.001 * (random(40) + 20); |
|
301 |
if random(2) = 0 then |
|
302 |
dx := -dx; |
|
303 |
Frame:= random(4); |
|
304 |
FrameTicks:= random(2000) + 1500; |
|
305 |
end; |
|
306 |
vgtBulletHit: |
|
307 |
begin |
|
308 |
dx:= 0; |
|
309 |
dy:= 0; |
|
310 |
FrameTicks:= 350; |
|
311 |
Frame:= 7; |
|
312 |
Angle:= 0; |
|
313 |
end; |
|
10015 | 314 |
vgtSmoothWindBar: |
9287 | 315 |
begin |
316 |
Angle:= hwFloat2Float(cMaxWindSpeed)*2 / 1440; // seems rate below is supposed to change wind bar at 1px per 10ms. Max time, 1440ms. This tries to match the rate of change |
|
317 |
Tag:= hwRound(cWindSpeed * 72 / cMaxWindSpeed); |
|
318 |
end; |
|
319 |
vgtStraightShot: |
|
320 |
begin |
|
321 |
Angle:= 0; |
|
322 |
Scale:= 1.0; |
|
323 |
dx:= 0.001 * random(45); |
|
324 |
dy:= 0.001 * (random(20) + 25); |
|
325 |
State:= ord(sprHealth); |
|
326 |
if random(2) = 0 then |
|
327 |
dx := -dx; |
|
328 |
Frame:= 0; |
|
329 |
FrameTicks:= random(750) + 1250; |
|
330 |
State:= ord(sprSnowDust); |
|
331 |
end; |
|
10251
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10193
diff
changeset
|
332 |
vgtNoPlaceWarn: |
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10193
diff
changeset
|
333 |
begin |
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10193
diff
changeset
|
334 |
FrameTicks:= 2000; |
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10193
diff
changeset
|
335 |
Tint:= $FF0000FF; |
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10193
diff
changeset
|
336 |
Scale:= 1.0; |
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10193
diff
changeset
|
337 |
end; |
9287 | 338 |
end; |
339 |
||
340 |
if State <> 0 then |
|
341 |
gear^.State:= State; |
|
342 |
||
343 |
case Gear^.Kind of |
|
344 |
vgtFlake: if cFlattenFlakes then |
|
345 |
gear^.Layer:= 0 |
|
10015 | 346 |
else if random(3) = 0 then |
9287 | 347 |
begin |
348 |
gear^.Scale:= 0.5; |
|
349 |
gear^.Layer:= 0 // 33% - far back |
|
350 |
end |
|
351 |
else if random(3) = 0 then |
|
352 |
begin |
|
353 |
gear^.Scale:= 0.8; |
|
354 |
gear^.Layer:= 4 // 22% - mid-distance |
|
355 |
end |
|
356 |
else if random(3) <> 0 then |
|
357 |
gear^.Layer:= 5 // 30% - just behind land |
|
358 |
else if random(2) = 0 then |
|
359 |
gear^.Layer:= 6 // 7% - just in front of land |
|
360 |
else |
|
361 |
begin |
|
362 |
gear^.Scale:= 1.5; |
|
363 |
gear^.Layer:= 2; // 7% - close up |
|
364 |
end; |
|
365 |
||
366 |
vgtCloud: if cFlattenClouds then gear^.Layer:= 5 |
|
367 |
else if random(3) = 0 then |
|
368 |
begin |
|
369 |
gear^.Scale:= 0.25; |
|
370 |
gear^.Layer:= 0 |
|
371 |
end |
|
372 |
else if random(2) = 0 then |
|
373 |
gear^.Layer:= 5 |
|
374 |
else |
|
375 |
begin |
|
376 |
gear^.Scale:= 0.4; |
|
377 |
gear^.Layer:= 4 |
|
378 |
end; |
|
10251
a3b42e81803c
collision indicator on failed girder placement (especially useful with rubberband I guess). still needs some tweaks but I am going to bed now :P
sheepluva
parents:
10193
diff
changeset
|
379 |
vgtNoPlaceWarn: gear^.Layer:= 6; |
9287 | 380 |
|
381 |
// 0: this layer is very distant in the background when in stereo |
|
382 |
vgtTeamHealthSorter, |
|
383 |
vgtSmoothWindBar: gear^.Layer:= 0; |
|
384 |
||
385 |
||
386 |
// 1: this layer is on the land level (which is close but behind the screen plane) when stereo |
|
387 |
vgtSmokeTrace, |
|
388 |
vgtEvilTrace, |
|
389 |
vgtLineTrail, |
|
390 |
vgtSmoke, |
|
391 |
vgtSmokeWhite, |
|
392 |
vgtDust, |
|
393 |
vgtFire, |
|
394 |
vgtSplash, |
|
395 |
vgtDroplet, |
|
396 |
vgtBubble: gear^.Layer:= 1; |
|
397 |
||
398 |
// 3: this layer is on the screen plane (depth = 0) when stereo |
|
399 |
vgtSpeechBubble, |
|
400 |
vgtSmallDamageTag, |
|
401 |
vgtHealthTag, |
|
402 |
vgtStraightShot, |
|
10876 | 403 |
vgtFeather, |
9287 | 404 |
vgtChunk: gear^.Layer:= 3; |
405 |
||
406 |
// 2: this layer is outside the screen when stereo |
|
407 |
vgtExplosion, |
|
408 |
vgtBigExplosion, |
|
409 |
vgtExplPart, |
|
410 |
vgtExplPart2, |
|
411 |
vgtSteam, |
|
412 |
vgtAmmo, |
|
413 |
vgtShell, |
|
414 |
vgtEgg, |
|
415 |
vgtBeeTrace, |
|
416 |
vgtSmokeRing, |
|
417 |
vgtNote, |
|
418 |
vgtBulletHit, |
|
419 |
vgtCircle: gear^.Layer:= 2 |
|
420 |
end; |
|
421 |
||
9769
5814e0c47c99
Experiment in adding a "boing" graphic for bouncing. It has no text right now (was thinking l10n) and colour is fixed.
nemo
parents:
9287
diff
changeset
|
422 |
if Layer <> -1 then gear^.Layer:= Layer; |
5814e0c47c99
Experiment in adding a "boing" graphic for bouncing. It has no text right now (was thinking l10n) and colour is fixed.
nemo
parents:
9287
diff
changeset
|
423 |
|
9287 | 424 |
if VisualGearLayers[gear^.Layer] <> nil then |
425 |
begin |
|
426 |
VisualGearLayers[gear^.Layer]^.PrevGear:= gear; |
|
427 |
gear^.NextGear:= VisualGearLayers[gear^.Layer] |
|
428 |
end; |
|
429 |
VisualGearLayers[gear^.Layer]:= gear; |
|
430 |
||
431 |
AddVisualGear:= gear; |
|
432 |
end; |
|
433 |
||
434 |
procedure DeleteVisualGear(Gear: PVisualGear); |
|
435 |
begin |
|
10634
35d059bd0932
Use FreeAndNil across the board. Even if we are immediately assigning after, probably avoids accidental mistakes. Also free neglected owner tex on shutdown, and delete hog gears using the normal deletion procedure if for any reason they still exist (EndGame call?).
nemo
parents:
10625
diff
changeset
|
436 |
FreeAndNilTexture(Gear^.Tex); |
9287 | 437 |
|
438 |
if Gear^.NextGear <> nil then |
|
439 |
Gear^.NextGear^.PrevGear:= Gear^.PrevGear; |
|
440 |
if Gear^.PrevGear <> nil then |
|
441 |
Gear^.PrevGear^.NextGear:= Gear^.NextGear |
|
442 |
else |
|
443 |
VisualGearLayers[Gear^.Layer]:= Gear^.NextGear; |
|
444 |
||
445 |
if lastVisualGearByUID = Gear then |
|
446 |
lastVisualGearByUID:= nil; |
|
447 |
||
448 |
Dispose(Gear); |
|
449 |
end; |
|
450 |
||
451 |
function VisualGearByUID(uid : Longword) : PVisualGear; |
|
452 |
var vg: PVisualGear; |
|
453 |
i: LongWord; |
|
454 |
begin |
|
455 |
VisualGearByUID:= nil; |
|
456 |
if uid = 0 then |
|
457 |
exit; |
|
458 |
if (lastVisualGearByUID <> nil) and (lastVisualGearByUID^.uid = uid) then |
|
459 |
begin |
|
460 |
VisualGearByUID:= lastVisualGearByUID; |
|
461 |
exit |
|
462 |
end; |
|
463 |
// search in an order that is more likely to return layers they actually use. Could perhaps track statistically AddVisualGear in uScript, since that is most likely the ones they want |
|
464 |
for i:= 2 to 5 do |
|
465 |
begin |
|
466 |
vg:= VisualGearLayers[i mod 4]; |
|
467 |
while vg <> nil do |
|
468 |
begin |
|
469 |
if vg^.uid = uid then |
|
470 |
begin |
|
471 |
lastVisualGearByUID:= vg; |
|
472 |
VisualGearByUID:= vg; |
|
473 |
exit |
|
474 |
end; |
|
475 |
vg:= vg^.NextGear |
|
476 |
end |
|
477 |
end |
|
478 |
end; |
|
479 |
||
480 |
||
481 |
end. |