hedgewars/uAIMisc.pas
changeset 6771 87a947097d00
parent 6770 7d2c6cdb816a
child 6772 13d13aefa4de
equal deleted inserted replaced
6770:7d2c6cdb816a 6771:87a947097d00
    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