# HG changeset patch # User unc0rr # Date 1133710111 0 # Node ID 517be8dc5b76bb6a5249f3058e9c906f0b3b92a5 # Parent dff476dcaaa3d5da3ae94319f346e4b8d98d3a5f - Fixed spawning boxes under water - Don't spawn mines in forts mode - Changed ping?pong! messages - Small optimization of random - New cool land generator diff -r dff476dcaaa3 -r 517be8dc5b76 hedgewars/uConsts.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; diff -r dff476dcaaa3 -r 517be8dc5b76 hedgewars/uGears.pas --- 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; diff -r dff476dcaaa3 -r 517be8dc5b76 hedgewars/uIO.pas --- 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; diff -r dff476dcaaa3 -r 517be8dc5b76 hedgewars/uLand.pas --- 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 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; diff -r dff476dcaaa3 -r 517be8dc5b76 hedgewars/uRandom.pas --- 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.