diff --git a/src/game/engine/scenes/tests/auto_play.gd b/src/game/engine/scenes/tests/auto_play.gd index 27d9084a..ebfa9799 100644 --- a/src/game/engine/scenes/tests/auto_play.gd +++ b/src/game/engine/scenes/tests/auto_play.gd @@ -1229,7 +1229,8 @@ func _decide_founder(unit: Variant, player: RefCounted, game_map: RefCounted) -> func _command_worker(unit: Variant, player: RefCounted, game_map: RefCounted) -> void: - ## Build an improvement on the current tile if possible; else walk toward a city. + ## Build an improvement on the current tile if possible; + ## else walk toward the nearest owned unimproved tile; else toward a city. if _improvement_manager == null: return var buildable: Array[Dictionary] = _improvement_manager.get_buildable_improvements( @@ -1250,6 +1251,28 @@ func _command_worker(unit: Variant, player: RefCounted, game_map: RefCounted) -> if not pick.is_empty(): _improvement_manager.start_improvement(unit, pick, player) return + # Seek the nearest buildable tile within 4 hexes: owned or unclaimed, non-water, + # unimproved, no pending build. Unclaimed tiles work — they convert on build. + var best_target: Vector2i = Vector2i(-1, -1) + var best_dist: int = 9999 + for dq: int in range(-4, 5): + for dr: int in range(-4, 5): + var tpos: Vector2i = unit.position + Vector2i(dq, dr) + var d: int = HexUtilsScript.hex_distance(unit.position, tpos) + if d == 0 or d > 4 or d >= best_dist: + continue + var t: Resource = game_map.get_tile(tpos) + if t == null or t.is_water() or str(t.improvement) != "": + continue + if t.owner != -1 and t.owner != player.index: + continue + if _improvement_manager.get_pending_at(tpos, player).size() > 0: + continue + best_dist = d + best_target = tpos + if best_target != Vector2i(-1, -1): + _move_toward(unit, best_target, game_map) + return if not player.cities.is_empty(): _move_toward(unit, player.cities[0].position, game_map) else: