# HG changeset patch # User nemo # Date 1272824713 0 # Node ID d445798e5fe26a80716180d2f1d4f275e05a9c14 # Parent 244382ea33c2e5e2940fbb4a9c241c72b54fed67 hax diff -r 244382ea33c2 -r d445798e5fe2 hedgewars/GSHandlers.inc --- a/hedgewars/GSHandlers.inc Sun May 02 16:53:19 2010 +0000 +++ b/hedgewars/GSHandlers.inc Sun May 02 18:25:13 2010 +0000 @@ -3044,16 +3044,17 @@ procedure doStepPortal(Gear: PGear); var tmpGear, iterator: PGear; begin - //if not AllInactive and (Gear^.IntersectGear <> nil) then - if (Gear^.IntersectGear <> nil) then + if (Land[hwRound(Gear^.Y), hwRound(Gear^.X)] and $FF00) = 0 then DeleteGear(Gear); + if not AllInactive and (Gear^.IntersectGear <> nil) then + //if (Gear^.IntersectGear <> nil) then begin iterator:= GearsList; while iterator <> nil do begin if iterator^.Active and (iterator^.Kind <> gtPortal) and - (hwRound(hwAbs(Gear^.X-iterator^.X)+hwAbs(Gear^.Y-iterator^.Y)) < Gear^.Radius) and + (hwRound(hwAbs(Gear^.X-iterator^.X)+hwAbs(Gear^.Y-iterator^.Y)) < Gear^.Radius+iterator^.Radius) and ((hwAbs(Gear^.X-(iterator^.X+iterator^.dX))+hwAbs(Gear^.Y-(iterator^.Y+iterator^.dY))).QWordValue < (hwAbs(Gear^.X-iterator^.X)+hwAbs(Gear^.Y-iterator^.Y)).QWordValue) and - (hwRound(Distance(Gear^.X-iterator^.X,Gear^.Y-iterator^.Y)) < Gear^.Radius) then // Let's check this one more closely + (hwRound(Distance(Gear^.X-iterator^.X,Gear^.Y-iterator^.Y)) < Gear^.Radius+iterator^.Radius) then // Let's check this one more closely begin iterator^.X:=Gear^.IntersectGear^.X+_128; iterator^.Y:=Gear^.IntersectGear^.Y+_128; @@ -3074,6 +3075,7 @@ procedure doStepMovingPortal(Gear: PGear); var x, y, tx, ty: LongInt;//, bx, by, tangle: LongInt; + iterator: PGear; begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.Y:= Gear^.Y + Gear^.dY; @@ -3126,7 +3128,20 @@ if Gear^.IntersectGear <> nil then begin Gear^.IntersectGear^.IntersectGear:= Gear; - SetAllToActive + AllInactive:= false; + // This jiggles gears, to ensure a portal connection just placed under a gear takes effect. + iterator:= GearsList; + while iterator <> nil do + begin + iterator^.Active:= true; + if iterator^.dY.QWordValue = _0.QWordValue then iterator^.dY.isNegative:= false; + iterator^.State:= iterator^.State or gstMoving; + DeleteCI(iterator); + inc(iterator^.dY.QWordValue,10); + iterator:= iterator^.NextGear; + end; + doStepPortal(Gear); + if Gear^.IntersectGear <> nil then doStepPortal(Gear^.IntersectGear); end end end