34 ExplX, ExplY, ExplR: LongInt; |
34 ExplX, ExplY, ExplR: LongInt; |
35 AttackPutX, AttackPutY: LongInt; |
35 AttackPutX, AttackPutY: LongInt; |
36 end; |
36 end; |
37 |
37 |
38 function TestBazooka(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams): LongInt; |
38 function TestBazooka(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams): LongInt; |
|
39 function TestBee(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams): LongInt; |
39 function TestSnowball(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams): LongInt; |
40 function TestSnowball(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams): LongInt; |
40 function TestGrenade(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams): LongInt; |
41 function TestGrenade(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams): LongInt; |
41 function TestMolotov(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams): LongInt; |
42 function TestMolotov(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams): LongInt; |
42 function TestClusterBomb(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams): LongInt; |
43 function TestClusterBomb(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams): LongInt; |
43 function TestWatermelon(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams): LongInt; |
44 function TestWatermelon(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams): LongInt; |
66 ( |
67 ( |
67 (proc: nil; flags: 0), // amNothing |
68 (proc: nil; flags: 0), // amNothing |
68 (proc: @TestGrenade; flags: 0), // amGrenade |
69 (proc: @TestGrenade; flags: 0), // amGrenade |
69 (proc: @TestClusterBomb; flags: 0), // amClusterBomb |
70 (proc: @TestClusterBomb; flags: 0), // amClusterBomb |
70 (proc: @TestBazooka; flags: 0), // amBazooka |
71 (proc: @TestBazooka; flags: 0), // amBazooka |
71 (proc: nil; flags: 0), // amBee |
72 (proc: @TestBee; flags: amtest_Rare), // amBee |
72 (proc: @TestShotgun; flags: 0), // amShotgun |
73 (proc: @TestShotgun; flags: 0), // amShotgun |
73 (proc: nil; flags: 0), // amPickHammer |
74 (proc: nil; flags: 0), // amPickHammer |
74 (proc: nil; flags: 0), // amSkip |
75 (proc: nil; flags: 0), // amSkip |
75 (proc: nil; flags: 0), // amRope |
76 (proc: nil; flags: 0), // amRope |
76 (proc: nil; flags: 0), // amMine |
77 (proc: nil; flags: 0), // amMine |
190 //until (value > 204800) or (rTime > 4250); not so useful since adding score to the drowning |
191 //until (value > 204800) or (rTime > 4250); not so useful since adding score to the drowning |
191 until rTime > 5050 - Level * 800; |
192 until rTime > 5050 - Level * 800; |
192 TestBazooka:= valueResult |
193 TestBazooka:= valueResult |
193 end; |
194 end; |
194 |
195 |
|
196 function calcBeeFlight(Me: PGear; x, y, dx, dy, tX, tY: real; var eX, eY: LongInt): LongInt; |
|
197 var t: Longword; |
|
198 f: boolean; |
|
199 speed, d: real; |
|
200 begin |
|
201 addfilelog('002'); |
|
202 |
|
203 speed:= sqrt(sqr(dx) + sqr(dy)); |
|
204 // parabola flight before activation |
|
205 t:= 500; |
|
206 repeat |
|
207 x:= x + dx; |
|
208 y:= y + dy; |
|
209 dy:= dy + cGravityf; |
|
210 f:= ((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or |
|
211 ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 5)); |
|
212 dec(t) |
|
213 until (t = 0) or (y >= cWaterLine) or f; |
|
214 |
|
215 if f then |
|
216 begin |
|
217 eX:= trunc(x); |
|
218 eY:= trunc(y); |
|
219 exit(RateExplosion(Me, eX, eY, 101, afTrackFall or afErasesLand)); |
|
220 end; |
|
221 |
|
222 // activated |
|
223 t:= 5000; |
|
224 |
|
225 repeat |
|
226 if (t and $F) = 0 then |
|
227 begin |
|
228 dx:= 0.9 * (dx + 0.000064 * (tX - x)); |
|
229 dy:= 0.9 * (dy + 0.000064 * (tY - y)); |
|
230 d := speed / sqrt(sqr(dx) + sqr(dy)); |
|
231 dx:= dx * d; |
|
232 dy:= dy * d; |
|
233 end; |
|
234 |
|
235 x:= x + dx; |
|
236 y:= y + dy; |
|
237 f:= ((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or |
|
238 ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 5)); |
|
239 dec(t) |
|
240 until (t = 0) or f; |
|
241 |
|
242 if f then |
|
243 begin |
|
244 eX:= trunc(x); |
|
245 eY:= trunc(y); |
|
246 exit(RateExplosion(Me, eX, eY, 101, afTrackFall or afErasesLand)); |
|
247 end |
|
248 else |
|
249 calcBeeFlight:= BadTurn |
|
250 end; |
|
251 |
|
252 function TestBee(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams): LongInt; |
|
253 var i, j: LongInt; |
|
254 valueResult, v: LongInt; |
|
255 mX, mY, dX: real; |
|
256 eX, eY: LongInt; |
|
257 begin |
|
258 if Level > 1 then |
|
259 exit(BadTurn); |
|
260 addfilelog('001'); |
|
261 eX:= 0; |
|
262 eY:= 0; |
|
263 mX:= hwFloat2Float(Me^.X); |
|
264 mY:= hwFloat2Float(Me^.Y); |
|
265 valueResult:= BadTurn; |
|
266 for i:= 0 to 8 do |
|
267 for j:= 0 to 1 do |
|
268 begin |
|
269 ap.Angle:= i * 120; |
|
270 ap.Power:= random(1700) + 300; |
|
271 dx:= sin(ap.Angle / 2048); |
|
272 if j = 0 then |
|
273 begin |
|
274 ap.Angle:= -ap.Angle; |
|
275 dx:= -dx; |
|
276 end; |
|
277 |
|
278 v:= calcBeeFlight(Me |
|
279 , mX |
|
280 , mY |
|
281 , sin(ap.Angle / 2048) * ap.Power / cMaxPower |
|
282 , cos(ap.Angle / 2048) * ap.Power / cMaxPower |
|
283 , Targ.Point.X |
|
284 , Targ.Point.Y |
|
285 , eX |
|
286 , eY); |
|
287 |
|
288 if v > valueResult then |
|
289 begin |
|
290 ap.ExplR:= 100; |
|
291 ap.ExplX:= eX; |
|
292 ap.ExplY:= eY; |
|
293 valueResult:= v |
|
294 end |
|
295 end; |
|
296 |
|
297 ap.AttackPutX:= Targ.Point.X; |
|
298 ap.AttackPutY:= Targ.Point.Y; |
|
299 |
|
300 TestBee:= valueResult |
|
301 end; |
195 |
302 |
196 function TestDrillRocket(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams): LongInt; |
303 function TestDrillRocket(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams): LongInt; |
197 var Vx, Vy, r, mX, mY: real; |
304 var Vx, Vy, r, mX, mY: real; |
198 rTime: LongInt; |
305 rTime: LongInt; |
199 EX, EY: LongInt; |
306 EX, EY: LongInt; |