hedgewars/uLandOutline.pas
changeset 13907 c36aaa30be98
parent 11532 bf86c6cb9341
child 14025 bb2f4636787f
equal deleted inserted replaced
13906:d4874de4736b 13907:c36aaa30be98
    10               end;
    10               end;
    11 
    11 
    12 procedure DrawEdge(var pa: TPixAr; value: Word);
    12 procedure DrawEdge(var pa: TPixAr; value: Word);
    13 procedure FillLand(x, y: LongInt; border, value: Word);
    13 procedure FillLand(x, y: LongInt; border, value: Word);
    14 procedure BezierizeEdge(var pa: TPixAr; Delta: hwFloat);
    14 procedure BezierizeEdge(var pa: TPixAr; Delta: hwFloat);
    15 procedure RandomizePoints(var pa: TPixAr);
       
    16 
    15 
    17 implementation
    16 implementation
    18 
    17 
    19 uses uLandGraphics, uDebug, uVariables, uLandTemplates, uRandom, uUtils;
    18 uses uLandGraphics, uDebug, uVariables, uLandTemplates;
    20 
       
    21 
    19 
    22 
    20 
    23 var Stack: record
    21 var Stack: record
    24            Count: Longword;
    22            Count: Longword;
    25            points: array[0..8192] of record
    23            points: array[0..8192] of record
   266                 exit;
   264                 exit;
   267         end;
   265         end;
   268     CheckSelfIntersect:= false
   266     CheckSelfIntersect:= false
   269 end;
   267 end;
   270 
   268 
   271 procedure RandomizePoints(var pa: TPixAr);
       
   272 const cEdge = 55;
       
   273       cMinDist = 8;
       
   274 var radz: array[0..Pred(cMaxEdgePoints)] of LongInt;
       
   275     i, k, dist, px, py: LongInt;
       
   276 begin
       
   277     for i:= 0 to Pred(pa.Count) do
       
   278     begin
       
   279     radz[i]:= 0;
       
   280         with pa.ar[i] do
       
   281             if x <> NTPX then
       
   282             begin
       
   283             radz[i]:= Min(Max(x - cEdge, 0), Max(LAND_WIDTH - cEdge - x, 0));
       
   284             radz[i]:= Min(radz[i], Min(Max(y - cEdge, 0), Max(LAND_HEIGHT - cEdge - y, 0)));
       
   285             if radz[i] > 0 then
       
   286                 for k:= 0 to Pred(i) do
       
   287                 begin
       
   288                 dist:= Max(abs(x - pa.ar[k].x), abs(y - pa.ar[k].y));
       
   289                 radz[k]:= Max(0, Min((dist - cMinDist) div 2, radz[k]));
       
   290                 radz[i]:= Max(0, Min(dist - radz[k] - cMinDist, radz[i]))
       
   291                 end
       
   292             end;
       
   293     end;
       
   294 
       
   295     for i:= 0 to Pred(pa.Count) do
       
   296         with pa.ar[i] do
       
   297             if ((x and LAND_WIDTH_MASK) = 0) and ((y and LAND_HEIGHT_MASK) = 0) then
       
   298             begin
       
   299             px:= x;
       
   300             py:= y;
       
   301             x:= x + LongInt(GetRandom(7) - 3) * (radz[i] * 5 div 7) div 3;
       
   302             y:= y + LongInt(GetRandom(7) - 3) * (radz[i] * 5 div 7) div 3;
       
   303             if CheckSelfIntersect(pa, i) then
       
   304                 begin
       
   305                 x:= px;
       
   306                 y:= py
       
   307                 end;
       
   308             end
       
   309 end;
       
   310 
       
   311 
       
   312 end.
   269 end.