# HG changeset patch # User unc0rr # Date 1395320689 -14400 # Node ID f04fdb35fc334eb7d527b6bd0beecd33d374d5c8 # Parent 9dd3a44805a1a97d0ddc0bf6b95e33a603f3f56b - 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 diff -r 9dd3a44805a1 -r f04fdb35fc33 hedgewars/uLandGenTemplateBased.pas --- 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)) diff -r 9dd3a44805a1 -r f04fdb35fc33 hedgewars/uLandTemplates.pas --- 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), diff -r 9dd3a44805a1 -r f04fdb35fc33 tools/templates/mainform.cpp --- 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;