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