hedgewars/uAIAmmoTests.pas
changeset 15730 680dc787408c
parent 15729 34138bf36c5c
child 15740 0a172cfe8840
equal deleted inserted replaced
15729:34138bf36c5c 15730:680dc787408c
    61 function TestWhip(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    61 function TestWhip(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    62 function TestKamikaze(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    62 function TestKamikaze(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    63 function TestAirAttack(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    63 function TestAirAttack(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    64 function TestDrillStrike(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    64 function TestDrillStrike(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    65 function TestMineStrike(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    65 function TestMineStrike(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
       
    66 function TestSineGun(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    66 function TestSMine(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    67 function TestSMine(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    67 function TestPiano(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    68 function TestPiano(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    68 function TestTeleport(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    69 function TestTeleport(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    69 function TestHammer(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    70 function TestHammer(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    70 function TestResurrector(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    71 function TestResurrector(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
   128             (proc: @TestMolotov;     flags: 0), // amMolotov
   129             (proc: @TestMolotov;     flags: 0), // amMolotov
   129             (proc: nil;              flags: 0), // amBirdy
   130             (proc: nil;              flags: 0), // amBirdy
   130             (proc: nil;              flags: 0), // amPortalGun
   131             (proc: nil;              flags: 0), // amPortalGun
   131             (proc: @TestPiano;       flags: amtest_Rare or amtest_NoInvulnerable or amtest_NoVampiric), // amPiano
   132             (proc: @TestPiano;       flags: amtest_Rare or amtest_NoInvulnerable or amtest_NoVampiric), // amPiano
   132             (proc: @TestGrenade;     flags: amtest_NoTrackFall), // amGasBomb
   133             (proc: @TestGrenade;     flags: amtest_NoTrackFall), // amGasBomb
   133             (proc: @TestShotgun;     flags: 0), // amSineGun
   134             (proc: @TestSineGun;     flags: amtest_NoVampiric), // amSineGun
   134             (proc: nil;              flags: 0), // amFlamethrower
   135             (proc: nil;              flags: 0), // amFlamethrower
   135             (proc: @TestSMine;       flags: 0), // amSMine
   136             (proc: @TestSMine;       flags: 0), // amSMine
   136             (proc: @TestHammer;      flags: amtest_NoTarget or amtest_NoInvulnerable), // amHammer
   137             (proc: @TestHammer;      flags: amtest_NoTarget or amtest_NoInvulnerable), // amHammer
   137             (proc: @TestResurrector; flags: amtest_NoTarget or amtest_NoInvulnerable or amtest_NoVampiric or amtest_NoLowGravity), // amResurrector
   138             (proc: @TestResurrector; flags: amtest_NoTarget or amtest_NoInvulnerable or amtest_NoVampiric or amtest_NoLowGravity), // amResurrector
   138             (proc: @TestDrillStrike; flags: amtest_Rare), // amDrillStrike
   139             (proc: @TestDrillStrike; flags: amtest_Rare), // amDrillStrike
  1804 if valueResult <= 0 then
  1805 if valueResult <= 0 then
  1805     valueResult:= BadTurn;
  1806     valueResult:= BadTurn;
  1806 TestMineStrike:= valueResult;
  1807 TestMineStrike:= valueResult;
  1807 end;
  1808 end;
  1808 
  1809 
       
  1810 function TestSineGun(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
       
  1811 const
       
  1812     MIN_RANGE =  40;
       
  1813     MAX_RANGE = 400;
       
  1814 var Vx, Vy, x, y: real;
       
  1815     rx, ry, value, valueResult: LongInt;
       
  1816     range: integer;
       
  1817     landStop: boolean;
       
  1818 begin
       
  1819 // TODO: Also simulate the sine gun's kickback and make sure the attacker
       
  1820 // doesn't get hurt
       
  1821 
       
  1822 Flags:= Flags; // avoid compiler hint
       
  1823 TestSineGun:= BadTurn;
       
  1824 valueResult:= 0;
       
  1825 ap.ExplR:= 0;
       
  1826 ap.Time:= 0;
       
  1827 ap.Power:= 1;
       
  1828 x:= hwFloat2Float(Me^.X);
       
  1829 y:= hwFloat2Float(Me^.Y);
       
  1830 range:= Metric(trunc(x), trunc(y), Targ.Point.X, Targ.Point.Y);
       
  1831 // Range limits
       
  1832 if (range < MIN_RANGE) or ((range > MAX_RANGE) and (Level >= 4)) then
       
  1833     exit(BadTurn);
       
  1834 
       
  1835 Vx:= (Targ.Point.X - x) * 1 / 1024;
       
  1836 Vy:= (Targ.Point.Y - y) * 1 / 1024;
       
  1837 
       
  1838 // Never shoot downwards or horizontal because it's dangerous
       
  1839 // and we don't have a proper check for kickback yet
       
  1840 if Vy >= 0 then
       
  1841     exit(BadTurn);
       
  1842 
       
  1843 landStop:= false;
       
  1844 ap.Angle:= DxDy2AttackAnglef(Vx, -Vy);
       
  1845 // Apply inaccuracy
       
  1846 if (not aiLaserSighting) then
       
  1847     inc(ap.Angle, AIrndSign(random((Level - 1) * 10)));
       
  1848 repeat
       
  1849     x:= x + vX;
       
  1850     y:= y + vY;
       
  1851     rx:= trunc(x);
       
  1852     ry:= trunc(y);
       
  1853     if (GameFlags and gfSolidLand) <> 0 then
       
  1854         // Stop projectile when colliding with indestructible land
       
  1855         landStop:= (Me = CurrentHedgehog^.Gear) and TestColl(rx, ry, 5);
       
  1856 
       
  1857     if landStop or
       
  1858        ((Me = CurrentHedgehog^.Gear) and TestCollHogsOrObjects(rx, ry, 5)) or
       
  1859        ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, rx, ry, 5)) then
       
  1860     begin
       
  1861         x:= x + vX * 8;
       
  1862         y:= y + vY * 8;
       
  1863         value:= RateShove(Me, rx, ry, 5, 35, 50, vX, vY, afTrackFall);
       
  1864 
       
  1865         if (value > 0) then
       
  1866             inc(valueResult, value);
       
  1867     end
       
  1868 until (Abs(Targ.Point.X - trunc(x)) + Abs(Targ.Point.Y - trunc(y)) < 5)
       
  1869     or (landStop)
       
  1870     or (Metric(trunc(x), trunc(y), hwRound(Me^.X), hwRound(Me^.Y)) > MAX_RANGE)
       
  1871     or (x < 0)
       
  1872     or (y < 0)
       
  1873     or (trunc(x) > LAND_WIDTH)
       
  1874     or (trunc(y) > LAND_HEIGHT);
       
  1875 
       
  1876 if valueResult <= 0 then
       
  1877     valueResult:= BadTurn;
       
  1878 TestSineGun:= valueResult;
       
  1879 end;
       
  1880 
  1809 function TestSMine(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
  1881 function TestSMine(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
  1810 const timeLimit = 50;
  1882 const timeLimit = 50;
  1811       Density : real = 1.6;
  1883       Density : real = 1.6;
  1812 var Vx, Vy, r, meX, meY: real;
  1884 var Vx, Vy, r, meX, meY: real;
  1813     rTime: LongInt;
  1885     rTime: LongInt;