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; |