package game import ( "math" ) func IsPositionInRange(origin Position, pos Position, r int) bool { x, y := float64(pos.X-origin.X), float64(pos.Y-origin.Y) ax, ay := math.Abs(x), math.Abs(y) if ax > float64(r) || ay > float64(r) { return false } var abs float64 if pos.X > pos.Y { abs = ax + math.Floor(ay/2) } else { abs = ay + math.Floor(ax/2) } return abs <= float64(r) } func PositionsInRange(origin Position, r int, includeOrigin bool) []Position { positions := []Position{} for x := -r; x <= r; x++ { for y := -r; y <= r; y++ { pos := Position{origin.X + x, origin.Y + y} if pos.X < 0 || pos.Y < 0 { continue } if !includeOrigin && pos == origin { continue } if IsPositionInRange(origin, pos, r) { positions = append(positions, pos) } } } return positions } func TilesInRangeFromOrigin(m *Map, origin Position, r int) []*Tile { tiles := []*Tile{} for _, pos := range PositionsInRange(origin, r, false) { tile := m.TileAt(pos) if tile != nil { tiles = append(tiles, tile) } } return tiles } func TilesInRange(m *Map, p Permanent, r int) []*Tile { return TilesInRangeFromOrigin(m, p.Tile().Position, r) }