xyz I think the problem is that you didn't take into consideration that adjacent hex coordinates differ on even and odd rows/columns depending on tile layout you've set in your tilemap properties.
Anyway here's a quick demo. It's modular. get_next_steps() basically simulates a move step. Here it's the simplest case we were mentioning - one movement point per hex in any direction. You can replace this function with something that represents a move step in your system, and also add a property to MovementState class to track the rotation cooldown.
Note that flood fill is brute force which makes it rather slow. It'll have to be optimized for larger movement radii.
extends TileMap
class Step:
var position: Vector2i
var movement_points: int
func _init(pos, mp):
self.position = pos
self.movement_points = mp
func get_next_steps(current: Step):
var out: Array[Step]
const directions_odd = [Vector2i(1,1), Vector2i(1, 0), Vector2i(1, -1), Vector2i(-0, -1), Vector2i(-1, 0), Vector2i(0, 1) ]
const directions_even = [Vector2i(0,1), Vector2i(1, 0), Vector2i(0, -1), Vector2i(-1, -1), Vector2i(-1, 0), Vector2i(-1, 1) ]
if current.movement_points > 0:
out.resize(6)
var directions = directions_odd if current.position.y % 2 else directions_even
for i in 6:
out[i] = Step.new(current.position + directions[i], current.movement_points - 1)
return out
func get_movement_area(start_position: Vector2i, movement_points: int):
var output: Array[Vector2i] = []
var stack: Array[Step] = [Step.new(start_position, movement_points)]
while not stack.is_empty():
var current = stack.pop_front()
output.append(current.position)
for next in get_next_steps(current):
if not next.position in output:
stack.push_back(next)
return output
func _ready():
var start_position = Vector2i(0,0)
var movement_points = 4
for p in get_movement_area(start_position, movement_points):
set_cell(0, p ,1, Vector2i(0,1))
set_cell(0, start_position,1, Vector2i(0,0))
