hedgewars/uGearsUtils.pas
changeset 10272 31ee88c9b4d0
parent 10245 3ccc054c3c3e
child 10274 07adc8b6288c
--- a/hedgewars/uGearsUtils.pas	Tue Jun 10 19:38:37 2014 +0200
+++ b/hedgewars/uGearsUtils.pas	Wed Jun 11 00:28:17 2014 +0400
@@ -549,7 +549,7 @@
     count: LongInt = 0;
 begin
     if (y and LAND_HEIGHT_MASK) = 0 then
-        for i:= max(x - r, 0) to min(x + r, LAND_WIDTH - 4) do
+        for i:= max(x - r, 0) to min(x + r, LAND_WIDTH - 1) do
             if Land[y, i] and mask <> 0 then
             begin
                 inc(count);
@@ -562,6 +562,28 @@
     CountNonZeroz:= count;
 end;
 
+function isSteadyPosition(x, y, r, c: LongInt; mask: Longword): boolean;
+var cnt, i: LongInt;
+begin
+    cnt:= 0;
+    isSteadyPosition:= false;
+
+    if ((y and LAND_HEIGHT_MASK) = 0) and (x - r >= 0) and (x + r < LAND_WIDTH) then
+    begin
+        for i:= r - c + 2 to r do
+        begin
+            if (Land[y, x - i] and mask <> 0) then inc(cnt);
+            if (Land[y, x + i] and mask <> 0) then inc(cnt);
+
+            if cnt >= c then
+            begin
+                isSteadyPosition:= true;
+                exit
+            end;
+        end;
+    end;
+end;
+
 
 function NoGearsToAvoid(mX, mY: LongInt; rX, rY: LongInt): boolean;
 var t: PGear;
@@ -629,16 +651,14 @@
                         ((not ignoreOverlap) and (CountNonZeroz(x, y, Gear^.Radius - 1, 1, $FFFF) <> 0)) or
                         (ignoreOverlap and (CountNonZeroz(x, y, Gear^.Radius - 1, 1, lfLandMask) <> 0));
 
-                if (y - sy > Gear^.Radius * 2)
+                if (y - sy > Gear^.Radius * 2) and (y < cWaterLine)
                     and (((Gear^.Kind = gtExplosives)
-                    and (y < cWaterLine)
-                    and (ignoreNearObjects or NoGearsToAvoid(x, y - Gear^.Radius, 60, 60))
-                    and (CountNonZeroz(x, y+1, Gear^.Radius - 1, Gear^.Radius+1, $FFFF) > Gear^.Radius))
-                or
-                    ((Gear^.Kind <> gtExplosives)
-                    and (y < cWaterLine)
-                    and (ignoreNearObjects or NoGearsToAvoid(x, y - Gear^.Radius, 110, 110))
-                    )) then
+                        and (ignoreNearObjects or NoGearsToAvoid(x, y - Gear^.Radius, 60, 60))
+                        and (isSteadyPosition(x, y+1, Gear^.Radius - 1, 3, $FFFF)))
+                    or
+                        ((Gear^.Kind <> gtExplosives)
+                        and (ignoreNearObjects or NoGearsToAvoid(x, y - Gear^.Radius, 110, 110))
+                        )) then
                     begin
                     ar[cnt].X:= x;
                     if withFall then