last_light/game/world/tile.go
2024-05-12 23:22:39 +03:00

241 lines
4.6 KiB
Go

package world
import (
"mvvasilev/last_light/engine"
"mvvasilev/last_light/game/model"
"github.com/gdamore/tcell/v2"
)
type Material uint
const (
MaterialGround Material = iota
MaterialRock
MaterialWall
MaterialGrass
MaterialVoid
MaterialClosedDoor
MaterialOpenDoor
MaterialStaircaseDown
MaterialStaircaseUp
)
type TileType struct {
Material Material
Passable bool
Presentation rune
Transparent bool
Style tcell.Style
}
func TileTypeGround() TileType {
return TileType{
Material: MaterialGround,
Passable: true,
Presentation: '.',
Transparent: false,
Style: tcell.StyleDefault,
}
}
func TileTypeRock() TileType {
return TileType{
Material: MaterialRock,
Passable: false,
Presentation: '█',
Transparent: false,
Style: tcell.StyleDefault,
}
}
func TileTypeGrass() TileType {
return TileType{
Material: MaterialGrass,
Passable: true,
Presentation: ',',
Transparent: false,
Style: tcell.StyleDefault,
}
}
func TileTypeVoid() TileType {
return TileType{
Material: MaterialVoid,
Passable: false,
Presentation: ' ',
Transparent: true,
Style: tcell.StyleDefault,
}
}
func TileTypeWall() TileType {
return TileType{
Material: MaterialWall,
Passable: false,
Presentation: '#',
Transparent: false,
Style: tcell.StyleDefault.Background(tcell.ColorGray),
}
}
func TileTypeClosedDoor() TileType {
return TileType{
Material: MaterialClosedDoor,
Passable: false,
Transparent: false,
Presentation: '[',
Style: tcell.StyleDefault.Foreground(tcell.ColorLightSteelBlue).Background(tcell.ColorSaddleBrown),
}
}
func TileTypeOpenDoor() TileType {
return TileType{
Material: MaterialClosedDoor,
Passable: false,
Transparent: false,
Presentation: '_',
Style: tcell.StyleDefault.Foreground(tcell.ColorLightSteelBlue),
}
}
func TileTypeStaircaseDown() TileType {
return TileType{
Material: MaterialStaircaseDown,
Passable: true,
Transparent: false,
Presentation: '≡',
Style: tcell.StyleDefault.Foreground(tcell.ColorDarkSlateGray).Attributes(tcell.AttrBold),
}
}
func TileTypeStaircaseUp() TileType {
return TileType{
Material: MaterialStaircaseUp,
Passable: true,
Transparent: false,
Presentation: '^',
Style: tcell.StyleDefault.Foreground(tcell.ColorDarkSlateGray).Attributes(tcell.AttrBold),
}
}
type Tile interface {
Position() engine.Position
Presentation() (rune, tcell.Style)
Passable() bool
Transparent() bool
}
type StaticTile struct {
position engine.Position
t TileType
}
func CreateStaticTile(x, y int, t TileType) Tile {
st := new(StaticTile)
st.position = engine.PositionAt(x, y)
st.t = t
return st
}
func (st *StaticTile) Position() engine.Position {
return st.position
}
func (st *StaticTile) Presentation() (rune, tcell.Style) {
return st.t.Presentation, st.t.Style
}
func (st *StaticTile) Passable() bool {
return st.t.Passable
}
func (st *StaticTile) Transparent() bool {
return st.t.Transparent
}
func (st *StaticTile) Type() TileType {
return st.t
}
type ItemTile struct {
position engine.Position
itemType *model.ItemType
quantity int
}
func CreateItemTile(position engine.Position, itemType *model.ItemType, quantity int) *ItemTile {
it := new(ItemTile)
it.position = position
it.itemType = itemType
it.quantity = quantity
return it
}
func (it *ItemTile) Type() *model.ItemType {
return it.itemType
}
func (it *ItemTile) Quantity() int {
return it.quantity
}
func (it *ItemTile) Position() engine.Position {
return it.position
}
func (it *ItemTile) Presentation() (rune, tcell.Style) {
return it.itemType.TileIcon(), it.itemType.Style()
}
func (it *ItemTile) Passable() bool {
return true
}
func (it *ItemTile) Transparent() bool {
return false
}
type EntityTile interface {
Entity() model.MovableEntity
Tile
}
type BasicEntityTile struct {
entity model.MovableEntity
presentation rune
style tcell.Style
}
func CreateBasicEntityTile(entity model.MovableEntity, presentation rune, style tcell.Style) *BasicEntityTile {
return &BasicEntityTile{
entity: entity,
presentation: presentation,
style: style,
}
}
func (bet *BasicEntityTile) Entity() model.MovableEntity {
return bet.entity
}
func (bet *BasicEntityTile) Position() engine.Position {
return bet.entity.Position()
}
func (bet *BasicEntityTile) Presentation() (rune, tcell.Style) {
return bet.presentation, bet.style
}
func (bet *BasicEntityTile) Passable() bool {
return false
}
func (bet *BasicEntityTile) Transparent() bool {
return false
}