38 lines
1 KiB
GDScript
38 lines
1 KiB
GDScript
extends MovementBehaviour
|
|
class_name MovementBehaviourGrasshopper
|
|
|
|
const DIRS = [
|
|
Vector4i(0, -1, +1, 0), #UP
|
|
Vector4i(-1, 0, +1, 0), #UP_LEFT
|
|
Vector4i(-1, +1, 0, 0), #DOWN_LEFT
|
|
Vector4i(0, +1, -1, 0), #DOWN
|
|
Vector4i(+1, 0, -1, 0), #DOWN_RIGHT
|
|
Vector4i(+1, -1, 0, 0), #UP_RIGHT
|
|
]
|
|
|
|
func simulate_move_dirs(start: Vector4i, map: HexGrid) -> Array[Vector4i]:
|
|
var possible: Array[Vector4i] = []
|
|
for dir in DIRS:
|
|
possible.push_back(simulate_move_recursive(start, dir, map))
|
|
|
|
return possible
|
|
|
|
func simulate_move_recursive(start: Vector4i, dir: Vector4i, map: HexGrid) -> Vector4i:
|
|
var possible: Array[Vector4i] = []
|
|
|
|
var target: Vector4i = start + dir
|
|
|
|
if map.is_cell_empty(target):
|
|
return target
|
|
|
|
return simulate_move_recursive(target, dir, map)
|
|
|
|
func get_available_spaces(pos: Vector4i, map: HexGrid) -> Array[Vector4i]:
|
|
var possible_places: Array[Vector4i] = []
|
|
|
|
possible_places = simulate_move_dirs(pos, map)
|
|
|
|
for neighbour in map.get_empty_neighbours(pos):
|
|
possible_places.erase(neighbour)
|
|
|
|
return possible_places
|