hedgewars/uAIAmmoTests.pas
changeset 136 89970b70b076
parent 108 08f1fe6f21f8
child 141 ac3680be1f4b
equal deleted inserted replaced
135:53faa20669de 136:89970b70b076
    33 
    33 
    34 unit uAIAmmoTests;
    34 unit uAIAmmoTests;
    35 interface
    35 interface
    36 uses SDLh, uGears, uConsts;
    36 uses SDLh, uGears, uConsts;
    37 
    37 
    38 function TestBazooka(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
    38 function TestBazooka(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
    39 function TestGrenade(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
    39 function TestGrenade(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
    40 function TestShotgun(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
    40 function TestShotgun(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
    41 function TestDesertEagle(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
    41 function TestDesertEagle(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
    42 function TestBaseballBat(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
    42 function TestBaseballBat(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
    43 function TestFirePunch(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
    43 function TestFirePunch(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
    44 
    44 
    45 type TAmmoTestProc = function (Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
    45 type TAmmoTestProc = function (Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
    46 const AmmoTests: array[TAmmoType] of TAmmoTestProc =
    46 const AmmoTests: array[TAmmoType] of TAmmoTestProc =
    47                  (
    47                  (
    48 {amGrenade}       TestGrenade,
    48 {amGrenade}       TestGrenade,
    49 {amClusterBomb}   nil,
    49 {amClusterBomb}   nil,
    50 {amBazooka}       TestBazooka,
    50 {amBazooka}       TestBazooka,
    67 function Metric(x1, y1, x2, y2: integer): integer;
    67 function Metric(x1, y1, x2, y2: integer): integer;
    68 begin
    68 begin
    69 Result:= abs(x1 - x2) + abs(y1 - y2)
    69 Result:= abs(x1 - x2) + abs(y1 - y2)
    70 end;
    70 end;
    71 
    71 
    72 function TestBazooka(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
    72 function TestBazooka(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
    73 var Vx, Vy, r: Double;
    73 var Vx, Vy, r: Double;
    74     rTime: Double;
    74     rTime: Double;
    75     Score, EX, EY: integer;
    75     Score, EX, EY: integer;
    76 
    76 
    77     function CheckTrace: integer;
    77     function CheckTrace: integer;
   100 Time:= 0;
   100 Time:= 0;
   101 rTime:= 50;
   101 rTime:= 50;
   102 ExplR:= 0;
   102 ExplR:= 0;
   103 Result:= BadTurn;
   103 Result:= BadTurn;
   104 repeat
   104 repeat
   105   rTime:= rTime + 150 + random*250;
   105   rTime:= rTime + 150 + Level * 25 + random * 250;
   106   Vx:= - cWindSpeed * rTime / 2 + (Targ.X - Me.X) / rTime;
   106   Vx:= - cWindSpeed * rTime / 2 + (Targ.X - Me.X) / rTime;
   107   Vy:= cGravity * rTime / 2 - (Targ.Y - Me.Y) / rTime;
   107   Vy:= cGravity * rTime / 2 - (Targ.Y - Me.Y) / rTime;
   108   r:= sqr(Vx) + sqr(Vy);
   108   r:= sqr(Vx) + sqr(Vy);
   109   if r <= 1 then
   109   if r <= 1 then
   110      begin
   110      begin
   111      Score:= CheckTrace;
   111      Score:= CheckTrace;
   112      if Result <= Score then
   112      if Result <= Score then
   113         begin
   113         begin
   114         r:= sqrt(r);
   114         r:= sqrt(r);
   115         Angle:= DxDy2AttackAngle(Vx, Vy);
   115         Angle:= DxDy2AttackAngle(Vx, Vy) + rndSign(random((Level - 1) * 8) + 1);
   116         Power:= round(r * cMaxPower);
   116         Power:= round(r * cMaxPower) - random((Level - 1) * 15 + 1);
   117         ExplR:= 100;
   117         ExplR:= 100;
   118         ExplX:= EX;
   118         ExplX:= EX;
   119         ExplY:= EY;
   119         ExplY:= EY;
   120         Result:= Score
   120         Result:= Score - random((Level - 1) * 2500)
   121         end;
   121         end;
   122      end
   122      end
   123 until (rTime >= 4500)
   123 until (rTime >= 4500)
   124 end;
   124 end;
   125 
   125 
   126 function TestGrenade(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
   126 function TestGrenade(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
   127 const tDelta = 24;
   127 const tDelta = 24;
   128 var Vx, Vy, r: Double;
   128 var Vx, Vy, r: Double;
   129     Score, EX, EY: integer;
   129     Score, EX, EY: integer;
   130     TestTime: Longword;
   130     TestTime: Longword;
   131 
   131 
   162      begin
   162      begin
   163      Score:= CheckTrace;
   163      Score:= CheckTrace;
   164      if Result < Score then
   164      if Result < Score then
   165         begin
   165         begin
   166         r:= sqrt(r);
   166         r:= sqrt(r);
   167         Angle:= DxDy2AttackAngle(Vx, Vy);
   167         Angle:= DxDy2AttackAngle(Vx, Vy) + rndSign(random(Level));
   168         Power:= round(r * cMaxPower);
   168         Power:= round(r * cMaxPower) + rndSign(random(Level) * 12);
   169         Time:= TestTime;
   169         Time:= TestTime;
   170         ExplR:= 100;
   170         ExplR:= 100;
   171         ExplX:= EX;
   171         ExplX:= EX;
   172         ExplY:= EY;
   172         ExplY:= EY;
   173         Result:= Score
   173         Result:= Score
   174         end;
   174         end;
   175      end
   175      end
   176 until (TestTime = 5000)
   176 until (TestTime = 5000)
   177 end;
   177 end;
   178 
   178 
   179 function TestShotgun(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
   179 function TestShotgun(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
   180 var Vx, Vy, x, y: Double;
   180 var Vx, Vy, x, y: Double;
   181 begin
   181 begin       
   182 ExplR:= 0;
   182 ExplR:= 0;
   183 if Metric(round(Me.X), round(Me.Y), Targ.X, Targ.Y) < 80 then
   183 if Metric(round(Me.X), round(Me.Y), Targ.X, Targ.Y) < 80 then
   184    begin
   184    begin
   185    Result:= BadTurn;
   185    Result:= BadTurn;
   186    exit
   186    exit
   195 repeat
   195 repeat
   196   x:= x + vX;
   196   x:= x + vX;
   197   y:= y + vY;
   197   y:= y + vY;
   198   if TestColl(round(x), round(y), 2) then
   198   if TestColl(round(x), round(y), 2) then
   199      begin
   199      begin
   200      Result:= RateShove(Me, round(x), round(y), 25, 25);
   200      Result:= RateShove(Me, round(x), round(y), 25, 25) * 2 - Level * 4000;
   201      if Result = 0 then Result:= - Metric(Targ.X, Targ.Y, round(x), round(y)) div 64;
   201      if Result = 0 then Result:= - Metric(Targ.X, Targ.Y, round(x), round(y)) div 64;
   202      exit
   202      exit
   203      end
   203      end
   204 until (abs(Targ.X - x) + abs(Targ.Y - y) < 4) or (x < 0) or (y < 0) or (x > 2048) or (y > 1024);
   204 until (abs(Targ.X - x) + abs(Targ.Y - y) < 4) or (x < 0) or (y < 0) or (x > 2048) or (y > 1024);
   205 Result:= BadTurn
   205 Result:= BadTurn
   206 end;
   206 end;
   207 
   207 
   208 function TestDesertEagle(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
   208 function TestDesertEagle(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
   209 var Vx, Vy, x, y, t: Double;
   209 var Vx, Vy, x, y, t: Double;
   210     d: Longword;
   210     d: Longword;
   211 begin
   211 begin
   212 ExplR:= 0;
   212 ExplR:= 0;
   213 if abs(Me.X - Targ.X) + abs(Me.Y - Targ.Y) < 80 then
   213 if abs(Me.X - Targ.X) + abs(Me.Y - Targ.Y) < 80 then
   232 until (abs(Targ.X - x) + abs(Targ.Y - y) < 2) or (x < 0) or (y < 0) or (x > 2048) or (y > 1024) or (d > 200);
   232 until (abs(Targ.X - x) + abs(Targ.Y - y) < 2) or (x < 0) or (y < 0) or (x > 2048) or (y > 1024) or (d > 200);
   233 if abs(Targ.X - x) + abs(Targ.Y - y) < 2 then Result:= max(0, (4 - d div 50) * 7 * 1024)
   233 if abs(Targ.X - x) + abs(Targ.Y - y) < 2 then Result:= max(0, (4 - d div 50) * 7 * 1024)
   234                                          else Result:= Low(integer)
   234                                          else Result:= Low(integer)
   235 end;
   235 end;
   236 
   236 
   237 function TestBaseballBat(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
   237 function TestBaseballBat(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
   238 begin
   238 begin
   239 ExplR:= 0;
   239 ExplR:= 0;
   240 if abs(Me.X - Targ.X) + abs(Me.Y - Targ.Y) >= 25 then
   240 if (Level < 2) and (abs(Me.X - Targ.X) + abs(Me.Y - Targ.Y) >= 25) then
   241    begin
   241    begin
   242    Result:= BadTurn;
   242    Result:= BadTurn;
   243    exit
   243    exit
   244    end;
   244    end;
   245 Time:= 0;
   245 Time:= 0;
   246 Power:= 1;
   246 Power:= 1;
   247 Angle:= DxDy2AttackAngle(hwSign(Targ.X - Me.X), 1);
   247 Angle:= DxDy2AttackAngle(hwSign(Targ.X - Me.X), 1);
   248 Result:= RateShove(Me, round(Me.X) + 10 * hwSign(Targ.X - Me.X), round(Me.Y), 15, 30)
   248 Result:= RateShove(Me, round(Me.X) + 10 * hwSign(Targ.X - Me.X), round(Me.Y), 15, 30)
   249 end;
   249 end;
   250 
   250 
   251 function TestFirePunch(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
   251 function TestFirePunch(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
   252 var i: integer;
   252 var i: integer;
   253 begin
   253 begin
   254 ExplR:= 0;
   254 ExplR:= 0;
   255 if (abs(Me.X - Targ.X) > 25) or (abs(Me.Y - 50 - Targ.Y) > 50) then
   255 if (abs(Me.X - Targ.X) > 25) or (abs(Me.Y - 50 - Targ.Y) > 50) then
   256    begin
   256    begin