362 // Try to overshoot slightly, seems to pay slightly better dividends in terms of hitting cluster |
362 // Try to overshoot slightly, seems to pay slightly better dividends in terms of hitting cluster |
363 if meX<Targ.X then |
363 if meX<Targ.X then |
364 Vx:= ((Targ.X+10) - meX) / (TestTime + tDelta) |
364 Vx:= ((Targ.X+10) - meX) / (TestTime + tDelta) |
365 else |
365 else |
366 Vx:= ((Targ.X-10) - meX) / (TestTime + tDelta); |
366 Vx:= ((Targ.X-10) - meX) / (TestTime + tDelta); |
367 Vy:= cGravityf * ((TestTime + tDelta) div 2) - ((Targ.Y-150) - meY) / (TestTime + tDelta); |
367 Vy:= cGravityf * ((TestTime + tDelta) div 2) - ((Targ.Y-50) - meY) / (TestTime + tDelta); |
368 r:= sqr(Vx)+sqr(Vy); |
368 r:= sqr(Vx)+sqr(Vy); |
369 if not (r > 1) then |
369 if not (r > 1) then |
370 begin |
370 begin |
371 x:= meX; |
371 x:= meX; |
372 y:= meY; |
372 y:= meY; |
414 meX:= hwFloat2Float(Me^.X); |
414 meX:= hwFloat2Float(Me^.X); |
415 meY:= hwFloat2Float(Me^.Y); |
415 meY:= hwFloat2Float(Me^.Y); |
416 repeat |
416 repeat |
417 inc(TestTime, 1000); |
417 inc(TestTime, 1000); |
418 Vx:= (Targ.X - meX) / (TestTime + tDelta); |
418 Vx:= (Targ.X - meX) / (TestTime + tDelta); |
419 Vy:= cGravityf * ((TestTime + tDelta) div 2) - ((Targ.Y-200) - meY) / (TestTime + tDelta); |
419 Vy:= cGravityf * ((TestTime + tDelta) div 2) - ((Targ.Y-50) - meY) / (TestTime + tDelta); |
420 r:= sqr(Vx)+sqr(Vy); |
420 r:= sqr(Vx)+sqr(Vy); |
421 if not (r > 1) then |
421 if not (r > 1) then |
422 begin |
422 begin |
423 x:= meX; |
423 x:= meX; |
424 y:= meY; |
424 y:= meY; |
425 dY:= -Vy; |
425 dY:= -Vy; |
426 t:= TestTime; |
426 t:= TestTime; |
427 repeat |
427 repeat |
428 x:= x + Vx; |
428 x:= x + Vx; |
429 y:= y + dY; |
429 y:= y + dY; |
430 dY:= dY + cGravityf; |
430 dY:= dY + cGravityf; |
431 dec(t) |
431 dec(t) |
432 until TestCollExcludingMe(Me, trunc(x), trunc(y), 5) or (t = 0); |
432 until TestCollExcludingMe(Me, trunc(x), trunc(y), 7) or (t = 0); |
433 EX:= trunc(x); |
|
434 EY:= trunc(y); |
|
435 if t < 50 then |
|
436 Score:= RateExplosion(Me, EX, EY, 381) |
|
437 else |
|
438 Score:= BadTurn; |
|
439 |
433 |
440 if valueResult < Score then |
434 EX:= trunc(x); |
441 begin |
435 EY:= trunc(y); |
442 ap.Angle:= DxDy2AttackAnglef(Vx, Vy) + AIrndSign(random(Level)); |
436 if t < 50 then |
443 ap.Power:= trunc(sqrt(r) * cMaxPower * 0.9) + AIrndSign(random(Level) * 15); |
437 Score:= RateExplosion(Me, EX, EY, 200) + RateExplosion(Me, EX, EY + 120, 200) |
444 ap.Time:= TestTime; |
438 else |
445 ap.ExplR:= 300; |
439 Score:= BadTurn; |
446 ap.ExplX:= EX; |
440 |
447 ap.ExplY:= EY; |
441 if valueResult < Score then |
448 valueResult:= Score |
442 begin |
449 end; |
443 ap.Angle:= DxDy2AttackAnglef(Vx, Vy) + AIrndSign(random(Level)); |
450 end |
444 ap.Power:= trunc(sqrt(r) * cMaxPower) + AIrndSign(random(Level) * 15); |
|
445 ap.Time:= TestTime; |
|
446 ap.ExplR:= 300; |
|
447 ap.ExplX:= EX; |
|
448 ap.ExplY:= EY; |
|
449 valueResult:= Score |
|
450 end; |
|
451 end |
451 until (TestTime = 4000); |
452 until (TestTime = 4000); |
452 TestWatermelon:= valueResult |
453 TestWatermelon:= valueResult |
453 end; |
454 end; |
454 |
455 |
455 |
456 |
456 function Solve(TX, TY, MX, MY: LongInt): LongWord; |
457 function Solve(TX, TY, MX, MY: LongInt): LongWord; |
457 var A, B, D, T: real; |
458 var A, B, D, T: real; |
458 C: LongInt; |
459 C: LongInt; |
459 begin |
460 begin |
460 A:= sqr(cGravityf) * 0.25; |
461 A:= sqr(cGravityf); |
461 B:= - cGravityf * (TY - MY) - 1; |
462 B:= - cGravityf * (TY - MY) - 1; |
462 C:= sqr(TY - MY) + sqr(TX - MX); |
463 C:= sqr(TY - MY) + sqr(TX - MX); |
463 D:= sqr(B) - (A * C * 4); |
464 D:= sqr(B) - A * C; |
464 if D >= 0 then |
465 if D >= 0 then |
465 begin |
466 begin |
466 D:= ( - B + sqrt(D)) * 0.5 / A; |
467 D:= sqrt(D) - B; |
467 if D >= 0 then |
468 if D >= 0 then |
468 T:= sqrt(D) |
469 T:= sqrt(D * 2 / A) |
469 else |
470 else |
470 T:= 0; |
471 T:= 0; |
471 Solve:= trunc(T) |
472 Solve:= trunc(T) |
472 end |
473 end |
473 else |
474 else |