# HG changeset patch # User Wuzzy # Date 1560615332 -7200 # Node ID 84e98f0f7f7b38d446a5507256350954adffb07e # Parent c0ae9f4f95899639e353455e69fd7146ec4088d6 Fix sprays being biased to the left on huge maps diff -r c0ae9f4f9589 -r 84e98f0f7f7b 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