hedgewars/uLandGenTemplateBased.pas
changeset 10198 e9cbe111c0df
child 10199 fdb689b57b1b
equal deleted inserted replaced
10197:c57798251b55 10198:e9cbe111c0df
       
     1 unit uLandGenTemplateBased;
       
     2 interface
       
     3 
       
     4 uses uLandTemplates;
       
     5 
       
     6 procedure GenTemplated(var Template: TEdgeTemplate);
       
     7 
       
     8 implementation
       
     9 uses uTypes, uVariables, uConsts, uFloat, uLandOutline, uLandUtils, uRandom;
       
    10 
       
    11 
       
    12 procedure SetPoints(var Template: TEdgeTemplate; var pa: TPixAr; fps: PPointArray);
       
    13 var i: LongInt;
       
    14 begin
       
    15     with Template do
       
    16         begin
       
    17         pa.Count:= BasePointsCount;
       
    18         for i:= 0 to pred(pa.Count) do
       
    19             begin
       
    20             pa.ar[i].x:= BasePoints^[i].x + LongInt(GetRandom(BasePoints^[i].w));
       
    21             if pa.ar[i].x <> NTPX then
       
    22             pa.ar[i].x:= pa.ar[i].x + ((LAND_WIDTH - Template.TemplateWidth) div 2);
       
    23             pa.ar[i].y:= BasePoints^[i].y + LongInt(GetRandom(BasePoints^[i].h)) + LAND_HEIGHT - LongInt(Template.TemplateHeight)
       
    24             end;
       
    25 
       
    26         if canMirror then
       
    27             if getrandom(2) = 0 then
       
    28                 begin
       
    29                 for i:= 0 to pred(BasePointsCount) do
       
    30                 if pa.ar[i].x <> NTPX then
       
    31                     pa.ar[i].x:= LAND_WIDTH - 1 - pa.ar[i].x;
       
    32                 for i:= 0 to pred(FillPointsCount) do
       
    33                     fps^[i].x:= LAND_WIDTH - 1 - fps^[i].x;
       
    34                 end;
       
    35 
       
    36 (*  Experiment in making this option more useful
       
    37      if ((not isNegative) and (cTemplateFilter = 4)) or
       
    38         (canFlip and (getrandom(2) = 0)) then
       
    39            begin
       
    40            for i:= 0 to pred(BasePointsCount) do
       
    41                begin
       
    42                pa.ar[i].y:= LAND_HEIGHT - 1 - pa.ar[i].y + (LAND_HEIGHT - TemplateHeight) * 2;
       
    43                if pa.ar[i].y > LAND_HEIGHT - 1 then
       
    44                    pa.ar[i].y:= LAND_HEIGHT - 1;
       
    45                end;
       
    46            for i:= 0 to pred(FillPointsCount) do
       
    47                begin
       
    48                FillPoints^[i].y:= LAND_HEIGHT - 1 - FillPoints^[i].y + (LAND_HEIGHT - TemplateHeight) * 2;
       
    49                if FillPoints^[i].y > LAND_HEIGHT - 1 then
       
    50                    FillPoints^[i].y:= LAND_HEIGHT - 1;
       
    51                end;
       
    52            end;
       
    53      end
       
    54 *)
       
    55 // template recycling.  Pull these off the floor a bit
       
    56     if (not isNegative) and (cTemplateFilter = 4) then
       
    57         begin
       
    58         for i:= 0 to pred(BasePointsCount) do
       
    59             begin
       
    60             dec(pa.ar[i].y, 100);
       
    61             if pa.ar[i].y < 0 then
       
    62                 pa.ar[i].y:= 0;
       
    63             end;
       
    64         for i:= 0 to pred(FillPointsCount) do
       
    65             begin
       
    66             dec(fps^[i].y, 100);
       
    67             if fps^[i].y < 0 then
       
    68                 fps^[i].y:= 0;
       
    69             end;
       
    70         end;
       
    71 
       
    72     if (canFlip and (getrandom(2) = 0)) then
       
    73         begin
       
    74         for i:= 0 to pred(BasePointsCount) do
       
    75             pa.ar[i].y:= LAND_HEIGHT - 1 - pa.ar[i].y;
       
    76         for i:= 0 to pred(FillPointsCount) do
       
    77             fps^[i].y:= LAND_HEIGHT - 1 - fps^[i].y;
       
    78         end;
       
    79     end
       
    80 end;
       
    81     
       
    82 procedure GenTemplated(var Template: TEdgeTemplate);
       
    83 var pa: TPixAr;
       
    84     i: Longword;
       
    85     y, x: Longword;
       
    86     fps: TPointArray;
       
    87 begin
       
    88     fps:=Template.FillPoints^;
       
    89     ResizeLand(Template.TemplateWidth, Template.TemplateHeight);
       
    90     for y:= 0 to LAND_HEIGHT - 1 do
       
    91         for x:= 0 to LAND_WIDTH - 1 do
       
    92             Land[y, x]:= lfBasic;
       
    93     {$HINTS OFF}
       
    94     SetPoints(Template, pa, @fps);
       
    95     {$HINTS ON}
       
    96     
       
    97     for i:= 1 to Template.BezierizeCount do
       
    98         begin
       
    99         BezierizeEdge(pa, _0_5);
       
   100         RandomizePoints(pa);
       
   101         RandomizePoints(pa)
       
   102         end;
       
   103     for i:= 1 to Template.RandPassesCount do
       
   104         RandomizePoints(pa);
       
   105     BezierizeEdge(pa, _0_1);
       
   106 
       
   107 
       
   108     DrawEdge(pa, 0);
       
   109 
       
   110     with Template do
       
   111         for i:= 0 to pred(FillPointsCount) do
       
   112             with fps[i] do
       
   113                 FillLand(x, y, 0, 0);
       
   114 
       
   115     DrawEdge(pa, lfBasic);
       
   116 
       
   117     MaxHedgehogs:= Template.MaxHedgehogs;
       
   118     hasGirders:= Template.hasGirders;
       
   119     playHeight:= Template.TemplateHeight;
       
   120     playWidth:= Template.TemplateWidth;
       
   121     leftX:= ((LAND_WIDTH - playWidth) div 2);
       
   122     rightX:= (playWidth + ((LAND_WIDTH - playWidth) div 2)) - 1;
       
   123     topY:= LAND_HEIGHT - playHeight;
       
   124 
       
   125     // HACK: force to only cavern even if a cavern map is invertable if cTemplateFilter = 4 ?
       
   126     if (cTemplateFilter = 4)
       
   127     or (Template.canInvert and (getrandom(2) = 0))
       
   128     or (not Template.canInvert and Template.isNegative) then
       
   129         begin
       
   130         hasBorder:= true;
       
   131         for y:= 0 to LAND_HEIGHT - 1 do
       
   132             for x:= 0 to LAND_WIDTH - 1 do
       
   133                 if (y < topY) or (x < leftX) or (x > rightX) then
       
   134                     Land[y, x]:= 0
       
   135                 else
       
   136                     begin
       
   137                     if Land[y, x] = 0 then
       
   138                         Land[y, x]:= lfBasic
       
   139                     else if Land[y, x] = lfBasic then
       
   140                         Land[y, x]:= 0;
       
   141                     end;
       
   142         end;
       
   143 end;
       
   144 
       
   145 
       
   146 end.