Track tactical map focus

This commit is contained in:
2026-06-19 18:11:05 +09:00
parent 49cf3a735f
commit c40bccf044
2 changed files with 111 additions and 0 deletions

View File

@@ -21,6 +21,7 @@ func _init() -> void:
_check_chapter_one_scenarios_have_visual_grounding(failures)
_check_edge_scroll_layout_contract(failures)
_check_minimap_navigation_contract(failures)
_check_map_focus_contract(failures)
_check_readability_contract(failures)
_check_dialogue_localization_and_side(failures)
_check_event_dialogue_side_passthrough(failures)
@@ -239,6 +240,56 @@ func _check_minimap_navigation_contract(failures: Array[String]) -> void:
scene.free()
func _check_map_focus_contract(failures: Array[String]) -> void:
var scene = BattleSceneScript.new()
if not scene.state.load_battle("res://data/scenarios/009_xiapi_siege.json"):
failures.append("could not load large chapter one map for map focus")
scene.free()
return
scene.battle_started = true
for method_name in [
"_board_scroll_offset_for_cell_focus",
"_focus_board_on_cell"
]:
if not scene.has_method(method_name):
failures.append("missing map focus helper: %s" % method_name)
var view_rect: Rect2 = scene._map_view_rect()
var far_cell := Vector2i(scene.state.map_size.x - 1, 4)
scene.board_scroll_offset = Vector2.ZERO
var far_offset: Vector2 = scene._board_scroll_offset_for_cell_focus(far_cell)
if far_offset.x >= -0.01:
failures.append("far map focus should scroll horizontally on a large map: %s" % str(far_offset))
var tile_size := float(scene.TILE_SIZE)
var far_center: Vector2 = scene.BOARD_OFFSET + far_offset + Vector2(far_cell.x + 0.5, far_cell.y + 0.5) * tile_size
if far_center.x > view_rect.end.x - 12.0 or far_center.x < view_rect.position.x + 12.0:
failures.append("far map focus should keep the target cell inside the visible view: %s in %s" % [str(far_center), str(view_rect)])
var center_cell := Vector2i(scene.state.map_size.x / 2, 4)
var center_offset: Vector2 = scene._board_scroll_offset_for_cell_focus(center_cell, true)
var centered_local: Vector2 = view_rect.get_center() - (scene.BOARD_OFFSET + center_offset)
var expected_local: Vector2 = Vector2(center_cell.x + 0.5, center_cell.y + 0.5) * tile_size
if scene._board_size().x > view_rect.size.x and absf(centered_local.x - expected_local.x) > 1.0:
failures.append("forced map focus should center the target X for action feedback: %s vs %s" % [str(centered_local), str(expected_local)])
scene.board_scroll_offset = scene._clamped_board_scroll_offset(Vector2(-9999.0, -9999.0))
var origin_offset: Vector2 = scene._board_scroll_offset_for_cell_focus(Vector2i(0, 0))
if origin_offset.x > 0.01 or origin_offset.y > 0.01:
failures.append("origin map focus should never scroll past the map origin: %s" % str(origin_offset))
scene.board_scroll_offset = Vector2.ZERO
var near_offset: Vector2 = scene._board_scroll_offset_for_cell_focus(Vector2i(2, 4))
if near_offset.distance_squared_to(Vector2.ZERO) > 0.01:
failures.append("map focus should not move when the target is already comfortably visible: %s" % str(near_offset))
scene.board_scroll_offset = Vector2.ZERO
if not scene._focus_board_on_cell(far_cell):
failures.append("map focus action should report movement for an off-screen cell")
if scene.board_scroll_offset.distance_squared_to(far_offset) > 0.01:
failures.append("map focus action should apply the calculated offset: %s vs %s" % [str(scene.board_scroll_offset), str(far_offset)])
scene.free()
func _check_readability_contract(failures: Array[String]) -> void:
var scene = BattleSceneScript.new()
scene._create_hud()