hedgewars/GSHandlers.inc
changeset 1573 cf88e0ace609
parent 1555 0a62938e695a
child 1579 2f581b1f289e
equal deleted inserted replaced
1572:e1b40c3560bb 1573:cf88e0ace609
  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;