165 Frame:= random(vobFramesCount); |
169 Frame:= random(vobFramesCount); |
166 end; |
170 end; |
167 Angle:= random * 360; |
171 Angle:= random * 360; |
168 dx:= 0.0000038654705 * random(10000); |
172 dx:= 0.0000038654705 * random(10000); |
169 dy:= 0.000003506096 * random(7000); |
173 dy:= 0.000003506096 * random(7000); |
170 if random(2) = 0 then dx := -dx; |
174 if random(2) = 0 then |
171 if SuddenDeathDmg then dAngle:= (random(2) * 2 - 1) * (1 + random) * vobSDVelocity / 1000 |
175 dx := -dx; |
172 else dAngle:= (random(2) * 2 - 1) * (1 + random) * vobVelocity / 1000 |
176 if SuddenDeathDmg then |
173 end; |
177 dAngle:= (random(2) * 2 - 1) * (1 + random) * vobSDVelocity / 1000 |
174 vgtCloud: begin |
178 else |
|
179 dAngle:= (random(2) * 2 - 1) * (1 + random) * vobVelocity / 1000 |
|
180 end; |
|
181 vgtCloud: |
|
182 begin |
175 Frame:= random(4); |
183 Frame:= random(4); |
176 dx:= 0.5 + 0.1 * random(5); // how much the cloud will be affected by wind |
184 dx:= 0.5 + 0.1 * random(5); // how much the cloud will be affected by wind |
177 timer:= random(4096); |
185 timer:= random(4096); |
178 Scale:= 1.0 |
186 Scale:= 1.0 |
179 end; |
187 end; |
180 vgtExplPart, |
188 vgtExplPart, |
181 vgtExplPart2: begin |
189 vgtExplPart2: |
|
190 begin |
182 t:= random(1024); |
191 t:= random(1024); |
183 sp:= 0.001 * (random(95) + 70); |
192 sp:= 0.001 * (random(95) + 70); |
184 dx:= hwFloat2Float(AngleSin(t)) * sp; |
193 dx:= hwFloat2Float(AngleSin(t)) * sp; |
185 dy:= hwFloat2Float(AngleCos(t)) * sp; |
194 dy:= hwFloat2Float(AngleCos(t)) * sp; |
186 if random(2) = 0 then dx := -dx; |
195 if random(2) = 0 then |
187 if random(2) = 0 then dy := -dy; |
196 dx := -dx; |
|
197 if random(2) = 0 then |
|
198 dy := -dy; |
188 Frame:= 7 - random(3); |
199 Frame:= 7 - random(3); |
189 FrameTicks:= cExplFrameTicks |
200 FrameTicks:= cExplFrameTicks |
190 end; |
201 end; |
191 vgtFire: begin |
202 vgtFire: |
|
203 begin |
192 t:= random(1024); |
204 t:= random(1024); |
193 sp:= 0.001 * (random(85) + 95); |
205 sp:= 0.001 * (random(85) + 95); |
194 dx:= hwFloat2Float(AngleSin(t)) * sp; |
206 dx:= hwFloat2Float(AngleSin(t)) * sp; |
195 dy:= hwFloat2Float(AngleCos(t)) * sp; |
207 dy:= hwFloat2Float(AngleCos(t)) * sp; |
196 if random(2) = 0 then dx := -dx; |
208 if random(2) = 0 then |
197 if random(2) = 0 then dy := -dy; |
209 dx := -dx; |
|
210 if random(2) = 0 then |
|
211 dy := -dy; |
198 FrameTicks:= 650 + random(250); |
212 FrameTicks:= 650 + random(250); |
199 Frame:= random(8) |
213 Frame:= random(8) |
200 end; |
214 end; |
201 vgtEgg: begin |
215 vgtEgg: |
|
216 begin |
202 t:= random(1024); |
217 t:= random(1024); |
203 sp:= 0.001 * (random(85) + 95); |
218 sp:= 0.001 * (random(85) + 95); |
204 dx:= hwFloat2Float(AngleSin(t)) * sp; |
219 dx:= hwFloat2Float(AngleSin(t)) * sp; |
205 dy:= hwFloat2Float(AngleCos(t)) * sp; |
220 dy:= hwFloat2Float(AngleCos(t)) * sp; |
206 if random(2) = 0 then dx := -dx; |
221 if random(2) = 0 then |
207 if random(2) = 0 then dy := -dy; |
222 dx := -dx; |
|
223 if random(2) = 0 then |
|
224 dy := -dy; |
208 FrameTicks:= 650 + random(250); |
225 FrameTicks:= 650 + random(250); |
209 Frame:= 1 |
226 Frame:= 1 |
210 end; |
227 end; |
211 vgtShell: FrameTicks:= 500; |
228 vgtShell: FrameTicks:= 500; |
212 vgtSmallDamageTag: begin |
229 vgtSmallDamageTag: |
|
230 begin |
213 gear^.FrameTicks:= 1100 |
231 gear^.FrameTicks:= 1100 |
214 end; |
232 end; |
215 vgtBubble: begin |
233 vgtBubble: |
|
234 begin |
216 dx:= 0.0000038654705 * random(10000); |
235 dx:= 0.0000038654705 * random(10000); |
217 dy:= 0; |
236 dy:= 0; |
218 if random(2) = 0 then dx := -dx; |
237 if random(2) = 0 then |
|
238 dx := -dx; |
219 FrameTicks:= 250 + random(1751); |
239 FrameTicks:= 250 + random(1751); |
220 Frame:= random(5) |
240 Frame:= random(5) |
221 end; |
241 end; |
222 vgtSteam: begin |
242 vgtSteam: |
|
243 begin |
223 dx:= 0.0000038654705 * random(10000); |
244 dx:= 0.0000038654705 * random(10000); |
224 dy:= 0.001 * (random(85) + 95); |
245 dy:= 0.001 * (random(85) + 95); |
225 if random(2) = 0 then dx := -dx; |
246 if random(2) = 0 then |
|
247 dx := -dx; |
226 Frame:= 7 - random(3); |
248 Frame:= 7 - random(3); |
227 FrameTicks:= cExplFrameTicks * 2; |
249 FrameTicks:= cExplFrameTicks * 2; |
228 end; |
250 end; |
229 vgtAmmo: begin |
251 vgtAmmo: |
|
252 begin |
230 alpha:= 1.0; |
253 alpha:= 1.0; |
231 scale:= 1.0 |
254 scale:= 1.0 |
232 end; |
255 end; |
233 vgtSmokeWhite, |
256 vgtSmokeWhite, |
234 vgtSmoke: begin |
257 vgtSmoke: |
|
258 begin |
235 Scale:= 1.0; |
259 Scale:= 1.0; |
236 dx:= 0.0002 * (random(45) + 10); |
260 dx:= 0.0002 * (random(45) + 10); |
237 dy:= 0.0002 * (random(45) + 10); |
261 dy:= 0.0002 * (random(45) + 10); |
238 if random(2) = 0 then dx := -dx; |
262 if random(2) = 0 then |
|
263 dx := -dx; |
239 Frame:= 7 - random(2); |
264 Frame:= 7 - random(2); |
240 FrameTicks:= cExplFrameTicks * 2; |
265 FrameTicks:= cExplFrameTicks * 2; |
241 end; |
266 end; |
242 vgtDust: begin |
267 vgtDust: |
|
268 begin |
243 dx:= 0.005 * (random(15) + 10); |
269 dx:= 0.005 * (random(15) + 10); |
244 dy:= 0.001 * (random(40) + 20); |
270 dy:= 0.001 * (random(40) + 20); |
245 if random(2) = 0 then dx := -dx; |
271 if random(2) = 0 then |
|
272 dx := -dx; |
246 Frame:= 7 - random(2); |
273 Frame:= 7 - random(2); |
247 FrameTicks:= random(20) + 15; |
274 FrameTicks:= random(20) + 15; |
248 end; |
275 end; |
249 vgtSplash: begin |
276 vgtSplash: |
|
277 begin |
250 dx:= 0; |
278 dx:= 0; |
251 dy:= 0; |
279 dy:= 0; |
252 FrameTicks:= 740; |
280 FrameTicks:= 740; |
253 Frame:= 19; |
281 Frame:= 19; |
254 end; |
282 end; |
255 vgtDroplet: begin |
283 vgtDroplet: |
|
284 begin |
256 dx:= 0.001 * (random(75) + 15); |
285 dx:= 0.001 * (random(75) + 15); |
257 dy:= -0.001 * (random(80) + 120); |
286 dy:= -0.001 * (random(80) + 120); |
258 if random(2) = 0 then dx := -dx; |
287 if random(2) = 0 then |
|
288 dx := -dx; |
259 FrameTicks:= 250 + random(1751); |
289 FrameTicks:= 250 + random(1751); |
260 Frame:= random(3) |
290 Frame:= random(3) |
261 end; |
291 end; |
262 vgtBeeTrace: begin |
292 vgtBeeTrace: |
|
293 begin |
263 FrameTicks:= 1000; |
294 FrameTicks:= 1000; |
264 Frame:= random(16); |
295 Frame:= random(16); |
265 end; |
296 end; |
266 vgtSmokeRing: begin |
297 vgtSmokeRing: |
|
298 begin |
267 dx:= 0; |
299 dx:= 0; |
268 dy:= 0; |
300 dy:= 0; |
269 FrameTicks:= 600; |
301 FrameTicks:= 600; |
270 Timer:= 0; |
302 Timer:= 0; |
271 Frame:= 0; |
303 Frame:= 0; |
272 scale:= 0.6; |
304 scale:= 0.6; |
273 alpha:= 1; |
305 alpha:= 1; |
274 angle:= random(360); |
306 angle:= random(360); |
275 end; |
307 end; |
276 vgtFeather: begin |
308 vgtFeather: |
|
309 begin |
277 t:= random(1024); |
310 t:= random(1024); |
278 sp:= 0.001 * (random(85) + 95); |
311 sp:= 0.001 * (random(85) + 95); |
279 dx:= hwFloat2Float(AngleSin(t)) * sp; |
312 dx:= hwFloat2Float(AngleSin(t)) * sp; |
280 dy:= hwFloat2Float(AngleCos(t)) * sp; |
313 dy:= hwFloat2Float(AngleCos(t)) * sp; |
281 if random(2) = 0 then dx := -dx; |
314 if random(2) = 0 then |
282 if random(2) = 0 then dy := -dy; |
315 dx := -dx; |
|
316 if random(2) = 0 then |
|
317 dy := -dy; |
283 FrameTicks:= 650 + random(250); |
318 FrameTicks:= 650 + random(250); |
284 Frame:= 1 |
319 Frame:= 1 |
285 end; |
320 end; |
286 vgtHealthTag: begin |
321 vgtHealthTag: |
|
322 begin |
287 Frame:= 0; |
323 Frame:= 0; |
288 Timer:= 1500; |
324 Timer:= 1500; |
289 dY:= -0.08; |
325 dY:= -0.08; |
290 dX:= 0; |
326 dX:= 0; |
291 //gear^.Z:= 2002; |
327 //gear^.Z:= 2002; |
292 end; |
328 end; |
293 vgtSmokeTrace, |
329 vgtSmokeTrace, |
294 vgtEvilTrace: begin |
330 vgtEvilTrace: |
|
331 begin |
295 gear^.X:= gear^.X - 16; |
332 gear^.X:= gear^.X - 16; |
296 gear^.Y:= gear^.Y - 16; |
333 gear^.Y:= gear^.Y - 16; |
297 gear^.State:= 8; |
334 gear^.State:= 8; |
298 //gear^.Z:= cSmokeZ |
335 //gear^.Z:= cSmokeZ |
299 end; |
336 end; |
300 vgtBigExplosion: begin |
337 vgtBigExplosion: |
|
338 begin |
301 gear^.Angle:= random(360); |
339 gear^.Angle:= random(360); |
302 end; |
340 end; |
303 vgtChunk: begin |
341 vgtChunk: |
|
342 begin |
304 gear^.Frame:= random(4); |
343 gear^.Frame:= random(4); |
305 t:= random(1024); |
344 t:= random(1024); |
306 sp:= 0.001 * (random(85) + 47); |
345 sp:= 0.001 * (random(85) + 47); |
307 dx:= hwFloat2Float(AngleSin(t)) * sp; |
346 dx:= hwFloat2Float(AngleSin(t)) * sp; |
308 dy:= hwFloat2Float(AngleCos(t)) * sp * -2; |
347 dy:= hwFloat2Float(AngleCos(t)) * sp * -2; |
309 if random(2) = 0 then dx := -dx; |
348 if random(2) = 0 then |
310 end; |
349 dx := -dx; |
311 vgtNote: begin |
350 end; |
|
351 vgtNote: |
|
352 begin |
312 dx:= 0.005 * (random(15) + 10); |
353 dx:= 0.005 * (random(15) + 10); |
313 dy:= -0.001 * (random(40) + 20); |
354 dy:= -0.001 * (random(40) + 20); |
314 if random(2) = 0 then dx := -dx; |
355 if random(2) = 0 then |
|
356 dx := -dx; |
315 Frame:= random(4); |
357 Frame:= random(4); |
316 FrameTicks:= random(2000) + 1500; |
358 FrameTicks:= random(2000) + 1500; |
317 end; |
359 end; |
318 vgtBulletHit: begin |
360 vgtBulletHit: |
|
361 begin |
319 dx:= 0; |
362 dx:= 0; |
320 dy:= 0; |
363 dy:= 0; |
321 FrameTicks:= 350; |
364 FrameTicks:= 350; |
322 Frame:= 7; |
365 Frame:= 7; |
323 Angle:= 0; |
366 Angle:= 0; |
324 end; |
367 end; |
325 vgtSmoothWindBar: Tag:= hwRound(cWindSpeed * 72 / cMaxWindSpeed); |
368 vgtSmoothWindBar: Tag:= hwRound(cWindSpeed * 72 / cMaxWindSpeed); |
326 vgtStraightShot: begin |
369 vgtStraightShot: |
|
370 begin |
327 Angle:= 0; |
371 Angle:= 0; |
328 Scale:= 1.0; |
372 Scale:= 1.0; |
329 dx:= 0.001 * random(45); |
373 dx:= 0.001 * random(45); |
330 dy:= 0.001 * (random(20) + 25); |
374 dy:= 0.001 * (random(20) + 25); |
331 State:= ord(sprHealth); |
375 State:= ord(sprHealth); |
332 if random(2) = 0 then dx := -dx; |
376 if random(2) = 0 then |
|
377 dx := -dx; |
333 Frame:= 0; |
378 Frame:= 0; |
334 FrameTicks:= random(750) + 1250; |
379 FrameTicks:= random(750) + 1250; |
335 State:= ord(sprSnowDust); |
380 State:= ord(sprSnowDust); |
336 end; |
381 end; |
337 end; |
382 end; |
338 |
383 |
339 if State <> 0 then gear^.State:= State; |
384 if State <> 0 then |
|
385 gear^.State:= State; |
340 |
386 |
341 case Gear^.Kind of |
387 case Gear^.Kind of |
342 vgtFlake: if cFlattenFlakes then gear^.Layer:= 0 |
388 vgtFlake: if cFlattenFlakes then |
|
389 gear^.Layer:= 0 |
343 else if random(3) = 0 then |
390 else if random(3) = 0 then |
344 begin |
391 begin |
345 gear^.Scale:= 0.5; |
392 gear^.Scale:= 0.5; |
346 gear^.Layer:= 0 // 33% - far back |
393 gear^.Layer:= 0 // 33% - far back |
347 end |
394 end |
348 else if random(3) = 0 then |
395 else if random(3) = 0 then |
349 begin |
396 begin |
350 gear^.Scale:= 0.8; |
397 gear^.Scale:= 0.8; |
351 gear^.Layer:= 4 // 22% - mid-distance |
398 gear^.Layer:= 4 // 22% - mid-distance |
352 end |
399 end |
353 else if random(3) <> 0 then gear^.Layer:= 5 // 30% - just behind land |
400 else if random(3) <> 0 then |
354 else if random(2) = 0 then gear^.Layer:= 6 // 7% - just in front of land |
401 gear^.Layer:= 5 // 30% - just behind land |
355 else begin |
402 else if random(2) = 0 then |
356 gear^.Scale:= 1.5; |
403 gear^.Layer:= 6 // 7% - just in front of land |
357 gear^.Layer:= 2; // 7% - close up |
404 else |
358 end; |
405 begin |
|
406 gear^.Scale:= 1.5; |
|
407 gear^.Layer:= 2; // 7% - close up |
|
408 end; |
359 |
409 |
360 vgtCloud: if cFlattenClouds then gear^.Layer:= 5 |
410 vgtCloud: if cFlattenClouds then gear^.Layer:= 5 |
361 else if random(3) = 0 then |
411 else if random(3) = 0 then |
362 begin |
412 begin |
363 gear^.Scale:= 0.25; |
413 gear^.Scale:= 0.25; |
364 gear^.Layer:= 0 |
414 gear^.Layer:= 0 |
365 end |
415 end |
366 else if random(2) = 0 then gear^.Layer:= 5 |
416 else if random(2) = 0 then |
367 else begin |
417 gear^.Layer:= 5 |
368 gear^.Scale:= 0.4; |
418 else |
369 gear^.Layer:= 4 |
419 begin |
370 end; |
420 gear^.Scale:= 0.4; |
|
421 gear^.Layer:= 4 |
|
422 end; |
371 |
423 |
372 // 0: this layer is very distant in the background when in stereo |
424 // 0: this layer is very distant in the background when in stereo |
373 vgtTeamHealthSorter, |
425 vgtTeamHealthSorter, |
374 vgtSmoothWindBar: gear^.Layer:= 0; |
426 vgtSmoothWindBar: gear^.Layer:= 0; |
375 |
427 |
423 procedure DeleteVisualGear(Gear: PVisualGear); |
475 procedure DeleteVisualGear(Gear: PVisualGear); |
424 begin |
476 begin |
425 FreeTexture(Gear^.Tex); |
477 FreeTexture(Gear^.Tex); |
426 Gear^.Tex:= nil; |
478 Gear^.Tex:= nil; |
427 |
479 |
428 if Gear^.NextGear <> nil then Gear^.NextGear^.PrevGear:= Gear^.PrevGear; |
480 if Gear^.NextGear <> nil then |
429 if Gear^.PrevGear <> nil then Gear^.PrevGear^.NextGear:= Gear^.NextGear |
481 Gear^.NextGear^.PrevGear:= Gear^.PrevGear; |
430 else VisualGearLayers[Gear^.Layer]:= Gear^.NextGear; |
482 if Gear^.PrevGear <> nil then |
431 |
483 Gear^.PrevGear^.NextGear:= Gear^.NextGear |
432 if lastVisualGearByUID = Gear then lastVisualGearByUID:= nil; |
484 else |
|
485 VisualGearLayers[Gear^.Layer]:= Gear^.NextGear; |
|
486 |
|
487 if lastVisualGearByUID = Gear then |
|
488 lastVisualGearByUID:= nil; |
433 |
489 |
434 Dispose(Gear); |
490 Dispose(Gear); |
435 end; |
491 end; |
436 |
492 |
437 procedure ProcessVisualGears(Steps: Longword); |
493 procedure ProcessVisualGears(Steps: Longword); |
438 var Gear, t: PVisualGear; |
494 var Gear, t: PVisualGear; |
439 i: LongWord; |
495 i: LongWord; |
440 begin |
496 begin |
441 if Steps = 0 then exit; |
497 if Steps = 0 then |
|
498 exit; |
442 |
499 |
443 for i:= 0 to 6 do |
500 for i:= 0 to 6 do |
444 begin |
501 begin |
445 t:= VisualGearLayers[i]; |
502 t:= VisualGearLayers[i]; |
446 while t <> nil do |
503 while t <> nil do |
447 begin |
504 begin |
448 Gear:= t; |
505 Gear:= t; |
449 t:= Gear^.NextGear; |
506 t:= Gear^.NextGear; |
450 Gear^.doStep(Gear, Steps) |
507 Gear^.doStep(Gear, Steps) |
451 end; |
508 end; |
452 end |
509 end |
453 end; |
510 end; |
454 |
511 |
455 procedure KickFlakes(Radius, X, Y: LongInt); |
512 procedure KickFlakes(Radius, X, Y: LongInt); |
456 var Gear, t: PVisualGear; |
513 var Gear, t: PVisualGear; |
457 dmg, i: LongInt; |
514 dmg, i: LongInt; |
458 begin |
515 begin |
459 if (vobCount = 0) or (vobCount > 200) then exit; |
516 if (vobCount = 0) or (vobCount > 200) then |
|
517 exit; |
460 for i:= 2 to 6 do |
518 for i:= 2 to 6 do |
461 if i <> 3 then |
519 if i <> 3 then |
462 begin |
520 begin |
463 t:= VisualGearLayers[i]; |
521 t:= VisualGearLayers[i]; |
464 while t <> nil do |
522 while t <> nil do |
465 begin |
523 begin |
466 Gear:= t; |
524 Gear:= t; |
467 if Gear^.Kind = vgtFlake then |
525 if Gear^.Kind = vgtFlake then |
468 begin |
526 begin |
469 // Damage calc from doMakeExplosion |
527 // Damage calc from doMakeExplosion |
470 dmg:= Min(101, Radius + cHHRadius div 2 - LongInt(abs(round(Gear^.X) - X) + abs(round(Gear^.Y) - Y)) div 5); |
528 dmg:= Min(101, Radius + cHHRadius div 2 - LongInt(abs(round(Gear^.X) - X) + abs(round(Gear^.Y) - Y)) div 5); |
471 if dmg > 1 then |
529 if dmg > 1 then |
472 begin |
530 begin |
473 Gear^.tdX:= 0.02 * dmg + 0.01; |
531 Gear^.tdX:= 0.02 * dmg + 0.01; |
474 if Gear^.X - X < 0 then Gear^.tdX := -Gear^.tdX; |
532 if Gear^.X - X < 0 then |
475 Gear^.tdY:= 0.02 * dmg + 0.01; |
533 Gear^.tdX := -Gear^.tdX; |
476 if Gear^.Y - Y < 0 then Gear^.tdY := -Gear^.tdY; |
534 Gear^.tdY:= 0.02 * dmg + 0.01; |
477 Gear^.Timer:= 200 |
535 if Gear^.Y - Y < 0 then |
478 end |
536 Gear^.tdY := -Gear^.tdY; |
479 end; |
537 Gear^.Timer:= 200 |
480 t:= Gear^.NextGear |
538 end |
481 end |
539 end; |
482 end |
540 t:= Gear^.NextGear |
|
541 end |
|
542 end |
483 end; |
543 end; |
484 |
544 |
485 procedure DrawVisualGears(Layer: LongWord); |
545 procedure DrawVisualGears(Layer: LongWord); |
486 var Gear: PVisualGear; |
546 var Gear: PVisualGear; |
487 tinted: boolean; |
547 tinted: boolean; |
525 DrawTextureF(SpritesData[sprFlake].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height) |
585 DrawTextureF(SpritesData[sprFlake].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height) |
526 else |
586 else |
527 DrawRotatedTextureF(SpritesData[sprFlake].Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height, Gear^.Angle) |
587 DrawRotatedTextureF(SpritesData[sprFlake].Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height, Gear^.Angle) |
528 end; |
588 end; |
529 end; |
589 end; |
530 if Gear^.Tint <> $FFFFFFFF then Tint($FF,$FF,$FF,$FF); |
590 if Gear^.Tint <> $FFFFFFFF then |
|
591 Tint($FF,$FF,$FF,$FF); |
531 Gear:= Gear^.NextGear |
592 Gear:= Gear^.NextGear |
532 end |
593 end |
533 end; |
594 end; |
534 // this layer is on the land level (which is close but behind the screen plane) when stereo |
595 // this layer is on the land level (which is close but behind the screen plane) when stereo |
535 1: begin |
596 1: begin |
536 Gear:= VisualGearLayers[1]; |
597 Gear:= VisualGearLayers[1]; |
537 while Gear <> nil do |
598 while Gear <> nil do |
538 begin |
599 begin |
539 //tinted:= false; |
600 //tinted:= false; |
540 if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint); |
601 if Gear^.Tint <> $FFFFFFFF then |
|
602 Tint(Gear^.Tint); |
541 case Gear^.Kind of |
603 case Gear^.Kind of |
542 vgtFlake: if SuddenDeathDmg then |
604 vgtFlake: if SuddenDeathDmg then |
543 if vobSDVelocity = 0 then |
605 if vobSDVelocity = 0 then |
544 DrawSprite(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame) |
606 DrawSprite(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame) |
545 else |
607 else |
547 else |
609 else |
548 if vobVelocity = 0 then |
610 if vobVelocity = 0 then |
549 DrawSprite(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame) |
611 DrawSprite(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame) |
550 else |
612 else |
551 DrawRotatedF(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle); |
613 DrawRotatedF(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle); |
552 vgtSmokeTrace: if Gear^.State < 8 then DrawSprite(sprSmokeTrace, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.State); |
614 vgtSmokeTrace: if Gear^.State < 8 then |
553 vgtEvilTrace: if Gear^.State < 8 then DrawSprite(sprEvilTrace, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.State); |
615 DrawSprite(sprSmokeTrace, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.State); |
|
616 vgtEvilTrace: if Gear^.State < 8 then |
|
617 DrawSprite(sprEvilTrace, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.State); |
554 vgtLineTrail: DrawLine(Gear^.X, Gear^.Y, Gear^.dX, Gear^.dY, 1.0, $FF, min(Gear^.Timer, $C0), min(Gear^.Timer, $80), min(Gear^.Timer, $FF)); |
618 vgtLineTrail: DrawLine(Gear^.X, Gear^.Y, Gear^.dX, Gear^.dY, 1.0, $FF, min(Gear^.Timer, $C0), min(Gear^.Timer, $80), min(Gear^.Timer, $FF)); |
555 end; |
619 end; |
556 if (cReducedQuality and rqAntiBoom) = 0 then |
620 if (cReducedQuality and rqAntiBoom) = 0 then |
557 case Gear^.Kind of |
621 case Gear^.Kind of |
558 vgtSmoke: DrawTextureF(SpritesData[sprSmoke].Texture, Gear^.scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, 7 - Gear^.Frame, 1, SpritesData[sprSmoke].Width, SpritesData[sprSmoke].Height); |
622 vgtSmoke: DrawTextureF(SpritesData[sprSmoke].Texture, Gear^.scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, 7 - Gear^.Frame, 1, SpritesData[sprSmoke].Width, SpritesData[sprSmoke].Height); |
615 if Gear^.Frame = 0 then |
681 if Gear^.Frame = 0 then |
616 DrawCentered(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Tex) |
682 DrawCentered(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Tex) |
617 else |
683 else |
618 begin |
684 begin |
619 SetScale(cDefaultZoomLevel); |
685 SetScale(cDefaultZoomLevel); |
620 if Gear^.Angle = 0 then DrawTexture(round(Gear^.X), round(Gear^.Y), Gear^.Tex) |
686 if Gear^.Angle = 0 then |
621 else DrawTexture(round(Gear^.X), round(Gear^.Y), Gear^.Tex, Gear^.Angle); |
687 DrawTexture(round(Gear^.X), round(Gear^.Y), Gear^.Tex) |
|
688 else |
|
689 DrawTexture(round(Gear^.X), round(Gear^.Y), Gear^.Tex, Gear^.Angle); |
622 SetScale(zoom) |
690 SetScale(zoom) |
623 end |
691 end |
624 end; |
692 end; |
625 vgtStraightShot: begin |
693 vgtStraightShot: begin |
626 if Gear^.dX < 0 then i:= -1 else i:= 1; |
694 if Gear^.dX < 0 then |
|
695 i:= -1 |
|
696 else |
|
697 i:= 1; |
627 DrawRotatedTextureF(SpritesData[TSprite(Gear^.State)].Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, i, SpritesData[TSprite(Gear^.State)].Width, SpritesData[TSprite(Gear^.State)].Height, Gear^.Angle); |
698 DrawRotatedTextureF(SpritesData[TSprite(Gear^.State)].Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, i, SpritesData[TSprite(Gear^.State)].Width, SpritesData[TSprite(Gear^.State)].Height, Gear^.Angle); |
628 end; |
699 end; |
629 end; |
700 end; |
630 if (cReducedQuality and rqAntiBoom) = 0 then |
701 if (cReducedQuality and rqAntiBoom) = 0 then |
631 case Gear^.Kind of |
702 case Gear^.Kind of |
632 vgtChunk: DrawRotatedF(sprChunk, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle); |
703 vgtChunk: DrawRotatedF(sprChunk, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle); |
633 end; |
704 end; |
634 if (Gear^.Tint <> $FFFFFFFF) or tinted then Tint($FF,$FF,$FF,$FF); |
705 if (Gear^.Tint <> $FFFFFFFF) or tinted then |
|
706 Tint($FF,$FF,$FF,$FF); |
635 Gear:= Gear^.NextGear |
707 Gear:= Gear^.NextGear |
636 end |
708 end |
637 end; |
709 end; |
638 // this layer is outside the screen when stereo |
710 // this layer is outside the screen when stereo |
639 2: begin |
711 2: begin |
640 Gear:= VisualGearLayers[2]; |
712 Gear:= VisualGearLayers[2]; |
641 while Gear <> nil do |
713 while Gear <> nil do |
642 begin |
714 begin |
643 tinted:= false; |
715 tinted:= false; |
644 if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint); |
716 if Gear^.Tint <> $FFFFFFFF then |
|
717 Tint(Gear^.Tint); |
645 case Gear^.Kind of |
718 case Gear^.Kind of |
646 vgtExplosion: DrawSprite(sprExplosion50, round(Gear^.X) - 32 + WorldDx, round(Gear^.Y) - 32 + WorldDy, Gear^.State); |
719 vgtExplosion: DrawSprite(sprExplosion50, round(Gear^.X) - 32 + WorldDx, round(Gear^.Y) - 32 + WorldDy, Gear^.State); |
647 vgtBigExplosion: begin |
720 vgtBigExplosion: begin |
648 tinted:= true; |
721 tinted:= true; |
649 Tint($FF, $FF, $FF, round($FF * (1 - power(Gear^.Timer / 250, 4)))); |
722 Tint($FF, $FF, $FF, round($FF * (1 - power(Gear^.Timer / 250, 4)))); |
708 vgtCircle: if gear^.Angle = 1 then |
781 vgtCircle: if gear^.Angle = 1 then |
709 begin |
782 begin |
710 tmp:= Gear^.State / 100; |
783 tmp:= Gear^.State / 100; |
711 DrawTexture(round(Gear^.X-24*tmp) + WorldDx, round(Gear^.Y-24*tmp) + WorldDy, SpritesData[sprVampiric].Texture, tmp) |
784 DrawTexture(round(Gear^.X-24*tmp) + WorldDx, round(Gear^.Y-24*tmp) + WorldDy, SpritesData[sprVampiric].Texture, tmp) |
712 end |
785 end |
713 else DrawCircle(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.State, Gear^.Timer); |
786 else |
|
787 DrawCircle(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.State, Gear^.Timer); |
714 end; |
788 end; |
715 if (Gear^.Tint <> $FFFFFFFF) or tinted then Tint($FF,$FF,$FF,$FF); |
789 if (Gear^.Tint <> $FFFFFFFF) or tinted then |
|
790 Tint($FF,$FF,$FF,$FF); |
716 Gear:= Gear^.NextGear |
791 Gear:= Gear^.NextGear |
717 end |
792 end |
718 end; |
793 end; |
719 // this layer is half-way between the screen plane (depth = 0) when in stereo, and the land |
794 // this layer is half-way between the screen plane (depth = 0) when in stereo, and the land |
720 4: begin |
795 4: begin |
721 Gear:= VisualGearLayers[4]; |
796 Gear:= VisualGearLayers[4]; |
722 while Gear <> nil do |
797 while Gear <> nil do |
723 begin |
798 begin |
724 if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint); |
799 if Gear^.Tint <> $FFFFFFFF then |
725 case Gear^.Kind of |
800 Tint(Gear^.Tint); |
726 vgtCloud: if SuddenDeathDmg then |
801 case Gear^.Kind of |
727 DrawTextureF(SpritesData[sprSDCloud].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 2, SpritesData[sprCloud].Width, SpritesData[sprCloud].Height) |
802 vgtCloud: if SuddenDeathDmg then |
728 else |
803 DrawTextureF(SpritesData[sprSDCloud].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 2, SpritesData[sprCloud].Width, SpritesData[sprCloud].Height) |
|
804 else |
729 DrawTextureF(SpritesData[sprCloud].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 2, SpritesData[sprCloud].Width, SpritesData[sprCloud].Height); |
805 DrawTextureF(SpritesData[sprCloud].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 2, SpritesData[sprCloud].Width, SpritesData[sprCloud].Height); |
730 vgtFlake: if SuddenDeathDmg then |
806 vgtFlake: if SuddenDeathDmg then |
731 if vobSDVelocity = 0 then |
807 if vobSDVelocity = 0 then |
732 DrawTextureF(SpritesData[sprSDFlake].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height) |
808 DrawTextureF(SpritesData[sprSDFlake].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height) |
733 else |
809 else |
734 DrawRotatedTextureF(SpritesData[sprSDFlake].Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height, Gear^.Angle) |
810 DrawRotatedTextureF(SpritesData[sprSDFlake].Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height, Gear^.Angle) |
735 else |
811 else |
736 if vobVelocity = 0 then |
812 if vobVelocity = 0 then |
737 DrawTextureF(SpritesData[sprFlake].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height) |
813 DrawTextureF(SpritesData[sprFlake].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height) |
738 else |
814 else |
739 DrawRotatedTextureF(SpritesData[sprFlake].Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height, Gear^.Angle); |
815 DrawRotatedTextureF(SpritesData[sprFlake].Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height, Gear^.Angle); |
740 end; |
816 end; |
741 if (Gear^.Tint <> $FFFFFFFF) then Tint($FF,$FF,$FF,$FF); |
817 if (Gear^.Tint <> $FFFFFFFF) then |
742 Gear:= Gear^.NextGear |
818 Tint($FF,$FF,$FF,$FF); |
743 end |
819 Gear:= Gear^.NextGear |
744 end; |
820 end |
745 // this layer is on the screen plane (depth = 0) when stereo, but just behind the land |
821 end; |
746 5: begin |
822 // this layer is on the screen plane (depth = 0) when stereo, but just behind the land |
747 Gear:= VisualGearLayers[5]; |
823 5: begin |
748 while Gear <> nil do |
824 Gear:= VisualGearLayers[5]; |
749 begin |
825 while Gear <> nil do |
750 if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint); |
826 begin |
751 case Gear^.Kind of |
827 if Gear^.Tint <> $FFFFFFFF then |
752 vgtCloud: if SuddenDeathDmg then |
828 Tint(Gear^.Tint); |
753 DrawSprite(sprSDCloud, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame) |
829 case Gear^.Kind of |
754 else |
830 vgtCloud: if SuddenDeathDmg then |
755 DrawSprite(sprCloud, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame); |
831 DrawSprite(sprSDCloud, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame) |
|
832 else |
|
833 DrawSprite(sprCloud, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame); |
756 vgtFlake: if SuddenDeathDmg then |
834 vgtFlake: if SuddenDeathDmg then |
757 if vobSDVelocity = 0 then |
835 if vobSDVelocity = 0 then |
758 DrawSprite(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame) |
836 DrawSprite(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame) |
759 else |
837 else |
760 DrawRotatedF(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle) |
838 DrawRotatedF(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle) |
761 else |
839 else |
762 if vobVelocity = 0 then |
840 if vobVelocity = 0 then |
763 DrawSprite(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame) |
841 DrawSprite(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame) |
764 else |
842 else |
765 DrawRotatedF(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle); |
843 DrawRotatedF(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle); |
766 end; |
844 end; |
767 if (Gear^.Tint <> $FFFFFFFF) then Tint($FF,$FF,$FF,$FF); |
845 if (Gear^.Tint <> $FFFFFFFF) then |
768 Gear:= Gear^.NextGear |
846 Tint($FF,$FF,$FF,$FF); |
769 end |
847 Gear:= Gear^.NextGear |
770 end; |
848 end |
771 // this layer is on the screen plane (depth = 0) when stereo, but just in front of the land |
849 end; |
|
850 // this layer is on the screen plane (depth = 0) when stereo, but just in front of the land |
772 6: begin |
851 6: begin |
773 Gear:= VisualGearLayers[6]; |
852 Gear:= VisualGearLayers[6]; |
774 while Gear <> nil do |
853 while Gear <> nil do |
775 begin |
854 begin |
776 if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint); |
855 if Gear^.Tint <> $FFFFFFFF then |
777 case Gear^.Kind of |
856 Tint(Gear^.Tint); |
778 vgtFlake: if SuddenDeathDmg then |
857 case Gear^.Kind of |
779 if vobSDVelocity = 0 then |
858 vgtFlake: if SuddenDeathDmg then |
780 DrawSprite(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame) |
859 if vobSDVelocity = 0 then |
781 else |
860 DrawSprite(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame) |
782 DrawRotatedF(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle) |
861 else |
783 else |
862 DrawRotatedF(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle) |
784 if vobVelocity = 0 then |
863 else |
785 DrawSprite(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame) |
864 if vobVelocity = 0 then |
786 else |
865 DrawSprite(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame) |
787 DrawRotatedF(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle); |
866 else |
788 end; |
867 DrawRotatedF(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle); |
789 if (Gear^.Tint <> $FFFFFFFF) then Tint($FF,$FF,$FF,$FF); |
868 end; |
790 Gear:= Gear^.NextGear |
869 if (Gear^.Tint <> $FFFFFFFF) then |
791 end |
870 Tint($FF,$FF,$FF,$FF); |
792 end; |
871 Gear:= Gear^.NextGear |
|
872 end |
|
873 end; |
793 end; |
874 end; |
794 end; |
875 end; |
795 |
876 |
796 function VisualGearByUID(uid : Longword) : PVisualGear; |
877 function VisualGearByUID(uid : Longword) : PVisualGear; |
797 var vg: PVisualGear; |
878 var vg: PVisualGear; |
798 i: LongWord; |
879 i: LongWord; |
799 begin |
880 begin |
800 VisualGearByUID:= nil; |
881 VisualGearByUID:= nil; |
801 if uid = 0 then exit; |
882 if uid = 0 then |
|
883 exit; |
802 if (lastVisualGearByUID <> nil) and (lastVisualGearByUID^.uid = uid) then |
884 if (lastVisualGearByUID <> nil) and (lastVisualGearByUID^.uid = uid) then |
803 begin |
885 begin |
804 VisualGearByUID:= lastVisualGearByUID; |
886 VisualGearByUID:= lastVisualGearByUID; |
805 exit |
887 exit |
806 end; |
888 end; |