Fix sprays being biased to the left on huge maps
authorWuzzy <Wuzzy2@mail.ru>
Sat, 15 Jun 2019 18:15:32 +0200
changeset 15156 84e98f0f7f7b
parent 15155 c0ae9f4f9589
child 15157 490bd70dac6e
Fix sprays being biased to the left on huge maps
hedgewars/uLandObjects.pas
--- a/hedgewars/uLandObjects.pas	Sat Jun 15 17:00:43 2019 +0200
+++ b/hedgewars/uLandObjects.pas	Sat Jun 15 18:15:32 2019 +0200
@@ -619,7 +619,8 @@
 
 function TryPut2(var Obj: TSprayObject; Surface: PSDL_Surface): boolean;
 const MaxPointsIndex = 8095;
-var x, y: Longword;
+var x, y, xStart, yStart: Longword;
+    xWraps, yWraps: Byte;
     ar: array[0..MaxPointsIndex] of TPoint;
     cnt, i: Longword;
     r: TSDL_Rect;
@@ -631,13 +632,20 @@
     begin
     if Maxcnt = 0 then
         exit;
-    x:= 0;
+    xWraps:= 0;
+    yWraps:= 0;
+    // Start at random coordinates
+    xStart:= getrandom(LAND_WIDTH - Width);
+    yStart:= 8 + getrandom(LAND_HEIGHT - Height - 16);
+    x:= xStart;
+    y:= yStart;
     r.x:= 0;
     r.y:= 0;
     r.w:= Width;
     r.h:= Height + 16;
+    // Then iterate through the whole map; this requires we wrap one time per axis
     repeat
-        y:= 8;
+        yWraps:= 0;
         repeat
             if CheckLand(r, x, y - 8, lfBasic)
             and (not CheckIntersect(x, y, Width, Height)) then
@@ -652,9 +660,19 @@
                     else inc(cnt);
                 end;
             inc(y, 12);
-        until y >= LAND_HEIGHT - Height - 8;
-        inc(x, getrandom(12) + 12)
-    until x >= LAND_WIDTH - Width;
+            if (y >= LAND_HEIGHT - Height - 8) or ((yWraps > 0) and (y >= yStart)) then
+                begin
+                inc(yWraps);
+                y:= 8;
+                end;
+        until yWraps > 1;
+        inc(x, getrandom(12) + 12);
+        if (x >= LAND_WIDTH - Width) or ((xWraps > 0) and (x >= xStart)) then
+            begin
+            inc(xWraps);
+            x:= 0;
+            end;
+    until xWraps > 1;
     bRes:= cnt <> 0;
     if bRes then
         begin