- improve land generation
authorunc0rr
Fri, 16 Dec 2005 20:57:14 +0000
changeset 27 c374fe590272
parent 26 e32fa14529f8
child 28 59f7db859b8a
- improve land generation - don't use themes with no objects
hedgewars/Data/Themes/themes.cfg
hedgewars/uLand.pas
hedgewars/uLandObjects.pas
hedgewars/uLandTemplates.pas
--- a/hedgewars/Data/Themes/themes.cfg	Wed Dec 07 20:36:55 2005 +0000
+++ b/hedgewars/Data/Themes/themes.cfg	Fri Dec 16 20:57:14 2005 +0000
@@ -1,7 +1,4 @@
 avematan
 bubbles
-ethereal
-norsk
 tibet
-wood
 xtheme
--- a/hedgewars/uLand.pas	Wed Dec 07 20:36:55 2005 +0000
+++ b/hedgewars/uLand.pas	Fri Dec 16 20:57:14 2005 +0000
@@ -348,9 +348,9 @@
           inc(t, 2)
           until (y > 1023) or (CountNonZeroz(x, y) <> 0);
           if (t > 22) and (y < 1023) then AddHHPoint(x, y - 12);
-          inc(y, 100)
+          inc(y, 80)
           end;
-    inc(x, 120)
+    inc(x, 100)
     end;
 
 if HHPoints.Last < cMaxHHs then
@@ -371,8 +371,8 @@
 end;
 
 procedure PointWave(var Template: TEdgeTemplate; var pa: TPixAr);
-const MAXPASSES = 16;
-var ar: array[1..MAXPASSES, 0..5] of real;
+const MAXPASSES = 32;
+var ar: array[0..MAXPASSES, 0..5] of real;
     i, k: integer;
     rx, ry, oy: real;
     PassesNum: Longword;
@@ -381,13 +381,15 @@
      begin
      PassesNum:= PassMin + getrandom(PassDelta);
      TryDo(PassesNum < MAXPASSES, 'Passes number too big', true);
+     ar[0, 1]:= WaveFreqMin;
+     ar[0, 4]:= WaveFreqMin;
      for i:= 1 to PassesNum do  // initialize random parameters
          begin
          ar[i, 0]:= WaveAmplMin + getrandom * WaveAmplDelta;
-         ar[i, 1]:= WaveFreqMin + getrandom * WaveFreqDelta;
+         ar[i, 1]:= ar[i - 1, 1] + (getrandom * 0.7 + 0.3) * WaveFreqDelta;
          ar[i, 2]:= getrandom * pi * 2;
          ar[i, 3]:= WaveAmplMin + getrandom * WaveAmplDelta;
-         ar[i, 4]:= WaveFreqMin + getrandom * WaveFreqDelta;
+         ar[i, 4]:= ar[i - 1, 4] + (getrandom * 0.7 + 0.3) * WaveFreqDelta;
          ar[i, 5]:= getrandom * pi * 2;
          end;
      end;
@@ -413,6 +415,24 @@
 begin
 with Template do
      begin
+     if canMirror then
+        if getrandom(16) < 8 then
+           begin
+           for i:= 0 to pred(BasePointsCount) do
+               BasePoints^[i].x:= 2047 - BasePoints^[i].x;
+           for i:= 0 to pred(FillPointsCount) do
+               FillPoints^[i].x:= 2047 - FillPoints^[i].x;
+           end;
+
+     if canFlip then
+        if getrandom(16) < 8 then
+           begin
+           for i:= 0 to pred(BasePointsCount) do
+               BasePoints^[i].y:= 1023 - BasePoints^[i].y;
+           for i:= 0 to pred(FillPointsCount) do
+               FillPoints^[i].y:= 1023 - FillPoints^[i].y;
+           end;
+
      pa.Count:= BasePointsCount;
      for i:= 0 to pred(pa.Count) do
          pa.ar[i]:= BasePoints^[i];
@@ -443,6 +463,7 @@
 with PixelFormat^ do
      LandSurface:= SDL_CreateRGBSurface(SDL_HWSURFACE, 2048, 1024, BitsPerPixel, RMask, GMask, BMask, 0);
 SDL_FillRect(LandSurface, nil, 0);
+AddProgress;
 
 AddObjects(LandSurface);
 
--- a/hedgewars/uLandObjects.pas	Wed Dec 07 20:36:55 2005 +0000
+++ b/hedgewars/uLandObjects.pas	Fri Dec 16 20:57:14 2005 +0000
@@ -8,8 +8,8 @@
 
 implementation
 uses uLand, uStore, uConsts, uMisc, uConsole, uRandom;
-const MaxRects = 1024;
-      MAXOBJECTRECTS = 32;
+const MaxRects = 256;
+      MAXOBJECTRECTS = 16;
 type  PRectArray = ^TRectsArray;
       TRectsArray = array[0..MaxRects] of TSDL_rect;
 
@@ -110,7 +110,7 @@
    until (i = RectCount) or (Result)
 end;
 
-procedure AddGirders(Surface: PSDL_Surface);
+function AddGirder(gX: integer; Surface: PSDL_Surface): boolean;
 var tmpsurf: PSDL_Surface;
     x1, x2, y, k, i: integer;
     r, rr: TSDL_Rect;
@@ -124,11 +124,11 @@
     end;
 
 begin
-y:= 256;
+y:= 150;
 repeat
   inc(y, 24);
-  x1:= 1024;
-  x2:= 1024;
+  x1:= gX;
+  x2:= gX;
   while (x1 > 100) and (CountNonZeroz(x1, y) = 0) do dec(x1, 2);
   i:= x1 - 12;
   repeat
@@ -151,6 +151,7 @@
 until y > 900;
 if x1 > 0 then
    begin
+   Result:= true;
    tmpsurf:= LoadImage(Pathz[ptGraphics] + 'Girder.png');
    rr.x:= x1;
    rr.y:= y;
@@ -165,10 +166,10 @@
    r.h:= 16;
    SDL_UpperBlit(tmpsurf, @r, Surface, @rr);
    SDL_FreeSurface(tmpsurf);
-   AddRect(x1 - 8, y - 8, x2 - x1 + 8, 32);
+   AddRect(x1 - 8, y - 8, x2 - x1 + 16, 72);
    for k:= y to y + 15 do
        for i:= x1 to x2 do Land[k, i]:= $FFFFFF
-   end
+   end else Result:= false
 end;
 
 function CheckLand(rect: TSDL_Rect; dX, dY, Color: Longword): boolean;
@@ -187,7 +188,7 @@
 i:= 0;
 while (i <= rect.h) and Result do
       begin
-      Result:= (Land[rect.y + i, rect.x] = Color) or (Land[rect.y + i, rect.x + rect.w] = Color);
+      Result:= (Land[rect.y + i, rect.x] = Color) and (Land[rect.y + i, rect.x + rect.w] = Color);
       inc(i)
       end;
 {$WARNINGS ON}
@@ -236,9 +237,9 @@
                    x:= 5000;
                    end
                 end;
-             inc(y, 2);
+             inc(y, 3);
          until y > 1023 - Height;
-         inc(x, getrandom(8) + 2)
+         inc(x, getrandom(6) + 3)
      until x > 2047 - Width;
      Result:= cnt <> 0;
      if Result then
@@ -251,7 +252,7 @@
 end;
 
 procedure AddThemeObjects(Surface: PSDL_Surface; MaxCount: Longword);
-const MAXTHEMEOBJECTS = 16;
+const MAXTHEMEOBJECTS = 32;
 var f: textfile;
     s: string;
     ThemeObjects: array[1..MAXTHEMEOBJECTS] of TThemeObject;
@@ -301,8 +302,11 @@
 procedure AddObjects(Surface: PSDL_Surface);
 begin
 InitRects;
-AddGirders(Surface);
-AddThemeObjects(Surface, 5);
+AddGirder(512, Surface);
+AddGirder(1024, Surface);
+AddGirder(1300, Surface);
+AddGirder(1536, Surface);
+AddThemeObjects(Surface, 8);
 FreeRects
 end;
 
--- a/hedgewars/uLandTemplates.pas	Wed Dec 07 20:36:55 2005 +0000
+++ b/hedgewars/uLandTemplates.pas	Fri Dec 16 20:57:14 2005 +0000
@@ -14,6 +14,7 @@
                      WaveFreqMin, WaveFreqDelta: real;
                      FillPoints: PPointArray;
                      FillPointsCount: Longword;
+                     canMirror, canFlip: boolean;
                      end;
 
 const Template0Points: array[0..4] of TPoint =
@@ -34,7 +35,7 @@
        (x:  300; y: 1500),
        (x:  300; y: 1000),
        (x:  250; y:  750),
-       (x: 1023; y:  600),
+       (x: 1200; y:  500),
        (x: 1800; y:  750),
        (x: 1750; y: 1000),
        (x: 1750; y: 1500)
@@ -44,11 +45,14 @@
        (x: 1023; y: 1023)
       );
 
-const Template2Points: array[0..18] of TPoint =
+const Template2Points: array[0..21] of TPoint =
       (
        (x:  350; y: 1500),
        (x:  350; y: 1000),
-       (x:  190; y:  650),
+       (x:  190; y:  850),
+       (x:  500; y:  750),
+       (x:  520; y:  450),
+       (x:  190; y:  600),
        (x:  210; y:  260),
        (x: 1650; y:  220),
        (x: 1650; y:  460),
@@ -72,34 +76,138 @@
        (x: 1500; y: 1023)
       );
 
-const EdgeTemplates: array[0..2] of TEdgeTemplate =
+const Template3Points: array[0..23] of TPoint =
+      (
+       (x:  200; y: 1500),
+       (x:  200; y: 1000),
+       (x:  390; y:  650),
+       (x:  210; y:  260),
+       (x: 1000; y:  420),
+       (x: 1100; y:  200),
+       (x: 1250; y:  420),
+       (x: 1250; y:  620),
+       (x:  900; y:  610),
+       (x:  650; y:  450),
+       (x:  550; y:  500),
+       (x:  650; y:  700),
+       (x: 1200; y:  800),
+       (x: 1200; y: 1000),
+       (x: 1200; y: 1200),
+       (x: 1400; y: 1200),
+       (x: 1400; y: 1000),
+       (x: 1280; y:  750),
+       (x: 1500; y:  600),
+       (x: 1400; y:  200),
+       (x: 1800; y:  200),
+       (x: 1700; y:  600),
+       (x: 1900; y: 1010),
+       (x: 1800; y: 1200)
+      );
+      Template3FPoints: array[0..1] of TPoint =
+      (
+       (x:  500; y: 1023),
+       (x: 1500; y: 1023)
+      );
+
+const Template4Points: array[0..38] of TPoint =
+      (
+       (x:  200; y: 1500),
+       (x:  200; y: 1000),
+       (x:  210; y:  800),
+       (x:  480; y:  830),
+       (x:  460; y:  700),
+       (x:  150; y:  610),
+       (x:  150; y:  310),
+       (x:  220; y:  200),
+       (x:  340; y:  195),
+       (x:  410; y:  415),
+       (x:  420; y:  495),
+       (x:  535; y:  615),
+       (x:  705; y:  600),
+       (x:  760; y:  425),
+       (x:  815; y:  230),
+       (x:  970; y:  200),
+       (x: 1050; y:  360),
+       (x:  850; y:  590),
+       (x: 1070; y:  790),
+       (x: 1000; y: 1000),
+       (x: 1000; y: 1500),
+       (x: 1250; y: 1500),
+       (x: 1250; y: 1000),
+       (x: 1260; y:  830),
+       (x: 1290; y:  700),
+       (x: 1270; y:  450),
+       (x: 1180; y:  280),
+       (x: 1210; y:  160),
+       (x: 1370; y:  160),
+       (x: 1505; y:  205),
+       (x: 1630; y:  315),
+       (x: 1660; y:  450),
+       (x: 1580; y:  620),
+       (x: 1670; y:  725),
+       (x: 1800; y:  730),
+       (x: 1860; y:  680),
+       (x: 1925; y:  810),
+       (x: 1800; y: 1000),
+       (x: 1800; y: 1500)
+      );
+      Template4FPoints: array[0..1] of TPoint =
+      (
+       (x:  500; y: 1023),
+       (x: 1500; y: 1023)
+      );
+
+const EdgeTemplates: array[0..4] of TEdgeTemplate =
       (
        (BasePoints: @Template0Points;
         BasePointsCount: Succ(High(Template0Points));
         BezPassCnt: 4;
-        PassMin: 4; PassDelta: 1;
-        WaveAmplMin:    27; WaveAmplDelta: 22;
-        WaveFreqMin: 0.010; WaveFreqDelta: 0.015;
+        PassMin: 10; PassDelta: 5;
+        WaveAmplMin:    17; WaveAmplDelta: 20;
+        WaveFreqMin: 0.010; WaveFreqDelta: 0.002;
         FillPoints: @Template0FPoints;
         FillPointsCount: Succ(High(Template0FPoints));
+        canMirror: false; canFlip: false;
        ),
        (BasePoints: @Template1Points;
         BasePointsCount: Succ(High(Template1Points));
         BezPassCnt: 4;
-        PassMin: 5; PassDelta: 2;
-        WaveAmplMin:    20; WaveAmplDelta: 10;
-        WaveFreqMin: 0.015; WaveFreqDelta: 0.020;
+        PassMin: 10; PassDelta: 2;
+        WaveAmplMin:    25; WaveAmplDelta: 15;
+        WaveFreqMin: 0.008; WaveFreqDelta: 0.002;
         FillPoints: @Template1FPoints;
         FillPointsCount: Succ(High(Template1FPoints));
+        canMirror: false; canFlip: false;
        ),
        (BasePoints: @Template2Points;
         BasePointsCount: Succ(High(Template2Points));
         BezPassCnt: 3;
-        PassMin: 3; PassDelta: 2;
-        WaveAmplMin:    30; WaveAmplDelta: 15;
-        WaveFreqMin: 0.010; WaveFreqDelta: 0.015;
+        PassMin: 14; PassDelta: 3;
+        WaveAmplMin:    10; WaveAmplDelta: 10;
+        WaveFreqMin: 0.010; WaveFreqDelta: 0.002;
         FillPoints: @Template2FPoints;
         FillPointsCount: Succ(High(Template2FPoints));
+        canMirror: true; canFlip: false;
+       ),
+       (BasePoints: @Template3Points;
+        BasePointsCount: Succ(High(Template3Points));
+        BezPassCnt: 4;
+        PassMin: 15; PassDelta: 2;
+        WaveAmplMin:    8; WaveAmplDelta: 12;
+        WaveFreqMin: 0.015; WaveFreqDelta: 0.0015;
+        FillPoints: @Template3FPoints;
+        FillPointsCount: Succ(High(Template3FPoints));
+        canMirror: true; canFlip: false;
+       ),
+       (BasePoints: @Template4Points;
+        BasePointsCount: Succ(High(Template4Points));
+        BezPassCnt: 3;
+        PassMin: 19; PassDelta: 5;
+        WaveAmplMin:    12; WaveAmplDelta: 14;
+        WaveFreqMin: 0.008; WaveFreqDelta: 0.001;
+        FillPoints: @Template4FPoints;
+        FillPointsCount: Succ(High(Template4FPoints));
+        canMirror: true; canFlip: false;
        )
       );