hedgewars/uAIAmmoTests.pas
changeset 75 d2b737858ff7
parent 74 42257fee61ae
child 78 66bb79dd248d
equal deleted inserted replaced
74:42257fee61ae 75:d2b737858ff7
    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; 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; 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; 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 
    42 
    42 type TAmmoTestProc = function (Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
    43 type TAmmoTestProc = function (Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
    43 const AmmoTests: array[TAmmoType] of TAmmoTestProc =
    44 const AmmoTests: array[TAmmoType] of TAmmoTestProc =
    44                  (
    45                  (
    45 {amGrenade}       TestGrenade,
    46 {amGrenade}       TestGrenade,
    48 {amShotgun}       TestShotgun,
    49 {amShotgun}       TestShotgun,
    49 {amPickHammer}    nil,
    50 {amPickHammer}    nil,
    50 {amSkip}          nil,
    51 {amSkip}          nil,
    51 {amRope}          nil,
    52 {amRope}          nil,
    52 {amMine}          nil,
    53 {amMine}          nil,
    53 {amDEagle}        nil,
    54 {amDEagle}        TestDesertEagle,
    54 {amDynamite}      nil
    55 {amDynamite}      nil
    55                   );
    56                   );
    56 
    57 
    57 implementation
    58 implementation
    58 uses uMisc, uAIMisc;
    59 uses uMisc, uAIMisc, uLand;
    59 const BadTurn = Low(integer);
    60 const BadTurn = Low(integer);
    60 
    61 
    61 function Metric(x1, y1, x2, y2: integer): integer;
    62 function Metric(x1, y1, x2, y2: integer): integer;
    62 begin
    63 begin
    63 Result:= abs(x1 - x2) + abs(y1 - y2)
    64 Result:= abs(x1 - x2) + abs(y1 - y2)
   197      end
   198      end
   198 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);
   199 Result:= BadTurn
   200 Result:= BadTurn
   200 end;
   201 end;
   201 
   202 
       
   203 function TestDesertEagle(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer;
       
   204 var Vx, Vy, x, y, t: real;
       
   205     d: Longword;
       
   206 begin
       
   207 if abs(Me.X - Targ.X) + abs(Me.Y - Targ.Y) < 80 then
       
   208    begin
       
   209    Result:= BadTurn;
       
   210    exit
       
   211    end;
       
   212 Time:= 0;
       
   213 Power:= 1;
       
   214 ExplR:= 0;
       
   215 t:= sqrt(sqr(Targ.X - Me.X) + sqr(Targ.Y - Me.Y)) * 2;
       
   216 Vx:= (Targ.X - Me.X) / t;
       
   217 Vy:= (Targ.Y - Me.Y) / t;
       
   218 x:= Me.X;
       
   219 y:= Me.Y;
       
   220 Angle:= DxDy2AttackAngle(Vx, -Vy);
       
   221 d:= 0;
       
   222 repeat
       
   223   x:= x + vX;
       
   224   y:= y + vY;
       
   225   if ((round(x) and $FFFFF800) = 0)and((round(y) and $FFFFFC00) = 0)
       
   226      and (Land[round(y), round(x)] <> 0) then inc(d);
       
   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);
       
   228 if abs(Targ.X - x) + abs(Targ.Y - y) < 2 then Result:= max(0, (4 - d div 50) * 7 * 1024)
       
   229                                          else Result:= Low(integer)
       
   230 end;
       
   231 
   202 end.
   232 end.