Dungeon Generator - Smart Placed Random Rectangle
Monkey Forums/Monkey Code/Dungeon Generator - Smart Placed Random Rectangle
| ||
![]() This might be useful for further modification. Very simple : Create a rectangle on the map enter loop Create random rectangle if it fits next to a previous placed rectangle place there exit if enough placed or counter hit max It can be set to different map sizes.. (be sure to also set the tilewidth and height then) I never got it this easy into code yet. The generator part is not that complicated now.
Import mojo
Class tilemap
Field tilew:Int
Field tileh:Int
Field width:Int
Field height:Int
Field map:Int[][]
Method New(width:Int,height:Int,tilew:Int,tileh:Int)
Self.width=width
Self.height=height
Self.tilew=tilew
Self.tileh=tileh
map = New Int[width][]
For Local i=0 Until width
map[i] = New Int[height]
Next
makemap
settiles
End Method
' Here we create the walls
Method settiles()
'create walls
For Local y=1 Until height-1
For Local x=1 Until width-1
Local t:Int=map[x][y]
If t=0 And map[x+1][y] = 1 Then map[x][y] = 2
If t=0 And map[x][y+1] = 1 Then map[x][y] = 2
If t=0 And map[x-1][y] = 1 Then map[x][y] = 2
If t=0 And map[x][y-1] = 1 Then map[x][y] = 2
Next
Next
' get corners
For Local y=1 Until height-1
For Local x=1 Until width-1
Local t:Int=map[x][y]
If t=0 And map[x+1][y] = 2 And map[x][y+1] = 2 Then map[x][y] = 3
If t=0 And map[x-1][y] = 2 And map[x][y+1] = 2 Then map[x][y] = 3
If t=0 And map[x][y-1] = 2 And map[x+1][y] = 2 Then map[x][y] = 3
If t=0 And map[x-1][y] = 2 And map[x][y-1] = 2 Then map[x][y] = 3
Next
Next
'set corners to value 2
For Local y=1 Until height-1
For Local x=1 Until width-1
If map[x][y] = 3 Then map[x][y] = 2
Next
Next
End Method
Method makemap()
'here we make random rectangles and see if they
'are placed next to another rectangle.
'This will grow a random level...
Local w1:Int=Rnd(1,4)
Local h1:Int=Rnd(1,4)
Local x1:Int=width/2
Local y1:Int=height/2
drawmaprect(x1,y1,w1,h1)
Local maxrooms:Int=(width*height)/30
Local numrooms:Int=0
Local cnt:Int=0
While numrooms < maxrooms And cnt<15000
cnt+=1
Local done:Bool=False
w1=Rnd(1,4)
h1=Rnd(1,4)
x1=Rnd(3,width-5)
y1=Rnd(3,height-5)
'check right
If map[x1][y1] = 1 And map[x1+1][y1] = 0 And map[x1+1][y1-2] = 0 And map[x1+1][y1+2] = 0
drawmaprect(x1,y1,w1,h1)
numrooms+=1
done=True
End If
'check bottom
If done=False And map[x1][y1] = 1 And map[x1][y1+1] = 0 And map[x1-2][y1+1] = 0 And map[x1+2][y1+1] = 0
drawmaprect(x1,y1,w1,h1)
numrooms+=1
done=True
End If
'check top
If done=False And y1+h1<height-1
If map[x1][y1+h1+1] = 1 And map[x1][y1+h1] = 0 And map[x1-2][y1+h1] = 0 And map[x1+2][y1+h1] = 0
drawmaprect(x1,y1,w1,h1)
numrooms+=1
done=True
End If
End If
'check left
If done=False And x1+w1<width-1
If map[x1+w1+1][y1] = 1 And map[x1+w1][y1] = 0 And map[x1+w1][y1-2] = 0 And map[x1+w1][y1+2] = 0
drawmaprect(x1,y1,w1,h1)
numrooms+=1
End If
End If
Wend
End Method
Method drawmaprect(x:Int,y:Int,w:Int,h:Int)
For Local y1=y To y+h
For Local x1=x To x+w
If x1>-1 And y1>-1 And x1<width And y1<height
map[x1][y1] = 1
End If
Next
Next
End Method
Method draw()
SetColor 255,255,255
For Local y=0 Until height
For Local x=0 Until width
Local t:Int=map[x][y]
Select t
Case 1 'wall
SetColor 100,100,100
DrawRect x*tilew,y*tileh,tilew,tileh
Case 2 'wall
SetColor 200,200,200
DrawRect x*tilew,y*tileh,tilew,tileh
End Select
Next
Next
End Method
End Class
Global m:tilemap
Class MyGame Extends App
Method OnCreate()
Seed = GetDate[5]
SetUpdateRate(60)
createrandommap()
End Method
Method OnUpdate()
If KeyHit(KEY_SPACE) Or MouseHit(MOUSE_LEFT)
createrandommap()
End If
End Method
Method OnRender()
Cls 0,0,0
m.draw
SetColor 255,255,255
DrawText "Press Mouse or Tab to create new level",0,0
End Method
End Class
Function createrandommap()
Local r:Int=Rnd(0,3)
Local w:Int,h:Int,tw:Int,th:Int
Select r
Case 0
w=20;h=15;tw=32;th=32
Case 1
w=20*2;h=15*2;tw=16;th=16
Case 2
w=20*4;h=15*4;tw=8;th=8
End Select
m = New tilemap(w,h,tw,th)
End Function
Function Main()
New MyGame()
End Function
|
| ||
| I like the way this generator looks on its output. I created a similar generator a while back, but it does a boolean operation and doesn't care much about the overlap. As a result, the inside walls are a bit "different". The only screen I could find was from before it supported multiple spawners. Newer iterations had a lot more variety: https://twitter.com/nobuyukinyuu/status/644410538739367936 |
