hedgewars/uLandGenTemplateBased.pas
changeset 10198 e9cbe111c0df
child 10199 fdb689b57b1b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hedgewars/uLandGenTemplateBased.pas	Fri Mar 14 19:59:34 2014 +0400
@@ -0,0 +1,146 @@
+unit uLandGenTemplateBased;
+interface
+
+uses uLandTemplates;
+
+procedure GenTemplated(var Template: TEdgeTemplate);
+
+implementation
+uses uTypes, uVariables, uConsts, uFloat, uLandOutline, uLandUtils, uRandom;
+
+
+procedure SetPoints(var Template: TEdgeTemplate; var pa: TPixAr; fps: PPointArray);
+var i: LongInt;
+begin
+    with Template do
+        begin
+        pa.Count:= BasePointsCount;
+        for i:= 0 to pred(pa.Count) do
+            begin
+            pa.ar[i].x:= BasePoints^[i].x + LongInt(GetRandom(BasePoints^[i].w));
+            if pa.ar[i].x <> NTPX then
+            pa.ar[i].x:= pa.ar[i].x + ((LAND_WIDTH - Template.TemplateWidth) div 2);
+            pa.ar[i].y:= BasePoints^[i].y + LongInt(GetRandom(BasePoints^[i].h)) + LAND_HEIGHT - LongInt(Template.TemplateHeight)
+            end;
+
+        if canMirror then
+            if getrandom(2) = 0 then
+                begin
+                for i:= 0 to pred(BasePointsCount) do
+                if pa.ar[i].x <> NTPX then
+                    pa.ar[i].x:= LAND_WIDTH - 1 - pa.ar[i].x;
+                for i:= 0 to pred(FillPointsCount) do
+                    fps^[i].x:= LAND_WIDTH - 1 - fps^[i].x;
+                end;
+
+(*  Experiment in making this option more useful
+     if ((not isNegative) and (cTemplateFilter = 4)) or
+        (canFlip and (getrandom(2) = 0)) then
+           begin
+           for i:= 0 to pred(BasePointsCount) do
+               begin
+               pa.ar[i].y:= LAND_HEIGHT - 1 - pa.ar[i].y + (LAND_HEIGHT - TemplateHeight) * 2;
+               if pa.ar[i].y > LAND_HEIGHT - 1 then
+                   pa.ar[i].y:= LAND_HEIGHT - 1;
+               end;
+           for i:= 0 to pred(FillPointsCount) do
+               begin
+               FillPoints^[i].y:= LAND_HEIGHT - 1 - FillPoints^[i].y + (LAND_HEIGHT - TemplateHeight) * 2;
+               if FillPoints^[i].y > LAND_HEIGHT - 1 then
+                   FillPoints^[i].y:= LAND_HEIGHT - 1;
+               end;
+           end;
+     end
+*)
+// template recycling.  Pull these off the floor a bit
+    if (not isNegative) and (cTemplateFilter = 4) then
+        begin
+        for i:= 0 to pred(BasePointsCount) do
+            begin
+            dec(pa.ar[i].y, 100);
+            if pa.ar[i].y < 0 then
+                pa.ar[i].y:= 0;
+            end;
+        for i:= 0 to pred(FillPointsCount) do
+            begin
+            dec(fps^[i].y, 100);
+            if fps^[i].y < 0 then
+                fps^[i].y:= 0;
+            end;
+        end;
+
+    if (canFlip and (getrandom(2) = 0)) then
+        begin
+        for i:= 0 to pred(BasePointsCount) do
+            pa.ar[i].y:= LAND_HEIGHT - 1 - pa.ar[i].y;
+        for i:= 0 to pred(FillPointsCount) do
+            fps^[i].y:= LAND_HEIGHT - 1 - fps^[i].y;
+        end;
+    end
+end;
+    
+procedure GenTemplated(var Template: TEdgeTemplate);
+var pa: TPixAr;
+    i: Longword;
+    y, x: Longword;
+    fps: TPointArray;
+begin
+    fps:=Template.FillPoints^;
+    ResizeLand(Template.TemplateWidth, Template.TemplateHeight);
+    for y:= 0 to LAND_HEIGHT - 1 do
+        for x:= 0 to LAND_WIDTH - 1 do
+            Land[y, x]:= lfBasic;
+    {$HINTS OFF}
+    SetPoints(Template, pa, @fps);
+    {$HINTS ON}
+    
+    for i:= 1 to Template.BezierizeCount do
+        begin
+        BezierizeEdge(pa, _0_5);
+        RandomizePoints(pa);
+        RandomizePoints(pa)
+        end;
+    for i:= 1 to Template.RandPassesCount do
+        RandomizePoints(pa);
+    BezierizeEdge(pa, _0_1);
+
+
+    DrawEdge(pa, 0);
+
+    with Template do
+        for i:= 0 to pred(FillPointsCount) do
+            with fps[i] do
+                FillLand(x, y, 0, 0);
+
+    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))
+    or (not Template.canInvert and Template.isNegative) then
+        begin
+        hasBorder:= true;
+        for y:= 0 to LAND_HEIGHT - 1 do
+            for x:= 0 to LAND_WIDTH - 1 do
+                if (y < topY) or (x < leftX) or (x > rightX) then
+                    Land[y, x]:= 0
+                else
+                    begin
+                    if Land[y, x] = 0 then
+                        Land[y, x]:= lfBasic
+                    else if Land[y, x] = lfBasic then
+                        Land[y, x]:= 0;
+                    end;
+        end;
+end;
+
+
+end.