- Fixed spawning boxes under water
authorunc0rr
Sun, 04 Dec 2005 15:28:31 +0000
changeset 22 517be8dc5b76
parent 21 dff476dcaaa3
child 23 16322d14f068
- Fixed spawning boxes under water - Don't spawn mines in forts mode - Changed ping?pong! messages - Small optimization of random - New cool land generator
hedgewars/uConsts.pas
hedgewars/uGears.pas
hedgewars/uIO.pas
hedgewars/uLand.pas
hedgewars/uRandom.pas
--- a/hedgewars/uConsts.pas	Sun Nov 13 22:13:58 2005 +0000
+++ b/hedgewars/uConsts.pas	Sun Dec 04 15:28:31 2005 +0000
@@ -91,11 +91,14 @@
 
       cTransparentColor: Cardinal = $000000;
 
-      cMaxHHIndex = 9;
-      cMaxHHs     = 20;
+      cMaxHHIndex      = 9;
+      cMaxHHs          = 20;
+      cMaxSpawnPoints  = 64;
       cHHSurfaceWidth     = 512;
       cHHSurfaceHeigth    = 256;
 
+      cMaxEdgePoints = 16384;
+
       cHHHalfHeight = 11;
 
       cKeyMaxIndex = 322;
--- a/hedgewars/uGears.pas	Sun Nov 13 22:13:58 2005 +0000
+++ b/hedgewars/uGears.pas	Sun Dec 04 15:28:31 2005 +0000
@@ -487,11 +487,14 @@
 begin
 for i:= 0 to cCloudsNumber do AddGear( - cScreenWidth + i * ((cScreenWidth * 2 + 2304) div cCloudsNumber), -128, gtCloud, random(4), (0.5-random)*0.01);
 AddGear(0, 0, gtActionTimer, gtsStartGame, 0, 0, 2000).Health:= 3;
-for i:= 0 to 3 do
-    begin
-    GetHHPoint(x, y);
-    AddGear(X, Y + 9, gtMine, 0);
-    end;
+if (GameFlags and gfForts) = 0 then
+   begin
+   for i:= 0 to 3 do
+       begin
+       GetHHPoint(x, y);
+       AddGear(X, Y + 9, gtMine, 0);
+       end;
+   end;
 end;
 
 procedure doMakeExplosion(X, Y, Radius: integer; Mask: LongWord);
@@ -576,6 +579,7 @@
          if sqr(mX - t.X) / rX + sqr(mY - t.Y) / rY <= 1 then
             begin
             Result:= t;
+            {$IFDEF DEBUGFILE}AddFileLog('CheckGearsNear: near ('+inttostr(mx)+','+inttostr(my)+') is gear '+inttostr(integer(t)));{$ENDIF}
             exit
             end;
       t:= t.NextGear
@@ -599,19 +603,25 @@
 var i, x, y, k: integer;
     b: boolean;
 begin
-if CountGears(gtCase) > 4 then exit;
+exit; // hack
+if CountGears(gtCase) > 2 then exit;
 k:= 7;
 repeat
   x:= getrandom(2000) + 24;
+  {$IFDEF DEBUGFILE}AddFileLog('SpawnBoxOfSmth: check x = '+inttostr(x));{$ENDIF}
   b:= false;
   y:= -1;
-  while (y < 1024) and not b do
+  while (y < 1023) and not b do
         begin
         inc(y);
-        i:= x - 14;
-        while (i <= x + 14) and not b do // 14 is gtCase HalfWidth
+        i:= x - 13;
+        while (i <= x + 13) and not b do // 13 is gtCase HalfWidth-1
               begin
-              if Land[y, i] <> 0 then b:= true;
+              if Land[y, i] <> 0 then
+                 begin
+                 b:= true;
+                 {$IFDEF DEBUGFILE}AddFileLog('SpawnBoxOfSmth: Land['+inttostr(y)+','+inttostr(i)+'] <> 0');{$ENDIF}
+                 end;
               inc(i)
               end;
         end;
--- a/hedgewars/uIO.pas	Sun Nov 13 22:13:58 2005 +0000
+++ b/hedgewars/uIO.pas	Sun Dec 04 15:28:31 2005 +0000
@@ -88,7 +88,7 @@
 procedure ParseIPCCommand(s: shortstring);
 begin
 case s[1] of
-     '!': isPonged:= true;
+     '!': begin {$IFDEF DEBUGFILE}AddFileLog('Ping? Pong!');{$ENDIF}isPonged:= true; end;
      '?': SendIPC('!');
      'e': ParseCommand(copy(s, 2, Length(s) - 1));
      'E': OutError(copy(s, 2, Length(s) - 1), true);
@@ -145,8 +145,7 @@
 procedure SendIPCAndWaitReply(s: shortstring);
 begin
 SendIPC(s);
-s:= '?';
-SDLNet_TCP_Send(IPCSock, @s, Succ(byte(s[0])));
+SendIPC('?');
 isPonged:= false;
 repeat
    IPCCheckSock;
--- a/hedgewars/uLand.pas	Sun Nov 13 22:13:58 2005 +0000
+++ b/hedgewars/uLand.pas	Sun Dec 04 15:28:31 2005 +0000
@@ -51,12 +51,12 @@
 
 type TPixAr = record
               Count: Longword;
-              ar: array[word] of TPoint;
+              ar: array[0..Pred(cMaxEdgePoints)] of TPoint;
               end;
 
 var HHPoints: record
               First, Last: word;
-              ar: array[1..Pred(cMaxHHs)] of TPoint
+              ar: array[1..Pred(cMaxSpawnPoints)] of TPoint
               end = (First: 1);
 
 procedure BlitImageAndGenerateCollisionInfo(cpX, cpY: Longword; Image, Surface: PSDL_Surface);
@@ -110,41 +110,22 @@
 WriteLnToConsole(msgOK)
 end;
 
-procedure GenEdge(out pa: TPixAr);
-var angle, r: real;
-    len1: Longword;
+procedure GenEdge(TemplateType: Longword; out pa: TPixAr);
+const Template0: array[0..4] of TPoint = (
+                                         (x:  500; y: 1500),
+                                         (x:  350; y:  400),
+                                         (x: 1023; y:  800),
+                                         (x: 1700; y:  400),
+                                         (x: 1550; y: 1500)
+                                         );
+var i: integer;
 begin
-len1:= 0;
-angle:= 5*pi/6;
-r:= 410;
-repeat
-  angle:= angle + 0.1 + getrandom * 0.1;
-  pa.ar[len1].X:= 544  + trunc(r*cos(angle));
-  pa.ar[len1].Y:= 1080 + trunc(1.5*r*sin(angle));
-  if r<380 then r:= r+getrandom*110
-           else r:= r - getrandom*80;
-  inc(len1);
-until angle > 7/4*pi;
-
-angle:= -pi/6;
-r:= 510;
-pa.ar[len1].X:= 644 + trunc(r*cos(angle));
-pa.ar[len1].Y:= 1080 + trunc(r*sin(angle));
-angle:= -pi;
-
-repeat
-  angle:= angle + 0.1 + getrandom*0.1;
-  pa.ar[len1].X:= 1504 + trunc(r*cos(angle));
-  pa.ar[len1].Y:= 880 + trunc(1.5*r*sin(angle));
-  if r<410 then r:= r + getrandom*80
-           else r:= r - getrandom*110;
-  inc(len1);
-until angle > 1/4*pi;
-pa.ar[len1]:= pa.ar[0];
-pa.Count:= Succ(len1)
+pa.Count:= Succ(High(Template0));
+for i:= 0 to High(Template0) do
+    pa.ar[i]:= Template0[i]
 end;
 
-procedure DrawBezierBorder(var pa: TPixAr);
+procedure DrawBezierEdge(var pa: TPixAr);
 var x, y, i: integer;
     tx, ty, vx, vy, vlen, t: real;
     r1, r2, r3, r4: real;
@@ -206,6 +187,73 @@
     end;
 end;
 
+procedure BezierizeEdge(var pa: TPixAr; Delta: real);
+var x, y, i: integer;
+    tx, ty, vx, vy, vlen, t: real;
+    r1, r2, r3, r4: real;
+    x1, y1, x2, y2, cx1, cy1, cx2, cy2, tsq, tcb: real;
+    opa: TPixAr;
+begin
+opa:= pa;
+pa.Count:= 0;
+vx:= 0;
+vy:= 0;
+with opa do
+for i:= 0 to Count-2 do
+    begin
+    vlen:= sqrt(sqr(ar[i + 1].x - ar[i    ].X) + sqr(ar[i + 1].y - ar[i    ].y));
+    t:=    sqrt(sqr(ar[i + 1].x - ar[i + 2].X) + sqr(ar[i + 1].y - ar[i + 2].y));
+    if t<vlen then vlen:= t;
+    vlen:= vlen/3;
+    tx:= ar[i+2].X - ar[i].X;
+    ty:= ar[i+2].y - ar[i].y;
+    t:= sqrt(sqr(tx)+sqr(ty));
+    if t = 0 then
+       begin
+       tx:= -tx * 100000;
+       ty:= -ty * 100000;
+       end else
+       begin
+       tx:= -tx/t;
+       ty:= -ty/t;
+       end;
+    t:= 1.0*vlen;
+    tx:= tx*t;
+    ty:= ty*t;
+    x1:= ar[i].x;
+    y1:= ar[i].y;
+    x2:= ar[i + 1].x;
+    y2:= ar[i + 1].y;
+    cx1:= ar[i].X   + trunc(vx);
+    cy1:= ar[i].y   + trunc(vy);
+    cx2:= ar[i+1].X + trunc(tx);
+    cy2:= ar[i+1].y + trunc(ty);
+    vx:= -tx;
+    vy:= -ty;
+    t:= 0;
+    while t <= 1.0 do
+          begin
+          tsq:= sqr(t);
+          tcb:= tsq * t;
+          r1:= (1 - 3*t + 3*tsq -   tcb) * x1;
+          r2:= (    3*t - 6*tsq + 3*tcb) * cx1;
+          r3:= (          3*tsq - 3*tcb) * cx2;
+          r4:= (                    tcb) * x2;
+          X:= round(r1 + r2 + r3 + r4);
+          r1:= (1 - 3*t + 3*tsq -   tcb) * y1;
+          r2:= (    3*t - 6*tsq + 3*tcb) * cy1;
+          r3:= (          3*tsq - 3*tcb) * cy2;
+          r4:= (                    tcb) * y2;
+          Y:= round(r1 + r2 + r3 + r4);
+          t:= t + Delta;
+          pa.ar[pa.Count].x:= X;
+          pa.ar[pa.Count].y:= Y;
+          inc(pa.Count);
+          TryDo(pa.Count < cMaxEdgePoints, 'Edge points overflow', true)
+          end;
+    end;
+end;
+
 procedure FillLand(x, y: integer);
 var Stack: record
            Count: Longword;
@@ -261,7 +309,11 @@
                   Land[y, xl]:= $FFFFFF;
                   inc(xl)
                   end;
-            if x < xl then Push(x, Pred(xl), y, dir)
+            if x < xl then
+               begin
+               Push(x, Pred(xl), y, dir);
+               Push(x, Pred(xl), y,-dir);
+               end;
             end;
       end;
 end;
@@ -287,7 +339,8 @@
 tmpsurf:= SDL_CreateRGBSurfaceFrom(@Land, 2048, 1024, 32, 2048*4, $FF0000, $FF00, $FF, 0);
 SDLTry(tmpsurf <> nil, true);
 SDL_SetColorKey(tmpsurf, SDL_SRCCOLORKEY, SDL_MapRGB(tmpsurf.format, $FF, $FF, $FF));
-SDL_UpperBlit(tmpsurf, nil, Surface, nil)
+SDL_UpperBlit(tmpsurf, nil, Surface, nil);
+SDL_FreeSurface(tmpsurf)
 end;
 
 procedure AddBorder(Surface: PSDL_Surface);
@@ -421,17 +474,70 @@
           if (t > 22) and (y < 1023) then AddHHPoint(x, y - 12);
           inc(y, 100)
           end;
-    inc(x, 160)
+    inc(x, 120)
     end;
+
+if HHPoints.Last < cMaxHHs then
+   begin
+   AddHHPoint(300, 800);
+   AddHHPoint(400, 800);
+   AddHHPoint(500, 800);
+   AddHHPoint(600, 800);
+   AddHHPoint(700, 800);
+   AddHHPoint(800, 800);
+   AddHHPoint(900, 800);
+   AddHHPoint(1000, 800);
+   AddHHPoint(1100, 800);
+   AddHHPoint(1200, 800);
+   AddHHPoint(1300, 800);
+   AddHHPoint(1400, 800);
+   end;
+end;
+
+procedure PointWave(var pa: TPixAr; PassesNum: Longword);
+const MAXPASSES = 8;
+var ar: array[0..Pred(MAXPASSES) - 1, 0..5] of real;
+    i, k: integer;
+    rx, ry, oy: real;
+begin
+TryDo(PassesNum < MAXPASSES, 'Passes number too big', true);
+for i:= 0 to Pred(PassesNum) do  // initialize random parameters
+    begin
+    ar[i, 0]:= 20 + getrandom(45);
+    ar[i, 1]:= 0.005 + getrandom * 0.015;
+    ar[i, 2]:= getrandom * pi * 2;
+    ar[i, 3]:= 20 + getrandom(45);
+    ar[i, 4]:= 0.005 + getrandom * 0.015;
+    ar[i, 5]:= getrandom * pi * 2;
+    end;
+
+for k:= 0 to Pred(pa.Count) do  // apply transformation
+    begin
+    rx:= pa.ar[k].x;
+    ry:= pa.ar[k].y;
+    for i:= 0 to Pred(PassesNum) do
+        begin
+        oy:= ry;
+        ry:= ry + ar[i, 0] * sin(ar[i, 1] * rx + ar[i, 2]);
+        rx:= rx + ar[i, 3] * sin(ar[i, 4] * oy + ar[i, 5]);
+        end;
+        pa.ar[k].x:= round(rx);
+        pa.ar[k].y:= round(ry);
+        end;
 end;
 
 procedure GenLandSurface;
 var pa: TPixAr;
     tmpsurf: PSDL_Surface;
 begin
-GenEdge(pa);
-DrawBezierBorder(pa);
+GenEdge(0, pa);
+BezierizeEdge(pa, 0.33334);
+BezierizeEdge(pa, 0.33334);
+BezierizeEdge(pa, 0.33334); 
+PointWave(pa, 3);
+DrawBezierEdge(pa);
 FillLand(1023, 1023);
+
 AddProgress;
 with PixelFormat^ do
      tmpsurf:= SDL_CreateRGBSurface(SDL_HWSURFACE, 2048, 1024, BitsPerPixel, RMask, GMask, BMask, 0);
@@ -477,7 +583,7 @@
 with HHPoints do
      begin
      inc(Last);
-     TryDo(Last < cMaxHHs, 'HHs coords queue overflow', true);
+     TryDo(Last < cMaxSpawnPoints, 'HHs coords queue overflow', true);
      with ar[Last] do
           begin
           x:= _x;
--- a/hedgewars/uRandom.pas	Sun Nov 13 22:13:58 2005 +0000
+++ b/hedgewars/uRandom.pas	Sun Dec 04 15:28:31 2005 +0000
@@ -66,9 +66,8 @@
 begin
 SHA1Update(sc1, @Fill[1], Length(Fill));
 sc2:= sc1;
-dig:= SHA1Final(sc1);
-Result:= (dig.LongWords[0] + dig.LongWords[2] + dig.LongWords[3]) mod m;
-sc1:= sc2
+dig:= SHA1Final(sc2);
+Result:= (dig.LongWords[0] + dig.LongWords[2] + dig.LongWords[3]) mod m
 end;
 
 end.