hedgewars/uAIAmmoTests.pas
changeset 15616 e4abca26f215
parent 15615 5a949495ee29
child 15617 e21285b7c5e6
equal deleted inserted replaced
15615:5a949495ee29 15616:e4abca26f215
    60 function TestTeleport(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    60 function TestTeleport(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    61 function TestHammer(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    61 function TestHammer(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    62 function TestCake(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    62 function TestCake(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    63 function TestDynamite(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    63 function TestDynamite(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    64 function TestMine(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    64 function TestMine(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
       
    65 function TestKnife(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    65 function TestAirMine(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    66 function TestAirMine(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    66 
    67 
    67 type TAmmoTestProc = function (Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    68 type TAmmoTestProc = function (Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    68     TAmmoTest = record
    69     TAmmoTest = record
    69             proc: TAmmoTestProc;
    70             proc: TAmmoTestProc;
   126             (proc: @TestDrillStrike; flags: amtest_Rare), // amDrillStrike
   127             (proc: @TestDrillStrike; flags: amtest_Rare), // amDrillStrike
   127             (proc: nil;              flags: 0), // amSnowball
   128             (proc: nil;              flags: 0), // amSnowball
   128             (proc: nil;              flags: 0), // amTardis
   129             (proc: nil;              flags: 0), // amTardis
   129             (proc: nil;              flags: 0), // amLandGun
   130             (proc: nil;              flags: 0), // amLandGun
   130             (proc: nil;              flags: 0), // amIceGun
   131             (proc: nil;              flags: 0), // amIceGun
   131             (proc: nil;              flags: 0), // amKnife
   132             (proc: @TestKnife;       flags: 0), // amKnife
   132             (proc: nil;              flags: 0), // amRubber
   133             (proc: nil;              flags: 0), // amRubber
   133             (proc: @TestAirMine;     flags: 0), // amAirMine
   134             (proc: @TestAirMine;     flags: 0), // amAirMine
   134             (proc: nil;              flags: 0), // amCreeper
   135             (proc: nil;              flags: 0), // amCreeper
   135             (proc: @TestShotgun;     flags: 0)  // amMinigun
   136             (proc: @TestShotgun;     flags: 0)  // amMinigun
   136             );
   137             );
  1926     valueResult:= BadTurn;
  1927     valueResult:= BadTurn;
  1927 
  1928 
  1928 TestMine:= valueResult
  1929 TestMine:= valueResult
  1929 end;
  1930 end;
  1930 
  1931 
       
  1932 function TestKnife(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
       
  1933 const timeLimit = 300;
       
  1934 var Vx, Vy, r, meX, meY: real;
       
  1935     rTime: LongInt;
       
  1936     EX, EY: LongInt;
       
  1937     valueResult: LongInt;
       
  1938     targXWrap, x, y, dX, dY: real;
       
  1939     t: LongInt;
       
  1940     value, range: LongInt;
       
  1941 begin
       
  1942 Flags:= Flags; // avoid compiler hint
       
  1943 meX:= hwFloat2Float(Me^.X);
       
  1944 meY:= hwFloat2Float(Me^.Y);
       
  1945 ap.Time:= 0;
       
  1946 rTime:= 350;
       
  1947 ap.ExplR:= 0;
       
  1948 if (WorldEdge = weWrap) then
       
  1949     if (Targ.Point.X < meX) then
       
  1950          targXWrap:= Targ.Point.X + (RightX-LeftX)
       
  1951     else
       
  1952          targXWrap:= Targ.Point.X - (RightX-LeftX);
       
  1953 valueResult:= BadTurn;
       
  1954 repeat
       
  1955     rTime:= rTime + 300 + Level * 50 + random(300);
       
  1956     if (WorldEdge = weWrap) and (random(2)=0) then
       
  1957          Vx:= (targXWrap - meX) / rTime
       
  1958     else
       
  1959          Vx:= (Targ.Point.X - meX) / rTime;
       
  1960     Vy:= cGravityf * rTime * 0.5 - (Targ.Point.Y + 1 - meY) / rTime;
       
  1961     r:= sqr(Vx) + sqr(Vy);
       
  1962 
       
  1963     if not (r > 1) then
       
  1964         begin
       
  1965         x:= meX;
       
  1966         y:= meY;
       
  1967         dX:= Vx;
       
  1968         dY:= -Vy;
       
  1969         t:= rTime;
       
  1970         repeat
       
  1971             x:= CheckWrap(x);
       
  1972             x:= x + dX;
       
  1973 
       
  1974             y:= y + dY;
       
  1975             dY:= dY + cGravityf;
       
  1976             dec(t)
       
  1977         until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 7)) or
       
  1978                ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 7))) or (t < -timeLimit);
       
  1979 
       
  1980         EX:= trunc(x);
       
  1981         EY:= trunc(y);
       
  1982 
       
  1983         // Sanity check: Make sure we're not too close to impact location
       
  1984         range:= Metric(trunc(meX), trunc(meY), EX, EY);
       
  1985         if (range <= 40) then
       
  1986             exit(BadTurn);
       
  1987 
       
  1988         if t >= -timeLimit then
       
  1989             value:= RateShove(Me, EX, EY, 16, trunc(sqr((abs(dY)+abs(dX))*40000/10000)), 0, dX, dY, 0)
       
  1990         else
       
  1991             value:= BadTurn;
       
  1992 
       
  1993         if (value = 0) and (Targ.Kind = gtHedgehog) and (Targ.Score > 0) then
       
  1994             value := BadTurn;
       
  1995 
       
  1996         if (valueResult < value) or ((valueResult = value) and (Level = 1)) then
       
  1997             begin
       
  1998             ap.Angle:= DxDy2AttackAnglef(Vx, Vy) + AIrndSign(random((Level - 1) * 12));
       
  1999             ap.Power:= trunc(sqrt(r) * cMaxPower) - random((Level - 1) * 22 + 1);
       
  2000             valueResult:= value
       
  2001             end;
       
  2002         end
       
  2003 until rTime > 5050 - Level * 800;
       
  2004 TestKnife:= valueResult
       
  2005 end;
       
  2006 
  1931 function TestAirMine(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
  2007 function TestAirMine(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
  1932 const
  2008 const
  1933     MIN_RANGE = 160;
  2009     MIN_RANGE = 160;
  1934     MAX_RANGE = 2612;
  2010     MAX_RANGE = 2612;
  1935 var Vx, Vy, meX, meY, x, y, r: real;
  2011 var Vx, Vy, meX, meY, x, y, r: real;