- Limit outline to leftX/rightX/topY instead of LAND_WIDTH/LAND_HEIGHT
authorunc0rr
Thu, 20 Mar 2014 17:04:49 +0400
changeset 10208 f04fdb35fc33
parent 10207 9dd3a44805a1
child 10209 76316652ef26
- Limit outline to leftX/rightX/topY instead of LAND_WIDTH/LAND_HEIGHT - Fix most of templates which could produce self-intersecting polyline as a start for distortion - Fix parsing in templates editor
hedgewars/uLandGenTemplateBased.pas
hedgewars/uLandTemplates.pas
tools/templates/mainform.cpp
--- a/hedgewars/uLandGenTemplateBased.pas	Thu Mar 20 00:59:15 2014 +0400
+++ b/hedgewars/uLandGenTemplateBased.pas	Thu Mar 20 17:04:49 2014 +0400
@@ -95,7 +95,7 @@
 end;
 
 procedure FindPoint(si, fillPointsCount: LongInt; var newPoint: TPoint; var pa: TPixAr);
-const mapBorderMargin = 30;
+const mapBorderMargin = 40;
     minDistance = 32; // adjust/parametrize this for different details size
 var p1, p2, p4, fp, mp: TPoint;
     i, t1, t2, a, b, p, q, iy, ix, aqpb: LongInt;
@@ -126,9 +126,9 @@
     // don't process too short segments or those which are too close to map borders
     if (p1.x = NTPX)
             or (dab < minDistance * 3) 
-            or (mp.x < mapBorderMargin)
-            or (mp.x > LAND_WIDTH - mapBorderMargin)
-            or (mp.y < mapBorderMargin)
+            or (mp.x < leftX + mapBorderMargin)
+            or (mp.x > rightX - mapBorderMargin)
+            or (mp.y < topY + mapBorderMargin)
             or (mp.y > LAND_HEIGHT - mapBorderMargin)
     then
     begin
@@ -140,22 +140,22 @@
     if a <> 0 then
     begin
         // left border
-        iy:= (mapBorderMargin - mp.x) * b div a + mp.y;
-        d:= DistanceI(mp.x - mapBorderMargin, mp.y - iy).Round;
+        iy:= (leftX + mapBorderMargin - mp.x) * b div a + mp.y;
+        d:= DistanceI(mp.x - leftX - mapBorderMargin, mp.y - iy).Round;
         t1:= a * (mp.x - mapBorderMargin) + b * (mp.y - iy);
         if t1 > 0 then distL:= d else distR:= d;
 
         // right border
-        iy:= (LAND_WIDTH - mapBorderMargin - mp.x) * b div a + mp.y;
-        d:= DistanceI(mp.x - LAND_WIDTH + mapBorderMargin, mp.y - iy).Round;
+        iy:= (rightX - mapBorderMargin - mp.x) * b div a + mp.y;
+        d:= DistanceI(mp.x - rightX + mapBorderMargin, mp.y - iy).Round;
         if t1 > 0 then distR:= d else distL:= d;
     end;
 
     if b <> 0 then
     begin
         // top border
-        ix:= (mapBorderMargin - mp.y) * a div b + mp.x;
-        d:= DistanceI(mp.y - mapBorderMargin, mp.x - ix).Round;
+        ix:= (topY + mapBorderMargin - mp.y) * a div b + mp.x;
+        d:= DistanceI(mp.y - topY - mapBorderMargin, mp.x - ix).Round;
         t2:= b * (mp.y - mapBorderMargin) + a * (mp.x - ix);
         if t2 > 0 then distL:= min(d, distL) else distR:= min(d, distR);
 
@@ -331,6 +331,15 @@
     for y:= 0 to LAND_HEIGHT - 1 do
         for x:= 0 to LAND_WIDTH - 1 do
             Land[y, x]:= lfBasic;
+            
+    MaxHedgehogs:= Template.MaxHedgehogs;
+    hasGirders:= Template.hasGirders;
+    playHeight:= Template.TemplateHeight;
+    playWidth:= Template.TemplateWidth;
+    leftX:= (LAND_WIDTH - playWidth) div 2;
+    rightX:= leftX + playWidth - 1;
+    topY:= LAND_HEIGHT - playHeight;
+    
     {$HINTS OFF}
     SetPoints(Template, pa, @fps);
     {$HINTS ON}
@@ -346,14 +355,6 @@
 
     DrawEdge(pa, lfBasic);
 
-    MaxHedgehogs:= Template.MaxHedgehogs;
-    hasGirders:= Template.hasGirders;
-    playHeight:= Template.TemplateHeight;
-    playWidth:= Template.TemplateWidth;
-    leftX:= ((LAND_WIDTH - playWidth) div 2);
-    rightX:= (playWidth + ((LAND_WIDTH - playWidth) div 2)) - 1;
-    topY:= LAND_HEIGHT - playHeight;
-
     // HACK: force to only cavern even if a cavern map is invertable if cTemplateFilter = 4 ?
     if (cTemplateFilter = 4)
     or (Template.canInvert and (getrandom(2) = 0))
--- a/hedgewars/uLandTemplates.pas	Thu Mar 20 00:59:15 2014 +0400
+++ b/hedgewars/uLandTemplates.pas	Thu Mar 20 17:04:49 2014 +0400
@@ -164,7 +164,7 @@
        (x:  550; y:  568; w:  134; h:   78),
        (x: 1102; y:  560; w:  132; h:   84),
        (x: 1102; y:  708; w:  230; h:   36),
-       (x: 1120; y:  808; w:  166; h:   96),
+       (x: 1120; y:  848; w:  166; h:   96),
        (x: NTPX; y:    0; w:    1; h:    1),
        (x: 2102; y:  834; w:  202; h:   42),
        (x: 1652; y:  788; w:  134; h:   98),
@@ -1332,57 +1332,58 @@
 // maybe Tiy would be ok with this if it was smoother/more climable and a bit shorter?
 const Template37Points: array[0..27] of TSDL_Rect =
       (
-       (x:  700; y: 2100; w: 20; h: 75),
-       (x:  800; y: 1200; w: 20; h: 75),
-       (x:  900; y:  400; w: 20; h: 50),
-       (x: 1100; y:  600; w: 20; h: 50),
-       (x: 1300; y:  900; w: 20; h: 50),
-       (x: 1000; y: 1000; w: 20; h: 50),
-       (x: 1700; y: 1850; w: 20; h: 75),
-       (x: 2048; y: 2100; w: 20; h: 75),
-       (x: NTPX; y:    0; w:  1; h:  1),
-       (x: 2048; y: 2100; w: 20; h: 50),
-       (x: 2400; y: 1850; w: 20; h: 50),
-       (x: 2600; y: 1000; w: 20; h: 75),
-       (x: 2800; y:  900; w: 20; h: 50),
-       (x: 3000; y:  600; w: 20; h: 50),
-       (x: 3200; y:  400; w: 20; h: 50),
-       (x: 3300; y: 1200; w: 20; h: 50),
-       (x: 3400; y: 2100; w: 20; h: 75),
-       (x: NTPX; y:    0; w:  1; h:  1),
-       (x: 1450; y:  700; w: 25; h: 25),
-       (x: 1850; y:  650; w: 25; h: 25),
-       (x: 2250; y:  800; w: 25; h: 25),
-       (x: 2500; y:  700; w: 25; h: 25),
-       (x: NTPX; y:    0; w:  1; h:  1),
-       (x: 1550; y: 1500; w: 25; h: 25),
-       (x: 1830; y: 1150; w: 25; h: 25),
-       (x: 2260; y: 1000; w: 25; h: 25),
-       (x: 2250; y: 1200; w: 25; h: 25),
-       (x: NTPX; y:    0; w:  1; h:  1)
+       (x:  700; y: 2100; w: 120; h: 175),
+       (x:  800; y: 1200; w: 120; h: 175),
+       (x:  900; y:  400; w: 120; h: 150),
+       (x: 1100; y:  600; w: 120; h: 150),
+       (x: 1300; y:  900; w: 120; h: 150),
+       (x: 1000; y: 1000; w: 120; h: 150),
+       (x: 1700; y: 1850; w: 120; h: 175),
+       (x: 2048; y: 2100; w: 120; h: 175),
+       (x: NTPX; y:    0; w:   1; h:   1),
+       (x: 2048; y: 2100; w: 120; h: 150),
+       (x: 2400; y: 1850; w: 120; h: 150),
+       (x: 2600; y: 1000; w: 120; h: 175),
+       (x: 2800; y:  900; w: 120; h: 150),
+       (x: 3000; y:  600; w: 120; h: 150),
+       (x: 3200; y:  400; w: 120; h: 150),
+       (x: 3300; y: 1200; w: 120; h: 150),
+       (x: 3400; y: 2100; w: 120; h: 175),
+       (x: NTPX; y:    0; w:   1; h:   1),
+       (x: 1450; y:  700; w: 125; h: 125),
+       (x: 1850; y:  500; w: 125; h: 125),
+       (x: 2250; y:  500; w: 125; h: 125),
+       (x: 2500; y:  700; w: 125; h: 125),
+       (x: NTPX; y:    0; w:   1; h:   1),
+       (x: 1550; y: 1500; w: 125; h: 125),
+       (x: 1830; y: 1150; w: 125; h: 125),
+       (x: 2260; y: 1000; w: 125; h: 125),
+       (x: 2250; y: 1400; w: 125; h: 125),
+       (x: NTPX; y:    0; w:   1; h:   1)
       );
       Template37FPoints: array[0..0] of TPoint =
       (
        (x: 2047; y:    0)
       );
 // attempt to make a series of moderate hills/valleys - was before I really figured out the whole probabilities thing
+// fixed much much later by unC0Rr during tempaltes review for new generator
 const Template38Points: array[0..16] of TSDL_Rect =
       (
        (x:  100; y: 2100; w:   1; h:    1),
-       (x:  100; y: 1600; w: 300; h:  500),
-       (x:  400; y:  600; w: 300; h: 1500),
-       (x:  700; y: 1600; w: 300; h:  600),
-       (x: 1000; y: 1800; w: 300; h:  300),
-       (x: 1300; y:  500; w: 300; h: 1600),
-       (x: 1600; y: 1700; w: 300; h:  400),
-       (x: 1600; y: 1600; w: 300; h:  500),
-       (x: 1600; y: 1400; w: 300; h:  700),
-       (x: 2200; y:  300; w: 300; h: 1800),
-       (x: 2500; y: 1500; w: 300; h:  600),
-       (x: 2800; y: 1900; w: 300; h:  200),
-       (x: 3100; y: 1600; w: 300; h:  500),
-       (x: 3400; y:  600; w: 300; h: 1500),
-       (x: 3700; y: 1800; w: 200; h:  300),
+       (x:  100; y: 1600; w: 250; h:  500),
+       (x:  400; y:  600; w: 250; h: 1500),
+       (x:  700; y: 1600; w: 250; h:  600),
+       (x: 1000; y: 1800; w: 250; h:  300),
+       (x: 1300; y:  500; w: 250; h: 1600),
+       (x: 1600; y: 1700; w: 150; h:  400),
+       (x: 1800; y: 1600; w: 150; h:  500),
+       (x: 2000; y: 1400; w: 150; h:  700),
+       (x: 2200; y:  300; w: 250; h: 1800),
+       (x: 2500; y: 1500; w: 250; h:  600),
+       (x: 2800; y: 1900; w: 250; h:  200),
+       (x: 3100; y: 1600; w: 250; h:  500),
+       (x: 3400; y:  600; w: 250; h: 1500),
+       (x: 3700; y: 1800; w: 150; h:  300),
        (x: 3700; y: 2100; w:   1; h:    1),
        (x: NTPX; y:    0; w:   1; h:    1)
       );
@@ -1455,7 +1456,7 @@
        (x: 512; y:    0)
       );
 // Many islands
-const Template41Points: array[0..86] of TSDL_Rect =
+const Template41Points: array[0..85] of TSDL_Rect =
       (
        (x:   95; y: 500; w:  26; h:  26),
        (x:  100; y: 275; w:  50; h: 125),
@@ -1472,31 +1473,31 @@
        (x: 1350; y: 300; w:  50; h:  75),
        (x: 1400; y: 575; w:  50; h:  75),
        (x: NTPX; y:   0; w:   1; h:   1),
-       (x:  525; y:1050; w:  75; h:  75),
+       (x:  725; y:1050; w:  75; h:  75),
        (x:  700; y: 800; w: 125; h: 175),
-       (x:  950; y: 900; w: 125; h: 175),
-       (x: 1100; y:1100; w:  75; h:  75),
+       (x:  950; y: 800; w: 125; h: 175),
+       (x: 1000; y:1100; w:  75; h:  75),
        (x: NTPX; y:   0; w:   1; h:   1),
        (x:  175; y:1500; w:  26; h:  26),
-       (x:  210; y:1400; w:  30; h:  50),
-       (x:  240; y:1400; w:  30; h:  50),
+       (x:  180; y:1400; w:  30; h:  50),
+       (x:  250; y:1400; w:  30; h:  50),
        (x:  275; y:1510; w:  26; h:  26),
        (x: NTPX; y:   0; w:   1; h:   1),
-       (x:  450; y:1800; w: 125; h: 125),
-       (x:  600; y:1750; w: 125; h: 125),
-       (x:  750; y:1750; w: 125; h: 125),
+       (x:  500; y:1800; w: 125; h: 125),
+       (x:  600; y:1650; w: 125; h: 125),
+       (x:  750; y:1650; w: 125; h: 125),
        (x:  950; y:1850; w: 125; h: 125),
        (x: NTPX; y:   0; w:   1; h:   1),
        (x: 1075; y:1450; w:  26; h:  26),
-       (x: 1110; y:1300; w:  30; h:  50),
-       (x: 1140; y:1300; w:  30; h:  50),
+       (x: 1100; y:1300; w:  30; h:  50),
+       (x: 1150; y:1300; w:  30; h:  50),
        (x: 1175; y:1430; w:  26; h:  26),
        (x: NTPX; y:   0; w:   1; h:   1),
        (x: 1600; y:1250; w:  50; h: 125),
-       (x: 1700; y:1150; w:  50; h: 125),
+       (x: 1700; y: 950; w:  50; h: 125),
        (x: 1850; y: 500; w:  75; h: 125),
        (x: 1950; y: 550; w:  75; h: 175),
-       (x: 2250; y:1150; w:  50; h: 125),
+       (x: 2250; y: 950; w:  50; h: 125),
        (x: 2350; y:1250; w:  50; h: 125),
        (x: NTPX; y:   0; w:   1; h:   1),
        (x: 1750; y:2010; w:  26; h:  26),
@@ -1510,27 +1511,27 @@
        (x: 2700; y:1690; w:  26; h:  26),
        (x: NTPX; y:   0; w:   1; h:   1),
        (x: 2000; y: 125; w:  26; h:  26),
-       (x: 2050; y:  50; w:  50; h:  50),
+       (x: 2000; y:  50; w:  50; h:  50),
        (x: 2100; y:  50; w:  50; h:  50),
        (x: 2150; y: 150; w:  26; h:  26),
        (x: NTPX; y:   0; w:   1; h:   1),
-       (x: 2600; y: 250; w:  50; h: 125),
-       (x: 2750; y: 400; w:  75; h:  75),
-       (x: 2900; y: 525; w:  75; h:  75),
-       (x: 3150; y: 550; w:  75; h: 125),
+       (x: 2600; y: 350; w:  50; h: 125),
+       (x: 2750; y: 250; w:  75; h:  75),
+       (x: 3200; y: 525; w:  75; h:  75),
+       (x: 2750; y: 550; w:  75; h: 125),
        (x: NTPX; y:   0; w:   1; h:   1),
        (x: 2800; y:1150; w:  26; h:  26),
-       (x: 2840; y: 950; w:  50; h:  50),
+       (x: 2770; y: 950; w:  50; h:  50),
        (x: 2880; y: 950; w:  50; h:  50),
        (x: 2900; y:1150; w:  26; h:  26),
        (x: NTPX; y:   0; w:   1; h:   1),
        (x: 3075; y:1985; w:  26; h:  26),
-       (x: 3325; y:1700; w:  75; h: 125),
+       (x: 3255; y:1700; w:  75; h: 125),
        (x: 3475; y:1700; w:  75; h: 125),
        (x: 3625; y:1985; w:  26; h:  26),
        (x: NTPX; y:   0; w:   1; h:   1),
        (x: 3200; y:1450; w:  26; h:  26),
-       (x: 3240; y:1350; w:  50; h:  50),
+       (x: 3140; y:1350; w:  50; h:  50),
        (x: 3280; y:1350; w:  50; h:  50),
        (x: 3300; y:1450; w:  26; h:  26),
        (x: NTPX; y:   0; w:   1; h:   1),
@@ -1540,11 +1541,10 @@
        (x: 3900; y:1000; w:  50; h:  75),
        (x: NTPX; y:   0; w:   1; h:   1),
        (x: 3800; y: 200; w:  50; h:  75),
-       (x: 3875; y: 100; w:  75; h:  75),
-       (x: 3925; y:  50; w:  75; h:  50),
-       (x: 4050; y: 125; w:  50; h:  75),
+       (x: 3975; y:  50; w:  75; h:  50),
+       (x: 4010; y: 225; w:  50; h:  75),
        (x: NTPX; y:   0; w:   1; h:   1)
-      );
+       );
       Template41FPoints: array[0..0] of TPoint =
       (
        (x: 2047; y:    0)
@@ -1572,7 +1572,7 @@
        (x: 512; y:    0)
       );
 // Many islands
-const Template43Points: array[0..173] of TSDL_Rect =
+const Template43Points: array[0..172] of TSDL_Rect =
       (
        (x:   95; y: 500; w:  26; h:  26),
        (x:  100; y: 275; w:  50; h: 125),
@@ -1589,31 +1589,31 @@
        (x: 1350; y: 300; w:  50; h:  75),
        (x: 1400; y: 575; w:  50; h:  75),
        (x: NTPX; y:   0; w:   1; h:   1),
-       (x:  525; y:1050; w:  75; h:  75),
+       (x:  725; y:1050; w:  75; h:  75),
        (x:  700; y: 800; w: 125; h: 175),
-       (x:  950; y: 900; w: 125; h: 175),
-       (x: 1100; y:1100; w:  75; h:  75),
+       (x:  950; y: 800; w: 125; h: 175),
+       (x: 1000; y:1100; w:  75; h:  75),
        (x: NTPX; y:   0; w:   1; h:   1),
        (x:  175; y:1500; w:  26; h:  26),
-       (x:  210; y:1400; w:  30; h:  50),
-       (x:  240; y:1400; w:  30; h:  50),
+       (x:  180; y:1400; w:  30; h:  50),
+       (x:  250; y:1400; w:  30; h:  50),
        (x:  275; y:1510; w:  26; h:  26),
        (x: NTPX; y:   0; w:   1; h:   1),
-       (x:  450; y:1800; w: 125; h: 125),
-       (x:  600; y:1750; w: 125; h: 125),
-       (x:  750; y:1750; w: 125; h: 125),
+       (x:  500; y:1800; w: 125; h: 125),
+       (x:  600; y:1650; w: 125; h: 125),
+       (x:  750; y:1650; w: 125; h: 125),
        (x:  950; y:1850; w: 125; h: 125),
        (x: NTPX; y:   0; w:   1; h:   1),
        (x: 1075; y:1450; w:  26; h:  26),
-       (x: 1110; y:1300; w:  30; h:  50),
-       (x: 1140; y:1300; w:  30; h:  50),
+       (x: 1100; y:1300; w:  30; h:  50),
+       (x: 1150; y:1300; w:  30; h:  50),
        (x: 1175; y:1430; w:  26; h:  26),
        (x: NTPX; y:   0; w:   1; h:   1),
        (x: 1600; y:1250; w:  50; h: 125),
-       (x: 1700; y:1150; w:  50; h: 125),
+       (x: 1700; y: 950; w:  50; h: 125),
        (x: 1850; y: 500; w:  75; h: 125),
        (x: 1950; y: 550; w:  75; h: 175),
-       (x: 2250; y:1150; w:  50; h: 125),
+       (x: 2250; y: 950; w:  50; h: 125),
        (x: 2350; y:1250; w:  50; h: 125),
        (x: NTPX; y:   0; w:   1; h:   1),
        (x: 1750; y:2010; w:  26; h:  26),
@@ -1627,27 +1627,27 @@
        (x: 2700; y:1690; w:  26; h:  26),
        (x: NTPX; y:   0; w:   1; h:   1),
        (x: 2000; y: 125; w:  26; h:  26),
-       (x: 2050; y:  50; w:  50; h:  50),
+       (x: 2000; y:  50; w:  50; h:  50),
        (x: 2100; y:  50; w:  50; h:  50),
        (x: 2150; y: 150; w:  26; h:  26),
        (x: NTPX; y:   0; w:   1; h:   1),
-       (x: 2600; y: 250; w:  50; h: 125),
-       (x: 2750; y: 400; w:  75; h:  75),
-       (x: 2900; y: 525; w:  75; h:  75),
-       (x: 3150; y: 550; w:  75; h: 125),
+       (x: 2600; y: 350; w:  50; h: 125),
+       (x: 2750; y: 250; w:  75; h:  75),
+       (x: 3200; y: 525; w:  75; h:  75),
+       (x: 2750; y: 550; w:  75; h: 125),
        (x: NTPX; y:   0; w:   1; h:   1),
        (x: 2800; y:1150; w:  26; h:  26),
-       (x: 2840; y: 950; w:  50; h:  50),
+       (x: 2770; y: 950; w:  50; h:  50),
        (x: 2880; y: 950; w:  50; h:  50),
        (x: 2900; y:1150; w:  26; h:  26),
        (x: NTPX; y:   0; w:   1; h:   1),
        (x: 3075; y:1985; w:  26; h:  26),
-       (x: 3325; y:1700; w:  75; h: 125),
+       (x: 3255; y:1700; w:  75; h: 125),
        (x: 3475; y:1700; w:  75; h: 125),
        (x: 3625; y:1985; w:  26; h:  26),
        (x: NTPX; y:   0; w:   1; h:   1),
        (x: 3200; y:1450; w:  26; h:  26),
-       (x: 3240; y:1350; w:  50; h:  50),
+       (x: 3140; y:1350; w:  50; h:  50),
        (x: 3280; y:1350; w:  50; h:  50),
        (x: 3300; y:1450; w:  26; h:  26),
        (x: NTPX; y:   0; w:   1; h:   1),
@@ -1657,9 +1657,8 @@
        (x: 3900; y:1000; w:  50; h:  75),
        (x: NTPX; y:   0; w:   1; h:   1),
        (x: 3800; y: 200; w:  50; h:  75),
-       (x: 3875; y: 100; w:  75; h:  75),
-       (x: 3925; y:  50; w:  75; h:  50),
-       (x: 4050; y: 125; w:  50; h:  75),
+       (x: 3975; y:  50; w:  75; h:  50),
+       (x: 4010; y: 225; w:  50; h:  75),
        (x: NTPX; y:   0; w:   1; h:   1),
        (x:   95; y:2548; w:  26; h:  26),
        (x:  100; y:2323; w:  50; h: 125),
--- a/tools/templates/mainform.cpp	Thu Mar 20 00:59:15 2014 +0400
+++ b/tools/templates/mainform.cpp	Thu Mar 20 17:04:49 2014 +0400
@@ -98,7 +98,7 @@
     xy->rects.clear();
     for (int i = 0; i < sl.size(); ++i)
     {
-        QRegExp re("x:\\s+(\\d+);\\sy:\\s+(\\d+);\\sw:\\s+(\\d+);\\sh:\\s+(\\d+)");
+        QRegExp re("x:\\s*(\\d+);\\sy:\\s*(\\d+);\\sw:\\s*(\\d+);\\sh:\\s*(\\d+)");
         re.indexIn(sl.at(i));
         QStringList coords = re.capturedTexts();
         qDebug() << sl.at(i) << coords;