|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"slices"
|
|
|
|
)
|
|
|
|
|
|
|
|
func compass(near Position, offset int) []Position {
|
|
|
|
return []Position{
|
|
|
|
Position{near.X, near.Y - offset},
|
|
|
|
Position{near.X, near.Y + offset},
|
|
|
|
Position{near.X + offset, near.Y},
|
|
|
|
Position{near.X - offset, near.Y},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (game *Game) Inbounds(pos Position, offset int) bool {
|
|
|
|
return pos.X >= offset &&
|
|
|
|
pos.X < game.Width - offset &&
|
|
|
|
pos.Y >= offset &&
|
|
|
|
pos.Y < game.Height - offset
|
|
|
|
}
|
|
|
|
|
|
|
|
func (game *Game) Occupied(pos Position) bool {
|
|
|
|
_, is_enemy := game.Enemies[pos]
|
|
|
|
is_player := pos == game.Player.Pos
|
|
|
|
|
|
|
|
// Inbounds comes first to prevent accessing level with bad x,y
|
|
|
|
return !game.Inbounds(pos, 1) ||
|
|
|
|
game.Level[pos.Y][pos.X] == WALL ||
|
|
|
|
is_enemy ||
|
|
|
|
is_player
|
|
|
|
}
|
|
|
|
|
|
|
|
func (game *Game) FillMap(target Map, setting rune) {
|
|
|
|
for y := 0 ; y < game.Height; y++ {
|
|
|
|
target[y] = slices.Repeat([]rune{setting}, game.Width)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (game *Game) Neighbors(near Position) []Position {
|
|
|
|
result := make([]Position, 0, 4)
|
|
|
|
points := compass(near, 2)
|
|
|
|
|
|
|
|
for _, pos := range points {
|
|
|
|
if game.Inbounds(pos, 0) {
|
|
|
|
result = append(result, pos)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return result
|
|
|
|
}
|
|
|
|
|
|
|
|
func (game *Game) NewMap() {
|
|
|
|
game.FillMap(game.Level, '#')
|
|
|
|
}
|