33 |
33 |
34 unit uAIAmmoTests; |
34 unit uAIAmmoTests; |
35 interface |
35 interface |
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; Level: Integer; 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; Level: Integer; 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; Level: Integer; 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 function TestDesertEagle(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
42 function TestBaseballBat(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
42 function TestBaseballBat(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
43 function TestFirePunch(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
43 function TestFirePunch(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
44 |
44 |
45 type TAmmoTestProc = function (Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
45 type TAmmoTestProc = function (Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
46 const AmmoTests: array[TAmmoType] of TAmmoTestProc = |
46 const AmmoTests: array[TAmmoType] of TAmmoTestProc = |
47 ( |
47 ( |
48 {amGrenade} TestGrenade, |
48 {amGrenade} TestGrenade, |
49 {amClusterBomb} nil, |
49 {amClusterBomb} nil, |
50 {amBazooka} TestBazooka, |
50 {amBazooka} TestBazooka, |
67 function Metric(x1, y1, x2, y2: integer): integer; |
67 function Metric(x1, y1, x2, y2: integer): integer; |
68 begin |
68 begin |
69 Result:= abs(x1 - x2) + abs(y1 - y2) |
69 Result:= abs(x1 - x2) + abs(y1 - y2) |
70 end; |
70 end; |
71 |
71 |
72 function TestBazooka(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
72 function TestBazooka(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
73 var Vx, Vy, r: Double; |
73 var Vx, Vy, r: Double; |
74 rTime: Double; |
74 rTime: Double; |
75 Score, EX, EY: integer; |
75 Score, EX, EY: integer; |
76 |
76 |
77 function CheckTrace: integer; |
77 function CheckTrace: integer; |
100 Time:= 0; |
100 Time:= 0; |
101 rTime:= 50; |
101 rTime:= 50; |
102 ExplR:= 0; |
102 ExplR:= 0; |
103 Result:= BadTurn; |
103 Result:= BadTurn; |
104 repeat |
104 repeat |
105 rTime:= rTime + 150 + random*250; |
105 rTime:= rTime + 150 + Level * 25 + random * 250; |
106 Vx:= - cWindSpeed * rTime / 2 + (Targ.X - Me.X) / rTime; |
106 Vx:= - cWindSpeed * rTime / 2 + (Targ.X - Me.X) / rTime; |
107 Vy:= cGravity * rTime / 2 - (Targ.Y - Me.Y) / rTime; |
107 Vy:= cGravity * rTime / 2 - (Targ.Y - Me.Y) / rTime; |
108 r:= sqr(Vx) + sqr(Vy); |
108 r:= sqr(Vx) + sqr(Vy); |
109 if r <= 1 then |
109 if r <= 1 then |
110 begin |
110 begin |
111 Score:= CheckTrace; |
111 Score:= CheckTrace; |
112 if Result <= Score then |
112 if Result <= Score then |
113 begin |
113 begin |
114 r:= sqrt(r); |
114 r:= sqrt(r); |
115 Angle:= DxDy2AttackAngle(Vx, Vy); |
115 Angle:= DxDy2AttackAngle(Vx, Vy) + rndSign(random((Level - 1) * 8) + 1); |
116 Power:= round(r * cMaxPower); |
116 Power:= round(r * cMaxPower) - random((Level - 1) * 15 + 1); |
117 ExplR:= 100; |
117 ExplR:= 100; |
118 ExplX:= EX; |
118 ExplX:= EX; |
119 ExplY:= EY; |
119 ExplY:= EY; |
120 Result:= Score |
120 Result:= Score - random((Level - 1) * 2500) |
121 end; |
121 end; |
122 end |
122 end |
123 until (rTime >= 4500) |
123 until (rTime >= 4500) |
124 end; |
124 end; |
125 |
125 |
126 function TestGrenade(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
126 function TestGrenade(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
127 const tDelta = 24; |
127 const tDelta = 24; |
128 var Vx, Vy, r: Double; |
128 var Vx, Vy, r: Double; |
129 Score, EX, EY: integer; |
129 Score, EX, EY: integer; |
130 TestTime: Longword; |
130 TestTime: Longword; |
131 |
131 |
162 begin |
162 begin |
163 Score:= CheckTrace; |
163 Score:= CheckTrace; |
164 if Result < Score then |
164 if Result < Score then |
165 begin |
165 begin |
166 r:= sqrt(r); |
166 r:= sqrt(r); |
167 Angle:= DxDy2AttackAngle(Vx, Vy); |
167 Angle:= DxDy2AttackAngle(Vx, Vy) + rndSign(random(Level)); |
168 Power:= round(r * cMaxPower); |
168 Power:= round(r * cMaxPower) + rndSign(random(Level) * 12); |
169 Time:= TestTime; |
169 Time:= TestTime; |
170 ExplR:= 100; |
170 ExplR:= 100; |
171 ExplX:= EX; |
171 ExplX:= EX; |
172 ExplY:= EY; |
172 ExplY:= EY; |
173 Result:= Score |
173 Result:= Score |
174 end; |
174 end; |
175 end |
175 end |
176 until (TestTime = 5000) |
176 until (TestTime = 5000) |
177 end; |
177 end; |
178 |
178 |
179 function TestShotgun(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
179 function TestShotgun(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
180 var Vx, Vy, x, y: Double; |
180 var Vx, Vy, x, y: Double; |
181 begin |
181 begin |
182 ExplR:= 0; |
182 ExplR:= 0; |
183 if Metric(round(Me.X), round(Me.Y), Targ.X, Targ.Y) < 80 then |
183 if Metric(round(Me.X), round(Me.Y), Targ.X, Targ.Y) < 80 then |
184 begin |
184 begin |
185 Result:= BadTurn; |
185 Result:= BadTurn; |
186 exit |
186 exit |
195 repeat |
195 repeat |
196 x:= x + vX; |
196 x:= x + vX; |
197 y:= y + vY; |
197 y:= y + vY; |
198 if TestColl(round(x), round(y), 2) then |
198 if TestColl(round(x), round(y), 2) then |
199 begin |
199 begin |
200 Result:= RateShove(Me, round(x), round(y), 25, 25); |
200 Result:= RateShove(Me, round(x), round(y), 25, 25) * 2 - Level * 4000; |
201 if Result = 0 then Result:= - Metric(Targ.X, Targ.Y, round(x), round(y)) div 64; |
201 if Result = 0 then Result:= - Metric(Targ.X, Targ.Y, round(x), round(y)) div 64; |
202 exit |
202 exit |
203 end |
203 end |
204 until (abs(Targ.X - x) + abs(Targ.Y - y) < 4) or (x < 0) or (y < 0) or (x > 2048) or (y > 1024); |
204 until (abs(Targ.X - x) + abs(Targ.Y - y) < 4) or (x < 0) or (y < 0) or (x > 2048) or (y > 1024); |
205 Result:= BadTurn |
205 Result:= BadTurn |
206 end; |
206 end; |
207 |
207 |
208 function TestDesertEagle(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
208 function TestDesertEagle(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
209 var Vx, Vy, x, y, t: Double; |
209 var Vx, Vy, x, y, t: Double; |
210 d: Longword; |
210 d: Longword; |
211 begin |
211 begin |
212 ExplR:= 0; |
212 ExplR:= 0; |
213 if abs(Me.X - Targ.X) + abs(Me.Y - Targ.Y) < 80 then |
213 if abs(Me.X - Targ.X) + abs(Me.Y - Targ.Y) < 80 then |
232 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); |
232 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); |
233 if abs(Targ.X - x) + abs(Targ.Y - y) < 2 then Result:= max(0, (4 - d div 50) * 7 * 1024) |
233 if abs(Targ.X - x) + abs(Targ.Y - y) < 2 then Result:= max(0, (4 - d div 50) * 7 * 1024) |
234 else Result:= Low(integer) |
234 else Result:= Low(integer) |
235 end; |
235 end; |
236 |
236 |
237 function TestBaseballBat(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
237 function TestBaseballBat(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
238 begin |
238 begin |
239 ExplR:= 0; |
239 ExplR:= 0; |
240 if abs(Me.X - Targ.X) + abs(Me.Y - Targ.Y) >= 25 then |
240 if (Level < 2) and (abs(Me.X - Targ.X) + abs(Me.Y - Targ.Y) >= 25) then |
241 begin |
241 begin |
242 Result:= BadTurn; |
242 Result:= BadTurn; |
243 exit |
243 exit |
244 end; |
244 end; |
245 Time:= 0; |
245 Time:= 0; |
246 Power:= 1; |
246 Power:= 1; |
247 Angle:= DxDy2AttackAngle(hwSign(Targ.X - Me.X), 1); |
247 Angle:= DxDy2AttackAngle(hwSign(Targ.X - Me.X), 1); |
248 Result:= RateShove(Me, round(Me.X) + 10 * hwSign(Targ.X - Me.X), round(Me.Y), 15, 30) |
248 Result:= RateShove(Me, round(Me.X) + 10 * hwSign(Targ.X - Me.X), round(Me.Y), 15, 30) |
249 end; |
249 end; |
250 |
250 |
251 function TestFirePunch(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
251 function TestFirePunch(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
252 var i: integer; |
252 var i: integer; |
253 begin |
253 begin |
254 ExplR:= 0; |
254 ExplR:= 0; |
255 if (abs(Me.X - Targ.X) > 25) or (abs(Me.Y - 50 - Targ.Y) > 50) then |
255 if (abs(Me.X - Targ.X) > 25) or (abs(Me.Y - 50 - Targ.Y) > 50) then |
256 begin |
256 begin |