author | alfadur |
Tue, 04 Jun 2019 22:25:28 +0300 | |
changeset 15121 | cce6e707172f |
parent 15102 | 260e96addf92 |
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; |
|
14589
ab79cd4a7382
Reverse order of visual gears linked list
Wuzzy <Wuzzy2@mail.ru>
parents:
14577
diff
changeset
|
36 |
VisualGearLayersStart: array[0..6] of PVisualGear; |
ab79cd4a7382
Reverse order of visual gears linked list
Wuzzy <Wuzzy2@mail.ru>
parents:
14577
diff
changeset
|
37 |
VisualGearLayersEnd: array[0..6] of PVisualGear; |
9287 | 38 |
|
39 |
implementation |
|
11885
2eac7a96b342
Lua API: Add GetVisualGearType, onVisualGearAdd, onVisualGearDelete
Wuzzy <almikes@aol.com>
parents:
11862
diff
changeset
|
40 |
uses uCollisions, uFloat, uVariables, uConsts, uTextures, uVisualGearsHandlers, uScript; |
9287 | 41 |
|
42 |
function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType): PVisualGear; inline; |
|
43 |
begin |
|
10352 | 44 |
// adjust some visual gear types if underwater |
10354 | 45 |
if CheckCoordInWater(X, Y) and ((Kind = vgtBeeTrace) or (Kind = vgtSmokeTrace) or (Kind = vgtEvilTrace)) then |
10352 | 46 |
Kind:= vgtBubble; |
47 |
||
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
|
48 |
AddVisualGear:= AddVisualGear(X, Y, Kind, 0, false, -1); |
9287 | 49 |
end; |
50 |
||
51 |
function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType; State: LongWord): PVisualGear; inline; |
|
52 |
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
|
53 |
AddVisualGear:= AddVisualGear(X, Y, Kind, State, false, -1); |
9287 | 54 |
end; |
55 |
||
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
|
56 |
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
|
57 |
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
|
58 |
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
|
59 |
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
|
60 |
|
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
|
61 |
function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType; State: LongWord; Critical: Boolean; Layer: LongInt): PVisualGear; |
9287 | 62 |
var gear: PVisualGear; |
63 |
t: Longword; |
|
64 |
sp: real; |
|
65 |
begin |
|
66 |
AddVisualGear:= nil; |
|
13045
a87d3119c962
VideoRec: Fix many effects not being recorded
Wuzzy <Wuzzy2@mail.ru>
parents:
12115
diff
changeset
|
67 |
if (GameType <> gmtRecord) and |
a87d3119c962
VideoRec: Fix many effects not being recorded
Wuzzy <Wuzzy2@mail.ru>
parents:
12115
diff
changeset
|
68 |
(((GameType = gmtSave) or (fastUntilLag and (GameType = gmtNet)) or fastScrolling) and // we are scrolling now |
13334
e8801220c13f
minor simplification of conditions for not spawning a visual gear - also allows lua to spawn clouds critically or non-critically. We probably shouldn't even exempt clouds from this, and just spawn them once synced, but, eh, probably isn't a significant hit since sheepluva made the motion more efficient.
nemo
parents:
13045
diff
changeset
|
69 |
(not Critical)) then |
9287 | 70 |
exit; |
71 |
||
72 |
if ((cReducedQuality and rqAntiBoom) <> 0) and |
|
73 |
(not Critical) and |
|
74 |
(not (Kind in |
|
75 |
[vgtTeamHealthSorter, |
|
76 |
vgtSmallDamageTag, |
|
77 |
vgtSpeechBubble, |
|
78 |
vgtHealthTag, |
|
79 |
vgtExplosion, |
|
15102
260e96addf92
Allow vgtBigExplosion in low quality mode
Wuzzy <Wuzzy2@mail.ru>
parents:
14662
diff
changeset
|
80 |
vgtBigExplosion, |
9287 | 81 |
vgtSmokeTrace, |
82 |
vgtEvilTrace, |
|
83 |
vgtNote, |
|
10876 | 84 |
vgtFeather, |
9287 | 85 |
vgtSmoothWindBar])) then |
10015 | 86 |
|
9287 | 87 |
exit; |
88 |
||
89 |
inc(VGCounter); |
|
90 |
New(gear); |
|
91 |
FillChar(gear^, sizeof(TVisualGear), 0); |
|
92 |
gear^.X:= real(X); |
|
93 |
gear^.Y:= real(Y); |
|
94 |
gear^.Kind := Kind; |
|
9960 | 95 |
gear^.doStep:= doStepVGHandlers[Kind]; |
9287 | 96 |
gear^.Tint:= $FFFFFFFF; |
97 |
gear^.uid:= VGCounter; |
|
98 |
||
99 |
with gear^ do |
|
100 |
case Kind of |
|
101 |
vgtFlake: |
|
102 |
begin |
|
103 |
Timer:= 0; |
|
104 |
tdX:= 0; |
|
105 |
tdY:= 0; |
|
106 |
Scale:= 1.0; |
|
107 |
if SuddenDeathDmg then |
|
108 |
begin |
|
10625
125e120165aa
flake FrameTicks value of 0 now indicades that the frame should not be changed
sheepluva
parents:
10354
diff
changeset
|
109 |
if vobSDFrameTicks > 0 then |
125e120165aa
flake FrameTicks value of 0 now indicades that the frame should not be changed
sheepluva
parents:
10354
diff
changeset
|
110 |
FrameTicks:= random(vobSDFrameTicks); |
9287 | 111 |
Frame:= random(vobSDFramesCount); |
112 |
end |
|
113 |
else |
|
114 |
begin |
|
10625
125e120165aa
flake FrameTicks value of 0 now indicades that the frame should not be changed
sheepluva
parents:
10354
diff
changeset
|
115 |
if vobFrameTicks > 0 then |
125e120165aa
flake FrameTicks value of 0 now indicades that the frame should not be changed
sheepluva
parents:
10354
diff
changeset
|
116 |
FrameTicks:= random(vobFrameTicks); |
9287 | 117 |
Frame:= random(vobFramesCount); |
118 |
end; |
|
119 |
Angle:= random(360); |
|
120 |
dx:= 0.0000038654705 * random(10000); |
|
121 |
dy:= 0.000003506096 * random(7000); |
|
122 |
if random(2) = 0 then |
|
123 |
dx := -dx; |
|
124 |
if SuddenDeathDmg then |
|
125 |
dAngle:= (random(2) * 2 - 1) * (vobSDVelocity + random(vobSDVelocity)) / 1000 |
|
126 |
else |
|
127 |
dAngle:= (random(2) * 2 - 1) * (vobVelocity + random(vobVelocity)) / 1000 |
|
128 |
end; |
|
129 |
vgtCloud: |
|
130 |
begin |
|
131 |
Frame:= random(4); |
|
132 |
dx:= 0.5 + 0.1 * random(5); // how much the cloud will be affected by wind |
|
133 |
timer:= random(4096); |
|
134 |
Scale:= 1.0 |
|
135 |
end; |
|
136 |
vgtExplPart, |
|
137 |
vgtExplPart2: |
|
138 |
begin |
|
139 |
t:= random(1024); |
|
140 |
sp:= 0.001 * (random(95) + 70); |
|
141 |
dx:= hwFloat2Float(AngleSin(t)) * sp; |
|
142 |
dy:= hwFloat2Float(AngleCos(t)) * sp; |
|
143 |
if random(2) = 0 then |
|
144 |
dx := -dx; |
|
145 |
if random(2) = 0 then |
|
146 |
dy := -dy; |
|
147 |
Frame:= 7 - random(3); |
|
148 |
FrameTicks:= cExplFrameTicks |
|
149 |
end; |
|
150 |
vgtFire: |
|
151 |
begin |
|
152 |
t:= random(1024); |
|
153 |
sp:= 0.001 * (random(85) + 95); |
|
154 |
dx:= hwFloat2Float(AngleSin(t)) * sp; |
|
155 |
dy:= hwFloat2Float(AngleCos(t)) * sp; |
|
156 |
if random(2) = 0 then |
|
157 |
dx := -dx; |
|
158 |
if random(2) = 0 then |
|
159 |
dy := -dy; |
|
160 |
FrameTicks:= 650 + random(250); |
|
161 |
Frame:= random(8) |
|
162 |
end; |
|
163 |
vgtEgg: |
|
164 |
begin |
|
165 |
t:= random(1024); |
|
166 |
sp:= 0.001 * (random(85) + 95); |
|
167 |
dx:= hwFloat2Float(AngleSin(t)) * sp; |
|
168 |
dy:= hwFloat2Float(AngleCos(t)) * sp; |
|
169 |
if random(2) = 0 then |
|
170 |
dx := -dx; |
|
171 |
if random(2) = 0 then |
|
172 |
dy := -dy; |
|
173 |
FrameTicks:= 650 + random(250); |
|
174 |
Frame:= 1 |
|
175 |
end; |
|
176 |
vgtShell: FrameTicks:= 500; |
|
177 |
vgtSmallDamageTag: |
|
178 |
begin |
|
179 |
gear^.FrameTicks:= 1100 |
|
180 |
end; |
|
181 |
vgtBubble: |
|
182 |
begin |
|
183 |
dx:= 0.0000038654705 * random(10000); |
|
184 |
dy:= 0; |
|
185 |
if random(2) = 0 then |
|
186 |
dx := -dx; |
|
187 |
FrameTicks:= 250 + random(1751); |
|
188 |
Frame:= random(5) |
|
189 |
end; |
|
190 |
vgtSteam: |
|
191 |
begin |
|
192 |
dx:= 0.0000038654705 * random(10000); |
|
193 |
dy:= 0.001 * (random(85) + 95); |
|
194 |
if random(2) = 0 then |
|
195 |
dx := -dx; |
|
196 |
Frame:= 7 - random(3); |
|
197 |
FrameTicks:= cExplFrameTicks * 2; |
|
198 |
end; |
|
199 |
vgtAmmo: |
|
200 |
begin |
|
201 |
alpha:= 1.0; |
|
202 |
scale:= 1.0 |
|
203 |
end; |
|
204 |
vgtSmokeWhite, |
|
205 |
vgtSmoke: |
|
206 |
begin |
|
207 |
Scale:= 1.0; |
|
208 |
dx:= 0.0002 * (random(45) + 10); |
|
209 |
dy:= 0.0002 * (random(45) + 10); |
|
210 |
if random(2) = 0 then |
|
211 |
dx := -dx; |
|
212 |
Frame:= 7 - random(2); |
|
213 |
FrameTicks:= cExplFrameTicks * 2; |
|
214 |
end; |
|
215 |
vgtDust: |
|
216 |
begin |
|
217 |
dx:= 0.005 * (random(15) + 10); |
|
218 |
dy:= 0.001 * (random(40) + 20); |
|
219 |
if random(2) = 0 then dx := -dx; |
|
220 |
if random(2) = 0 then Tag:= 1 |
|
221 |
else Tag:= -1; |
|
222 |
Frame:= 7 - random(2); |
|
223 |
FrameTicks:= random(20) + 15; |
|
224 |
end; |
|
225 |
vgtSplash: |
|
226 |
begin |
|
227 |
dx:= 0; |
|
228 |
dy:= 0; |
|
229 |
FrameTicks:= 740; |
|
230 |
Frame:= 19; |
|
231 |
Scale:= 0.75; |
|
232 |
Timer:= 1; |
|
233 |
end; |
|
234 |
vgtDroplet: |
|
235 |
begin |
|
11862
cb137eb71556
pimp up random droplet movement vector init to create half-elliptic rather than square patterns - makes using piano less painful to the eyes
sheepluva
parents:
11046
diff
changeset
|
236 |
// => min speed ~ 0.098, max speed ~ 0.218, speed range ~ 0.120 |
cb137eb71556
pimp up random droplet movement vector init to create half-elliptic rather than square patterns - makes using piano less painful to the eyes
sheepluva
parents:
11046
diff
changeset
|
237 |
// => min angle(4096) ~ 129, max angle ~ 1919, angle range ~ 1790 |
cb137eb71556
pimp up random droplet movement vector init to create half-elliptic rather than square patterns - makes using piano less painful to the eyes
sheepluva
parents:
11046
diff
changeset
|
238 |
dx:= 0.001 * (98 + random(121)); // speed |
cb137eb71556
pimp up random droplet movement vector init to create half-elliptic rather than square patterns - makes using piano less painful to the eyes
sheepluva
parents:
11046
diff
changeset
|
239 |
Frame:= 129 + random(1791); // angle |
cb137eb71556
pimp up random droplet movement vector init to create half-elliptic rather than square patterns - makes using piano less painful to the eyes
sheepluva
parents:
11046
diff
changeset
|
240 |
dy:= -dx * hwFloat2Float(AngleSin(Frame)); |
cb137eb71556
pimp up random droplet movement vector init to create half-elliptic rather than square patterns - makes using piano less painful to the eyes
sheepluva
parents:
11046
diff
changeset
|
241 |
// divide by 2 to create an eliptic shape |
cb137eb71556
pimp up random droplet movement vector init to create half-elliptic rather than square patterns - makes using piano less painful to the eyes
sheepluva
parents:
11046
diff
changeset
|
242 |
dx:= dx * hwFloat2Float(AngleCos(Frame)) / 2; |
9287 | 243 |
FrameTicks:= 250 + random(1751); |
244 |
Frame:= random(3) |
|
245 |
end; |
|
246 |
vgtBeeTrace: |
|
247 |
begin |
|
248 |
FrameTicks:= 1000; |
|
249 |
Frame:= random(16); |
|
250 |
end; |
|
251 |
vgtSmokeRing: |
|
252 |
begin |
|
253 |
dx:= 0; |
|
254 |
dy:= 0; |
|
255 |
FrameTicks:= 600; |
|
256 |
Timer:= 0; |
|
257 |
Frame:= 0; |
|
258 |
scale:= 0.6; |
|
259 |
alpha:= 1; |
|
260 |
angle:= random(360); |
|
261 |
end; |
|
262 |
vgtFeather: |
|
263 |
begin |
|
264 |
t:= random(1024); |
|
265 |
sp:= 0.001 * (random(85) + 95); |
|
266 |
dx:= hwFloat2Float(AngleSin(t)) * sp; |
|
267 |
dy:= hwFloat2Float(AngleCos(t)) * sp; |
|
268 |
if random(2) = 0 then |
|
269 |
dx := -dx; |
|
270 |
if random(2) = 0 then |
|
271 |
dy := -dy; |
|
272 |
FrameTicks:= 650 + random(250); |
|
273 |
Frame:= 1 |
|
274 |
end; |
|
275 |
vgtHealthTag: |
|
276 |
begin |
|
277 |
Frame:= 0; |
|
14662
b390479f24c1
vgtHealthTag now supports setting FrameTicks <> 0 to disable automatic water handling
Wuzzy <Wuzzy2@mail.ru>
parents:
14589
diff
changeset
|
278 |
FrameTicks:= 0; |
9287 | 279 |
Timer:= 1500; |
280 |
dY:= -0.08; |
|
281 |
dX:= 0; |
|
282 |
end; |
|
283 |
vgtSmokeTrace, |
|
284 |
vgtEvilTrace: |
|
285 |
begin |
|
286 |
gear^.X:= gear^.X - 16; |
|
287 |
gear^.Y:= gear^.Y - 16; |
|
288 |
gear^.State:= 8; |
|
289 |
end; |
|
290 |
vgtBigExplosion: |
|
291 |
begin |
|
292 |
gear^.Angle:= random(360); |
|
293 |
end; |
|
294 |
vgtChunk: |
|
295 |
begin |
|
296 |
gear^.Frame:= random(4); |
|
297 |
t:= random(1024); |
|
298 |
sp:= 0.001 * (random(85) + 47); |
|
299 |
dx:= hwFloat2Float(AngleSin(t)) * sp; |
|
300 |
dy:= hwFloat2Float(AngleCos(t)) * sp * -2; |
|
301 |
if random(2) = 0 then |
|
302 |
dx := -dx; |
|
303 |
end; |
|
10015 | 304 |
vgtNote: |
9287 | 305 |
begin |
306 |
dx:= 0.005 * (random(15) + 10); |
|
307 |
dy:= -0.001 * (random(40) + 20); |
|
308 |
if random(2) = 0 then |
|
309 |
dx := -dx; |
|
310 |
Frame:= random(4); |
|
311 |
FrameTicks:= random(2000) + 1500; |
|
312 |
end; |
|
313 |
vgtBulletHit: |
|
314 |
begin |
|
315 |
dx:= 0; |
|
316 |
dy:= 0; |
|
317 |
FrameTicks:= 350; |
|
318 |
Frame:= 7; |
|
319 |
Angle:= 0; |
|
320 |
end; |
|
10015 | 321 |
vgtSmoothWindBar: |
9287 | 322 |
begin |
323 |
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 |
|
324 |
Tag:= hwRound(cWindSpeed * 72 / cMaxWindSpeed); |
|
325 |
end; |
|
326 |
vgtStraightShot: |
|
327 |
begin |
|
328 |
Angle:= 0; |
|
329 |
Scale:= 1.0; |
|
330 |
dx:= 0.001 * random(45); |
|
331 |
dy:= 0.001 * (random(20) + 25); |
|
332 |
State:= ord(sprHealth); |
|
333 |
if random(2) = 0 then |
|
334 |
dx := -dx; |
|
335 |
Frame:= 0; |
|
336 |
FrameTicks:= random(750) + 1250; |
|
337 |
State:= ord(sprSnowDust); |
|
338 |
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
|
339 |
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
|
340 |
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
|
341 |
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
|
342 |
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
|
343 |
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
|
344 |
end; |
9287 | 345 |
end; |
346 |
||
347 |
if State <> 0 then |
|
348 |
gear^.State:= State; |
|
349 |
||
350 |
case Gear^.Kind of |
|
12115
f214d6315b71
requested by CopherNeue - make "flatten-flakes" only exclude the foreground layers. testing on eyes/halloween seems ok.
nemo
parents:
11885
diff
changeset
|
351 |
vgtFlake: |
f214d6315b71
requested by CopherNeue - make "flatten-flakes" only exclude the foreground layers. testing on eyes/halloween seems ok.
nemo
parents:
11885
diff
changeset
|
352 |
if random(3) = 0 then |
9287 | 353 |
begin |
354 |
gear^.Scale:= 0.5; |
|
355 |
gear^.Layer:= 0 // 33% - far back |
|
356 |
end |
|
357 |
else if random(3) = 0 then |
|
358 |
begin |
|
359 |
gear^.Scale:= 0.8; |
|
360 |
gear^.Layer:= 4 // 22% - mid-distance |
|
361 |
end |
|
362 |
else if random(3) <> 0 then |
|
363 |
gear^.Layer:= 5 // 30% - just behind land |
|
12115
f214d6315b71
requested by CopherNeue - make "flatten-flakes" only exclude the foreground layers. testing on eyes/halloween seems ok.
nemo
parents:
11885
diff
changeset
|
364 |
else if (not cFlattenFlakes) and (random(2) = 0) then |
9287 | 365 |
gear^.Layer:= 6 // 7% - just in front of land |
12115
f214d6315b71
requested by CopherNeue - make "flatten-flakes" only exclude the foreground layers. testing on eyes/halloween seems ok.
nemo
parents:
11885
diff
changeset
|
366 |
else if not cFlattenFlakes then |
9287 | 367 |
begin |
368 |
gear^.Scale:= 1.5; |
|
12115
f214d6315b71
requested by CopherNeue - make "flatten-flakes" only exclude the foreground layers. testing on eyes/halloween seems ok.
nemo
parents:
11885
diff
changeset
|
369 |
gear^.Layer:= 2 // 7% - close up |
f214d6315b71
requested by CopherNeue - make "flatten-flakes" only exclude the foreground layers. testing on eyes/halloween seems ok.
nemo
parents:
11885
diff
changeset
|
370 |
end |
f214d6315b71
requested by CopherNeue - make "flatten-flakes" only exclude the foreground layers. testing on eyes/halloween seems ok.
nemo
parents:
11885
diff
changeset
|
371 |
else begin |
f214d6315b71
requested by CopherNeue - make "flatten-flakes" only exclude the foreground layers. testing on eyes/halloween seems ok.
nemo
parents:
11885
diff
changeset
|
372 |
gear^.Layer:= 0; |
f214d6315b71
requested by CopherNeue - make "flatten-flakes" only exclude the foreground layers. testing on eyes/halloween seems ok.
nemo
parents:
11885
diff
changeset
|
373 |
gear^.Scale:= 0.5 |
f214d6315b71
requested by CopherNeue - make "flatten-flakes" only exclude the foreground layers. testing on eyes/halloween seems ok.
nemo
parents:
11885
diff
changeset
|
374 |
end; |
9287 | 375 |
|
376 |
vgtCloud: if cFlattenClouds then gear^.Layer:= 5 |
|
377 |
else if random(3) = 0 then |
|
378 |
begin |
|
379 |
gear^.Scale:= 0.25; |
|
380 |
gear^.Layer:= 0 |
|
381 |
end |
|
382 |
else if random(2) = 0 then |
|
383 |
gear^.Layer:= 5 |
|
384 |
else |
|
385 |
begin |
|
386 |
gear^.Scale:= 0.4; |
|
387 |
gear^.Layer:= 4 |
|
388 |
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
|
389 |
vgtNoPlaceWarn: gear^.Layer:= 6; |
9287 | 390 |
|
391 |
// 0: this layer is very distant in the background when in stereo |
|
392 |
vgtTeamHealthSorter, |
|
393 |
vgtSmoothWindBar: gear^.Layer:= 0; |
|
394 |
||
395 |
||
396 |
// 1: this layer is on the land level (which is close but behind the screen plane) when stereo |
|
397 |
vgtSmokeTrace, |
|
398 |
vgtEvilTrace, |
|
399 |
vgtLineTrail, |
|
400 |
vgtSmoke, |
|
401 |
vgtSmokeWhite, |
|
402 |
vgtDust, |
|
403 |
vgtFire, |
|
404 |
vgtSplash, |
|
405 |
vgtDroplet, |
|
406 |
vgtBubble: gear^.Layer:= 1; |
|
407 |
||
408 |
// 3: this layer is on the screen plane (depth = 0) when stereo |
|
409 |
vgtSpeechBubble, |
|
410 |
vgtSmallDamageTag, |
|
411 |
vgtHealthTag, |
|
412 |
vgtStraightShot, |
|
10876 | 413 |
vgtFeather, |
9287 | 414 |
vgtChunk: gear^.Layer:= 3; |
415 |
||
416 |
// 2: this layer is outside the screen when stereo |
|
417 |
vgtExplosion, |
|
418 |
vgtBigExplosion, |
|
419 |
vgtExplPart, |
|
420 |
vgtExplPart2, |
|
421 |
vgtSteam, |
|
422 |
vgtAmmo, |
|
423 |
vgtShell, |
|
424 |
vgtEgg, |
|
425 |
vgtBeeTrace, |
|
426 |
vgtSmokeRing, |
|
427 |
vgtNote, |
|
428 |
vgtBulletHit, |
|
429 |
vgtCircle: gear^.Layer:= 2 |
|
430 |
end; |
|
431 |
||
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
|
432 |
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
|
433 |
|
14589
ab79cd4a7382
Reverse order of visual gears linked list
Wuzzy <Wuzzy2@mail.ru>
parents:
14577
diff
changeset
|
434 |
if VisualGearLayersStart[gear^.Layer] = nil then |
ab79cd4a7382
Reverse order of visual gears linked list
Wuzzy <Wuzzy2@mail.ru>
parents:
14577
diff
changeset
|
435 |
VisualGearLayersStart[gear^.Layer]:= gear; |
ab79cd4a7382
Reverse order of visual gears linked list
Wuzzy <Wuzzy2@mail.ru>
parents:
14577
diff
changeset
|
436 |
|
ab79cd4a7382
Reverse order of visual gears linked list
Wuzzy <Wuzzy2@mail.ru>
parents:
14577
diff
changeset
|
437 |
if VisualGearLayersEnd[gear^.Layer] <> nil then |
9287 | 438 |
begin |
14589
ab79cd4a7382
Reverse order of visual gears linked list
Wuzzy <Wuzzy2@mail.ru>
parents:
14577
diff
changeset
|
439 |
VisualGearLayersEnd[gear^.Layer]^.NextGear:= gear; |
ab79cd4a7382
Reverse order of visual gears linked list
Wuzzy <Wuzzy2@mail.ru>
parents:
14577
diff
changeset
|
440 |
gear^.PrevGear:= VisualGearLayersEnd[gear^.Layer] |
9287 | 441 |
end; |
14589
ab79cd4a7382
Reverse order of visual gears linked list
Wuzzy <Wuzzy2@mail.ru>
parents:
14577
diff
changeset
|
442 |
VisualGearLayersEnd[gear^.Layer]:= gear; |
9287 | 443 |
|
444 |
AddVisualGear:= gear; |
|
11885
2eac7a96b342
Lua API: Add GetVisualGearType, onVisualGearAdd, onVisualGearDelete
Wuzzy <almikes@aol.com>
parents:
11862
diff
changeset
|
445 |
ScriptCall('onVisualGearAdd', gear^.uid); |
9287 | 446 |
end; |
447 |
||
448 |
procedure DeleteVisualGear(Gear: PVisualGear); |
|
449 |
begin |
|
11885
2eac7a96b342
Lua API: Add GetVisualGearType, onVisualGearAdd, onVisualGearDelete
Wuzzy <almikes@aol.com>
parents:
11862
diff
changeset
|
450 |
ScriptCall('onVisualGearDelete', Gear^.uid); |
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
|
451 |
FreeAndNilTexture(Gear^.Tex); |
9287 | 452 |
|
14589
ab79cd4a7382
Reverse order of visual gears linked list
Wuzzy <Wuzzy2@mail.ru>
parents:
14577
diff
changeset
|
453 |
if (Gear^.NextGear = nil) and (Gear^.PrevGear = nil) then |
ab79cd4a7382
Reverse order of visual gears linked list
Wuzzy <Wuzzy2@mail.ru>
parents:
14577
diff
changeset
|
454 |
begin |
ab79cd4a7382
Reverse order of visual gears linked list
Wuzzy <Wuzzy2@mail.ru>
parents:
14577
diff
changeset
|
455 |
VisualGearLayersStart[Gear^.Layer]:= nil; |
ab79cd4a7382
Reverse order of visual gears linked list
Wuzzy <Wuzzy2@mail.ru>
parents:
14577
diff
changeset
|
456 |
VisualGearLayersEnd[Gear^.Layer]:= nil; |
ab79cd4a7382
Reverse order of visual gears linked list
Wuzzy <Wuzzy2@mail.ru>
parents:
14577
diff
changeset
|
457 |
end; |
9287 | 458 |
if Gear^.PrevGear <> nil then |
459 |
Gear^.PrevGear^.NextGear:= Gear^.NextGear |
|
14589
ab79cd4a7382
Reverse order of visual gears linked list
Wuzzy <Wuzzy2@mail.ru>
parents:
14577
diff
changeset
|
460 |
else if Gear^.NextGear <> nil then |
ab79cd4a7382
Reverse order of visual gears linked list
Wuzzy <Wuzzy2@mail.ru>
parents:
14577
diff
changeset
|
461 |
VisualGearLayersStart[Gear^.Layer]:= Gear^.NextGear; |
ab79cd4a7382
Reverse order of visual gears linked list
Wuzzy <Wuzzy2@mail.ru>
parents:
14577
diff
changeset
|
462 |
if Gear^.NextGear <> nil then |
ab79cd4a7382
Reverse order of visual gears linked list
Wuzzy <Wuzzy2@mail.ru>
parents:
14577
diff
changeset
|
463 |
Gear^.NextGear^.PrevGear:= Gear^.PrevGear |
ab79cd4a7382
Reverse order of visual gears linked list
Wuzzy <Wuzzy2@mail.ru>
parents:
14577
diff
changeset
|
464 |
else if Gear^.PrevGear <> nil then |
ab79cd4a7382
Reverse order of visual gears linked list
Wuzzy <Wuzzy2@mail.ru>
parents:
14577
diff
changeset
|
465 |
VisualGearLayersEnd[Gear^.Layer]:= Gear^.PrevGear; |
9287 | 466 |
|
467 |
if lastVisualGearByUID = Gear then |
|
468 |
lastVisualGearByUID:= nil; |
|
469 |
||
470 |
Dispose(Gear); |
|
471 |
end; |
|
472 |
||
473 |
function VisualGearByUID(uid : Longword) : PVisualGear; |
|
474 |
var vg: PVisualGear; |
|
475 |
i: LongWord; |
|
476 |
begin |
|
477 |
VisualGearByUID:= nil; |
|
478 |
if uid = 0 then |
|
479 |
exit; |
|
480 |
if (lastVisualGearByUID <> nil) and (lastVisualGearByUID^.uid = uid) then |
|
481 |
begin |
|
482 |
VisualGearByUID:= lastVisualGearByUID; |
|
483 |
exit |
|
484 |
end; |
|
485 |
// 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 |
|
486 |
for i:= 2 to 5 do |
|
487 |
begin |
|
14589
ab79cd4a7382
Reverse order of visual gears linked list
Wuzzy <Wuzzy2@mail.ru>
parents:
14577
diff
changeset
|
488 |
vg:= VisualGearLayersStart[i mod 4]; |
9287 | 489 |
while vg <> nil do |
490 |
begin |
|
491 |
if vg^.uid = uid then |
|
492 |
begin |
|
493 |
lastVisualGearByUID:= vg; |
|
494 |
VisualGearByUID:= vg; |
|
495 |
exit |
|
496 |
end; |
|
497 |
vg:= vg^.NextGear |
|
498 |
end |
|
499 |
end |
|
500 |
end; |
|
501 |
||
502 |
||
503 |
end. |