Part 4 6/6 need help
This commit is contained in:
parent
085b1078d4
commit
f13438951a
|
@ -6,38 +6,41 @@ import (
|
||||||
"steel/interfaces"
|
"steel/interfaces"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GameMap is our map data type.
|
// GameMap is our map type for holding our tiles and dimensions.
|
||||||
type GameMap struct {
|
type GameMap struct {
|
||||||
Width, Height int
|
width, height int
|
||||||
Tiles [][]Tile
|
tiles [][]Tile
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize initializes a GameMap's Tiles to match its Width and Height. It also sets up some coordinates to block movement and sight.
|
// NewGameMap initializes a GameMap's Tiles to match provided width and height and sets up a few tiles to block movement and sight. Returns a GameMap interface.
|
||||||
func (g *GameMap) Initialize() {
|
func NewGameMap(width, height int) interfaces.GameMap {
|
||||||
g.Tiles = make([][]Tile, g.Width)
|
g := &GameMapmake{
|
||||||
|
width: width,
|
||||||
|
height: height,
|
||||||
|
}
|
||||||
|
g.tiles = make([][]Tile, g.width)
|
||||||
|
|
||||||
for x := range g.Tiles {
|
for x := range g.tiles {
|
||||||
g.Tiles[x] = make([]Tile, g.Height)
|
g.tiles[x] = make([]Tile, g.height)
|
||||||
for y := range g.Tiles[x] {
|
for y := range g.tiles[x] {
|
||||||
g.Tiles[x][y] = Tile{
|
g.tiles[x][y].Flags = BlockMovement | BlockSight
|
||||||
BlockSight: true,
|
|
||||||
BlockMovement: true,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
// MakeMap creates a new randomized map. This is built according to the passed arguments.
|
// MakeMap creates a new randomized map. This is built according to the passed arguments.
|
||||||
func (g *GameMap) MakeMap(maxRooms, roomMinSize, roomMaxSize int, player interfaces.Entity) {
|
func (g *GameMap) MakeMap(maxRooms, roomMinSize, roomMaxSize int, player interfaces.Entity) {
|
||||||
var rooms []*Rect
|
var rooms []Rect
|
||||||
|
|
||||||
for r := 0; r < maxRooms; r++ {
|
for r := 0; r < maxRooms; r++ {
|
||||||
// Generate a random width and height.
|
// Generate a random width and height.
|
||||||
width := roomMinSize + goro.Random.Intn(roomMaxSize)
|
width := roomMinSize + goro.Random.Intn(roomMaxSize)
|
||||||
height := roomMinSize + goro.Random.Intn(roomMaxSize)
|
height := roomMinSize + goro.Random.Intn(roomMaxSize)
|
||||||
// Generate a random position within the map boundaries.
|
// Generate a random position within the map boundaries.
|
||||||
x := goro.Random.Intn(g.Width - width - 1)
|
x := goro.Random.Intn(g.width - width - 1)
|
||||||
y := goro.Random.Intn(g.Height - height - 1)
|
y := goro.Random.Intn(g.height - height - 1)
|
||||||
// Create a Rect according to our generated sizes.
|
// Create a Rect according to our generated sizes.
|
||||||
room := NewRect(x, y, width, height)
|
room := NewRect(x, y, width, height)
|
||||||
|
|
||||||
|
@ -77,7 +80,7 @@ func (g *GameMap) MakeMap(maxRooms, roomMinSize, roomMaxSize int, player interfa
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateRoom creates a room from a provided rect.
|
// CreateRoom creates a room from a provided rect.
|
||||||
func (g *GameMap) CreateRoom(r *Rect) {
|
func (g *GameMap) CreateRoom(r Rect) {
|
||||||
for x := r.X1 + 1; x < r.X2; x++ {
|
for x := r.X1 + 1; x < r.X2; x++ {
|
||||||
for y := r.Y1 + 1; y < r.Y2; y++ {
|
for y := r.Y1 + 1; y < r.Y2; y++ {
|
||||||
if g.InBounds(x, y) {
|
if g.InBounds(x, y) {
|
||||||
|
@ -105,18 +108,45 @@ func (g *GameMap) CreateVTunnel(y1, y2, x int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Explored returns if the tile at x by y has been explored.
|
||||||
|
func (g *GameMap) Explored(x, y int) bool {
|
||||||
|
if g.InBounds(x, y) {
|
||||||
|
return g.tiles[x][y].Flags&Explored != 0
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetExplored sets the explored state of the tile at x and y to the passed explored bool.
|
||||||
|
func (g *GameMap) SetExplored(x, y int, explored bool) {
|
||||||
|
if g.InBounds(x, y) {
|
||||||
|
if explored {
|
||||||
|
g.tiles[x][y].Flags = g.tiles[x][y].Flags | Explored
|
||||||
|
} else {
|
||||||
|
g.tiles[x][y].Flags = g.tiles[x][y].Flags &^ Explored
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// IsBlocked returns if the given coordinates are blocking movement.
|
// IsBlocked returns if the given coordinates are blocking movement.
|
||||||
func (g *GameMap) IsBlocked(x, y int) bool {
|
func (g *GameMap) IsBlocked(x, y int) bool {
|
||||||
// Always block if ourside our GameMap's bounds.
|
// Always block if ourside our GameMap's bounds.
|
||||||
if !g.InBounds(x, y) {
|
if !g.InBounds(x, y) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return g.Tiles[x][y].BlockMovement
|
return g.Tiles[x][y].Flags&BlockMovement != 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsOpaque returns if the given coordinates are blocking sight.
|
||||||
|
func (g *GameMap) IsOpaque(x, y int) bool {
|
||||||
|
if !g.InBounds(x, y) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return g.tiles[x][y].Flags&BlockSight != 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// InBounds returns if the given coordinates are within the map's bounds.
|
// InBounds returns if the given coordinates are within the map's bounds.
|
||||||
func (g *GameMap) InBounds(x, y int) bool {
|
func (g *GameMap) InBounds(x, y int) bool {
|
||||||
if x < 0 || x >= g.Width || y < 0 || y >= g.Height {
|
if x < 0 || x >= g.width || y < 0 || y >= g.height {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
|
|
|
@ -1,6 +1,13 @@
|
||||||
package mapping
|
package mapping
|
||||||
|
|
||||||
// Tile represents the state of a given location in a GameMap.
|
// Tile represents the state of a given location in a GameMap.
|
||||||
type Tile struct {
|
type Tile struct {
|
||||||
BlockMovement bool
|
Flags uint
|
||||||
BlockSight bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Our Tile's flags.
|
||||||
|
const (
|
||||||
|
BlockMovement = 1 << iota
|
||||||
|
BlockSight
|
||||||
|
Explored
|
||||||
|
)
|
||||||
|
|
32
render.go
32
render.go
|
@ -11,19 +11,20 @@ import (
|
||||||
// DrawAll draws all entities and the gameMap to the screen and flushes it.
|
// DrawAll draws all entities and the gameMap to the screen and flushes it.
|
||||||
func DrawAll(screen *goro.Screen, entities []interfaces.Entity, gameMap mapping.GameMap, fovMap fov.Map, fovRecompute bool, colors map[string]goro.Color) {
|
func DrawAll(screen *goro.Screen, entities []interfaces.Entity, gameMap mapping.GameMap, fovMap fov.Map, fovRecompute bool, colors map[string]goro.Color) {
|
||||||
if fovRecompute {
|
if fovRecompute {
|
||||||
// Draw all the riles in the game map.
|
// Draw all the tiles in the game map.
|
||||||
for x, column := range gameMap.Tiles {
|
for x := 0; x < gameMap.Width(); x++ {
|
||||||
for y, tile := range column {
|
for y := 0; y < gameMap.Height(); y++ {
|
||||||
visible := fovMap.Visible(x, y)
|
visible := fovMap.Visible(x, y)
|
||||||
|
|
||||||
if visible {
|
if visible {
|
||||||
if tile.BlockSight {
|
if gameMap.IsBlocked(x, y) {
|
||||||
screen.SetBackground(x, y, colors["lightWall"])
|
screen.SetBackground(x, y, colors["lightWall"])
|
||||||
} else {
|
} else {
|
||||||
screen.SetBackground(x, y, colors["lightGround"])
|
screen.SetBackground(x, y, colors["lightGround"])
|
||||||
}
|
}
|
||||||
} else {
|
gameMap.SetExplored(x, y, true)
|
||||||
if tile.BlockSight {
|
} else if gameMap.Explored(x, y) {
|
||||||
|
if gameMap.IsBlocked(x, y) {
|
||||||
screen.SetBackground(x, y, colors["darkWall"])
|
screen.SetBackground(x, y, colors["darkWall"])
|
||||||
} else {
|
} else {
|
||||||
screen.SetBackground(x, y, colors["darkGround"])
|
screen.SetBackground(x, y, colors["darkGround"])
|
||||||
|
@ -35,24 +36,29 @@ func DrawAll(screen *goro.Screen, entities []interfaces.Entity, gameMap mapping.
|
||||||
|
|
||||||
// Draw all the entities in the game map.
|
// Draw all the entities in the game map.
|
||||||
for _, entity := range entities {
|
for _, entity := range entities {
|
||||||
DrawEntity(screen, entity)
|
DrawEntity(screen, entity, fovMap)
|
||||||
}
|
}
|
||||||
screen.Flush()
|
screen.Flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
// ClearAll clears all entities from the screen.
|
// ClearAll clears all entities from the screen.
|
||||||
func ClearAll(screen *goro.Screen, entities []interfaces.Entity) {
|
func ClearAll(screen *goro.Screen, entities []interfaces.Entity, fovMap fov.Map) {
|
||||||
for _, entity := range entities {
|
for _, entity := range entities {
|
||||||
ClearEntity(screen, entity)
|
ClearEntity(screen, entity, fovMap)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// DrawEntity draws a given entity to the screen.
|
// DrawEntity draws a given entity to the screen.
|
||||||
func DrawEntity(screen *goro.Screen, e interfaces.Entity) {
|
func DrawEntity(screen *goro.Screen, e interfaces.Entity, fovMap fov.Map) {
|
||||||
screen.DrawRune(e.X(), e.Y(), e.Rune(), e.Style())
|
if fovMap.Visible(e.X(), e.Y()) {
|
||||||
|
screen.SetRune(e.X()), e.Y(), e.Rune())
|
||||||
|
screen.SetForeground(e.X(), e.Y(), e.Style().Foreground)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ClearEntity clears a given entity from the screen.
|
// ClearEntity clears a given entity from the screen.
|
||||||
func ClearEntity(screen *goro.Screen, e interfaces.Entity) {
|
func ClearEntity(screen *goro.Screen, e interfaces.Entity, fovMap fov.Map) {
|
||||||
screen.SetRune(e.X(), e.Y(), ' ')
|
if fovMap.Visible(e.X(), e.Y()) {
|
||||||
|
screen.SetRune(e.X(), e.Y(), ' ')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user