diff -r c57798251b55 -r e9cbe111c0df hedgewars/uLand.pas --- a/hedgewars/uLand.pas Fri Mar 14 16:00:36 2014 +0400 +++ b/hedgewars/uLand.pas Fri Mar 14 19:59:34 2014 +0400 @@ -32,34 +32,11 @@ implementation uses uConsole, uStore, uRandom, uLandObjects, uIO, uLandTexture, SysUtils, uVariables, uUtils, uCommands, adler32, uDebug, uLandPainted, uTextures, - uLandGenMaze, uLandOutline, uPhysFSLayer, uScript, uLandGenPerlin; + uLandGenMaze, uLandOutline, uPhysFSLayer, uScript, uLandGenPerlin, + uLandGenTemplateBased, uLandUtils; var digest: shortstring; -procedure ResizeLand(width, height: LongWord); -var potW, potH: LongInt; -begin -potW:= toPowerOf2(width); -potH:= toPowerOf2(height); -if (potW <> LAND_WIDTH) or (potH <> LAND_HEIGHT) then - begin - LAND_WIDTH:= potW; - LAND_HEIGHT:= potH; - LAND_WIDTH_MASK:= not(LAND_WIDTH-1); - LAND_HEIGHT_MASK:= not(LAND_HEIGHT-1); - cWaterLine:= LAND_HEIGHT; - if (cReducedQuality and rqBlurryLand) = 0 then - SetLength(LandPixels, LAND_HEIGHT, LAND_WIDTH) - else - SetLength(LandPixels, LAND_HEIGHT div 2, LAND_WIDTH div 2); - - SetLength(Land, LAND_HEIGHT, LAND_WIDTH); - SetLength(LandDirty, (LAND_HEIGHT div 32), (LAND_WIDTH div 32)); - // 0.5 is already approaching on unplayable - if (width div 4096 >= 2) or (height div 2048 >= 2) then cMaxZoomLevel:= 0.5; - cMinMaxZoomLevelDelta:= cMaxZoomLevel - cMinZoomLevel - end; -end; procedure PrettifyLandAlpha(); begin @@ -221,139 +198,6 @@ if (LandBackSurface <> nil) and GrayScale then Surface2GrayScale(LandBackSurface); end; -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 GenBlank(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; procedure GenDrawnMap; begin @@ -701,7 +545,7 @@ begin WriteLnToConsole('Generating land...'); case cMapGen of - 0: GenBlank(EdgeTemplates[SelectTemplate]); + 0: GenTemplated(EdgeTemplates[SelectTemplate]); //1: begin ResizeLand(4096,2048); GenMaze; end; 1: begin ResizeLand(4096,2048); GenPerlin; end; 2: GenDrawnMap; @@ -830,7 +674,7 @@ begin WriteLnToConsole('Generating preview...'); case cMapGen of - 0: GenBlank(EdgeTemplates[SelectTemplate]); + 0: GenTemplated(EdgeTemplates[SelectTemplate]); //1: begin ResizeLand(4096,2048); GenMaze; end; 1: begin ResizeLand(4096,2048); GenPerlin; end; 2: GenDrawnMap; @@ -878,7 +722,7 @@ begin WriteLnToConsole('Generating preview...'); case cMapGen of - 0: GenBlank(EdgeTemplates[SelectTemplate]); + 0: GenTemplated(EdgeTemplates[SelectTemplate]); //1: begin ResizeLand(4096,2048); GenMaze; end; 1: begin ResizeLand(4096,2048); GenPerlin; end; 2: GenDrawnMap;