last_light/game/world/entity_map.go

137 lines
2.5 KiB
Go
Raw Normal View History

2024-05-06 18:59:14 +03:00
package world
import (
"maps"
2024-05-06 21:19:08 +03:00
"mvvasilev/last_light/engine"
2024-05-30 23:39:54 +03:00
"mvvasilev/last_light/game/npc"
2024-05-06 18:59:14 +03:00
"github.com/google/uuid"
)
type EntityMap struct {
entities map[int]EntityTile
2024-05-06 21:19:08 +03:00
engine.Sized
2024-05-06 18:59:14 +03:00
}
func CreateEntityMap(width, height int) *EntityMap {
return &EntityMap{
entities: make(map[int]EntityTile, 0),
2024-05-06 21:19:08 +03:00
Sized: engine.WithSize(engine.SizeOf(width, height)),
2024-05-06 18:59:14 +03:00
}
}
2024-05-12 23:22:39 +03:00
func (em *EntityMap) SetTileAt(x int, y int, t Tile) Tile {
return nil
2024-05-06 18:59:14 +03:00
// if !em.FitsWithin(x, y) {
// return
// }
// index := em.Size().AsArrayIndex(x, y)
// TODO? May not be necessary
}
func (em *EntityMap) FindEntityByUuid(uuid uuid.UUID) (key int, entity EntityTile) {
for i, e := range em.entities {
if e.Entity().UniqueId() == uuid {
return i, e
}
}
return -1, nil
}
2024-06-01 11:20:51 +03:00
func (em *EntityMap) AddEntity(entity npc.MovableEntity) {
2024-05-06 18:59:14 +03:00
if !em.FitsWithin(entity.Position().XY()) {
return
}
key := em.Size().AsArrayIndex(entity.Position().XY())
2024-06-01 11:20:51 +03:00
et := CreateBasicEntityTile(entity)
2024-05-06 18:59:14 +03:00
em.entities[key] = et
}
func (em *EntityMap) DropEntity(uuid uuid.UUID) {
maps.DeleteFunc(em.entities, func(i int, et EntityTile) bool {
2024-05-06 21:19:08 +03:00
return et.Entity().UniqueId() == uuid
2024-05-06 18:59:14 +03:00
})
}
func (em *EntityMap) MoveEntity(uuid uuid.UUID, dx, dy int) {
oldKey, e := em.FindEntityByUuid(uuid)
if e == nil {
return
}
if !em.FitsWithin(e.Entity().Position().WithOffset(dx, dy).XY()) {
return
}
delete(em.entities, oldKey)
newPos := e.Entity().Position().WithOffset(dx, dy)
e.Entity().MoveTo(newPos)
newKey := em.Size().AsArrayIndex(e.Entity().Position().XY())
em.entities[newKey] = e
}
2024-05-12 23:22:39 +03:00
func (em *EntityMap) MoveEntityTo(uuid uuid.UUID, x, y int) {
oldKey, e := em.FindEntityByUuid(uuid)
if e == nil {
return
}
if !em.FitsWithin(x, y) {
return
}
delete(em.entities, oldKey)
e.Entity().MoveTo(engine.PositionAt(x, y))
newKey := em.Size().AsArrayIndex(e.Entity().Position().XY())
em.entities[newKey] = e
}
2024-05-06 18:59:14 +03:00
func (em *EntityMap) TileAt(x int, y int) Tile {
if !em.FitsWithin(x, y) {
return CreateStaticTile(x, y, TileTypeVoid())
}
key := em.Size().AsArrayIndex(x, y)
return em.entities[key]
}
2024-06-01 11:20:51 +03:00
func (em *EntityMap) EntityAt(x, y int) (ent npc.MovableEntity) {
tile := em.TileAt(x, y)
if tile == nil {
return nil
}
return tile.(EntityTile).Entity()
}
2024-05-21 23:08:51 +03:00
func (em *EntityMap) IsInBounds(x, y int) bool {
return em.FitsWithin(x, y)
}
func (em *EntityMap) MarkExplored(x, y int) {
}
func (em *EntityMap) ExploredTileAt(x, y int) Tile {
return CreateStaticTile(x, y, TileTypeVoid())
}
2024-05-06 18:59:14 +03:00
func (em *EntityMap) Tick(dt int64) {
}