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 |
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); |
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 |
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 |
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; |