mapgen moving to delanay -> minimum spanning tree for rooms connection
This commit is contained in:
85
engine/gamemap/room.go
Normal file
85
engine/gamemap/room.go
Normal file
@ -0,0 +1,85 @@
|
||||
package gamemap
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"lab.zaar.be/thefish/alchemyst-go/engine/items"
|
||||
"lab.zaar.be/thefish/alchemyst-go/engine/mob"
|
||||
"lab.zaar.be/thefish/alchemyst-go/engine/types"
|
||||
"lab.zaar.be/thefish/alchemyst-go/util"
|
||||
)
|
||||
|
||||
var invalidBlit = errors.New("trying to blit on existing good tile")
|
||||
|
||||
type Room struct {
|
||||
*types.Rect
|
||||
Center types.Coords
|
||||
Geometry []func() *Tile
|
||||
Mobs []mob.Mob
|
||||
Items []items.Carried
|
||||
Connectors []types.Coords
|
||||
}
|
||||
|
||||
func (r *Room) Put (x, y int, tileFunc interface{}) {
|
||||
tf := tileFunc.(func() *Tile)
|
||||
if tf == nil {
|
||||
return //fixme error
|
||||
}
|
||||
if r.InBounds(types.Coords{x, y}) {
|
||||
r.Geometry[x+y*r.W] = tf
|
||||
}
|
||||
}
|
||||
|
||||
func (room *Room) BlitToLevel(l *Level, where types.Coords) error {
|
||||
//copy tiles like this:
|
||||
//https://stackoverflow.com/questions/21011023/copy-pointer-values-a-b-in-golang
|
||||
|
||||
for j := 0; j < room.H; j++ {
|
||||
|
||||
for i := 0; i < room.W; i++ {
|
||||
underlyingTile := l.GetTileByXY(i+where.X, j+where.Y)
|
||||
|
||||
tileFunc := room.Geometry[i+j*room.W]
|
||||
|
||||
if tileFunc == nil {
|
||||
continue
|
||||
}
|
||||
//check underlying tile
|
||||
if underlyingTile != nil ||
|
||||
underlyingTile.Name != "Wall" {
|
||||
return invalidBlit
|
||||
}
|
||||
l.Put(i+where.X, j+where.Y, tileFunc)
|
||||
}
|
||||
}
|
||||
//update room coords?
|
||||
room.X = where.X
|
||||
room.Y = where.Y
|
||||
//update connector?
|
||||
for i, _ := range room.Connectors {
|
||||
room.Connectors[i].X += where.X
|
||||
room.Connectors[i].Y += where.Y
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func NewRandomRectRoom(rng *util.RNG, w, h int, fillage types.RectFill) *Room {
|
||||
newRoom := &Room{
|
||||
Rect: types.NewRect(
|
||||
0,
|
||||
0,
|
||||
w,
|
||||
h,
|
||||
),
|
||||
Center: types.Coords{w / 2, h /2 },
|
||||
}
|
||||
newRoom.Blit(fillage, newRoom)
|
||||
//add connectors
|
||||
newRoom.Connectors = append(
|
||||
newRoom.Connectors,
|
||||
types.Coords{rng.Range(1, w - 2), 0},
|
||||
types.Coords{rng.Range(1, w - 2), h -1},
|
||||
types.Coords{0, rng.Range(1, h - 2)},
|
||||
types.Coords{w - 1, rng.Range(1, h - 2)},
|
||||
)
|
||||
return newRoom
|
||||
}
|
Reference in New Issue
Block a user