summaryrefslogtreecommitdiffstats
path: root/HexBoard.gd
diff options
context:
space:
mode:
Diffstat (limited to 'HexBoard.gd')
-rw-r--r--HexBoard.gd41
1 files changed, 41 insertions, 0 deletions
diff --git a/HexBoard.gd b/HexBoard.gd
index aa5d8e9..c44ff7f 100644
--- a/HexBoard.gd
+++ b/HexBoard.gd
@@ -22,6 +22,8 @@ var tl : int # num of hexes in 2 consecutives rows
var tile_factory_fct : FuncRef
var angles : Dictionary
var adjacents : Array
+var search_count : int
+var stack : Array
func configure(cols : int, rows : int, side : float, v0 : Vector2, vertical : bool) -> void:
v = vertical
@@ -39,6 +41,7 @@ func configure(cols : int, rows : int, side : float, v0 : Vector2, vertical : bo
bt = v0
cr = Vector2(rows, cols)
tl = (2 * int(cr.x) - 1)
+ search_count = 0
angles = {}
if v:
angles[Orientation.E] = 0
@@ -360,3 +363,41 @@ func compute_contact(from : Vector2, to : Vector2, o : int, t : Vector2, line :
var x : float = t.x + (dh if (o == Orientation.NW || o == Orientation.SW) else -dh)
var y : float = t.y + (dw if (o == Orientation.SE || o == Orientation.SW) else -dw)
return Vector2(x, y)
+
+func possible_moves(piece : Piece, from : Tile, tiles : Array) -> int:
+ tiles.clear()
+ search_count += 1
+ from.acc = piece.get_mp()
+ from.parent = null
+ from.search_count = search_count
+ if from.acc <= 0 or not is_on_map(from.coords): return 0
+ var road_march_bonus : int = piece.road_march_bonus()
+ from.road_march = road_march_bonus > 0
+ stack.push_back(from)
+ while(not stack.empty()):
+ var src : Tile = stack.pop_back()
+ if (src.acc + (road_march_bonus if src.road_march else 0)) <= 0: continue
+ # warning-ignore:return_value_discarded
+ build_adjacents(src.coords)
+ for dst in adjacents:
+ if not dst.on_board: continue
+ var a : int = angle(src, dst)
+ var cost : int = piece.move_cost(src, dst, a)
+ if (cost == -1): continue # impracticable
+ var r : int = src.acc - cost
+ var rm : bool = src.road_march and src.has_road(a)
+ # not enough MP even with RM, maybe first move allowed
+ if ((r + (road_march_bonus if rm else 0)) < 0 and not (src == from and piece.at_least_one_tile())): continue
+ if dst.search_count != search_count:
+ dst.search_count = search_count
+ dst.acc = r
+ dst.parent = src
+ dst.road_march = rm
+ stack.push_back(dst)
+ tiles.append(dst)
+ elif (r > dst.acc or (rm and (r + road_march_bonus > dst.acc + (road_march_bonus if dst.roadMarch else 0)))):
+ dst.acc = r
+ dst.parent = src
+ dst.road_march = rm
+ stack.push_back(dst)
+ return tiles.size()