hedgewars/uAIAmmoTests.pas
changeset 70 82d93eeecebe
parent 66 9643d75baf1e
child 71 5f56c6979496
equal deleted inserted replaced
69:d8a526934b9f 70:82d93eeecebe
     2 interface
     2 interface
     3 uses SDLh, uGears, uConsts;
     3 uses SDLh, uGears, uConsts;
     4 
     4 
     5 function TestBazooka(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer): integer;
     5 function TestBazooka(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer): integer;
     6 function TestGrenade(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer): integer;
     6 function TestGrenade(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer): integer;
       
     7 function TestShotgun(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer): integer;
     7 
     8 
     8 type TAmmoTestProc = function (Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer): integer;
     9 type TAmmoTestProc = function (Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer): integer;
     9 const AmmoTests: array[TAmmoType] of TAmmoTestProc =
    10 const AmmoTests: array[TAmmoType] of TAmmoTestProc =
    10                  (
    11                  (
    11 {amGrenade}       TestGrenade,
    12 {amGrenade}       TestGrenade,
    12 {amBazooka}       TestBazooka,
    13 {amBazooka}       TestBazooka,
    13 {amUFO}           nil,
    14 {amUFO}           nil,
    14 {amShotgun}       nil,
    15 {amShotgun}       TestShotgun,
    15 {amPickHammer}    nil,
    16 {amPickHammer}    nil,
    16 {amSkip}          nil,
    17 {amSkip}          nil,
    17 {amRope}          nil,
    18 {amRope}          nil,
    18 {amMine}          nil,
    19 {amMine}          nil,
    19 {amDEagle}        nil,
    20 {amDEagle}        nil,
    20 {amDynamite}      nil
    21 {amDynamite}      nil
    21                   );
    22                   );
    22 
    23 
    23 implementation
    24 implementation
    24 uses uMisc, uAIMisc;
    25 uses uMisc, uAIMisc;
       
    26 const BadTurn = Low(integer);
    25 
    27 
    26 function Metric(x1, y1, x2, y2: integer): integer;
    28 function Metric(x1, y1, x2, y2: integer): integer;
    27 begin
    29 begin
    28 Result:= abs(x1 - x2) + abs(y1 - y2)
    30 Result:= abs(x1 - x2) + abs(y1 - y2)
    29 end;
    31 end;
    47       y:= y + dY;
    49       y:= y + dY;
    48       dX:= dX + cWindSpeed;
    50       dX:= dX + cWindSpeed;
    49       dY:= dY + cGravity;
    51       dY:= dY + cGravity;
    50       dec(t)
    52       dec(t)
    51     until TestColl(round(x), round(y), 5) or (t <= 0);
    53     until TestColl(round(x), round(y), 5) or (t <= 0);
    52     Result:= RateExplosion(Me, round(x), round(y), 101) - Metric(Targ.X, Targ.Y, round(x), round(y)) div 16
    54     Result:= RateExplosion(Me, round(x), round(y), 101);
       
    55     if Result = 0 then Result:= - Metric(Targ.X, Targ.Y, round(x), round(y)) div 64
    53     end;
    56     end;
    54 
    57 
    55 begin
    58 begin
    56 Time:= 0;
    59 Time:= 0;
    57 rTime:= 10;
    60 rTime:= 10;
    58 Result:= Low(integer);
    61 Result:= BadTurn;
    59 repeat
    62 repeat
    60   rTime:= rTime + 100 + random*250;
    63   rTime:= rTime + 100 + random*250;
    61   Vx:= - cWindSpeed * rTime / 2 + (Targ.X - Me.X) / rTime;
    64   Vx:= - cWindSpeed * rTime / 2 + (Targ.X - Me.X) / rTime;
    62   Vy:= cGravity * rTime / 2 - (Targ.Y - Me.Y) / rTime;
    65   Vy:= cGravity * rTime / 2 - (Targ.Y - Me.Y) / rTime;
    63   r:= sqr(Vx) + sqr(Vy);
    66   r:= sqr(Vx) + sqr(Vy);
    74      end
    77      end
    75 until (rTime >= 5000)
    78 until (rTime >= 5000)
    76 end;
    79 end;
    77 
    80 
    78 function TestGrenade(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer): integer;
    81 function TestGrenade(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer): integer;
    79 const tDelta = 10;
    82 const tDelta = 24;
    80 var Vx, Vy, r: real;
    83 var Vx, Vy, r: real;
    81     Score: integer;
    84     Score: integer;
    82     TestTime: Longword;
    85     TestTime: Longword;
    83 
    86 
    84     function CheckTrace: integer;
    87     function CheckTrace: integer;
    98     if t < 50 then Result:= RateExplosion(Me, round(x), round(y), 101)
   101     if t < 50 then Result:= RateExplosion(Me, round(x), round(y), 101)
    99               else Result:= Low(integer)
   102               else Result:= Low(integer)
   100     end;
   103     end;
   101 
   104 
   102 begin
   105 begin
   103 Result:= Low(integer);
   106 Result:= BadTurn;
   104 TestTime:= 0;
   107 TestTime:= 0;
   105 repeat
   108 repeat
   106   inc(TestTime, 1000);
   109   inc(TestTime, 1000);
   107   Vx:= (Targ.X - Me.X) / (TestTime + tDelta);
   110   Vx:= (Targ.X - Me.X) / (TestTime + tDelta);
   108   Vy:= cGravity*((TestTime + tDelta) div 2) - (Targ.Y - Me.Y) / (TestTime + tDelta);
   111   Vy:= cGravity*((TestTime + tDelta) div 2) - (Targ.Y - Me.Y) / (TestTime + tDelta);
   109   r:= sqr(Vx) + sqr(Vy);
   112   r:= sqr(Vx) + sqr(Vy);
   110   if r <= 1 then
   113   if r <= 1 then
   111      begin
   114      begin
   112      Score:= CheckTrace;
   115      Score:= CheckTrace;
   113      if Result <= Score then
   116      if Result < Score then
   114         begin
   117         begin
   115         r:= sqrt(r);
   118         r:= sqrt(r);
   116         Angle:= DxDy2AttackAngle(Vx, Vy);
   119         Angle:= DxDy2AttackAngle(Vx, Vy);
   117         Power:= round(r * cMaxPower);
   120         Power:= round(r * cMaxPower);
   118         Time:= TestTime;
   121         Time:= TestTime;
   120         end;
   123         end;
   121      end
   124      end
   122 until (TestTime = 5000)
   125 until (TestTime = 5000)
   123 end;
   126 end;
   124 
   127 
       
   128 function TestShotgun(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer): integer;
       
   129 var Vx, Vy, x, y: real;
       
   130 begin
       
   131 if Metric(round(Me.X), round(Me.Y), Targ.X, Targ.Y) < 80 then
       
   132    begin
       
   133    Result:= BadTurn;
       
   134    exit
       
   135    end;
       
   136 Time:= 0;
       
   137 Power:= 1;
       
   138 Vx:= (Targ.X - Me.X)/1024;
       
   139 Vy:= (Targ.Y - Me.Y)/1024;
       
   140 x:= Me.X;
       
   141 y:= Me.Y;
       
   142 Angle:= DxDy2AttackAngle(Vx, -Vy);
       
   143 repeat
       
   144   x:= x + vX;
       
   145   y:= y + vY;
       
   146   if TestColl(round(x), round(y), 2) then
       
   147      begin
       
   148      Result:= RateExplosion(Me, round(x), round(y), 25) * 2;
       
   149      if Result = 0 then Result:= - Metric(Targ.X, Targ.Y, round(x), round(y)) div 64;
       
   150      exit
       
   151      end
       
   152 until (abs(Targ.X - x) + abs(Targ.Y - y) < 4) or (x < 0) or (y < 0) or (x > 2048) or (y > 1024);
       
   153 Result:= BadTurn
       
   154 end;
       
   155 
   125 end.
   156 end.