45 procedure AddHHPoint(_x, _y: integer); |
45 procedure AddHHPoint(_x, _y: integer); |
46 procedure GetHHPoint(out _x, _y: integer); |
46 procedure GetHHPoint(out _x, _y: integer); |
47 procedure RandomizeHHPoints; |
47 procedure RandomizeHHPoints; |
48 |
48 |
49 implementation |
49 implementation |
50 uses uConsole, uStore, uMisc, uConsts, uRandom, uTeams, uIO; |
50 uses uConsole, uStore, uMisc, uConsts, uRandom, uTeams, uIO, uLandTemplates; |
51 |
51 |
52 type TPixAr = record |
52 type TPixAr = record |
53 Count: Longword; |
53 Count: Longword; |
54 ar: array[0..Pred(cMaxEdgePoints)] of TPoint; |
54 ar: array[0..Pred(cMaxEdgePoints)] of TPoint; |
55 end; |
55 end; |
106 end; |
106 end; |
107 end; |
107 end; |
108 if SDL_MustLock(Image) then |
108 if SDL_MustLock(Image) then |
109 SDL_UnlockSurface(Image); |
109 SDL_UnlockSurface(Image); |
110 WriteLnToConsole(msgOK) |
110 WriteLnToConsole(msgOK) |
111 end; |
|
112 |
|
113 procedure GenEdge(TemplateType: Longword; out pa: TPixAr); |
|
114 const Template0: array[0..4] of TPoint = ( |
|
115 (x: 500; y: 1500), |
|
116 (x: 350; y: 400), |
|
117 (x: 1023; y: 800), |
|
118 (x: 1700; y: 400), |
|
119 (x: 1550; y: 1500) |
|
120 ); |
|
121 var i: integer; |
|
122 begin |
|
123 pa.Count:= Succ(High(Template0)); |
|
124 for i:= 0 to High(Template0) do |
|
125 pa.ar[i]:= Template0[i] |
|
126 end; |
111 end; |
127 |
112 |
128 procedure DrawBezierEdge(var pa: TPixAr); |
113 procedure DrawBezierEdge(var pa: TPixAr); |
129 var x, y, i: integer; |
114 var x, y, i: integer; |
130 tx, ty, vx, vy, vlen, t: real; |
115 tx, ty, vx, vy, vlen, t: real; |
492 AddHHPoint(1300, 800); |
478 AddHHPoint(1300, 800); |
493 AddHHPoint(1400, 800); |
479 AddHHPoint(1400, 800); |
494 end; |
480 end; |
495 end; |
481 end; |
496 |
482 |
497 procedure PointWave(var pa: TPixAr; PassesNum: Longword); |
483 procedure PointWave(var Template: TEdgeTemplate; var pa: TPixAr); |
498 const MAXPASSES = 8; |
484 const MAXPASSES = 16; |
499 var ar: array[0..Pred(MAXPASSES) - 1, 0..5] of real; |
485 var ar: array[0..MAXPASSES, 0..5] of real; |
500 i, k: integer; |
486 i, k: integer; |
501 rx, ry, oy: real; |
487 rx, ry, oy: real; |
502 begin |
488 PassesNum: Longword; |
503 TryDo(PassesNum < MAXPASSES, 'Passes number too big', true); |
489 begin |
504 for i:= 0 to Pred(PassesNum) do // initialize random parameters |
490 with Template do |
505 begin |
491 begin |
506 ar[i, 0]:= 20 + getrandom(45); |
492 PassesNum:= PassMin + getrandom(PassDelta); |
507 ar[i, 1]:= 0.005 + getrandom * 0.015; |
493 TryDo(PassesNum < MAXPASSES, 'Passes number too big', true); |
508 ar[i, 2]:= getrandom * pi * 2; |
494 for i:= 1 to PassesNum do // initialize random parameters |
509 ar[i, 3]:= 20 + getrandom(45); |
495 begin |
510 ar[i, 4]:= 0.005 + getrandom * 0.015; |
496 ar[i, 0]:= WaveAmplMin + getrandom * WaveAmplDelta; |
511 ar[i, 5]:= getrandom * pi * 2; |
497 ar[i, 1]:= WaveFreqMin + getrandom * WaveFreqDelta; |
512 end; |
498 ar[i, 2]:= getrandom * pi * 2; |
|
499 ar[i, 3]:= WaveAmplMin + getrandom * WaveAmplDelta; |
|
500 ar[i, 4]:= WaveFreqMin + getrandom * WaveFreqDelta; |
|
501 ar[i, 5]:= getrandom * pi * 2; |
|
502 end; |
|
503 end; |
513 |
504 |
514 for k:= 0 to Pred(pa.Count) do // apply transformation |
505 for k:= 0 to Pred(pa.Count) do // apply transformation |
515 begin |
506 begin |
516 rx:= pa.ar[k].x; |
507 rx:= pa.ar[k].x; |
517 ry:= pa.ar[k].y; |
508 ry:= pa.ar[k].y; |
518 for i:= 0 to Pred(PassesNum) do |
509 for i:= 0 to PassesNum do |
519 begin |
510 begin |
520 oy:= ry; |
511 oy:= ry; |
521 ry:= ry + ar[i, 0] * sin(ar[i, 1] * rx + ar[i, 2]); |
512 ry:= ry + ar[i, 0] * sin(ar[i, 1] * rx + ar[i, 2]); |
522 rx:= rx + ar[i, 3] * sin(ar[i, 4] * oy + ar[i, 5]); |
513 rx:= rx + ar[i, 3] * sin(ar[i, 4] * oy + ar[i, 5]); |
523 end; |
514 end; |
524 pa.ar[k].x:= round(rx); |
515 pa.ar[k].x:= round(rx); |
525 pa.ar[k].y:= round(ry); |
516 pa.ar[k].y:= round(ry); |
526 end; |
517 end; |
527 end; |
518 end; |
528 |
519 |
|
520 procedure GenBlank(var Template: TEdgeTemplate); |
|
521 var pa: TPixAr; |
|
522 i: Longword; |
|
523 begin |
|
524 with Template do |
|
525 begin |
|
526 pa.Count:= BasePointsCount; |
|
527 for i:= 0 to pred(pa.Count) do |
|
528 pa.ar[i]:= BasePoints^[i]; |
|
529 |
|
530 for i:= 1 to BezPassCnt do |
|
531 BezierizeEdge(pa, 0.33333334); |
|
532 |
|
533 PointWave(Template, pa); |
|
534 DrawBezierEdge(pa); |
|
535 |
|
536 for i:= 0 to pred(FillPointsCount) do |
|
537 with FillPoints^[i] do |
|
538 FillLand(x, y) |
|
539 end; |
|
540 end; |
|
541 |
529 procedure GenLandSurface; |
542 procedure GenLandSurface; |
530 var pa: TPixAr; |
543 var tmpsurf: PSDL_Surface; |
531 tmpsurf: PSDL_Surface; |
544 begin |
532 begin |
545 GenBlank(EdgeTemplates[getrandom(Succ(High(EdgeTemplates)))]); |
533 GenEdge(0, pa); |
|
534 BezierizeEdge(pa, 0.33334); |
|
535 BezierizeEdge(pa, 0.33334); |
|
536 BezierizeEdge(pa, 0.33334); |
|
537 PointWave(pa, 3); |
|
538 DrawBezierEdge(pa); |
|
539 FillLand(1023, 1023); |
|
540 |
546 |
541 AddProgress; |
547 AddProgress; |
542 with PixelFormat^ do |
548 with PixelFormat^ do |
543 tmpsurf:= SDL_CreateRGBSurface(SDL_HWSURFACE, 2048, 1024, BitsPerPixel, RMask, GMask, BMask, 0); |
549 tmpsurf:= SDL_CreateRGBSurface(SDL_HWSURFACE, 2048, 1024, BitsPerPixel, RMask, GMask, BMask, 0); |
544 ColorizeLand(tmpsurf); |
550 ColorizeLand(tmpsurf); |