53 function RatePlace(Gear: PGear): LongInt; |
53 function RatePlace(Gear: PGear): LongInt; |
54 function TestCollExcludingMe(Me: PGear; x, y, r: LongInt): boolean; inline; |
54 function TestCollExcludingMe(Me: PGear; x, y, r: LongInt): boolean; inline; |
55 function TestColl(x, y, r: LongInt): boolean; inline; |
55 function TestColl(x, y, r: LongInt): boolean; inline; |
56 function RateExplosion(Me: PGear; x, y, r: LongInt; Flags: LongWord = 0): LongInt; |
56 function RateExplosion(Me: PGear; x, y, r: LongInt; Flags: LongWord = 0): LongInt; |
57 function RateShove(Me: PGear; x, y, r, power, kick: LongInt; gdX, gdY: real; Flags: LongWord): LongInt; |
57 function RateShove(Me: PGear; x, y, r, power, kick: LongInt; gdX, gdY: real; Flags: LongWord): LongInt; |
58 function RateShotgun(Me: PGear; x, y: LongInt): LongInt; |
58 function RateShotgun(Me: PGear; gdX, gdY: real; x, y: LongInt): LongInt; |
59 function RateHammer(Me: PGear): LongInt; |
59 function RateHammer(Me: PGear): LongInt; |
60 function HHGo(Gear, AltGear: PGear; var GoInfo: TGoInfo): boolean; |
60 function HHGo(Gear, AltGear: PGear; var GoInfo: TGoInfo): boolean; |
61 function AIrndSign(num: LongInt): LongInt; |
61 function AIrndSign(num: LongInt): LongInt; |
62 |
62 |
63 var ThinkingHH: PGear; |
63 var ThinkingHH: PGear; |
346 for i:= 0 to Pred(Targets.Count) do |
346 for i:= 0 to Pred(Targets.Count) do |
347 with Targets.ar[i] do |
347 with Targets.ar[i] do |
348 begin |
348 begin |
349 dmg:= 0; |
349 dmg:= 0; |
350 if abs(Point.x - x) + abs(Point.y - y) < r then |
350 if abs(Point.x - x) + abs(Point.y - y) < r then |
|
351 begin |
351 dmg:= r - hwRound(DistanceI(Point.x - x, Point.y - y)); |
352 dmg:= r - hwRound(DistanceI(Point.x - x, Point.y - y)); |
352 dmg:= hwRound(_0_01 * cDamageModifier * dmg * cDamagePercent); |
353 dmg:= hwRound(_0_01 * cDamageModifier * dmg * cDamagePercent); |
|
354 end; |
353 if dmg > 0 then |
355 if dmg > 0 then |
354 begin |
356 begin |
355 if Flags and 1 <> 0 then |
357 if Flags and 1 <> 0 then |
356 begin |
358 begin |
357 dX:= gdX * 0.005 * kick; |
359 dX:= gdX * 0.005 * kick; |
375 end; |
377 end; |
376 end; |
378 end; |
377 RateShove:= rate * 1024 |
379 RateShove:= rate * 1024 |
378 end; |
380 end; |
379 |
381 |
380 function RateShotgun(Me: PGear; x, y: LongInt): LongInt; |
382 function RateShotgun(Me: PGear; gdX, gdY: real; x, y: LongInt): LongInt; |
381 var i, dmg, rate: LongInt; |
383 var i, dmg, baseDmg, rate, erasure: LongInt; |
|
384 dX, dY: real; |
382 begin |
385 begin |
383 rate:= 0; |
386 rate:= 0; |
384 // add our virtual position |
387 // add our virtual position |
385 with Targets.ar[Targets.Count] do |
388 with Targets.ar[Targets.Count] do |
386 begin |
389 begin |
387 Point.x:= hwRound(Me^.X); |
390 Point.x:= hwRound(Me^.X); |
388 Point.y:= hwRound(Me^.Y); |
391 Point.y:= hwRound(Me^.Y); |
389 Score:= - ThinkingHH^.Health |
392 Score:= - ThinkingHH^.Health |
390 end; |
393 end; |
391 // rate shot |
394 // rate shot |
|
395 baseDmg:= cHHRadius + cShotgunRadius + 4; |
|
396 if GameFlags and gfSolidLand = 0 then erasure:= cShotgunRadius |
|
397 else erasure:= 0; |
392 for i:= 0 to Targets.Count do |
398 for i:= 0 to Targets.Count do |
393 with Targets.ar[i] do |
399 with Targets.ar[i] do |
394 begin |
400 begin |
395 dmg:= min(cHHRadius + cShotgunRadius + 4 - hwRound(DistanceI(Point.x - x, Point.y - y)), 25); |
401 dmg:= 0; |
396 dmg:= hwRound(_0_01 * cDamageModifier * dmg * cDamagePercent); |
402 if abs(Point.x - x) + abs(Point.y - y) < baseDmg then |
|
403 begin |
|
404 dmg:= min(baseDmg - hwRound(DistanceI(Point.x - x, Point.y - y)), 25); |
|
405 dmg:= hwRound(_0_01 * cDamageModifier * dmg * cDamagePercent); |
|
406 end; |
397 if dmg > 0 then |
407 if dmg > 0 then |
398 begin |
408 begin |
399 if dmg >= abs(Score) then |
409 dX:= gdX * dmg * 0.01; |
400 dmg := KillScore; |
410 dY:= gdY * dmg * 0.01; |
|
411 if dX < 0 then dX:= dX - 0.01 |
|
412 else dX:= dX + 0.01; |
|
413 if TraceDrown(x, y, Point.x, Point.y, dX, dY, erasure) then |
401 if Score > 0 then |
414 if Score > 0 then |
402 inc(rate, dmg) |
415 inc(rate, KillScore) |
403 else |
416 else |
404 dec(rate, dmg * friendlyfactor div 100); |
417 dec(rate, KillScore * friendlyfactor div 100) |
|
418 else if dmg >= abs(Score) then |
|
419 dmg := KillScore; |
|
420 if Score > 0 then |
|
421 inc(rate, dmg) |
|
422 else |
|
423 dec(rate, dmg * friendlyfactor div 100); |
405 end; |
424 end; |
406 end; |
425 end; |
407 RateShotgun:= rate * 1024; |
426 RateShotgun:= rate * 1024; |
408 end; |
427 end; |
409 |
428 |