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 |