hedgewars/uAIAmmoTests.pas
changeset 15603 ac44dae6425e
parent 15602 583080b0272b
child 15604 22d0a3d6e2be
equal deleted inserted replaced
15602:583080b0272b 15603:ac44dae6425e
    51 function TestBaseballBat(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 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 TestTeleport(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;
    57 function TestHammer(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;
    58 function TestCake(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;
    59 function TestDynamite(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;
    60 function TestMine(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;
   116             (proc: @TestShotgun;     flags: 0), // amSineGun
   117             (proc: @TestShotgun;     flags: 0), // amSineGun
   117             (proc: nil;              flags: 0), // amFlamethrower
   118             (proc: nil;              flags: 0), // amFlamethrower
   118             (proc: @TestGrenade;     flags: 0), // amSMine
   119             (proc: @TestGrenade;     flags: 0), // amSMine
   119             (proc: @TestHammer;      flags: amtest_NoTarget), // amHammer
   120             (proc: @TestHammer;      flags: amtest_NoTarget), // amHammer
   120             (proc: nil;              flags: 0), // amResurrector
   121             (proc: nil;              flags: 0), // amResurrector
   121             (proc: nil;              flags: 0), // amDrillStrike
   122             (proc: @TestDrillStrike; flags: amtest_Rare), // amDrillStrike
   122             (proc: nil;              flags: 0), // amSnowball
   123             (proc: nil;              flags: 0), // amSnowball
   123             (proc: nil;              flags: 0), // amTardis
   124             (proc: nil;              flags: 0), // amTardis
   124             (proc: nil;              flags: 0), // amLandGun
   125             (proc: nil;              flags: 0), // amLandGun
   125             (proc: nil;              flags: 0), // amIceGun
   126             (proc: nil;              flags: 0), // amIceGun
   126             (proc: nil;              flags: 0), // amKnife
   127             (proc: nil;              flags: 0), // amKnife
  1304 if valueResult <= 0 then
  1305 if valueResult <= 0 then
  1305     valueResult:= BadTurn;
  1306     valueResult:= BadTurn;
  1306 TestAirAttack:= valueResult;
  1307 TestAirAttack:= valueResult;
  1307 end;
  1308 end;
  1308 
  1309 
       
  1310 function TestDrillStrike(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
       
  1311 const cShift = 4;
       
  1312 var bombsSpeed, X, Y, dX, dY, drillX, drillY: real;
       
  1313     t2: real;
       
  1314     b: array[0..9] of boolean;
       
  1315     dmg: array[0..9] of LongInt;
       
  1316     fexit, collided: boolean;
       
  1317     i, t, value, valueResult, attackTime, drillTimer, targetX: LongInt;
       
  1318 begin
       
  1319 Flags:= Flags; // avoid compiler hint
       
  1320 ap.ExplR:= 0;
       
  1321 if (Level > 3) or (cGravityf = 0) then
       
  1322     exit(BadTurn);
       
  1323 
       
  1324 ap.Angle:= 0;
       
  1325 targetX:= Targ.Point.X;
       
  1326 ap.AttackPutY:= Targ.Point.Y;
       
  1327 
       
  1328 bombsSpeed:= hwFloat2Float(cBombsSpeed);
       
  1329 X:= Targ.Point.X - 135 - cShift; // hh center - cShift
       
  1330 X:= X - bombsSpeed * sqrt(((Targ.Point.Y + 128) * 2) / cGravityf);
       
  1331 Y:= -128;
       
  1332 dX:= bombsSpeed;
       
  1333 dY:= 0;
       
  1334 
       
  1335 valueResult:= 0;
       
  1336 
       
  1337 attackTime:= 0;
       
  1338 while attackTime <= 4000 do
       
  1339     begin
       
  1340     inc(attackTime, 1000);
       
  1341     value:= 0;
       
  1342     for i:= 0 to 9 do
       
  1343         begin
       
  1344         b[i]:= true;
       
  1345         dmg[i]:= 0
       
  1346         end;
       
  1347 
       
  1348     repeat
       
  1349         X:= X + dX;
       
  1350         Y:= Y + dY;
       
  1351         dY:= dY + cGravityf;
       
  1352         fexit:= true;
       
  1353 
       
  1354         for i:= 0 to 9 do
       
  1355             if b[i] then
       
  1356                 begin
       
  1357                 fexit:= false;
       
  1358                 collided:= false;
       
  1359                 drillX:= trunc(X) + LongWord(i * 30);
       
  1360                 drillY:= trunc(Y);
       
  1361                 // Collided with land ... simulate drilling
       
  1362                 if TestCollExcludingObjects(trunc(drillX), trunc(drillY), 4) and
       
  1363                     (Abs(Targ.Point.X - trunc(X)) + Abs(Targ.Point.Y - trunc(Y)) > 21) then
       
  1364                     begin
       
  1365                     drillTimer := attackTime;
       
  1366                     t2 := 0.5 / sqrt(sqr(dX) + sqr(dY));
       
  1367                     dX := dX * t2;
       
  1368                     dY := dY * t2;
       
  1369                     repeat
       
  1370                         drillX:= drillX + dX;
       
  1371                         drillY:= drillY + dY;
       
  1372                         dec(drillTimer, 10);
       
  1373                     until (Abs(Targ.Point.X - drillX) + Abs(Targ.Point.Y - drillY) < 22)
       
  1374                         or (drillX < 0)
       
  1375                         or (drillY < 0)
       
  1376                         or (trunc(drillX) > LAND_WIDTH)
       
  1377                         or (trunc(drillY) > LAND_HEIGHT)
       
  1378                         // TODO: Simulate falling again when rocket has left terrain again
       
  1379                         or (drillTimer <= 0);
       
  1380                     collided:= true;
       
  1381                     end
       
  1382                 // Collided with something else ... record collision
       
  1383                 else if TestColl(trunc(drillX), trunc(drillY), 4) then
       
  1384                     collided:= true;
       
  1385 
       
  1386                 // Simulate explosion
       
  1387                 if collided then
       
  1388                     begin
       
  1389                     b[i]:= false;
       
  1390                     dmg[i]:= RateExplosion(Me, trunc(drillX), trunc(drillY), 58);
       
  1391                     // 58 (instead of 60) for better prediction (hh moves after explosion of one of the rockets)
       
  1392                     end;
       
  1393                 end;
       
  1394     until fexit or (Y > cWaterLine);
       
  1395 
       
  1396     for i:= 0 to 5 do
       
  1397         if dmg[i] <> BadTurn then
       
  1398             inc(value, dmg[i]);
       
  1399     t:= value;
       
  1400     targetX:= Targ.Point.X - 60;
       
  1401 
       
  1402     for i:= 0 to 3 do
       
  1403         if dmg[i] <> BadTurn then
       
  1404             begin
       
  1405             dec(t, dmg[i]);
       
  1406             inc(t, dmg[i + 6]);
       
  1407             if t > value then
       
  1408                 begin
       
  1409                 value:= t;
       
  1410                 targetX:= Targ.Point.X - 30 - cShift + i * 30
       
  1411                 end
       
  1412             end;
       
  1413 
       
  1414     if value > valueResult then
       
  1415         begin
       
  1416         valueResult:= value;
       
  1417         ap.AttackPutX:= targetX;
       
  1418         ap.Time:= attackTime;
       
  1419         end;
       
  1420 end;
       
  1421 
       
  1422 if valueResult <= 0 then
       
  1423     valueResult:= BadTurn
       
  1424 else
       
  1425     begin
       
  1426     // Weaker AI has chance to get the time wrong by 1-3 seconds
       
  1427     if Level = 5 then
       
  1428         // +/- 3 seconds
       
  1429         ap.Time:= ap.Time + (3 - random(7)) * 1000
       
  1430     else if Level = 4 then
       
  1431         // +/- 2 seconds
       
  1432         ap.Time:= ap.Time + (2 - random(5)) * 1000
       
  1433     else if Level = 3 then
       
  1434         // +/- 1 second
       
  1435         if (random(2) = 0) then
       
  1436             ap.Time:= ap.Time + (1 - random(3)) * 1000
       
  1437     else if Level = 2 then
       
  1438         // 50% chance for +/- 1 second
       
  1439         if (random(2) = 0) then
       
  1440             ap.Time:= ap.Time + (1 - random(3)) * 1000;
       
  1441     ap.Time:= Min(5000, Max(1000, ap.Time));
       
  1442     end;
       
  1443 
       
  1444 TestDrillStrike:= valueResult;
       
  1445 end;
  1309 
  1446 
  1310 function TestTeleport(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
  1447 function TestTeleport(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
  1311 var
  1448 var
  1312     i, failNum: longword;
  1449     i, failNum: longword;
  1313     maxTop: longword;
  1450     maxTop: longword;