Workaround bug (each time losing room master status, even when joining mutliple rooms, new instance of NetAmmoSchemeModel created, receiving schemeConfig and modifying its 43rd member, thus the last model which accepts this signal has the string cut down several times, workaround creates copy of qstringlist to avoid modifying shared message instance. Proper fix would delete unneeded instances of NetAmmoSchemeModel, but who cares)
unit uLandUtils;
interface
procedure ResizeLand(width, height: LongWord);
procedure InitWorldEdges();
implementation
uses uUtils, uConsts, uVariables, uTypes;
procedure ResizeLand(width, height: LongWord);
var potW, potH: LongInt;
begin
potW:= toPowerOf2(width);
potH:= toPowerOf2(height);
if (potW <> LAND_WIDTH) or (potH <> LAND_HEIGHT) then
begin
LAND_WIDTH:= potW;
LAND_HEIGHT:= potH;
LAND_WIDTH_MASK:= not(LAND_WIDTH-1);
LAND_HEIGHT_MASK:= not(LAND_HEIGHT-1);
cWaterLine:= LAND_HEIGHT;
if (cReducedQuality and rqBlurryLand) = 0 then
SetLength(LandPixels, LAND_HEIGHT, LAND_WIDTH)
else
SetLength(LandPixels, LAND_HEIGHT div 2, LAND_WIDTH div 2);
SetLength(Land, LAND_HEIGHT, LAND_WIDTH);
SetLength(LandDirty, (LAND_HEIGHT div 32), (LAND_WIDTH div 32));
// 0.5 is already approaching on unplayable
if (width div 4096 >= 2) or (height div 2048 >= 2) then cMaxZoomLevel:= 0.5;
cMinMaxZoomLevelDelta:= cMaxZoomLevel - cMinZoomLevel
end;
end;
procedure InitWorldEdges();
var cy, cx, lx, ly: LongInt;
found: boolean;
begin
playHeight:= LAND_HEIGHT;
topY:= 0;
lx:= LongInt(LAND_WIDTH) - 1;
if WorldEdge = weNone then
begin
playWidth:= LAND_WIDTH;
leftX := 0;
rightX:= lx;
EXIT;
end;
ly:= LongInt(LAND_HEIGHT) - 1;
// find most left land pixels and set leftX accordingly
found:= false;
for cx:= 0 to lx do
begin
for cy:= ly downto 0 do
if Land[cy, cx] <> 0 then
begin
leftX:= max(0, cx - cWorldEdgeDist);
// break out of both loops
found:= true;
break;
end;
if found then break;
end;
// find most right land pixels and set rightX accordingly
found:= false;
for cx:= lx downto 0 do
begin
for cy:= ly downto 0 do
if Land[cy, cx] <> 0 then
begin
rightX:= min(lx, cx + cWorldEdgeDist);
// break out of both loops
found:= true;
break;
end;
if found then break;
end;
playWidth := rightX + 1 - leftX;
end;
end.