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