New formula to calculate drawn map sizes, now every FeatureSize leads to an unique size
authorWuzzy <Wuzzy2@mail.ru>
Mon, 17 Jun 2019 20:27:34 +0200
changeset 15176 2765731b378b
parent 15175 3cc1a79de3fd
child 15177 dc94bb5990a0
New formula to calculate drawn map sizes, now every FeatureSize leads to an unique size It works by using 4 hardcoded map sizes and the rest is simply interpolated. Size 1: 1024×512 Size 6: 2048×1024 Size 12: 4096×2048 (default, compatible with pre-1.0.0) Size 25: 8192×4096
hedgewars/uLand.pas
--- a/hedgewars/uLand.pas	Mon Jun 17 20:20:01 2019 +0200
+++ b/hedgewars/uLand.pas	Mon Jun 17 20:27:34 2019 +0200
@@ -282,11 +282,9 @@
 
 
 procedure GenDrawnMap;
+var lowerX, upperX, lowerY, upperY, lowerFS, upperFS, value: LongInt;
 begin
-    if (cFeatureSize <= 3) then
-        // sizes 1-3 are identical
-        MaxHedgehogs:= 8
-    else if (cFeatureSize <= 6) then
+    if (cFeatureSize <= 6) then
         MaxHedgehogs:= 6 + (cFeatureSize-1) * 2
     else if (cFeatureSize < 11) then
         MaxHedgehogs:= 16 + (cFeatureSize-6) * 4
@@ -298,9 +296,56 @@
         MaxHedgehogs:= cMaxHHs;
 
     if GameType = gmtLandPreview then
-        cFeatureSize:= 3;
-    playWidth:= (4096 * max(min(cFeatureSize,24),3)) div 12;
-    playHeight:= (2048 * max(min(cFeatureSize,24),3)) div 12;
+        cFeatureSize:= 1;
+
+    // Calculate map size for drawn map, use cFeatureSize to scale.
+
+    // We have pre-determined map size for cFeatureSize 1, 6, 12 and 25.
+    // The other values will be interpolated.
+    if cFeatureSize < 6 then
+        begin
+        // reference size for cFeatureSize 1
+        lowerFS:= 1;
+        lowerX:= 1024;
+        lowerY:= 512;
+        upperFS:= 6;
+        end
+    else if cFeatureSize < 12 then
+        begin
+        // reference size for cFeatureSize 6
+        lowerFS:= 6;
+        lowerX:= 2048;
+        lowerY:= 1024;
+        upperFS:= 12;
+        end
+    else
+        begin
+        // reference size for cFeatureSize 12, size of drawn maps in pre-1.0.0 versions
+        lowerFS:= 12;
+        lowerX:= 4096;
+        lowerY:= 2048;
+        upperFS:= 25;
+        end;
+
+    upperX:= lowerX * 2;
+    upperY:= lowerY * 2;
+
+    if cFeatureSize = 25 then
+        begin
+        // hardcoded size for size level 25
+        playWidth:= 8192;
+        playHeight:= 4096;
+        end
+    else
+        begin
+        // Interpolation formula
+        playWidth:= lowerX + ((upperX-lowerX) div (upperFS-lowerFS))*(cFeatureSize-lowerFS);
+        playHeight:= lowerY + ((upperY-lowerY) div (upperFS-lowerFS))*(cFeatureSize-lowerFS);
+        end;
+
+    if GameType <> gmtLandPreview then
+        WriteLnToConsole('Drawn map size: cFeatureSize='+IntToStr(cFeatureSize)+' playWidth='+IntToStr(playWidth)+' playHeight='+IntToStr(playHeight));
+
     ResizeLand(playWidth, playHeight);
 
     hasGirders:= true;