hedgewars/uAIAmmoTests.pas
changeset 15611 be8fe5e0789e
parent 15609 4ae2ebe812be
child 15612 39a353e8ef3d
equal deleted inserted replaced
15610:d347785fd61c 15611:be8fe5e0789e
    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;