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 function TestDesertEagle(Me: PGear; Targ: TPoint; 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 |
43 |
43 type TAmmoTestProc = function (Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
44 type TAmmoTestProc = function (Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
44 const AmmoTests: array[TAmmoType] of TAmmoTestProc = |
45 const AmmoTests: array[TAmmoType] of TAmmoTestProc = |
45 ( |
46 ( |
46 {amGrenade} TestGrenade, |
47 {amGrenade} TestGrenade, |
173 end; |
175 end; |
174 |
176 |
175 function TestShotgun(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
177 function TestShotgun(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
176 var Vx, Vy, x, y: real; |
178 var Vx, Vy, x, y: real; |
177 begin |
179 begin |
|
180 ExplR:= 0; |
178 if Metric(round(Me.X), round(Me.Y), Targ.X, Targ.Y) < 80 then |
181 if Metric(round(Me.X), round(Me.Y), Targ.X, Targ.Y) < 80 then |
179 begin |
182 begin |
180 Result:= BadTurn; |
183 Result:= BadTurn; |
181 exit |
184 exit |
182 end; |
185 end; |
183 Time:= 0; |
186 Time:= 0; |
184 Power:= 1; |
187 Power:= 1; |
185 ExplR:= 0; |
|
186 Vx:= (Targ.X - Me.X)/1024; |
188 Vx:= (Targ.X - Me.X)/1024; |
187 Vy:= (Targ.Y - Me.Y)/1024; |
189 Vy:= (Targ.Y - Me.Y)/1024; |
188 x:= Me.X; |
190 x:= Me.X; |
189 y:= Me.Y; |
191 y:= Me.Y; |
190 Angle:= DxDy2AttackAngle(Vx, -Vy); |
192 Angle:= DxDy2AttackAngle(Vx, -Vy); |
191 repeat |
193 repeat |
192 x:= x + vX; |
194 x:= x + vX; |
193 y:= y + vY; |
195 y:= y + vY; |
194 if TestColl(round(x), round(y), 2) then |
196 if TestColl(round(x), round(y), 2) then |
195 begin |
197 begin |
196 Result:= RateExplosion(Me, round(x), round(y), 25) * 2; |
198 Result:= RateShove(Me, round(x), round(y), 25, 25) * 1024; |
197 if Result = 0 then Result:= - Metric(Targ.X, Targ.Y, round(x), round(y)) div 64; |
199 if Result = 0 then Result:= - Metric(Targ.X, Targ.Y, round(x), round(y)) div 64; |
198 exit |
200 exit |
199 end |
201 end |
200 until (abs(Targ.X - x) + abs(Targ.Y - y) < 4) or (x < 0) or (y < 0) or (x > 2048) or (y > 1024); |
202 until (abs(Targ.X - x) + abs(Targ.Y - y) < 4) or (x < 0) or (y < 0) or (x > 2048) or (y > 1024); |
201 Result:= BadTurn |
203 Result:= BadTurn |
203 |
205 |
204 function TestDesertEagle(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
206 function TestDesertEagle(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
205 var Vx, Vy, x, y, t: real; |
207 var Vx, Vy, x, y, t: real; |
206 d: Longword; |
208 d: Longword; |
207 begin |
209 begin |
|
210 ExplR:= 0; |
208 if abs(Me.X - Targ.X) + abs(Me.Y - Targ.Y) < 80 then |
211 if abs(Me.X - Targ.X) + abs(Me.Y - Targ.Y) < 80 then |
209 begin |
212 begin |
210 Result:= BadTurn; |
213 Result:= BadTurn; |
211 exit |
214 exit |
212 end; |
215 end; |
213 Time:= 0; |
216 Time:= 0; |
214 Power:= 1; |
217 Power:= 1; |
215 ExplR:= 0; |
|
216 t:= sqrt(sqr(Targ.X - Me.X) + sqr(Targ.Y - Me.Y)) * 2; |
218 t:= sqrt(sqr(Targ.X - Me.X) + sqr(Targ.Y - Me.Y)) * 2; |
217 Vx:= (Targ.X - Me.X) / t; |
219 Vx:= (Targ.X - Me.X) / t; |
218 Vy:= (Targ.Y - Me.Y) / t; |
220 Vy:= (Targ.Y - Me.Y) / t; |
219 x:= Me.X; |
221 x:= Me.X; |
220 y:= Me.Y; |
222 y:= Me.Y; |
228 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); |
230 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); |
229 if abs(Targ.X - x) + abs(Targ.Y - y) < 2 then Result:= max(0, (4 - d div 50) * 7 * 1024) |
231 if abs(Targ.X - x) + abs(Targ.Y - y) < 2 then Result:= max(0, (4 - d div 50) * 7 * 1024) |
230 else Result:= Low(integer) |
232 else Result:= Low(integer) |
231 end; |
233 end; |
232 |
234 |
|
235 function TestBaseballBat(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; |
|
236 begin |
|
237 ExplR:= 0; |
|
238 if abs(Me.X - Targ.X) + abs(Me.Y - Targ.Y) >= 25 then |
|
239 begin |
|
240 Result:= BadTurn; |
|
241 exit |
|
242 end; |
|
243 Time:= 0; |
|
244 Power:= 1; |
|
245 Angle:= DxDy2AttackAngle(Sign(Targ.X - Me.X), 1); |
|
246 Result:= RateShove(Me, round(Me.X) + 10 * Sign(Targ.X - Me.X), round(Me.Y), 15, 30) |
|
247 end; |
|
248 |
233 end. |
249 end. |