diff -r c7fe94d56d6e -r 78e383fff605 hedgewars/uAIMisc.pas --- a/hedgewars/uAIMisc.pas Mon Jul 06 00:25:13 2020 +0200 +++ b/hedgewars/uAIMisc.pas Mon Jul 06 01:46:22 2020 +0200 @@ -88,6 +88,7 @@ function RateShove(Me: PGear; x, y, r, power, kick: LongInt; gdX, gdY: real; Flags: LongWord): LongInt; function RateShotgun(Me: PGear; gdX, gdY: real; x, y: LongInt): LongInt; function RateSeduction(Me: PGear): LongInt; +function RateResurrector(Me: PGear): LongInt; function RateHammer(Me: PGear): LongInt; function HHGo(Gear, AltGear: PGear; var GoInfo: TGoInfo): boolean; @@ -102,6 +103,7 @@ walkbonuses: Twalkbonuses; const KillScore = 200; + ResurrectScore = 100; var friendlyfactor: LongInt = 300; var dmgMod: real = 1.0; @@ -137,6 +139,8 @@ (Gear <> ThinkingHH) and (Gear^.Health > Gear^.Damage) and (not Gear^.Hedgehog^.Team^.hasgone)) or + ((Gear^.Kind = gtGrave) and + (Gear^.Health = 0)) or ((Gear^.Kind = gtExplosives) and (Gear^.Health > Gear^.Damage)) or ((Gear^.Kind = gtMine) and @@ -170,6 +174,17 @@ inc(e) end; end + else if Gear^.Kind = gtGrave then + if (Gear^.Hedgehog^.Team^.Clan = CurrentTeam^.Clan) then + begin + Score:= ResurrectScore; + inc(f); + end + else + begin + Score:= -ResurrectScore; + inc(e); + end else if Gear^.Kind = gtExplosives then Score:= Gear^.Health - Gear^.Damage else if Gear^.Kind = gtMine then @@ -923,6 +938,45 @@ RateSeduction:= rate * 1024; end; +function RateResurrector(Me: PGear): LongInt; +var i, r, rate, pX, pY: LongInt; + meX, meY: hwFloat; + hadSkips: boolean; +begin +meX:= Me^.X; +meY:= Me^.Y; +rate:= 0; +for i:= 0 to Targets.Count do + if (Targets.ar[i].Kind = gtGrave) and (not Targets.ar[i].dead) then + with Targets.ar[i] do + begin + pX:= Point.X; + pY:= Point.Y; + + if (not matters) then + hadSkips:= true + else if matters and (abs(pX - hwRound(meX)) + abs(pY - hwRound(meY)) < cResurrectorDist) then + begin + r:= trunc(sqrt(sqr(abs(pX - hwRound(meX)))+sqr(abs(pY - hwRound(meY))))); + if r < cResurrectorDist then + begin + if Score > 0 then + inc(rate, Score * 1024) + else + inc(rate, Score * friendlyFactor div 100 * 1024); + // a "dead" grave is a grave that we have resurrected + dead:= true; + Targets.reset:= true; + end; + end; + end; + +if hadSkips and (rate <= 0) then + RateResurrector:= BadTurn +else + RateResurrector:= rate * 1024; +end; + function RateHammer(Me: PGear): LongInt; var x, y, i, r, rate: LongInt; hadSkips: boolean;