36 uses SDLh, uGears, uConsts; |
36 uses SDLh, uGears, uConsts; |
37 |
37 |
38 function TestBazooka(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
38 function TestBazooka(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
39 function TestGrenade(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
39 function TestGrenade(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
40 function TestShotgun(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
40 function TestShotgun(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
|
41 function TestDesertEagle(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
41 |
42 |
42 type TAmmoTestProc = function (Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
43 type TAmmoTestProc = function (Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
43 const AmmoTests: array[TAmmoType] of TAmmoTestProc = |
44 const AmmoTests: array[TAmmoType] of TAmmoTestProc = |
44 ( |
45 ( |
45 {amGrenade} TestGrenade, |
46 {amGrenade} TestGrenade, |
48 {amShotgun} TestShotgun, |
49 {amShotgun} TestShotgun, |
49 {amPickHammer} nil, |
50 {amPickHammer} nil, |
50 {amSkip} nil, |
51 {amSkip} nil, |
51 {amRope} nil, |
52 {amRope} nil, |
52 {amMine} nil, |
53 {amMine} nil, |
53 {amDEagle} nil, |
54 {amDEagle} TestDesertEagle, |
54 {amDynamite} nil |
55 {amDynamite} nil |
55 ); |
56 ); |
56 |
57 |
57 implementation |
58 implementation |
58 uses uMisc, uAIMisc; |
59 uses uMisc, uAIMisc, uLand; |
59 const BadTurn = Low(integer); |
60 const BadTurn = Low(integer); |
60 |
61 |
61 function Metric(x1, y1, x2, y2: integer): integer; |
62 function Metric(x1, y1, x2, y2: integer): integer; |
62 begin |
63 begin |
63 Result:= abs(x1 - x2) + abs(y1 - y2) |
64 Result:= abs(x1 - x2) + abs(y1 - y2) |
197 end |
198 end |
198 until (abs(Targ.X - x) + abs(Targ.Y - y) < 4) or (x < 0) or (y < 0) or (x > 2048) or (y > 1024); |
199 until (abs(Targ.X - x) + abs(Targ.Y - y) < 4) or (x < 0) or (y < 0) or (x > 2048) or (y > 1024); |
199 Result:= BadTurn |
200 Result:= BadTurn |
200 end; |
201 end; |
201 |
202 |
|
203 function TestDesertEagle(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
|
204 var Vx, Vy, x, y, t: real; |
|
205 d: Longword; |
|
206 begin |
|
207 if abs(Me.X - Targ.X) + abs(Me.Y - Targ.Y) < 80 then |
|
208 begin |
|
209 Result:= BadTurn; |
|
210 exit |
|
211 end; |
|
212 Time:= 0; |
|
213 Power:= 1; |
|
214 ExplR:= 0; |
|
215 t:= sqrt(sqr(Targ.X - Me.X) + sqr(Targ.Y - Me.Y)) * 2; |
|
216 Vx:= (Targ.X - Me.X) / t; |
|
217 Vy:= (Targ.Y - Me.Y) / t; |
|
218 x:= Me.X; |
|
219 y:= Me.Y; |
|
220 Angle:= DxDy2AttackAngle(Vx, -Vy); |
|
221 d:= 0; |
|
222 repeat |
|
223 x:= x + vX; |
|
224 y:= y + vY; |
|
225 if ((round(x) and $FFFFF800) = 0)and((round(y) and $FFFFFC00) = 0) |
|
226 and (Land[round(y), round(x)] <> 0) then inc(d); |
|
227 until (abs(Targ.X - x) + abs(Targ.Y - y) < 2) or (x < 0) or (y < 0) or (x > 2048) or (y > 1024) or (d > 200); |
|
228 if abs(Targ.X - x) + abs(Targ.Y - y) < 2 then Result:= max(0, (4 - d div 50) * 7 * 1024) |
|
229 else Result:= Low(integer) |
|
230 end; |
|
231 |
202 end. |
232 end. |