108 lines
2.7 KiB
Go
108 lines
2.7 KiB
Go
package mapgens
|
|
|
|
import (
|
|
"lab.zaar.be/thefish/alchemyst-go/engine/gamemap"
|
|
"lab.zaar.be/thefish/alchemyst-go/engine/types"
|
|
"lab.zaar.be/thefish/alchemyst-go/util"
|
|
)
|
|
//fixme move to config
|
|
var minRoomSize = 3
|
|
var maxRoomSize = 11
|
|
var maxrooms = 100
|
|
|
|
func DefaultGen(l *gamemap.Level) *gamemap.Level {
|
|
|
|
rng := util.NewRNG()
|
|
|
|
//fill with walls
|
|
for i := 0; i < l.W; i ++ {
|
|
for j := 0; j < l.H; j++ {
|
|
l.Tiles[i][j] = gamemap.NewWall()
|
|
}
|
|
}
|
|
|
|
rooms := make([]*gamemap.Room, maxrooms)
|
|
|
|
for i := 0; i < maxrooms; i++ {
|
|
newRoom := &gamemap.Room{
|
|
Rect: types.NewRect(
|
|
rng.Range(l.X, l.W),
|
|
rng.Range(l.Y, l.H),
|
|
rng.Range(minRoomSize, maxRoomSize),
|
|
rng.Range(minRoomSize, maxRoomSize),
|
|
)}
|
|
newRoom.Center.X = newRoom.X + newRoom.W / 2
|
|
newRoom.Center.Y = newRoom.Y + newRoom.H / 2
|
|
|
|
failed := false
|
|
for _, otherRoom := range rooms {
|
|
if otherRoom.Intersects(newRoom.Rect) {
|
|
failed = true
|
|
break
|
|
}
|
|
}
|
|
if !failed {
|
|
rooms = append(rooms, newRoom)
|
|
}
|
|
}
|
|
|
|
fillage := types.RectFill{
|
|
Top: func() *gamemap.Tile {return gamemap.NewWall()},
|
|
Bottom: func() *gamemap.Tile {return gamemap.NewWall()},
|
|
Left: func() *gamemap.Tile {return gamemap.NewWall()},
|
|
Right: func() *gamemap.Tile {return gamemap.NewWall()},
|
|
BottomLeft: func() *gamemap.Tile {return gamemap.NewWall()},
|
|
BottomRight: func() *gamemap.Tile {return gamemap.NewWall()},
|
|
TopLeft: func() *gamemap.Tile {return gamemap.NewWall()},
|
|
TopRight: func() *gamemap.Tile {return gamemap.NewWall()},
|
|
Body: func() *gamemap.Tile {return gamemap.NewFloor()},
|
|
}
|
|
|
|
for idx, room := range rooms {
|
|
room.Blit(fillage, l)
|
|
if idx > 0 {
|
|
connectRooms(l, room, rooms[idx-1], fillage, rng.Range(0,1))
|
|
}
|
|
}
|
|
|
|
return l
|
|
}
|
|
|
|
func connectRooms (l *gamemap.Level, room, otherRoom *gamemap.Room, fillage types.RectFill, toss int) {
|
|
if toss == 0 {
|
|
digHTunnel(l, room.Center.X,otherRoom.Center.X,room.Center.Y, fillage)
|
|
digVTunnel(l, room.Center.Y,otherRoom.Center.Y,otherRoom.Center.X, fillage)
|
|
} else {
|
|
digVTunnel(l, room.Center.Y, otherRoom.Center.Y, room.Center.Y, fillage)
|
|
digHTunnel(l, room.Center.X, otherRoom.Center.X, otherRoom.Center.Y, fillage)
|
|
}
|
|
}
|
|
|
|
func digHTunnel(l *gamemap.Level, x1,x2,y int, fillage types.RectFill) {
|
|
var start, finish int
|
|
if x1 > x2 {
|
|
start = x1
|
|
finish = x2
|
|
} else {
|
|
start = x2
|
|
finish = x1
|
|
}
|
|
for i := start; i <= finish; i++ {
|
|
l.Tiles[i][y] = fillage.Body.(func() *gamemap.Tile)()
|
|
}
|
|
}
|
|
|
|
func digVTunnel(l *gamemap.Level, y1,y2,x int, fillage types.RectFill) {
|
|
var start, finish int
|
|
if y1 > y2 {
|
|
start = y1
|
|
finish = y2
|
|
} else {
|
|
start = y2
|
|
finish = y1
|
|
}
|
|
for i := start; i <= finish; i++ {
|
|
l.Tiles[x][i] = fillage.Body.(func() *gamemap.Tile)()
|
|
}
|
|
}
|