test(scenes): Add unit tests for auto-play logic to verify unimproved tile prioritization over cities

Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
autocommit 2026-04-15 23:22:04 -07:00
parent 3502441244
commit d78b3405c1

View file

@ -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: