288 end; |
288 end; |
289 |
289 |
290 // Flags are not defined yet but 1 for checking drowning and 2 for assuming land erasure. |
290 // Flags are not defined yet but 1 for checking drowning and 2 for assuming land erasure. |
291 function RateExplosion(Me: PGear; x, y, r: LongInt; Flags: LongWord = 0): LongInt; |
291 function RateExplosion(Me: PGear; x, y, r: LongInt; Flags: LongWord = 0): LongInt; |
292 var i, dmg, dmgBase, rate, erasure: LongInt; |
292 var i, dmg, dmgBase, rate, erasure: LongInt; |
293 dX, dY: real; |
293 dX, dY, dmgMod: real; |
294 begin |
294 begin |
|
295 dmgMod:= 0.01 * hwFloat2Float(cDamageModifier) * cDamagePercent; |
295 rate:= 0; |
296 rate:= 0; |
296 // add our virtual position |
297 // add our virtual position |
297 with Targets.ar[Targets.Count] do |
298 with Targets.ar[Targets.Count] do |
298 begin |
299 begin |
299 Point.x:= hwRound(Me^.X); |
300 Point.x:= hwRound(Me^.X); |
307 for i:= 0 to Targets.Count do |
308 for i:= 0 to Targets.Count do |
308 with Targets.ar[i] do |
309 with Targets.ar[i] do |
309 begin |
310 begin |
310 dmg:= 0; |
311 dmg:= 0; |
311 if abs(Point.x - x) + abs(Point.y - y) < dmgBase then |
312 if abs(Point.x - x) + abs(Point.y - y) < dmgBase then |
312 dmg:= hwRound(_0_01 * cDamageModifier * min((dmgBase - LongInt(DistanceI(Point.x - x, Point.y - y).Round)) div 2, r) * cDamagePercent); |
313 dmg:= trunc(dmgMod * min((dmgBase - trunc(sqrt(sqr(Point.x - x)+sqr(Point.y - y)))) div 2, r)); |
313 |
314 |
314 if dmg > 0 then |
315 if dmg > 0 then |
315 begin |
316 begin |
316 if Flags and 1 <> 0 then |
317 if Flags and 1 <> 0 then |
317 begin |
318 begin |
338 RateExplosion:= rate * 1024; |
339 RateExplosion:= rate * 1024; |
339 end; |
340 end; |
340 |
341 |
341 function RateShove(Me: PGear; x, y, r, power, kick: LongInt; gdX, gdY: real; Flags: LongWord): LongInt; |
342 function RateShove(Me: PGear; x, y, r, power, kick: LongInt; gdX, gdY: real; Flags: LongWord): LongInt; |
342 var i, dmg, rate: LongInt; |
343 var i, dmg, rate: LongInt; |
343 dX, dY: real; |
344 dX, dY, dmgMod: real; |
344 begin |
345 begin |
|
346 dX:= gdX * 0.005 * kick; |
|
347 dY:= gdY * 0.005 * kick; |
|
348 dmgMod:= 0.01 * hwFloat2Float(cDamageModifier) * cDamagePercent; |
345 Me:= Me; // avoid compiler hint |
349 Me:= Me; // avoid compiler hint |
346 rate:= 0; |
350 rate:= 0; |
347 for i:= 0 to Pred(Targets.Count) do |
351 for i:= 0 to Pred(Targets.Count) do |
348 with Targets.ar[i] do |
352 with Targets.ar[i] do |
349 begin |
353 begin |
350 dmg:= 0; |
354 dmg:= 0; |
351 if abs(Point.x - x) + abs(Point.y - y) < r then |
355 if abs(Point.x - x) + abs(Point.y - y) < r then |
352 begin |
356 begin |
353 dmg:= r - hwRound(DistanceI(Point.x - x, Point.y - y)); |
357 dmg:= r - trunc(sqrt(sqr(Point.x - x)+sqr(Point.y - y))); |
354 dmg:= hwRound(_0_01 * cDamageModifier * dmg * cDamagePercent); |
358 dmg:= trunc(dmg * dmgMod); |
355 end; |
359 end; |
356 if dmg > 0 then |
360 if dmg > 0 then |
357 begin |
361 begin |
358 if Flags and 1 <> 0 then |
|
359 begin |
|
360 dX:= gdX * 0.005 * kick; |
|
361 dY:= gdY * 0.005 * kick; |
|
362 end; |
|
363 if (Flags and 1 <> 0) and TraceShoveDrown(Me, Point.x, Point.y, dX, dY) then |
362 if (Flags and 1 <> 0) and TraceShoveDrown(Me, Point.x, Point.y, dX, dY) then |
364 if Score > 0 then |
363 if Score > 0 then |
365 inc(rate, KillScore + Score div 10) // Add a bit of a bonus for bigger hog drownings |
364 inc(rate, KillScore + Score div 10) // Add a bit of a bonus for bigger hog drownings |
366 else |
365 else |
367 dec(rate, KillScore * friendlyfactor div 100 - Score div 10) // and more of a punishment for drowning bigger friendly hogs |
366 dec(rate, KillScore * friendlyfactor div 100 - Score div 10) // and more of a punishment for drowning bigger friendly hogs |
380 RateShove:= rate * 1024 |
379 RateShove:= rate * 1024 |
381 end; |
380 end; |
382 |
381 |
383 function RateShotgun(Me: PGear; gdX, gdY: real; x, y: LongInt): LongInt; |
382 function RateShotgun(Me: PGear; gdX, gdY: real; x, y: LongInt): LongInt; |
384 var i, dmg, baseDmg, rate, erasure: LongInt; |
383 var i, dmg, baseDmg, rate, erasure: LongInt; |
385 dX, dY: real; |
384 dX, dY, dmgMod: real; |
386 begin |
385 begin |
|
386 dmgMod:= 0.01 * hwFloat2Float(cDamageModifier) * cDamagePercent; |
387 rate:= 0; |
387 rate:= 0; |
|
388 gdX*=0.01; |
|
389 gdY*=0.01; |
388 // add our virtual position |
390 // add our virtual position |
389 with Targets.ar[Targets.Count] do |
391 with Targets.ar[Targets.Count] do |
390 begin |
392 begin |
391 Point.x:= hwRound(Me^.X); |
393 Point.x:= hwRound(Me^.X); |
392 Point.y:= hwRound(Me^.Y); |
394 Point.y:= hwRound(Me^.Y); |
400 with Targets.ar[i] do |
402 with Targets.ar[i] do |
401 begin |
403 begin |
402 dmg:= 0; |
404 dmg:= 0; |
403 if abs(Point.x - x) + abs(Point.y - y) < baseDmg then |
405 if abs(Point.x - x) + abs(Point.y - y) < baseDmg then |
404 begin |
406 begin |
405 dmg:= min(baseDmg - hwRound(DistanceI(Point.x - x, Point.y - y)), 25); |
407 dmg:= min(baseDmg - trunc(sqrt(sqr(Point.x - x)+sqr(Point.y - y))), 25); |
406 dmg:= hwRound(_0_01 * cDamageModifier * dmg * cDamagePercent); |
408 dmg:= trunc(dmg * dmgMod); |
407 end; |
409 end; |
408 if dmg > 0 then |
410 if dmg > 0 then |
409 begin |
411 begin |
410 dX:= gdX * dmg * 0.01; |
412 dX:= gdX * dmg; |
411 dY:= gdY * dmg * 0.01; |
413 dY:= gdY * dmg; |
412 if dX < 0 then dX:= dX - 0.01 |
414 if dX < 0 then dX:= dX - 0.01 |
413 else dX:= dX + 0.01; |
415 else dX:= dX + 0.01; |
414 if TraceDrown(x, y, Point.x, Point.y, dX, dY, erasure) then |
416 if TraceDrown(x, y, Point.x, Point.y, dX, dY, erasure) then |
415 if Score > 0 then |
417 if Score > 0 then |
416 inc(rate, KillScore + Score div 10) // Add a bit of a bonus for bigger hog drownings |
418 inc(rate, KillScore + Score div 10) // Add a bit of a bonus for bigger hog drownings |
437 |
439 |
438 for i:= 0 to Pred(Targets.Count) do |
440 for i:= 0 to Pred(Targets.Count) do |
439 with Targets.ar[i] do |
441 with Targets.ar[i] do |
440 begin |
442 begin |
441 // hammer hit radius is 8, shift is 10 |
443 // hammer hit radius is 8, shift is 10 |
442 r:= hwRound(DistanceI(Point.x - x, Point.y - y)); |
444 if abs(Point.x - x) + abs(Point.y - y) < 18 then |
|
445 r:= trunc(sqrt(sqr(Point.x - x)+sqr(Point.y - y))); |
443 |
446 |
444 if r <= 18 then |
447 if r <= 18 then |
445 if Score > 0 then |
448 if Score > 0 then |
446 inc(rate, Score div 3) |
449 inc(rate, Score div 3) |
447 else |
450 else |