# HG changeset patch # User nemo # Date 1381684472 14400 # Node ID 2fd51591b26079c99dc602ceb9947bf52ee63596 # Parent 0a52c1dd94006313e244e910da370f26e05e6a6a make wrapping nicer when there's collision diff -r 0a52c1dd9400 -r 2fd51591b260 hedgewars/uGearsHandlersMess.pas --- a/hedgewars/uGearsHandlersMess.pas Fri Oct 11 13:06:04 2013 -0400 +++ b/hedgewars/uGearsHandlersMess.pas Sun Oct 13 13:14:32 2013 -0400 @@ -280,11 +280,17 @@ var isFalling: boolean; //tmp: QWord; - tdX, tdY: hwFloat; + tX, tdX, tdY: hwFloat; collV, collH: LongInt; land: word; begin - WorldWrap(Gear); + tX:= Gear^.X; + if WorldWrap(Gear) and (WorldEdge = weWrap) and (Gear^.AdvBounce <> 0) and + (TestCollisionXwithGear(Gear, 1) or TestCollisionXwithGear(Gear, -1)) then + begin + Gear^.X:= tX; + Gear^.dX.isNegative:= (hwRound(tX) > leftX+Gear^.Radius*2) + end; // clip velocity at 2 - over 1 per pixel, but really shouldn't cause many actual problems. if Gear^.dX.Round > 2 then diff -r 0a52c1dd9400 -r 2fd51591b260 hedgewars/uGearsHandlersRope.pas --- a/hedgewars/uGearsHandlersRope.pas Fri Oct 11 13:06:04 2013 -0400 +++ b/hedgewars/uGearsHandlersRope.pas Sun Oct 13 13:14:32 2013 -0400 @@ -31,9 +31,17 @@ procedure doStepRopeAfterAttack(Gear: PGear); var HHGear: PGear; + tX: hwFloat; begin HHGear := Gear^.Hedgehog^.Gear; - WorldWrap(HHGear); + tX:= HHGear^.X; + if WorldWrap(HHGear) and (WorldEdge = weWrap) and + (TestCollisionXwithGear(HHGear, 1) or TestCollisionXwithGear(HHGear, -1)) then + begin + HHGear^.X:= tX; + HHGear^.dX.isNegative:= (hwRound(tX) > leftX+HHGear^.Radius*2) + end; + if (HHGear^.Hedgehog^.CurAmmoType = amParachute) and (HHGear^.dY > _0_39) then begin DeleteGear(Gear); @@ -117,8 +125,20 @@ HHGear := Gear^.Hedgehog^.Gear; - if ((HHGear^.State and gstHHDriven) = 0) or WorldWrap(HHGear) - or (CheckGearDrowning(HHGear)) or (Gear^.PortalCounter <> 0) then + tX:= HHGear^.X; + if WorldWrap(HHGear) and (WorldEdge = weWrap) and + (TestCollisionXwithGear(HHGear, 1) or TestCollisionXwithGear(HHGear, -1)) then + begin + PlaySound(sndRopeRelease); + RopeDeleteMe(Gear, HHGear); + HHGear^.X:= tX; + HHGear^.dX.isNegative:= (hwRound(tX) > leftX+HHGear^.Radius*2); + exit + end; + + tX:= HHGear^.X; + if ((HHGear^.State and gstHHDriven) = 0) or + (CheckGearDrowning(HHGear)) or (Gear^.PortalCounter <> 0) then begin PlaySound(sndRopeRelease); RopeDeleteMe(Gear, HHGear); diff -r 0a52c1dd9400 -r 2fd51591b260 hedgewars/uGearsHedgehog.pas --- a/hedgewars/uGearsHedgehog.pas Fri Oct 11 13:06:04 2013 -0400 +++ b/hedgewars/uGearsHedgehog.pas Sun Oct 13 13:14:32 2013 -0400 @@ -1275,10 +1275,20 @@ //////////////////////////////////////////////////////////////////////////////// procedure doStepHedgehog(Gear: PGear); +var tX: hwFloat; begin -if WorldWrap(Gear) and (WorldEdge <> weBounce) and - (Gear = CurrentHedgehog^.Gear) and (CurAmmoGear <> nil) and (CurAmmoGear^.Kind =gtRope) then - CurAmmoGear^.PortalCounter:= 1; +tX:= Gear^.X; +if WorldWrap(Gear) then + begin + if (WorldEdge <> weBounce) and (Gear = CurrentHedgehog^.Gear) and + (CurAmmoGear <> nil) and (CurAmmoGear^.Kind =gtRope) then + CurAmmoGear^.PortalCounter:= 1; + if (WorldEdge = weWrap) and (TestCollisionXwithGear(Gear, 1) or TestCollisionXwithGear(Gear, -1)) then + begin + Gear^.X:= tX; + Gear^.dX.isNegative:= (hwRound(tX) > leftX+Gear^.Radius*2) + end + end; CheckSum:= CheckSum xor Gear^.Hedgehog^.BotLevel; if (Gear^.Message and gmDestroy) <> 0 then