diff -r 53eb1d3953ef -r 646d56eacb8f hedgewars/GSHandlers.inc --- a/hedgewars/GSHandlers.inc Tue Jan 06 14:53:49 2009 +0000 +++ b/hedgewars/GSHandlers.inc Tue Jan 06 17:37:18 2009 +0000 @@ -1838,61 +1838,64 @@ end; //////////////////////////////////////////////////////////////////////////////// -procedure doStepDiggingGear(Gear: PGear); +procedure doStepDrillDrilling(Gear: PGear); var ox,oy: hwFloat; begin +AllInactive:= false; + +if (Gear^.Timer > 0) and ((Gear^.Timer mod 20) = 0) then + begin ox:= Gear^.X; oy:= Gear^.Y; Gear^.X:= Gear^.X + Gear^.dX; Gear^.Y:= Gear^.Y + Gear^.dY; DrawTunnel(oX, oY, Gear^.dX, Gear^.dY, 2, 6); CheckGearDrowning(Gear); + end; + +if (Gear^.Timer = 0) +or (not TestCollisionYWithGear(Gear, hwSign(Gear^.dY)) +and not TestCollisionXWithGear(Gear, hwSign(Gear^.dX))) then + begin //out of time or exited ground + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound); + DeleteGear(Gear); + exit + end; + +dec(Gear^.Timer); end; procedure doStepDrill(Gear: PGear); -var newX, newY, oldDx, oldDy: hwFloat; - t: PGearArray; +var t: PGearArray; + newX, newY, oldDx, oldDy: hwFloat; begin - AllInactive:= false; +AllInactive:= false; - if (Gear^.Timer = 5000) then begin //flying - Gear^.dX:= Gear^.dX + cWindSpeed; - oldDx:= Gear^.dX; - oldDy:= Gear^.dY; - doStepFallingGear(Gear); - if (GameTicks and $3F) = 0 then - AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0); - end; +Gear^.dX:= Gear^.dX + cWindSpeed; +oldDx:= Gear^.dX; +oldDy:= Gear^.dY; + +doStepFallingGear(Gear); + +if (GameTicks and $3F) = 0 then + AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0); - if ((Gear^.State and gstCollision) <> 0) and (Gear^.Timer = 5000) then - begin //hit - Gear^.dX:= oldDx; - Gear^.dY:= oldDy; - t:= CheckGearsCollision(Gear); - if (t^.Count = 0) then - begin //hit the ground not the hedgehog - newy:= hwSqrt((_0_5 * Gear^.dY * Gear^.dY) / Distance(Gear^.dX, Gear^.dY)); - if (Gear^.dY < _0) then newY := -newY; - newx:= newy * Gear^.dX / Gear^.dY; - Gear^.dX := newx; - Gear^.dY := newy; - dec(Gear^.Timer); - end - else - Gear^.Timer:= 0 - end; - - if (Gear^.Timer > 0) and (Gear^.Timer < 5000) and ((Gear^.Timer mod 20) = 0) then doStepDiggingGear(Gear); - - if (Gear^.Timer = 0) - or ((Gear^.Timer < 5000) - and not TestCollisionYWithGear(Gear, hwSign(Gear^.dY)) - and not TestCollisionXWithGear(Gear, hwSign(Gear^.dX))) then - begin //out of time or exited ground - doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound); - DeleteGear(Gear); - exit - end; - - if (Gear^.Timer < 5000) then dec(Gear^.Timer); -end; \ No newline at end of file +if ((Gear^.State and gstCollision) <> 0) then + begin //hit + Gear^.dX:= oldDx; + Gear^.dY:= oldDy; + t:= CheckGearsCollision(Gear); + Gear^.doStep:= @doStepDrillDrilling; + if (t^.Count = 0) then + begin //hit the ground not the hedgehog + newy:= hwSqrt((_0_5 * Gear^.dY * Gear^.dY) / Distance(Gear^.dX, Gear^.dY)); + if (Gear^.dY < _0) then newY := -newY; + newx:= newy * Gear^.dX / Gear^.dY; + Gear^.dX := newx; + Gear^.dY := newy; + dec(Gear^.Timer) + end + else + Gear^.Timer:= 0 + end +end;