1835 |
1835 |
1836 inc(Gear^.Tag); |
1836 inc(Gear^.Tag); |
1837 if (Gear^.Tag = 47) or (cWaterLine = 0) then |
1837 if (Gear^.Tag = 47) or (cWaterLine = 0) then |
1838 DeleteGear(Gear) |
1838 DeleteGear(Gear) |
1839 end; |
1839 end; |
|
1840 |
|
1841 //////////////////////////////////////////////////////////////////////////////// |
|
1842 procedure doStepDiggingGear(Gear: PGear); |
|
1843 var ox,oy: hwFloat; |
|
1844 begin |
|
1845 ox:= Gear^.X; |
|
1846 oy:= Gear^.Y; |
|
1847 Gear^.X:= Gear^.X + Gear^.dX; |
|
1848 Gear^.Y:= Gear^.Y + Gear^.dY; |
|
1849 DrawTunnel(oX, oY, Gear^.dX, Gear^.dY, 2, 6); |
|
1850 CheckGearDrowning(Gear); |
|
1851 end; |
|
1852 |
|
1853 procedure doStepDrill(Gear: PGear); |
|
1854 var newX, newY, oldDx, oldDy: hwFloat; |
|
1855 t: PGearArray; |
|
1856 begin |
|
1857 AllInactive:= false; |
|
1858 |
|
1859 if (Gear^.Timer = 5000) then begin //flying |
|
1860 Gear^.dX:= Gear^.dX + cWindSpeed; |
|
1861 oldDx:= Gear^.dX; |
|
1862 oldDy:= Gear^.dY; |
|
1863 doStepFallingGear(Gear); |
|
1864 if (GameTicks and $3F) = 0 then |
|
1865 AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0); |
|
1866 end; |
|
1867 |
|
1868 if ((Gear^.State and gstCollision) <> 0) and (Gear^.Timer = 5000) then |
|
1869 begin //hit |
|
1870 Gear^.dX:= oldDx; |
|
1871 Gear^.dY:= oldDy; |
|
1872 t:= CheckGearsCollision(Gear); |
|
1873 if (t^.Count = 0) then |
|
1874 begin //hit the ground not the hedgehog |
|
1875 newy:= hwSqrt((_0_5 * Gear^.dY * Gear^.dY) / Distance(Gear^.dX, Gear^.dY)); |
|
1876 if (Gear^.dY < _0) then newY := -newY; |
|
1877 newx:= newy * Gear^.dX / Gear^.dY; |
|
1878 Gear^.dX := newx; |
|
1879 Gear^.dY := newy; |
|
1880 dec(Gear^.Timer); |
|
1881 end |
|
1882 else |
|
1883 Gear^.Timer:= 0 |
|
1884 end; |
|
1885 |
|
1886 if (Gear^.Timer > 0) and (Gear^.Timer < 5000) and ((Gear^.Timer mod 20) = 0) then doStepDiggingGear(Gear); |
|
1887 |
|
1888 if (Gear^.Timer = 0) |
|
1889 or ((Gear^.Timer < 5000) |
|
1890 and not TestCollisionYWithGear(Gear, hwSign(Gear^.dY)) |
|
1891 and not TestCollisionXWithGear(Gear, hwSign(Gear^.dX))) then |
|
1892 begin //out of time or exited ground |
|
1893 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound); |
|
1894 DeleteGear(Gear); |
|
1895 exit |
|
1896 end; |
|
1897 |
|
1898 if (Gear^.Timer < 5000) then dec(Gear^.Timer); |
|
1899 end; |