42 function TestGrenade(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
42 function TestGrenade(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
43 function TestMolotov(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
43 function TestMolotov(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
44 function TestClusterBomb(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
44 function TestClusterBomb(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
45 function TestWatermelon(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
45 function TestWatermelon(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
46 function TestDrillRocket(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
46 function TestDrillRocket(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
|
47 function TestRCPlane(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
47 function TestMortar(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
48 function TestMortar(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
48 function TestShotgun(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
49 function TestShotgun(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
49 function TestDesertEagle(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
50 function TestDesertEagle(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
50 function TestSniperRifle(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
51 function TestSniperRifle(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
51 function TestBaseballBat(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
52 function TestBaseballBat(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
100 (proc: @TestWatermelon; flags: 0), // amWatermelon |
101 (proc: @TestWatermelon; flags: 0), // amWatermelon |
101 (proc: nil; flags: 0), // amHellishBomb |
102 (proc: nil; flags: 0), // amHellishBomb |
102 (proc: nil; flags: 0), // amNapalm |
103 (proc: nil; flags: 0), // amNapalm |
103 (proc: @TestDrillRocket; flags: 0), // amDrill |
104 (proc: @TestDrillRocket; flags: 0), // amDrill |
104 (proc: nil; flags: 0), // amBallgun |
105 (proc: nil; flags: 0), // amBallgun |
105 (proc: nil; flags: 0), // amRCPlane |
106 (proc: @TestRCPlane; flags: 0), // amRCPlane |
106 (proc: nil; flags: 0), // amLowGravity |
107 (proc: nil; flags: 0), // amLowGravity |
107 (proc: nil; flags: 0), // amExtraDamage |
108 (proc: nil; flags: 0), // amExtraDamage |
108 (proc: nil; flags: 0), // amInvulnerable |
109 (proc: nil; flags: 0), // amInvulnerable |
109 (proc: nil; flags: 0), // amExtraTime |
110 (proc: nil; flags: 0), // amExtraTime |
110 (proc: nil; flags: 0), // amLaserSight |
111 (proc: nil; flags: 0), // amLaserSight |
413 end |
414 end |
414 until rTime > 5050 - Level * 800; |
415 until rTime > 5050 - Level * 800; |
415 TestDrillRocket:= valueResult |
416 TestDrillRocket:= valueResult |
416 end; |
417 end; |
417 |
418 |
|
419 function TestRCPlane(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
|
420 const |
|
421 MIN_RANGE = 200; |
|
422 var Vx, Vy, meX, meY, x, y: real; |
|
423 rx, ry, valueResult: LongInt; |
|
424 range, maxRange: integer; |
|
425 begin |
|
426 // This is a very simple test to let a RC plane fly in a straight line, without dropping any bombs |
|
427 // TODO: Teach AI how to steer |
|
428 // TODO: Teach AI how to drop bombs |
|
429 // TODO: Teach AI how to predict fire behavior |
|
430 Flags:= Flags; // avoid compiler hint |
|
431 if Level = 5 then |
|
432 exit(BadTurn) |
|
433 else if Level = 4 then |
|
434 maxRange:= 2200 |
|
435 else if Level = 3 then |
|
436 maxRange:= 2900 |
|
437 else if Level = 2 then |
|
438 maxRange:= 3500 |
|
439 else |
|
440 maxRange:= 3900; |
|
441 TestRCPlane:= BadTurn; |
|
442 ap.ExplR:= 0; |
|
443 ap.Time:= 0; |
|
444 ap.Power:= 1; |
|
445 meX:= hwFloat2Float(Me^.X); |
|
446 meY:= hwFloat2Float(Me^.Y); |
|
447 x:= meX; |
|
448 y:= meY; |
|
449 range:= Metric(trunc(x), trunc(y), Targ.Point.X, Targ.Point.Y); |
|
450 if ( range < MIN_RANGE ) or ( range > maxRange) then |
|
451 exit(BadTurn); |
|
452 |
|
453 Vx:= (Targ.Point.X - x) * 1 / 1024; |
|
454 Vy:= (Targ.Point.Y - y) * 1 / 1024; |
|
455 ap.Angle:= DxDy2AttackAnglef(Vx, -Vy); |
|
456 repeat |
|
457 x:= x + vX; |
|
458 y:= y + vY; |
|
459 rx:= trunc(x); |
|
460 ry:= trunc(y); |
|
461 if ((Me = CurrentHedgehog^.Gear) and TestColl(rx, ry, 8)) or |
|
462 ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, rx, ry, 8)) then |
|
463 begin |
|
464 x:= x + vX * 8; |
|
465 y:= y + vY * 8; |
|
466 |
|
467 // Intentionally low rating to discourage use |
|
468 if Level = 1 then |
|
469 valueResult:= RateExplosion(Me, rx, ry, 26, afTrackFall or afErasesLand) |
|
470 else |
|
471 valueResult:= RateExplosion(Me, rx, ry, 26); |
|
472 |
|
473 // Check range again in case the plane collided before target |
|
474 range:= Metric(trunc(meX), trunc(meY), rx, ry); |
|
475 if ( range < MIN_RANGE ) or ( range > maxRange) then |
|
476 exit(BadTurn); |
|
477 |
|
478 // If impact location is close, above us and wind blows in our direction, |
|
479 // there's a risk of fire flying towards us, so fail in this case. |
|
480 if (Level < 3) and (range <= 600) and (meY >= ry) and |
|
481 (((ap.Angle < 0) and (windSpeed > 0)) or ((ap.Angle > 0) and (windSpeed < 0))) then |
|
482 exit(BadTurn); |
|
483 |
|
484 if (valueResult <= 0) then |
|
485 valueResult:= BadTurn; |
|
486 exit(valueResult) |
|
487 end |
|
488 until (Abs(Targ.Point.X - trunc(x)) + Abs(Targ.Point.Y - trunc(y)) < 4) |
|
489 or (x < 0) |
|
490 or (y < 0) |
|
491 or (trunc(x) > LAND_WIDTH) |
|
492 or (trunc(y) > LAND_HEIGHT); |
|
493 |
|
494 TestRCPlane:= BadTurn |
|
495 end; |
418 |
496 |
419 function TestSnowball(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
497 function TestSnowball(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
420 var Vx, Vy, r: real; |
498 var Vx, Vy, r: real; |
421 rTime: LongInt; |
499 rTime: LongInt; |
422 EX, EY: LongInt; |
500 EX, EY: LongInt; |