18 |
18 |
19 unit uAIAmmoTests; |
19 unit uAIAmmoTests; |
20 interface |
20 interface |
21 uses SDLh, uGears, uConsts, uFloat; |
21 uses SDLh, uGears, uConsts, uFloat; |
22 |
22 |
23 (*function TestBazooka(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
23 function TestBazooka(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer; |
24 function TestGrenade(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
24 (*function TestGrenade(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer; |
25 function TestShotgun(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
25 function TestShotgun(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer; |
26 function TestDesertEagle(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
26 function TestDesertEagle(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer; |
27 function TestBaseballBat(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
27 function TestBaseballBat(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer; |
28 function TestFirePunch(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
28 function TestFirePunch(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer; |
29 *) |
29 *) |
30 type TAmmoTestProc = function (Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer; |
30 type TAmmoTestProc = function (Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer; |
31 const AmmoTests: array[TAmmoType] of TAmmoTestProc = |
31 const AmmoTests: array[TAmmoType] of TAmmoTestProc = |
32 ( |
32 ( |
33 {amGrenade} nil,//TestGrenade, |
33 {amGrenade} nil,//TestGrenade, |
34 {amClusterBomb} nil, |
34 {amClusterBomb} nil, |
35 {amBazooka} nil,//TestBazooka, |
35 {amBazooka} @TestBazooka, |
36 {amUFO} nil, |
36 {amUFO} nil, |
37 {amShotgun} nil,//TestShotgun, |
37 {amShotgun} nil,//TestShotgun, |
38 {amPickHammer} nil, |
38 {amPickHammer} nil, |
39 {amSkip} nil, |
39 {amSkip} nil, |
40 {amRope} nil, |
40 {amRope} nil, |
52 const BadTurn = Low(integer); |
52 const BadTurn = Low(integer); |
53 |
53 |
54 |
54 |
55 implementation |
55 implementation |
56 uses uMisc, uAIMisc, uLand; |
56 uses uMisc, uAIMisc, uLand; |
57 { |
57 |
58 function Metric(x1, y1, x2, y2: integer): integer; |
58 function Metric(x1, y1, x2, y2: integer): integer; |
59 begin |
59 begin |
60 Result:= abs(x1 - x2) + abs(y1 - y2) |
60 Metric:= abs(x1 - x2) + abs(y1 - y2) |
61 end; |
61 end; |
62 |
62 |
63 function TestBazooka(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
63 function TestBazooka(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer; |
64 var Vx, Vy, r: hwFloat; |
64 var Vx, Vy, r: hwFloat; |
65 rTime: hwFloat; |
65 rTime: hwFloat; |
66 Score, EX, EY: integer; |
66 Score, EX, EY: integer; |
|
67 Result: integer; |
67 |
68 |
68 function CheckTrace: integer; |
69 function CheckTrace: integer; |
69 var x, y, dX, dY: hwFloat; |
70 var x, y, dX, dY: hwFloat; |
70 t: integer; |
71 t: integer; |
|
72 Result: integer; |
71 begin |
73 begin |
72 x:= Me.X; |
74 x:= Me^.X; |
73 y:= Me.Y; |
75 y:= Me^.Y; |
74 dX:= Vx; |
76 dX:= Vx; |
75 dY:= -Vy; |
77 dY:= -Vy; |
76 t:= trunc(rTime); |
78 t:= hwRound(rTime); |
77 repeat |
79 repeat |
78 x:= x + dX; |
80 x:= x + dX; |
79 y:= y + dY; |
81 y:= y + dY; |
80 dX:= dX + cWindSpeed; |
82 dX:= dX + cWindSpeed; |
81 dY:= dY + cGravity; |
83 dY:= dY + cGravity; |
82 dec(t) |
84 dec(t) |
83 until TestColl(round(x), round(y), 5) or (t <= 0); |
85 until TestColl(hwRound(x), hwRound(y), 5) or (t <= 0); |
84 EX:= round(x); |
86 EX:= hwRound(x); |
85 EY:= round(y); |
87 EY:= hwRound(y); |
86 Result:= RateExplosion(Me, round(x), round(y), 101); |
88 Result:= RateExplosion(Me, EX, EY, 101); |
87 if Result = 0 then Result:= - Metric(Targ.X, Targ.Y, round(x), round(y)) div 64 |
89 if Result = 0 then Result:= - Metric(Targ.X, Targ.Y, EX, EY) div 64; |
|
90 CheckTrace:= Result |
88 end; |
91 end; |
89 |
92 |
90 begin |
93 begin |
91 Time:= 0; |
94 Time:= 0; |
92 rTime:= 50; |
95 rTime:= 50; |
93 ExplR:= 0; |
96 ExplR:= 0; |
94 Result:= BadTurn; |
97 Result:= BadTurn; |
95 repeat |
98 repeat |
96 rTime:= rTime + 300 + Level * 50 + random * 200; |
99 rTime:= rTime + 300 + Level * 50 + random(200); |
97 Vx:= - cWindSpeed * rTime / 2 + (Targ.X - Me.X) / rTime; |
100 Vx:= - cWindSpeed * rTime * _0_5 + (Targ.X - hwRound(Me^.X)) / rTime; |
98 Vy:= cGravity * rTime / 2 - (Targ.Y - Me.Y) / rTime; |
101 Vy:= cGravity * rTime * _0_5 - (Targ.Y - hwRound(Me^.Y)) / rTime; |
99 r:= sqr(Vx) + sqr(Vy); |
102 r:= Distance(Vx, Vy); |
100 if r <= 1 then |
103 if not (r > 1) then |
101 begin |
104 begin |
102 Score:= CheckTrace; |
105 Score:= CheckTrace; |
103 if Result <= Score then |
106 if Result <= Score then |
104 begin |
107 begin |
105 r:= sqrt(r); |
108 Angle:= DxDy2AttackAngle(Vx, Vy) + AIrndSign(random((Level - 1) * 8)); |
106 Angle:= DxDy2AttackAngle(Vx, Vy) + rndSign(random((Level - 1) * 8)); |
109 Power:= hwRound(r * cMaxPower) - random((Level - 1) * 15 + 1); |
107 Power:= round(r * cMaxPower) - random((Level - 1) * 15 + 1); |
|
108 ExplR:= 100; |
110 ExplR:= 100; |
109 ExplX:= EX; |
111 ExplX:= EX; |
110 ExplY:= EY; |
112 ExplY:= EY; |
111 Result:= Score |
113 Result:= Score |
112 end; |
114 end; |
113 end |
115 end |
114 until (rTime >= 4500) |
116 until (rTime > 4500); |
115 end; |
117 TestBazooka:= Result |
116 |
118 end; |
117 function TestGrenade(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
119 { |
|
120 function TestGrenade(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer; |
118 const tDelta = 24; |
121 const tDelta = 24; |
119 var Vx, Vy, r: hwFloat; |
122 var Vx, Vy, r: hwFloat; |
120 Score, EX, EY: integer; |
123 Score, EX, EY: integer; |
121 TestTime: Longword; |
124 TestTime: Longword; |
122 |
125 |
165 end; |
168 end; |
166 end |
169 end |
167 until (TestTime = 5000) |
170 until (TestTime = 5000) |
168 end; |
171 end; |
169 |
172 |
170 function TestShotgun(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
173 function TestShotgun(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer; |
171 var Vx, Vy, x, y: hwFloat; |
174 var Vx, Vy, x, y: hwFloat; |
172 begin |
175 begin |
173 ExplR:= 0; |
176 ExplR:= 0; |
174 if Metric(round(Me.X), round(Me.Y), Targ.X, Targ.Y) < 80 then |
177 if Metric(round(Me.X), round(Me.Y), Targ.X, Targ.Y) < 80 then |
175 begin |
178 begin |
195 end |
198 end |
196 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); |
197 Result:= BadTurn |
200 Result:= BadTurn |
198 end; |
201 end; |
199 |
202 |
200 function TestDesertEagle(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
203 function TestDesertEagle(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer; |
201 var Vx, Vy, x, y, t: hwFloat; |
204 var Vx, Vy, x, y, t: hwFloat; |
202 d: Longword; |
205 d: Longword; |
203 begin |
206 begin |
204 ExplR:= 0; |
207 ExplR:= 0; |
205 if abs(Me.X - Targ.X) + abs(Me.Y - Targ.Y) < 80 then |
208 if abs(Me.X - Targ.X) + abs(Me.Y - Targ.Y) < 80 then |
224 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); |
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); |
225 if abs(Targ.X - x) + abs(Targ.Y - y) < 2 then Result:= max(0, (4 - d div 50) * 7 * 1024) |
228 if abs(Targ.X - x) + abs(Targ.Y - y) < 2 then Result:= max(0, (4 - d div 50) * 7 * 1024) |
226 else Result:= Low(integer) |
229 else Result:= Low(integer) |
227 end; |
230 end; |
228 |
231 |
229 function TestBaseballBat(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
232 function TestBaseballBat(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer; |
230 begin |
233 begin |
231 ExplR:= 0; |
234 ExplR:= 0; |
232 if (Level > 2) and (abs(Me.X - Targ.X) + abs(Me.Y - Targ.Y) >= 25) then |
235 if (Level > 2) and (abs(Me.X - Targ.X) + abs(Me.Y - Targ.Y) >= 25) then |
233 begin |
236 begin |
234 Result:= BadTurn; |
237 Result:= BadTurn; |
239 Angle:= DxDy2AttackAngle(hwSign(Targ.X - Me.X), 1); |
242 Angle:= DxDy2AttackAngle(hwSign(Targ.X - Me.X), 1); |
240 Result:= RateShove(Me, round(Me.X) + 10 * hwSign(Targ.X - Me.X), round(Me.Y), 15, 30); |
243 Result:= RateShove(Me, round(Me.X) + 10 * hwSign(Targ.X - Me.X), round(Me.Y), 15, 30); |
241 if Result <= 0 then Result:= BadTurn |
244 if Result <= 0 then Result:= BadTurn |
242 end; |
245 end; |
243 |
246 |
244 function TestFirePunch(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
247 function TestFirePunch(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer; |
245 var i: integer; |
248 var i: integer; |
246 begin |
249 begin |
247 ExplR:= 0; |
250 ExplR:= 0; |
248 if (abs(Me.X - Targ.X) > 25) or (abs(Me.Y - 50 - Targ.Y) > 50) then |
251 if (abs(Me.X - Targ.X) > 25) or (abs(Me.Y - 50 - Targ.Y) > 50) then |
249 begin |
252 begin |