aboutsummaryrefslogtreecommitdiff
path: root/go/game/range.go
diff options
context:
space:
mode:
Diffstat (limited to 'go/game/range.go')
-rw-r--r--go/game/range.go58
1 files changed, 58 insertions, 0 deletions
diff --git a/go/game/range.go b/go/game/range.go
new file mode 100644
index 00000000..ab86c44e
--- /dev/null
+++ b/go/game/range.go
@@ -0,0 +1,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.Tile().Position, r)
+}