hedgewars/uAIAmmoTests.pas
changeset 15604 22d0a3d6e2be
parent 15603 ac44dae6425e
child 15607 899fd1841399
equal deleted inserted replaced
15603:ac44dae6425e 15604:22d0a3d6e2be
    52 function TestFirePunch(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    52 function TestFirePunch(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    53 function TestWhip(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    53 function TestWhip(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    54 function TestKamikaze(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    54 function TestKamikaze(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    55 function TestAirAttack(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    55 function TestAirAttack(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    56 function TestDrillStrike(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    56 function TestDrillStrike(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
       
    57 function TestMineStrike(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    57 function TestTeleport(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    58 function TestTeleport(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    58 function TestHammer(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    59 function TestHammer(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    59 function TestCake(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    60 function TestCake(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    60 function TestDynamite(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    61 function TestDynamite(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    61 function TestMine(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    62 function TestMine(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
    83             (proc: @TestFirePunch;   flags: amtest_NoTarget), // amFirePunch
    84             (proc: @TestFirePunch;   flags: amtest_NoTarget), // amFirePunch
    84             (proc: @TestWhip;        flags: amtest_NoTarget), // amWhip
    85             (proc: @TestWhip;        flags: amtest_NoTarget), // amWhip
    85             (proc: @TestBaseballBat; flags: amtest_NoTarget), // amBaseballBat
    86             (proc: @TestBaseballBat; flags: amtest_NoTarget), // amBaseballBat
    86             (proc: nil;              flags: 0), // amParachute
    87             (proc: nil;              flags: 0), // amParachute
    87             (proc: @TestAirAttack;   flags: amtest_Rare), // amAirAttack
    88             (proc: @TestAirAttack;   flags: amtest_Rare), // amAirAttack
    88             (proc: nil;              flags: 0), // amMineStrike
    89             (proc: @TestMineStrike;  flags: amtest_Rare), // amMineStrike
    89             (proc: nil;              flags: 0), // amBlowTorch
    90             (proc: nil;              flags: 0), // amBlowTorch
    90             (proc: nil;              flags: 0), // amGirder
    91             (proc: nil;              flags: 0), // amGirder
    91             (proc: nil;              flags: 0), // amTeleport
    92             (proc: nil;              flags: 0), // amTeleport
    92             //(proc: @TestTeleport;    flags: amtest_OnTurn), // amTeleport
    93             //(proc: @TestTeleport;    flags: amtest_OnTurn), // amTeleport
    93             (proc: nil;              flags: 0), // amSwitch
    94             (proc: nil;              flags: 0), // amSwitch
  1442     end;
  1443     end;
  1443 
  1444 
  1444 TestDrillStrike:= valueResult;
  1445 TestDrillStrike:= valueResult;
  1445 end;
  1446 end;
  1446 
  1447 
       
  1448 function TestMineStrike(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
       
  1449 const cShift = 4;
       
  1450 var minesSpeed, X, Y, dY: real;
       
  1451     b: array[0..9] of boolean;
       
  1452     dmg: array[0..9] of LongInt;
       
  1453     fexit: boolean;
       
  1454     i, t, valueResult: LongInt;
       
  1455 begin
       
  1456 Flags:= Flags; // avoid compiler hint
       
  1457 ap.ExplR:= 0;
       
  1458 ap.Time:= 0;
       
  1459 
       
  1460 // AI currently only supports cMinesTime = 0 because it's the most
       
  1461 // predictable.
       
  1462 // Other cMinesTime values are risky because of bouncy mines;
       
  1463 // so they are unsupported.
       
  1464 // TODO: Implement mine strike for other values of MineTime
       
  1465 // TODO: Teach AI to avoid hitting their own with mines
       
  1466 if (Level > 3) or (cGravityf = 0) or (cMinesTime <> 0) then
       
  1467     exit(BadTurn);
       
  1468 
       
  1469 ap.Angle:= 0;
       
  1470 ap.AttackPutX:= Targ.Point.X;
       
  1471 ap.AttackPutY:= Targ.Point.Y;
       
  1472 
       
  1473 minesSpeed:= hwFloat2Float(cBombsSpeed);
       
  1474 X:= Targ.Point.X - 135 - cShift; // hh center - cShift
       
  1475 X:= X - minesSpeed * sqrt(((Targ.Point.Y + 128) * 2) / cGravityf);
       
  1476 Y:= -128;
       
  1477 dY:= 0;
       
  1478 
       
  1479 for i:= 0 to 9 do
       
  1480     begin
       
  1481     b[i]:= true;
       
  1482     dmg[i]:= 0
       
  1483     end;
       
  1484 valueResult:= 0;
       
  1485 
       
  1486 repeat
       
  1487     X:= X + minesSpeed;
       
  1488     Y:= Y + dY;
       
  1489     dY:= dY + cGravityf;
       
  1490     fexit:= true;
       
  1491 
       
  1492     for i:= 0 to 9 do
       
  1493         if b[i] then
       
  1494             begin
       
  1495             fexit:= false;
       
  1496             if TestColl(trunc(X) + LongWord(i * 30), trunc(Y), 4) then
       
  1497                 begin
       
  1498                 b[i]:= false;
       
  1499                 dmg[i]:= RateExplosion(Me, trunc(X) + LongWord(i * 30), trunc(Y), 96)
       
  1500                 end
       
  1501             end;
       
  1502 until fexit or (Y > cWaterLine);
       
  1503 
       
  1504 for i:= 0 to 5 do
       
  1505     if dmg[i] <> BadTurn then
       
  1506         inc(valueResult, dmg[i]);
       
  1507 t:= valueResult;
       
  1508 ap.AttackPutX:= Targ.Point.X - 60;
       
  1509 
       
  1510 for i:= 0 to 3 do
       
  1511     if dmg[i] <> BadTurn then
       
  1512         begin
       
  1513         dec(t, dmg[i]);
       
  1514         inc(t, dmg[i + 6]);
       
  1515         if t > valueResult then
       
  1516             begin
       
  1517             valueResult:= t;
       
  1518             ap.AttackPutX:= Targ.Point.X - 30 - cShift + i * 30
       
  1519             end
       
  1520         end;
       
  1521 
       
  1522 if valueResult <= 0 then
       
  1523     valueResult:= BadTurn;
       
  1524 TestMineStrike:= valueResult;
       
  1525 end;
       
  1526 
  1447 function TestTeleport(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
  1527 function TestTeleport(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
  1448 var
  1528 var
  1449     i, failNum: longword;
  1529     i, failNum: longword;
  1450     maxTop: longword;
  1530     maxTop: longword;
  1451 begin
  1531 begin