hedgewars/uAIAmmoTests.pas
changeset 15613 d9c62f196fe0
parent 15612 39a353e8ef3d
child 15614 250c778463f3
equal deleted inserted replaced
15612:39a353e8ef3d 15613:d9c62f196fe0
    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 TestAirMine(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    65 
    66 
    66 type TAmmoTestProc = function (Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    67 type TAmmoTestProc = function (Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    67     TAmmoTest = record
    68     TAmmoTest = record
    68             proc: TAmmoTestProc;
    69             proc: TAmmoTestProc;
    69             flags: Longword;
    70             flags: Longword;
   127             (proc: nil;              flags: 0), // amTardis
   128             (proc: nil;              flags: 0), // amTardis
   128             (proc: nil;              flags: 0), // amLandGun
   129             (proc: nil;              flags: 0), // amLandGun
   129             (proc: nil;              flags: 0), // amIceGun
   130             (proc: nil;              flags: 0), // amIceGun
   130             (proc: nil;              flags: 0), // amKnife
   131             (proc: nil;              flags: 0), // amKnife
   131             (proc: nil;              flags: 0), // amRubber
   132             (proc: nil;              flags: 0), // amRubber
   132             (proc: nil;              flags: 0), // amAirMine
   133             (proc: @TestAirMine;     flags: 0), // amAirMine
   133             (proc: nil;              flags: 0), // amCreeper
   134             (proc: nil;              flags: 0), // amCreeper
   134             (proc: @TestShotgun;     flags: 0)  // amMinigun
   135             (proc: @TestShotgun;     flags: 0)  // amMinigun
   135             );
   136             );
   136 
   137 
   137 implementation
   138 implementation
  1909     valueResult:= BadTurn;
  1910     valueResult:= BadTurn;
  1910 
  1911 
  1911 TestMine:= valueResult
  1912 TestMine:= valueResult
  1912 end;
  1913 end;
  1913 
  1914 
       
  1915 function TestAirMine(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
       
  1916 const
       
  1917     MIN_RANGE = 160;
       
  1918     MAX_RANGE = 2612;
       
  1919 var Vx, Vy, meX, meY, x, y, r: real;
       
  1920     rx, ry, valueResult: LongInt;
       
  1921     range, maxRange: integer;
       
  1922 begin
       
  1923 Flags:= Flags; // avoid compiler hint
       
  1924 maxRange:= MAX_RANGE - ((Level - 1) * 300);
       
  1925 TestAirMine:= BadTurn;
       
  1926 ap.ExplR:= 60;
       
  1927 ap.Time:= 0;
       
  1928 meX:= hwFloat2Float(Me^.X);
       
  1929 meY:= hwFloat2Float(Me^.Y);
       
  1930 x:= meX;
       
  1931 y:= meY;
       
  1932 
       
  1933 // Rough first range check
       
  1934 range:= Metric(trunc(x), trunc(y), Targ.Point.X, Targ.Point.Y);
       
  1935 if ( range < MIN_RANGE ) or ( range > maxRange ) then
       
  1936     exit(BadTurn);
       
  1937 
       
  1938 Vx:= (Targ.Point.X - x) * 1 / 1024;
       
  1939 Vy:= (Targ.Point.Y - y) * 1 / 1024;
       
  1940 ap.Angle:= DxDy2AttackAnglef(Vx, -Vy);
       
  1941 repeat
       
  1942     x:= x + vX;
       
  1943     y:= y + vY;
       
  1944     rx:= trunc(x);
       
  1945     ry:= trunc(y);
       
  1946     if ((Me = CurrentHedgehog^.Gear) and TestColl(rx, ry, 8)) or
       
  1947         ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, rx, ry, 8)) then
       
  1948         begin
       
  1949         x:= x + vX * 8;
       
  1950         y:= y + vY * 8;
       
  1951 
       
  1952         if Level = 1 then
       
  1953             valueResult:= RateExplosion(Me, rx, ry, 61, afTrackFall)
       
  1954         else
       
  1955             valueResult:= RateExplosion(Me, rx, ry, 61);
       
  1956 
       
  1957         // Precise range calculation required to calculate power;
       
  1958         // The air mine is very sensitive to small changes in power.
       
  1959         r:= sqr(meX - rx) + sqr(meY - ry);
       
  1960         range:= trunc(sqrt(r));
       
  1961 
       
  1962         if ( range < MIN_RANGE ) or ( range > maxRange ) then
       
  1963             exit(BadTurn);
       
  1964         ap.Power:= ((range + cHHRadius*2) * cMaxPower) div MAX_RANGE;
       
  1965 
       
  1966         // Apply inaccuracy
       
  1967         inc(ap.Power, (random(93*(Level-1)) - 31*(Level-1))); // Level 1 spread: -124 .. 248
       
  1968         if (not cLaserSighting) then
       
  1969             inc(ap.Angle, + AIrndSign(random((Level - 1) * 10)));
       
  1970 
       
  1971         if (valueResult <= 0) then
       
  1972             valueResult:= BadTurn;
       
  1973         exit(valueResult)
       
  1974         end
       
  1975 until (abs(Targ.Point.X - trunc(x)) + abs(Targ.Point.Y - trunc(y)) < 4)
       
  1976     or (x < 0)
       
  1977     or (y < 0)
       
  1978     or (trunc(x) > LAND_WIDTH)
       
  1979     or (trunc(y) > LAND_HEIGHT);
       
  1980 
       
  1981 TestAirMine := BadTurn
       
  1982 end;
       
  1983 
       
  1984 
  1914 end.
  1985 end.