hedgewars/GSHandlers.inc
changeset 4800 83ee0a10903b
parent 4799 0f408159a33f
child 4801 c0d3c2f5e952
--- a/hedgewars/GSHandlers.inc	Fri Dec 31 23:09:06 2010 +0100
+++ b/hedgewars/GSHandlers.inc	Sat Jan 01 11:15:35 2011 +0100
@@ -1362,19 +1362,19 @@
         if (GameFlags and gfMoreWind) <> 0 then HHGear^.dX := HHGear^.dX + cWindSpeed / HHGear^.Density;
         end;
 
+    // vector between hedgehog and rope attaching point
     ropeDx := HHGear^.X - Gear^.X;
-    // vector between hedgehog and rope attaching point
     ropeDy := HHGear^.Y - Gear^.Y;
 
     mdX := ropeDx + HHGear^.dX;
     mdY := ropeDy + HHGear^.dY;
     len := _1 / Distance(mdX, mdY);
+    // rope vector plus hedgehog direction vector normalized
     mdX := mdX * len;
-    // rope vector plus hedgehog direction vector normalized
     mdY := mdY * len;
 
+    // for visual purposes only
     Gear^.dX := mdX;
-    // for visual purposes only
     Gear^.dY := mdY;
 
     /////
@@ -1502,8 +1502,27 @@
         HHGear^.dY := HHGear^.dY * len;
         end;
 
-
-    if (Gear^.Message and gmAttack) <> 0 then
+    if RopePoints.Count > 0 then
+        begin
+        // backup gear location
+        tx:= Gear^.X;
+        ty:= Gear^.Y;
+
+        // set gear location to the remote end of the rope, the attachment point
+        Gear^.X:= RopePoints.ar[0].X;
+        Gear^.Y:= RopePoints.ar[0].Y;
+
+        CheckCollisionWithLand(Gear);
+
+        // restore gear location
+        Gear^.X:= tx;
+        Gear^.Y:= ty;
+        end
+    else
+        CheckCollisionWithLand(Gear);
+
+    if ((Gear^.Message and gmAttack) <> 0)
+    or ((Gear^.State and gstCollision) = 0) then
         if (Gear^.State and gsttmpFlag) <> 0 then
             with Gear^.Hedgehog^ do
                 begin
@@ -1517,6 +1536,7 @@
     else
         if (Gear^.State and gsttmpFlag) = 0 then
             Gear^.State := Gear^.State or gsttmpFlag;
+
 end;
 
 procedure doStepRopeAttach(Gear: PGear);