# HG changeset patch # User unc0rr # Date 1133723216 0 # Node ID 16322d14f0686c0596c1a92f6da1a20c86f46429 # Parent 517be8dc5b76bb6a5249f3058e9c906f0b3b92a5 - Land generator uses templates to generate - Small fixes diff -r 517be8dc5b76 -r 16322d14f068 hedgewars/GSHandlers.inc --- a/hedgewars/GSHandlers.inc Sun Dec 04 15:28:31 2005 +0000 +++ b/hedgewars/GSHandlers.inc Sun Dec 04 19:06:56 2005 +0000 @@ -405,8 +405,6 @@ begin tx:= cc*len; ty:= cs*len; -// if TestCollisionXwithXYShift(Gear, round(tx), round(ty), Sign(HHGear.dX)) -/// or TestCollisionYwithXYShift(Gear, round(tx), round(ty), Sign(HHGear.dY)) then lx:= round(Gear.X + tx) + sign(HHGear.dX); ly:= round(Gear.Y + ty) + sign(HHGear.dY); if ((ly and $FFFFFC00) = 0) and ((lx and $FFFFF800) = 0)and (Land[ly, lx] <> 0) then @@ -573,7 +571,7 @@ //////////////////////////////////////////////////////////////////////////////// procedure doStepMine(Gear: PGear); begin -if (Gear.dX <> 0) or (Gear.dY <> 0) then +if (Gear.dX <> 0) or (Gear.dY <> 0) {or not TestCollisionY(Gear, 1)} then begin doStepFallingGear(Gear); if Gear.Active = false then diff -r 517be8dc5b76 -r 16322d14f068 hedgewars/hw.dpr --- a/hedgewars/hw.dpr Sun Dec 04 15:28:31 2005 +0000 +++ b/hedgewars/hw.dpr Sun Dec 04 19:06:56 2005 +0000 @@ -52,7 +52,8 @@ uAIMisc in 'uAIMisc.pas', uAIAmmoTests in 'uAIAmmoTests.pas', uCollisions in 'uCollisions.pas', - uLand in 'uLand.pas'; + uLand in 'uLand.pas', + uLandTemplates in 'uLandTemplates.pas'; {$INCLUDE options.inc} diff -r 517be8dc5b76 -r 16322d14f068 hedgewars/uLand.pas --- a/hedgewars/uLand.pas Sun Dec 04 15:28:31 2005 +0000 +++ b/hedgewars/uLand.pas Sun Dec 04 19:06:56 2005 +0000 @@ -47,7 +47,7 @@ procedure RandomizeHHPoints; implementation -uses uConsole, uStore, uMisc, uConsts, uRandom, uTeams, uIO; +uses uConsole, uStore, uMisc, uConsts, uRandom, uTeams, uIO, uLandTemplates; type TPixAr = record Count: Longword; @@ -110,21 +110,6 @@ WriteLnToConsole(msgOK) end; -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 -pa.Count:= Succ(High(Template0)); -for i:= 0 to High(Template0) do - pa.ar[i]:= Template0[i] -end; - procedure DrawBezierEdge(var pa: TPixAr); var x, y, i: integer; tx, ty, vx, vy, vlen, t: real; @@ -294,7 +279,8 @@ Stack.Count:= 0; xl:= x - 1; xr:= x; -Push(xl, xr, 1024, -1); +Push(xl, xr, y, -1); +Push(xl, xr, y, 1); while Stack.Count > 0 do begin Pop(xl, xr, y, dir); @@ -452,7 +438,7 @@ begin Result:= 0; if (y and $FFFFFC00) <> 0 then exit; - for i:= max(x - 6, 0) to min(x + 6, 2043) do + for i:= max(x - 5, 0) to min(x + 5, 2043) do if Land[y, i] <> 0 then inc(Result) end; @@ -494,28 +480,33 @@ end; end; -procedure PointWave(var pa: TPixAr; PassesNum: Longword); -const MAXPASSES = 8; -var ar: array[0..Pred(MAXPASSES) - 1, 0..5] of real; +procedure PointWave(var Template: TEdgeTemplate; var pa: TPixAr); +const MAXPASSES = 16; +var ar: array[0..MAXPASSES, 0..5] of real; i, k: integer; rx, ry, oy: real; + PassesNum: Longword; 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; +with Template do + begin + PassesNum:= PassMin + getrandom(PassDelta); + TryDo(PassesNum < MAXPASSES, 'Passes number too big', true); + for i:= 1 to PassesNum do // initialize random parameters + begin + ar[i, 0]:= WaveAmplMin + getrandom * WaveAmplDelta; + ar[i, 1]:= WaveFreqMin + getrandom * WaveFreqDelta; + ar[i, 2]:= getrandom * pi * 2; + ar[i, 3]:= WaveAmplMin + getrandom * WaveAmplDelta; + ar[i, 4]:= WaveFreqMin + getrandom * WaveFreqDelta; + ar[i, 5]:= getrandom * pi * 2; + end; + 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 + for i:= 0 to PassesNum do begin oy:= ry; ry:= ry + ar[i, 0] * sin(ar[i, 1] * rx + ar[i, 2]); @@ -526,17 +517,32 @@ end; end; -procedure GenLandSurface; +procedure GenBlank(var Template: TEdgeTemplate); var pa: TPixAr; - tmpsurf: PSDL_Surface; + i: Longword; begin -GenEdge(0, pa); -BezierizeEdge(pa, 0.33334); -BezierizeEdge(pa, 0.33334); -BezierizeEdge(pa, 0.33334); -PointWave(pa, 3); -DrawBezierEdge(pa); -FillLand(1023, 1023); +with Template do + begin + pa.Count:= BasePointsCount; + for i:= 0 to pred(pa.Count) do + pa.ar[i]:= BasePoints^[i]; + + for i:= 1 to BezPassCnt do + BezierizeEdge(pa, 0.33333334); + + PointWave(Template, pa); + DrawBezierEdge(pa); + + for i:= 0 to pred(FillPointsCount) do + with FillPoints^[i] do + FillLand(x, y) + end; +end; + +procedure GenLandSurface; +var tmpsurf: PSDL_Surface; +begin +GenBlank(EdgeTemplates[getrandom(Succ(High(EdgeTemplates)))]); AddProgress; with PixelFormat^ do diff -r 517be8dc5b76 -r 16322d14f068 hedgewars/uLandTemplates.pas --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hedgewars/uLandTemplates.pas Sun Dec 04 19:06:56 2005 +0000 @@ -0,0 +1,108 @@ +unit uLandTemplates; +interface +uses SDLh; +{$INCLUDE options.inc} + +type PPointArray = ^TPointArray; + TPointArray = array[0..0] of TPoint; + TEdgeTemplate = record + BasePoints: PPointArray; + BasePointsCount: Longword; + BezPassCnt: Longword; + PassMin, PassDelta: Longword; + WaveAmplMin, WaveAmplDelta: real; + WaveFreqMin, WaveFreqDelta: real; + FillPoints: PPointArray; + FillPointsCount: Longword; + end; + +const Template0Points: array[0..4] of TPoint = + ( + (x: 500; y: 1500), + (x: 350; y: 400), + (x: 1023; y: 820), + (x: 1700; y: 400), + (x: 1550; y: 1500) + ); + Template0FPoints: array[0..0] of TPoint = + ( + (x: 1023; y: 1023) + ); + +const Template1Points: array[0..6] of TPoint = + ( + (x: 300; y: 1500), + (x: 300; y: 1000), + (x: 250; y: 750), + (x: 1023; y: 600), + (x: 1800; y: 750), + (x: 1750; y: 1000), + (x: 1750; y: 1500) + ); + Template1FPoints: array[0..0] of TPoint = + ( + (x: 1023; y: 1023) + ); + +const Template2Points: array[0..18] of TPoint = + ( + (x: 350; y: 1500), + (x: 350; y: 1000), + (x: 190; y: 650), + (x: 210; y: 260), + (x: 1650; y: 220), + (x: 1650; y: 460), + (x: 900; y: 410), + (x: 650; y: 400), + (x: 1200; y: 1000), + (x: 1200; y: 1200), + (x: 1400; y: 1200), + (x: 1400; y: 1000), + (x: 1280; y: 750), + (x: 1150; y: 530), + (x: 1700; y: 750), + (x: 1800; y: 600), + (x: 1900; y: 600), + (x: 1700; y: 1010), + (x: 1700; y: 1200) + ); + Template2FPoints: array[0..1] of TPoint = + ( + (x: 600; y: 1023), + (x: 1500; y: 1023) + ); + +const EdgeTemplates: array[0..2] of TEdgeTemplate = + ( + (BasePoints: @Template0Points; + BasePointsCount: Succ(High(Template0Points)); + BezPassCnt: 4; + PassMin: 5; PassDelta: 1; + WaveAmplMin: 27; WaveAmplDelta: 22; + WaveFreqMin: 0.010; WaveFreqDelta: 0.015; + FillPoints: @Template0FPoints; + FillPointsCount: Succ(High(Template0FPoints)); + ), + (BasePoints: @Template1Points; + BasePointsCount: Succ(High(Template1Points)); + BezPassCnt: 4; + PassMin: 6; PassDelta: 2; + WaveAmplMin: 20; WaveAmplDelta: 10; + WaveFreqMin: 0.015; WaveFreqDelta: 0.020; + FillPoints: @Template1FPoints; + FillPointsCount: Succ(High(Template1FPoints)); + ), + (BasePoints: @Template2Points; + BasePointsCount: Succ(High(Template2Points)); + BezPassCnt: 2; + PassMin: 4; PassDelta: 1; + WaveAmplMin: 30; WaveAmplDelta: 15; + WaveFreqMin: 0.010; WaveFreqDelta: 0.015; + FillPoints: @Template2FPoints; + FillPointsCount: Succ(High(Template2FPoints)); + ) + ); + +implementation + +end. diff -r 517be8dc5b76 -r 16322d14f068 hedgewars/uWorld.pas --- a/hedgewars/uWorld.pas Sun Dec 04 15:28:31 2005 +0000 +++ b/hedgewars/uWorld.pas Sun Dec 04 19:06:56 2005 +0000 @@ -108,6 +108,7 @@ r.y:= WorldDy + cWaterLine + 32; if r.y < cScreenHeight then begin + if r.y < 0 then r.y:= 0; r.h:= cScreenHeight - r.y; r.x:= 0; r.w:= cScreenWidth;