Difference between revisions of "Double layer cave generator"
Jump to navigation
Jump to search
m (fixed up some of the grammar/wording) |
|||
Line 1: | Line 1: | ||
This [[dungeon]] generator is mainly based on [[Cellular Automata Method for Generating Random Cave-Like Levels|Cellular Automata Method]], so I suggest to read that article first. With my | This [[dungeon]] generator is mainly based on [[Cellular Automata Method for Generating Random Cave-Like Levels|Cellular Automata Method]], so I suggest to read that article first. With my generator modification, you will generate absolutely random caves, and there will not be any unreachable disconnected space. | ||
Line 6: | Line 6: | ||
In words there are only 3 (or 4, if you want less open space) steps: | In words there are only 3 (or 4, if you want less open space) steps: | ||
* Generate one map by Cellular Automata method. | * Generate one map by Cellular Automata method. | ||
* Generate another | * Generate another map with that method. | ||
* Fuse both maps: | * Fuse both maps: Check both map arrays. If the first map's square is "wall", and the second map's is "wall", then invert and make it a "stepable" square. Otherwise, do not invert and keep it a "wall". If the first map's square is "stepable" and the second map's square is too, then invert and make it a "wall", else keep it a "stepable square". | ||
* ''(Optional step)'' Generate random walls: | * ''(Optional step)'' Generate random walls: I.e. if there are 3 or less "walls" in a 3 square radius around another square, make that square also a "wall". Or something like that. | ||
Also, | Also, here is dirty(we can join some loops) code in [[Pascal]] language: | ||
program Map_Gen; | program Map_Gen; | ||
uses crt; | uses crt; |
Latest revision as of 01:30, 5 April 2012
This dungeon generator is mainly based on Cellular Automata Method, so I suggest to read that article first. With my generator modification, you will generate absolutely random caves, and there will not be any unreachable disconnected space.
Algorithm
In words there are only 3 (or 4, if you want less open space) steps:
- Generate one map by Cellular Automata method.
- Generate another map with that method.
- Fuse both maps: Check both map arrays. If the first map's square is "wall", and the second map's is "wall", then invert and make it a "stepable" square. Otherwise, do not invert and keep it a "wall". If the first map's square is "stepable" and the second map's square is too, then invert and make it a "wall", else keep it a "stepable square".
- (Optional step) Generate random walls: I.e. if there are 3 or less "walls" in a 3 square radius around another square, make that square also a "wall". Or something like that.
Also, here is dirty(we can join some loops) code in Pascal language:
program Map_Gen; uses crt; var x, y: array [1..116,1..50,1..5] of char; xx: array[1..116,1..50] of integer; i, j, q, qq, ii, jj, ax, ay, k:integer; begin Randomize; for i:=1 to 50 do for j:=1 to 116 do begin If (i=1) or (i=50) or (j=1) or (j=116) then xx[j,i]:=-1 else xx[j,i]:=0; end;
for i:=1 to 50 do for j:=1 to 116 do begin If (i=1) or (i=50) or (j=1) or (j=116) then begin x[j,i,1]:='#'; x[j,i,5]:='#'; y[j,i,1]:='#'; end else begin q:=random(100); if q<45 then x[j,i,1]:='#' else x[j,i,1]:='.'; qq:=random(100); if qq<45 then y[j,i,1]:='#' else y[j,i,1]:='.'; end; end; for k:=2 to 5 do begin TextColor(k); for i:=2 to 49 do begin for j:=2 to 115 do begin ax:=0; ay:=0; for ii:=(i-1) to (i+1) do begin for jj:=(j-1) to (j+1) do begin If (x[jj,ii,k-1]='#') then ax:=ax+1; If (y[jj,ii,k-1]='#') then ay:=ay+1; end; end; If ((x[j,i,k-1]='#') and (ax>3)) or (ax>4) then begin x[j,i,k]:='#'; end else begin x[j,i,k]:='.'; end; If ((y[j,i,k-1]='#') and (ay>3)) or (ay>4) then begin y[j,i,k]:='#'; end else begin y[j,i,k-1]:='.'; end; end; end; end; for i:=2 to 49 do begin for j:=2 to 115 do begin Case x[j,i,5] of '#': if x[j,i,5]=y[j,i,5] then begin x[j,i,5]:='.'; xx[j,i]:=0; end else begin x[j,i,5]:='#'; xx[j,i]:=-1; end; '.': if x[j,i,5]=y[j,i,5] then begin x[j,i,5]:='#'; xx[j,i]:=-1; end else begin x[j,i,5]:='.'; xx[j,i]:=0; end; end; end; end; for i:=22 to 28 do for j:=55 to 61 do begin x[j,i,5]:='.'; xx[j,i]:=0; end; xx[58,25]:=1;
for k:=1 to 50 do for i:=2 to 49 do for j:=2 to 115 do begin if xx[j,i]=k then begin for ii:=(i-1) to (i+1) do begin for jj:=(j-1) to (j+1) do begin if (xx[jj,ii]=0) then xx[jj,ii]:=k+1; end; end; end; end;
for i:=2 to 49 do for j:=2 to 115 do begin if (xx[j,i]=0) and (x[j,i,5]='.') then begin x[j,i,5]:='#'; end; end;
for i:=1 to 50 do for j:=1 to 116 do begin GoToXY(j,i); Write(x[j,i,5]); end; Readln; end.