hedgewars/uAIAmmoTests.pas
changeset 370 c75410fe3133
parent 369 2aed85310727
child 371 731ad6d27bd1
equal deleted inserted replaced
369:2aed85310727 370:c75410fe3133
    18 
    18 
    19 unit uAIAmmoTests;
    19 unit uAIAmmoTests;
    20 interface
    20 interface
    21 uses SDLh, uGears, uConsts, uFloat;
    21 uses SDLh, uGears, uConsts, uFloat;
    22 
    22 
    23 (*function TestBazooka(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
    23 function TestBazooka(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer;
    24 function TestGrenade(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
    24 (*function TestGrenade(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer;
    25 function TestShotgun(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
    25 function TestShotgun(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer;
    26 function TestDesertEagle(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
    26 function TestDesertEagle(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer;
    27 function TestBaseballBat(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
    27 function TestBaseballBat(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer;
    28 function TestFirePunch(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
    28 function TestFirePunch(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer;
    29 *)
    29 *)
    30 type TAmmoTestProc = function (Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer;
    30 type TAmmoTestProc = function (Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer;
    31 const AmmoTests: array[TAmmoType] of TAmmoTestProc =
    31 const AmmoTests: array[TAmmoType] of TAmmoTestProc =
    32                  (
    32                  (
    33 {amGrenade}       nil,//TestGrenade,
    33 {amGrenade}       nil,//TestGrenade,
    34 {amClusterBomb}   nil,
    34 {amClusterBomb}   nil,
    35 {amBazooka}       nil,//TestBazooka,
    35 {amBazooka}       @TestBazooka,
    36 {amUFO}           nil,
    36 {amUFO}           nil,
    37 {amShotgun}       nil,//TestShotgun,
    37 {amShotgun}       nil,//TestShotgun,
    38 {amPickHammer}    nil,
    38 {amPickHammer}    nil,
    39 {amSkip}          nil,
    39 {amSkip}          nil,
    40 {amRope}          nil,
    40 {amRope}          nil,
    52 const BadTurn = Low(integer);
    52 const BadTurn = Low(integer);
    53 
    53 
    54 
    54 
    55 implementation
    55 implementation
    56 uses uMisc, uAIMisc, uLand;
    56 uses uMisc, uAIMisc, uLand;
    57 {
    57 
    58 function Metric(x1, y1, x2, y2: integer): integer;
    58 function Metric(x1, y1, x2, y2: integer): integer;
    59 begin
    59 begin
    60 Result:= abs(x1 - x2) + abs(y1 - y2)
    60 Metric:= abs(x1 - x2) + abs(y1 - y2)
    61 end;
    61 end;
    62 
    62 
    63 function TestBazooka(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
    63 function TestBazooka(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer;
    64 var Vx, Vy, r: hwFloat;
    64 var Vx, Vy, r: hwFloat;
    65     rTime: hwFloat;
    65     rTime: hwFloat;
    66     Score, EX, EY: integer;
    66     Score, EX, EY: integer;
       
    67     Result: integer;
    67 
    68 
    68     function CheckTrace: integer;
    69     function CheckTrace: integer;
    69     var x, y, dX, dY: hwFloat;
    70     var x, y, dX, dY: hwFloat;
    70         t: integer;
    71         t: integer;
       
    72         Result: integer;
    71     begin
    73     begin
    72     x:= Me.X;
    74     x:= Me^.X;
    73     y:= Me.Y;
    75     y:= Me^.Y;
    74     dX:= Vx;
    76     dX:= Vx;
    75     dY:= -Vy;
    77     dY:= -Vy;
    76     t:= trunc(rTime);
    78     t:= hwRound(rTime);
    77     repeat
    79     repeat
    78       x:= x + dX;
    80       x:= x + dX;
    79       y:= y + dY;
    81       y:= y + dY;
    80       dX:= dX + cWindSpeed;
    82       dX:= dX + cWindSpeed;
    81       dY:= dY + cGravity;
    83       dY:= dY + cGravity;
    82       dec(t)
    84       dec(t)
    83     until TestColl(round(x), round(y), 5) or (t <= 0);
    85     until TestColl(hwRound(x), hwRound(y), 5) or (t <= 0);
    84     EX:= round(x);
    86     EX:= hwRound(x);
    85     EY:= round(y);
    87     EY:= hwRound(y);
    86     Result:= RateExplosion(Me, round(x), round(y), 101);
    88     Result:= RateExplosion(Me, EX, EY, 101);
    87     if Result = 0 then Result:= - Metric(Targ.X, Targ.Y, round(x), round(y)) div 64
    89     if Result = 0 then Result:= - Metric(Targ.X, Targ.Y, EX, EY) div 64;
       
    90     CheckTrace:= Result
    88     end;
    91     end;
    89 
    92 
    90 begin
    93 begin
    91 Time:= 0;
    94 Time:= 0;
    92 rTime:= 50;
    95 rTime:= 50;
    93 ExplR:= 0;
    96 ExplR:= 0;
    94 Result:= BadTurn;
    97 Result:= BadTurn;
    95 repeat
    98 repeat
    96   rTime:= rTime + 300 + Level * 50 + random * 200;
    99   rTime:= rTime + 300 + Level * 50 + random(200);
    97   Vx:= - cWindSpeed * rTime / 2 + (Targ.X - Me.X) / rTime;
   100   Vx:= - cWindSpeed * rTime * _0_5 + (Targ.X - hwRound(Me^.X)) / rTime;
    98   Vy:= cGravity * rTime / 2 - (Targ.Y - Me.Y) / rTime;
   101   Vy:= cGravity * rTime * _0_5 - (Targ.Y - hwRound(Me^.Y)) / rTime;
    99   r:= sqr(Vx) + sqr(Vy);
   102   r:= Distance(Vx, Vy);
   100   if r <= 1 then
   103   if not (r > 1) then
   101      begin
   104      begin
   102      Score:= CheckTrace;
   105      Score:= CheckTrace;
   103      if Result <= Score then
   106      if Result <= Score then
   104         begin
   107         begin
   105         r:= sqrt(r);
   108         Angle:= DxDy2AttackAngle(Vx, Vy) + AIrndSign(random((Level - 1) * 8));
   106         Angle:= DxDy2AttackAngle(Vx, Vy) + rndSign(random((Level - 1) * 8));
   109         Power:= hwRound(r * cMaxPower) - random((Level - 1) * 15 + 1);
   107         Power:= round(r * cMaxPower) - random((Level - 1) * 15 + 1);
       
   108         ExplR:= 100;
   110         ExplR:= 100;
   109         ExplX:= EX;
   111         ExplX:= EX;
   110         ExplY:= EY;
   112         ExplY:= EY;
   111         Result:= Score
   113         Result:= Score
   112         end;
   114         end;
   113      end
   115      end
   114 until (rTime >= 4500)
   116 until (rTime > 4500);
   115 end;
   117 TestBazooka:= Result
   116 
   118 end;
   117 function TestGrenade(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
   119 {
       
   120 function TestGrenade(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer;
   118 const tDelta = 24;
   121 const tDelta = 24;
   119 var Vx, Vy, r: hwFloat;
   122 var Vx, Vy, r: hwFloat;
   120     Score, EX, EY: integer;
   123     Score, EX, EY: integer;
   121     TestTime: Longword;
   124     TestTime: Longword;
   122 
   125 
   165         end;
   168         end;
   166      end
   169      end
   167 until (TestTime = 5000)
   170 until (TestTime = 5000)
   168 end;
   171 end;
   169 
   172 
   170 function TestShotgun(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
   173 function TestShotgun(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer;
   171 var Vx, Vy, x, y: hwFloat;
   174 var Vx, Vy, x, y: hwFloat;
   172 begin       
   175 begin       
   173 ExplR:= 0;
   176 ExplR:= 0;
   174 if Metric(round(Me.X), round(Me.Y), Targ.X, Targ.Y) < 80 then
   177 if Metric(round(Me.X), round(Me.Y), Targ.X, Targ.Y) < 80 then
   175    begin
   178    begin
   195      end
   198      end
   196 until (abs(Targ.X - x) + abs(Targ.Y - y) < 4) or (x < 0) or (y < 0) or (x > 2048) or (y > 1024);
   199 until (abs(Targ.X - x) + abs(Targ.Y - y) < 4) or (x < 0) or (y < 0) or (x > 2048) or (y > 1024);
   197 Result:= BadTurn
   200 Result:= BadTurn
   198 end;
   201 end;
   199 
   202 
   200 function TestDesertEagle(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
   203 function TestDesertEagle(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer;
   201 var Vx, Vy, x, y, t: hwFloat;
   204 var Vx, Vy, x, y, t: hwFloat;
   202     d: Longword;
   205     d: Longword;
   203 begin
   206 begin
   204 ExplR:= 0;
   207 ExplR:= 0;
   205 if abs(Me.X - Targ.X) + abs(Me.Y - Targ.Y) < 80 then
   208 if abs(Me.X - Targ.X) + abs(Me.Y - Targ.Y) < 80 then
   224 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);
   227 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);
   225 if abs(Targ.X - x) + abs(Targ.Y - y) < 2 then Result:= max(0, (4 - d div 50) * 7 * 1024)
   228 if abs(Targ.X - x) + abs(Targ.Y - y) < 2 then Result:= max(0, (4 - d div 50) * 7 * 1024)
   226                                          else Result:= Low(integer)
   229                                          else Result:= Low(integer)
   227 end;
   230 end;
   228 
   231 
   229 function TestBaseballBat(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
   232 function TestBaseballBat(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer;
   230 begin
   233 begin
   231 ExplR:= 0;
   234 ExplR:= 0;
   232 if (Level > 2) and (abs(Me.X - Targ.X) + abs(Me.Y - Targ.Y) >= 25) then
   235 if (Level > 2) and (abs(Me.X - Targ.X) + abs(Me.Y - Targ.Y) >= 25) then
   233    begin
   236    begin
   234    Result:= BadTurn;
   237    Result:= BadTurn;
   239 Angle:= DxDy2AttackAngle(hwSign(Targ.X - Me.X), 1);
   242 Angle:= DxDy2AttackAngle(hwSign(Targ.X - Me.X), 1);
   240 Result:= RateShove(Me, round(Me.X) + 10 * hwSign(Targ.X - Me.X), round(Me.Y), 15, 30);
   243 Result:= RateShove(Me, round(Me.X) + 10 * hwSign(Targ.X - Me.X), round(Me.Y), 15, 30);
   241 if Result <= 0 then Result:= BadTurn
   244 if Result <= 0 then Result:= BadTurn
   242 end;
   245 end;
   243 
   246 
   244 function TestFirePunch(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
   247 function TestFirePunch(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer;
   245 var i: integer;
   248 var i: integer;
   246 begin
   249 begin
   247 ExplR:= 0;
   250 ExplR:= 0;
   248 if (abs(Me.X - Targ.X) > 25) or (abs(Me.Y - 50 - Targ.Y) > 50) then
   251 if (abs(Me.X - Targ.X) > 25) or (abs(Me.Y - 50 - Targ.Y) > 50) then
   249    begin
   252    begin