diff -r a40b871d506b -r 1603a796f42a hedgewars/GSHandlers.inc --- a/hedgewars/GSHandlers.inc Thu Nov 20 15:18:38 2008 +0000 +++ b/hedgewars/GSHandlers.inc Thu Nov 20 15:48:50 2008 +0000 @@ -615,28 +615,28 @@ procedure doStepRopeWork(Gear: PGear); const flCheck: boolean = false; var HHGear: PGear; - len, cs, cc, tx, ty, nx, ny: hwFloat; - lx, ly: LongInt; + len, cs, cc, tx, ty, nx, ny: hwFloat; + lx, ly: LongInt; - procedure DeleteMe; - begin - with HHGear^ do - begin - Message:= Message and not gm_Attack; - State:= State or gstMoving; - end; - DeleteGear(Gear) - end; + procedure DeleteMe; + begin + with HHGear^ do + begin + Message:= Message and not gm_Attack; + State:= State or gstMoving; + end; + DeleteGear(Gear) + end; begin HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; if ((HHGear^.State and gstHHDriven) = 0) - or (CheckGearDrowning(HHGear)) then - begin - DeleteMe; - exit - end; + or (CheckGearDrowning(HHGear)) then + begin + DeleteMe; + exit + end; Gear^.dX:= HHGear^.X - Gear^.X; Gear^.dY:= HHGear^.Y - Gear^.Y; @@ -657,48 +657,48 @@ flCheck:= not flCheck; if flCheck then // check whether rope needs dividing - begin - len:= Gear^.Elasticity - _20; - while len > _5 do - begin - tx:= cc*len; - ty:= cs*len; - lx:= hwRound(Gear^.X + tx + nx); - ly:= hwRound(Gear^.Y + ty + ny); - if ((ly and $FFFFFC00) = 0) and ((lx and $FFFFF800) = 0) and (Land[ly, lx] <> 0) then - begin - with RopePoints.ar[RopePoints.Count] do - begin - X:= Gear^.X; - Y:= Gear^.Y; - if RopePoints.Count = 0 then RopePoints.HookAngle:= DxDy2Angle(Gear^.dY, Gear^.dX); - b:= (cc * HHGear^.dY) > (cs * HHGear^.dX); - dLen:= len - end; - Gear^.X:= Gear^.X + tx; - Gear^.Y:= Gear^.Y + ty; - inc(RopePoints.Count); - TryDo(RopePoints.Count <= MAXROPEPOINTS, 'Rope points overflow', true); - Gear^.Elasticity:= Gear^.Elasticity - len; - Gear^.Friction:= Gear^.Friction - len; - break - end; - len:= len - _0_5 - end; - end else - if RopePoints.Count > 0 then // check whether the last dividing point could be removed - begin - tx:= RopePoints.ar[Pred(RopePoints.Count)].X; - ty:= RopePoints.ar[Pred(RopePoints.Count)].Y; - if RopePoints.ar[Pred(RopePoints.Count)].b xor ((tx - Gear^.X) * (ty - HHGear^.Y) > (tx - HHGear^.X) * (ty - Gear^.Y)) then - begin - dec(RopePoints.Count); - Gear^.X:=RopePoints.ar[RopePoints.Count].X; - Gear^.Y:=RopePoints.ar[RopePoints.Count].Y; - Gear^.Elasticity:= Gear^.Elasticity + RopePoints.ar[RopePoints.Count].dLen; - Gear^.Friction:= Gear^.Friction + RopePoints.ar[RopePoints.Count].dLen - end - end; + begin + len:= Gear^.Elasticity - _20; + while len > _5 do + begin + tx:= cc*len; + ty:= cs*len; + lx:= hwRound(Gear^.X + tx + nx); + ly:= hwRound(Gear^.Y + ty + ny); + if ((ly and $FFFFFC00) = 0) and ((lx and $FFFFF800) = 0) and (Land[ly, lx] <> 0) then + begin + with RopePoints.ar[RopePoints.Count] do + begin + X:= Gear^.X; + Y:= Gear^.Y; + if RopePoints.Count = 0 then RopePoints.HookAngle:= DxDy2Angle(Gear^.dY, Gear^.dX); + b:= (cc * HHGear^.dY) > (cs * HHGear^.dX); + dLen:= len + end; + Gear^.X:= Gear^.X + tx; + Gear^.Y:= Gear^.Y + ty; + inc(RopePoints.Count); + TryDo(RopePoints.Count <= MAXROPEPOINTS, 'Rope points overflow', true); + Gear^.Elasticity:= Gear^.Elasticity - len; + Gear^.Friction:= Gear^.Friction - len; + break + end; + len:= len - _0_5 + end; + end else + if RopePoints.Count > 0 then // check whether the last dividing point could be removed + begin + tx:= RopePoints.ar[Pred(RopePoints.Count)].X; + ty:= RopePoints.ar[Pred(RopePoints.Count)].Y; + if RopePoints.ar[Pred(RopePoints.Count)].b xor ((tx - Gear^.X) * (ty - HHGear^.Y) > (tx - HHGear^.X) * (ty - Gear^.Y)) then + begin + dec(RopePoints.Count); + Gear^.X:=RopePoints.ar[RopePoints.Count].X; + Gear^.Y:=RopePoints.ar[RopePoints.Count].Y; + Gear^.Elasticity:= Gear^.Elasticity + RopePoints.ar[RopePoints.Count].dLen; + Gear^.Friction:= Gear^.Friction + RopePoints.ar[RopePoints.Count].dLen + end + end; Gear^.dX:= HHGear^.X - Gear^.X; Gear^.dY:= HHGear^.Y - Gear^.Y; @@ -713,12 +713,12 @@ HHGear^.dY:= HHGear^.Y; if ((Gear^.Message and gm_Down) <> 0) and (Gear^.Elasticity < Gear^.Friction) then - if not (TestCollisionXwithGear(HHGear, hwSign(Gear^.dX)) - or TestCollisionYwithGear(HHGear, hwSign(Gear^.dY))) then Gear^.Elasticity:= Gear^.Elasticity + _0_3; + if not (TestCollisionXwithGear(HHGear, hwSign(Gear^.dX)) + or TestCollisionYwithGear(HHGear, hwSign(Gear^.dY))) then Gear^.Elasticity:= Gear^.Elasticity + _0_3; if ((Gear^.Message and gm_Up) <> 0) and (Gear^.Elasticity > _30) then - if not (TestCollisionXwithGear(HHGear, -hwSign(Gear^.dX)) - or TestCollisionYwithGear(HHGear, -hwSign(Gear^.dY))) then Gear^.Elasticity:= Gear^.Elasticity - _0_3; + if not (TestCollisionXwithGear(HHGear, -hwSign(Gear^.dX)) + or TestCollisionYwithGear(HHGear, -hwSign(Gear^.dY))) then Gear^.Elasticity:= Gear^.Elasticity - _0_3; HHGear^.X:= Gear^.X + cc*Gear^.Elasticity; HHGear^.Y:= Gear^.Y + cs*Gear^.Elasticity; @@ -727,21 +727,25 @@ HHGear^.dY:= HHGear^.Y - HHGear^.dY; if TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) then - HHGear^.dX:= -_0_6 * HHGear^.dX; + HHGear^.dX:= -_0_6 * HHGear^.dX; if TestCollisionYwithGear(HHGear, hwSign(HHGear^.dY)) then - HHGear^.dY:= -_0_6 * HHGear^.dY; + HHGear^.dY:= -_0_6 * HHGear^.dY; len:= Distance(HHGear^.dX, HHGear^.dY); if len > _0_8 then - begin - len:= _0_8 / len; - HHGear^.dX:= HHGear^.dX * len; - HHGear^.dY:= HHGear^.dY * len; - end; + begin + len:= _0_8 / len; + HHGear^.dX:= HHGear^.dX * len; + HHGear^.dY:= HHGear^.dY * len; + end; if (Gear^.Message and gm_Attack) <> 0 then - if (Gear^.State and gsttmpFlag) <> 0 then DeleteMe else -else if (Gear^.State and gsttmpFlag) = 0 then Gear^.State:= Gear^.State or gsttmpFlag; + if (Gear^.State and gsttmpFlag) <> 0 then + DeleteMe + else +else + if (Gear^.State and gsttmpFlag) = 0 then + Gear^.State:= Gear^.State or gsttmpFlag; end;