hedgewars/uAIAmmoTests.pas
changeset 15678 e933b1dc302d
parent 15676 6de74494b8a5
child 15679 b64f96d43f1f
equal deleted inserted replaced
15677:785c1af0bf87 15678:e933b1dc302d
  1399 const cShift = 4;
  1399 const cShift = 4;
  1400       Density : real = 2.0;
  1400       Density : real = 2.0;
  1401 var bombsSpeed, X, Y, dX, dY: real;
  1401 var bombsSpeed, X, Y, dX, dY: real;
  1402     b: array[0..9] of boolean;
  1402     b: array[0..9] of boolean;
  1403     dmg: array[0..9] of LongInt;
  1403     dmg: array[0..9] of LongInt;
  1404     fexit: boolean;
  1404     fexit, firstHit: boolean;
  1405     i, t, valueResult: LongInt;
  1405     i, t, valueResult, targetY: LongInt;
  1406 begin
  1406 begin
  1407 Flags:= Flags; // avoid compiler hint
  1407 Flags:= Flags; // avoid compiler hint
  1408 ap.ExplR:= 0;
  1408 ap.ExplR:= 0;
  1409 ap.Time:= 0;
  1409 ap.Time:= 0;
  1410 if (Level > 3) or (cGravityf = 0) then
  1410 if (Level > 3) or (cGravityf = 0) then
  1426     begin
  1426     begin
  1427     b[i]:= true;
  1427     b[i]:= true;
  1428     dmg[i]:= 0
  1428     dmg[i]:= 0
  1429     end;
  1429     end;
  1430 valueResult:= 0;
  1430 valueResult:= 0;
       
  1431 firstHit:= false;
  1431 
  1432 
  1432 repeat
  1433 repeat
  1433     X:= X + dX;
  1434     X:= X + dX;
  1434     if (GameFlags and gfMoreWind) <> 0 then
  1435     if (GameFlags and gfMoreWind) <> 0 then
  1435         dX:= dX + windSpeed / Density;
  1436         dX:= dX + windSpeed / Density;
  1442             begin
  1443             begin
  1443             fexit:= false;
  1444             fexit:= false;
  1444             if TestColl(trunc(X) + LongWord(i * 30), trunc(Y), 4) then
  1445             if TestColl(trunc(X) + LongWord(i * 30), trunc(Y), 4) then
  1445                 begin
  1446                 begin
  1446                 b[i]:= false;
  1447                 b[i]:= false;
  1447                 dmg[i]:= RateExplosion(Me, trunc(X) + LongWord(i * 30), trunc(Y), 58)
  1448                 dmg[i]:= RateExplosion(Me, trunc(X) + LongWord(i * 30), trunc(Y), 58);
  1448                 // 58 (instead of 60) for better prediction (hh moves after explosion of one of the rockets)
  1449                 // 58 (instead of 60) for better prediction (hh moves after explosion of one of the rockets)
       
  1450                 if (not firstHit) then
       
  1451                     begin
       
  1452                     firstHit:= true;
       
  1453                     // remember Y of first hit, used for target pos
       
  1454                     targetY:= trunc(Y);
       
  1455                     end;
  1449                 end
  1456                 end
  1450             end;
  1457             end;
  1451 until fexit or (Y > cWaterLine);
  1458 until fexit or (Y > cWaterLine);
  1452 
  1459 
  1453 for i:= 0 to 5 do
  1460 for i:= 0 to 5 do
  1454     if dmg[i] <> BadTurn then
  1461     if dmg[i] <> BadTurn then
  1455         inc(valueResult, dmg[i]);
  1462         inc(valueResult, dmg[i]);
  1456 t:= valueResult;
  1463 t:= valueResult;
  1457 ap.AttackPutX:= Targ.Point.X - 60;
  1464 ap.AttackPutX:= Targ.Point.X - 60;
       
  1465 if firstHit then
       
  1466     // this is not strictly neccessry, it's just to make sure
       
  1467     // the X is on the height of the first hit
       
  1468     ap.AttackPutY:= targetY;
  1458 
  1469 
  1459 for i:= 0 to 3 do
  1470 for i:= 0 to 3 do
  1460     if dmg[i] <> BadTurn then
  1471     if dmg[i] <> BadTurn then
  1461         begin
  1472         begin
  1462         dec(t, dmg[i]);
  1473         dec(t, dmg[i]);
  1477 const cShift = 4;
  1488 const cShift = 4;
  1478       Density : real = 1.0;
  1489       Density : real = 1.0;
  1479 var bombsSpeed, X, Y, dX, dY, drillX, drillY: real;
  1490 var bombsSpeed, X, Y, dX, dY, drillX, drillY: real;
  1480     t2: real;
  1491     t2: real;
  1481     dmg: array[0..9] of LongInt;
  1492     dmg: array[0..9] of LongInt;
  1482     collided, drilling, timerRuns: boolean;
  1493     collided, drilling, timerRuns, firstHit: boolean;
  1483     i, t, value, valueResult, attackTime, drillTimer, targetX: LongInt;
  1494     i, t, value, valueResult, attackTime, drillTimer, targetX, targetY: LongInt;
  1484 begin
  1495 begin
  1485 Flags:= Flags; // avoid compiler hint
  1496 Flags:= Flags; // avoid compiler hint
  1486 ap.ExplR:= 0;
  1497 ap.ExplR:= 0;
  1487 if (Level > 3) or (cGravityf = 0) then
  1498 if (Level > 3) or (cGravityf = 0) then
  1488     exit(BadTurn);
  1499     exit(BadTurn);
  1501 attackTime:= 6000;
  1512 attackTime:= 6000;
  1502 while attackTime >= 0 do
  1513 while attackTime >= 0 do
  1503     begin
  1514     begin
  1504     dec(attackTime, 1000);
  1515     dec(attackTime, 1000);
  1505     value:= 0;
  1516     value:= 0;
       
  1517     firstHit:= false;
  1506     for i:= 0 to 9 do
  1518     for i:= 0 to 9 do
  1507         begin
  1519         begin
  1508         dmg[i]:= 0;
  1520         dmg[i]:= 0;
  1509         drillX:= trunc(X) + LongWord(i * 30);
  1521         drillX:= trunc(X) + LongWord(i * 30);
  1510         drillY:= trunc(Y);
  1522         drillY:= trunc(Y);
  1554             else if (drillTimer <= 0) or TestColl(trunc(drillX), trunc(drillY), 4) then
  1566             else if (drillTimer <= 0) or TestColl(trunc(drillX), trunc(drillY), 4) then
  1555                 collided:= true;
  1567                 collided:= true;
  1556 
  1568 
  1557             // Simulate explosion
  1569             // Simulate explosion
  1558             if collided then
  1570             if collided then
       
  1571                 begin
  1559                 dmg[i]:= RateExplosion(Me, trunc(drillX), trunc(drillY), 58);
  1572                 dmg[i]:= RateExplosion(Me, trunc(drillX), trunc(drillY), 58);
  1560                 // 58 (instead of 60) for better prediction (hh moves after explosion of one of the rockets)
  1573                 // 58 (instead of 60) for better prediction (hh moves after explosion of one of the rockets)
       
  1574                 if not firstHit then
       
  1575                     begin
       
  1576                     targetY:= trunc(drillY);
       
  1577                     firstHit:= true;
       
  1578                     end;
       
  1579                 end;
  1561         until collided or (drillY > cWaterLine);
  1580         until collided or (drillY > cWaterLine);
  1562         end;
  1581         end;
  1563 
  1582 
  1564     // calculate score
  1583     // calculate score
  1565     for i:= 0 to 5 do
  1584     for i:= 0 to 5 do
  1582 
  1601 
  1583     if value > valueResult then
  1602     if value > valueResult then
  1584         begin
  1603         begin
  1585         valueResult:= value;
  1604         valueResult:= value;
  1586         ap.AttackPutX:= targetX;
  1605         ap.AttackPutX:= targetX;
       
  1606         if firstHit then
       
  1607             ap.AttackPutY:= targetY;
  1587         ap.Time:= attackTime;
  1608         ap.Time:= attackTime;
  1588         end;
  1609         end;
  1589 end;
  1610 end;
  1590 
  1611 
  1591 if valueResult <= 0 then
  1612 if valueResult <= 0 then
  1617 const cShift = 4;
  1638 const cShift = 4;
  1618       Density : real = 1.0;
  1639       Density : real = 1.0;
  1619 var minesSpeed, X, Y, dX, dY: real;
  1640 var minesSpeed, X, Y, dX, dY: real;
  1620     b: array[0..9] of boolean;
  1641     b: array[0..9] of boolean;
  1621     dmg: array[0..9] of LongInt;
  1642     dmg: array[0..9] of LongInt;
  1622     fexit: boolean;
  1643     fexit, firstHit: boolean;
  1623     i, t, valueResult: LongInt;
  1644     i, t, valueResult, targetY: LongInt;
  1624 begin
  1645 begin
  1625 Flags:= Flags; // avoid compiler hint
  1646 Flags:= Flags; // avoid compiler hint
  1626 ap.ExplR:= 0;
  1647 ap.ExplR:= 0;
  1627 ap.Time:= 0;
  1648 ap.Time:= 0;
  1628 
  1649 
  1650     begin
  1671     begin
  1651     b[i]:= true;
  1672     b[i]:= true;
  1652     dmg[i]:= 0
  1673     dmg[i]:= 0
  1653     end;
  1674     end;
  1654 valueResult:= 0;
  1675 valueResult:= 0;
       
  1676 firstHit:= false;
  1655 
  1677 
  1656 repeat
  1678 repeat
  1657     X:= X + dX;
  1679     X:= X + dX;
  1658     if (GameFlags and (gfMoreWind or gfInfAttack)) <> 0 then
  1680     if (GameFlags and (gfMoreWind or gfInfAttack)) <> 0 then
  1659         dX:= dX + windSpeed / Density;
  1681         dX:= dX + windSpeed / Density;
  1666             begin
  1688             begin
  1667             fexit:= false;
  1689             fexit:= false;
  1668             if TestColl(trunc(X) + LongWord(i * 30), trunc(Y), 4) then
  1690             if TestColl(trunc(X) + LongWord(i * 30), trunc(Y), 4) then
  1669                 begin
  1691                 begin
  1670                 b[i]:= false;
  1692                 b[i]:= false;
  1671                 dmg[i]:= RateExplosion(Me, trunc(X) + LongWord(i * 30), trunc(Y), 96)
  1693                 dmg[i]:= RateExplosion(Me, trunc(X) + LongWord(i * 30), trunc(Y), 96);
       
  1694                 if (not firstHit) then
       
  1695                     begin
       
  1696                     targetY:= trunc(Y);
       
  1697                     firstHit:= true;
       
  1698                     end;
  1672                 end
  1699                 end
  1673             end;
  1700             end;
  1674 until fexit or (Y > cWaterLine);
  1701 until fexit or (Y > cWaterLine);
  1675 
  1702 
  1676 for i:= 0 to 5 do
  1703 for i:= 0 to 5 do
  1677     if dmg[i] <> BadTurn then
  1704     if dmg[i] <> BadTurn then
  1678         inc(valueResult, dmg[i]);
  1705         inc(valueResult, dmg[i]);
  1679 t:= valueResult;
  1706 t:= valueResult;
  1680 ap.AttackPutX:= Targ.Point.X - 60;
  1707 ap.AttackPutX:= Targ.Point.X - 60;
       
  1708 if firstHit then
       
  1709     ap.AttackPutY:= targetY;
  1681 
  1710 
  1682 for i:= 0 to 3 do
  1711 for i:= 0 to 3 do
  1683     if dmg[i] <> BadTurn then
  1712     if dmg[i] <> BadTurn then
  1684         begin
  1713         begin
  1685         dec(t, dmg[i]);
  1714         dec(t, dmg[i]);
  1776 
  1805 
  1777 function TestPiano(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
  1806 function TestPiano(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
  1778 const BOUNCES = 5;
  1807 const BOUNCES = 5;
  1779 var X, Y: real;
  1808 var X, Y: real;
  1780     dmg: array[0..BOUNCES-1] of LongInt;
  1809     dmg: array[0..BOUNCES-1] of LongInt;
  1781     i, e, rate, valueResult: LongInt;
  1810     i, e, rate, valueResult, targetY: LongInt;
       
  1811     firstHit: boolean;
  1782 begin
  1812 begin
  1783 Flags:= Flags; // avoid compiler hint
  1813 Flags:= Flags; // avoid compiler hint
  1784 ap.ExplR:= 0;
  1814 ap.ExplR:= 0;
  1785 ap.Time:= 0;
  1815 ap.Time:= 0;
  1786 if (cGravityf <= 0) then
  1816 if (cGravityf <= 0) then
  1798 
  1828 
  1799 for i:= 0 to BOUNCES-1 do
  1829 for i:= 0 to BOUNCES-1 do
  1800     dmg[i]:= 0;
  1830     dmg[i]:= 0;
  1801 
  1831 
  1802 i:= 1;
  1832 i:= 1;
       
  1833 firstHit:= false;
  1803 repeat
  1834 repeat
  1804     // Piano goes down
  1835     // Piano goes down
  1805     Y:= Y + 11;
  1836     Y:= Y + 11;
  1806     if TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(X), trunc(Y), 32) then
  1837     if TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(X), trunc(Y), 32) then
  1807         begin
  1838         begin
       
  1839         if (not firstHit) then
       
  1840             targetY:= trunc(Y);
       
  1841         firstHit:= true;
  1808         for e:= -1 to 1 do
  1842         for e:= -1 to 1 do
  1809             begin
  1843             begin
  1810             rate:= RateExplosion(Me, trunc(X) + 30*e, trunc(Y)+40, 161, afIgnoreMe);
  1844             rate:= RateExplosion(Me, trunc(X) + 30*e, trunc(Y)+40, 161, afIgnoreMe);
  1811             if rate <> BadTurn then
  1845             if rate <> BadTurn then
  1812                 dmg[i]:= dmg[i] + rate;
  1846                 dmg[i]:= dmg[i] + rate;
  1831         break;
  1865         break;
  1832         end
  1866         end
  1833     else
  1867     else
  1834         inc(valueResult, dmg[i]);
  1868         inc(valueResult, dmg[i]);
  1835 ap.AttackPutX:= Targ.Point.X;
  1869 ap.AttackPutX:= Targ.Point.X;
       
  1870 if firstHit then
       
  1871     ap.AttackPutY:= targetY;
  1836 
  1872 
  1837 valueResult:= valueResult - KillScore * friendlyfactor div 100 * 1024;
  1873 valueResult:= valueResult - KillScore * friendlyfactor div 100 * 1024;
  1838 
  1874 
  1839 if valueResult <= 0 then
  1875 if valueResult <= 0 then
  1840     valueResult:= BadTurn;
  1876     valueResult:= BadTurn;