I combined the last dungeon generator with the shitting hamster code for the monster ai. The monsters will get to every last corner of the map and will thus eventually find you. Shows ai and map generation.
Import mojo
Global twidth:Int=8
Global theight:Int=8
Class monster
Field mapwidth:Int=640/twidth
Field mapheight:Int=480/theight
Field map:Int[640/twidth][]
Field x:Int,y:Int
Field mdelay:Int=0
Method New()
For Local i = 0 Until mapwidth
map[i] = New Int[mapheight]
Next
' find place for monster
Local exitloop:Bool=False
While exitloop = False
Local x1:Int=Rnd(5,mapwidth-5)
Local y1:Int=Rnd(5,mapheight-5)
If myroom.map[x1][y1] = 1 Then
exitloop = True
Self.x = x1
Self.y = y1
map[x][y] = 1
End If
Wend
End Method
Method update()
mdelay+=1
If mdelay< 15 Then Return
mdelay=0
map[x][y]+=1
If map[x][y] > 1000
For Local y1=0 Until mapheight
For Local x1=0 Until mapwidth
map[x1][y1] = 0
Next
Next
map[x][y]=1
End If
Local exitloop:Bool=False
While exitloop = False
Local y2:Int=Rnd(-2,2)
Local x2:Int=Rnd(-2,2)
If myroom.map[x+x2][y+y2] = 1
If map[x+x2][y+y2] <= map[x][y]
x+=x2
y+=y2
exitloop=True
Return
End If
End If
Wend
End Method
Method draw()
SetColor 255,255,0
DrawRect x*twidth,y*theight,twidth,theight
End Method
End Class
Class room
Field mapwidth:Int=640/twidth
Field mapheight:Int=480/theight
Field tilewidth:Int=twidth
Field tileheight:Int=theight
Field map:Int[640/twidth][]
Field refreshmaptime:Int=0
Method New()
For Local i = 0 Until mapwidth
map[i] = New Int[mapheight]
Next
newmap
End Method
Method update()
End Method
Method draw()
For Local y=0 Until mapheight
For Local x=0 Until mapwidth
If map[x][y] = 1
SetColor 150,150,150
DrawRect x*tilewidth,y*tileheight,
tilewidth,tileheight
End If
If map[x][y] = 2
SetColor 200,200,200
DrawRect x*tilewidth,y*tileheight,
tilewidth,tileheight
End If
Next
Next
End Method
Method newmap()
For Local y=0 Until mapheight
For Local x=0 Until mapwidth
map[x][y] = 0
Next
Next
drawrectinmap(Rnd(10,mapwidth-10),Rnd(10,mapheight-10),5,3)
For Local i=0 Until 50
makeroom
Next
makewalls
End Method
Method makewalls()
' put walls on the map
For Local y=1 Until mapheight-1
For Local x=1 Until mapwidth-1
If map[x][y] = 0
If map[x+1][y] = 1
map[x+1][y] = 2
End If
End If
If map[x][y] = 1
If map[x+1][y] = 0
map[x][y] = 2
End If
End If
If map[x][y] = 1
If map[x][y+1] = 0
map[x][y] = 2
End If
End If
If map[x][y] = 0
If map[x][y+1] = 1
map[x][y+1] = 2
End If
End If
Next
Next
End Method
Method makeroom:Bool()
'find suitable place to make room
Local exitloop:Bool=False
Local cnt:Int=0
While exitloop = False
cnt+=1
If cnt>8000 Then exitloop=True
Local x:Int=Rnd(5,mapwidth-8)
Local y:Int=Rnd(5,mapheight-8)
Local roomw:Int=Rnd(4,8)
Local roomh:Int=Rnd(4,8)
Local pass1:Bool=True
For Local y1=0 Until roomh
For Local x1=0 Until roomh
If map[x1+x][y1+y] = 1 Then pass1=False
Next
Next
Local pass2:Bool=False
If pass1=True Then
For Local y1=3 To roomh-3
If map[x-1][y+y1] = 1 Then pass2=True
If map[x+roomw][y+y1] = 1 Then pass2=True
Next
For Local x1=3 To roomw-3
If map[x+x1][y-1] = 1 Then pass2 = True
If map[x+x1][y+roomh] = 1 Then pass2 = True
Next
End If
If pass2 = True Then
drawrectinmap(x,y,roomw,roomh)
Return
End If
Wend
End Method
Method issuitable:Bool(x:Int,y:Int,w:Int,h:Int)
For Local y1=0 Until h
For Local x1=0 Until w
If map[x+x1][y+y1] = 1 Then Return False
Next
Next
Return True
End Method
Method drawrectinmap(x:Int,y:Int,w:Int,h:Int)
For Local y1=0 Until h
For Local x1=0 Until w
map[x+x1][y+y1] = 1
Next
Next
End Method
End Class
Global myroom:room = New room()
Global mymonster:List<monster> = New List<monster>
Class MyGame Extends App
Method OnCreate()
SetUpdateRate(60)
For Local i=0 Until 10
mymonster.AddLast(New monster())
Next
End Method
Method OnUpdate()
myroom.update
For Local i:=Eachin mymonster
i.update
Next
End Method
Method OnRender()
Cls(0,0,0)
myroom.draw
For Local i:=Eachin mymonster
i.draw
Next
SetColor 255,255,255
DrawText "Monsters in a dungeon. (shitting hamster algorithm)",
2,2
End
End
Function Main()
New MyGame()
End
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.