1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
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.GetTile().Position, r)
}
|