diff -r c94045b70142 -r 975d5061712f hedgewars/GSHandlers.inc --- a/hedgewars/GSHandlers.inc Thu Mar 26 13:54:02 2009 +0000 +++ b/hedgewars/GSHandlers.inc Thu Mar 26 13:59:27 2009 +0000 @@ -19,14 +19,32 @@ procedure doStepDrowningGear(Gear: PGear); forward; function CheckGearDrowning(Gear: PGear): boolean; +var skipSpeed, skipAngle, skipDecay: hwFloat; begin +// probably needs tweaking. might need to be in a case statement based upon gear type +//(not Gear^.dY.isNegative) and this should not be necessary if cWaterLine < hwRound(Gear^.Y) + Gear^.Radius then - begin - CheckGearDrowning:= true; - Gear^.State:= gstDrowning; - Gear^.doStep:= @doStepDrowningGear; - PlaySound(sndSplash, false, nil) - end else + begin + skipSpeed:= _0_25; // was 0.36 - couldn't manage baseball bat. Tiy's build is 0.36... + skipAngle:= _1 + _0_9; // these should perhaps also be constants, once work out what proper values are + skipDecay:= _0_87; // this could perhaps be a tiny bit higher. + if ((Gear^.dX*Gear^.dX+Gear^.dY*Gear^.dY) > skipSpeed) and + (hwAbs(Gear^.dX/Gear^.dY) > skipAngle) then + begin + Gear^.dY.isNegative:= true; + Gear^.dY:=Gear^.dY*skipDecay; + Gear^.dX:=Gear^.dX*skipDecay; + CheckGearDrowning:= false + end + else + begin + CheckGearDrowning:= true; + Gear^.State:= gstDrowning; + Gear^.doStep:= @doStepDrowningGear; + end; + PlaySound(sndSplash, false, nil) + end + else CheckGearDrowning:= false end;