last_light/game/world/multilevel_map.go

110 lines
2 KiB
Go
Raw Normal View History

2024-05-06 18:59:14 +03:00
package world
2024-05-06 21:19:08 +03:00
import "mvvasilev/last_light/engine"
type MultilevelMap struct {
layers []Map
}
func CreateMultilevelMap(maps ...Map) *MultilevelMap {
m := new(MultilevelMap)
m.layers = maps
return m
}
2024-05-06 21:19:08 +03:00
func (mm *MultilevelMap) Size() engine.Size {
if len(mm.layers) == 0 {
2024-05-06 21:19:08 +03:00
return engine.SizeOf(0, 0)
}
return mm.layers[0].Size()
}
2024-05-12 23:22:39 +03:00
func (mm *MultilevelMap) SetTileAt(x, y int, t Tile) Tile {
return mm.layers[0].SetTileAt(x, y, t)
}
func (mm *MultilevelMap) UnsetTileAtHeight(x, y, height int) {
if len(mm.layers) < height {
return
}
mm.layers[height].SetTileAt(x, y, nil)
}
func (mm *MultilevelMap) SetTileAtHeight(x, y, height int, t Tile) {
if len(mm.layers) < height {
return
}
mm.layers[height].SetTileAt(x, y, t)
}
2024-05-03 13:46:32 +03:00
func (mm *MultilevelMap) CollectTilesAt(x, y int, filter func(t Tile) bool) []Tile {
tiles := make([]Tile, len(mm.layers))
if x < 0 || y < 0 {
return tiles
}
if x >= mm.Size().Width() || y >= mm.Size().Height() {
return tiles
}
for i := len(mm.layers) - 1; i >= 0; i-- {
tile := mm.layers[i].TileAt(x, y)
if tile != nil && !tile.Transparent() && filter(tile) {
tiles = append(tiles, tile)
}
}
return tiles
}
func (mm *MultilevelMap) TileAt(x int, y int) Tile {
2024-05-03 13:46:32 +03:00
if x < 0 || y < 0 {
return CreateStaticTile(x, y, TileTypeVoid())
}
if x >= mm.Size().Width() || y >= mm.Size().Height() {
return CreateStaticTile(x, y, TileTypeVoid())
}
for i := len(mm.layers) - 1; i >= 0; i-- {
tile := mm.layers[i].TileAt(x, y)
2024-05-03 13:46:32 +03:00
if tile != nil && !tile.Transparent() {
return tile
}
2024-05-03 13:46:32 +03:00
}
return CreateStaticTile(x, y, TileTypeVoid())
}
func (mm *MultilevelMap) TileAtHeight(x, y, height int) Tile {
if x < 0 || y < 0 {
return CreateStaticTile(x, y, TileTypeVoid())
}
if x >= mm.Size().Width() || y >= mm.Size().Height() {
return CreateStaticTile(x, y, TileTypeVoid())
}
if height > len(mm.layers)-1 {
return CreateStaticTile(x, y, TileTypeVoid())
}
2024-05-03 13:46:32 +03:00
return mm.layers[height].TileAt(x, y)
}
2024-05-06 18:59:14 +03:00
func (mm *MultilevelMap) Tick(dt int64) {
for _, l := range mm.layers {
2024-05-06 18:59:14 +03:00
l.Tick(dt)
}
}