Refine large map viewport controls
This commit is contained in:
@@ -98,9 +98,16 @@ func _check_edge_scroll_layout_contract(failures: Array[String]) -> void:
|
||||
failures.append("edge scroll clamp should not create positive board offsets")
|
||||
|
||||
scene.board_scroll_offset = far_offset
|
||||
var far_visible_cell := Vector2i(scene.state.map_size.x - 1, scene.state.map_size.y - 1)
|
||||
var far_visible_screen := scene._rect_for_cell(far_visible_cell).position + Vector2(4.0, 4.0)
|
||||
if scene._cell_from_screen(far_visible_screen) != far_visible_cell:
|
||||
failures.append("screen-to-cell mapping should stay stable for the visible far edge after scrolling")
|
||||
var first_cell_screen := scene._rect_for_cell(Vector2i(0, 0)).position + Vector2(4.0, 4.0)
|
||||
if scene._cell_from_screen(first_cell_screen) != Vector2i(0, 0):
|
||||
failures.append("screen-to-cell mapping should stay stable after scrolling")
|
||||
if scene._cell_from_screen(first_cell_screen) != Vector2i(-1, -1):
|
||||
failures.append("hidden map cells should not accept board clicks after scrolling")
|
||||
var side_panel_screen := Vector2(view_rect.end.x + 8.0, view_rect.position.y + 24.0)
|
||||
if scene._cell_from_screen(side_panel_screen) != Vector2i(-1, -1):
|
||||
failures.append("screen-to-cell mapping should ignore clicks outside the visible map view")
|
||||
_check_edge_scroll_velocity_curve(scene, view_rect, failures)
|
||||
scene.free()
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ func _init() -> void:
|
||||
_check_deferred_move_events(failures)
|
||||
_check_scene_post_move_menu_flow(failures)
|
||||
_check_scene_post_move_edge_positioning(failures)
|
||||
_check_scene_post_move_scrolled_view_positioning(failures)
|
||||
_check_scene_post_move_text_fit(failures)
|
||||
_check_scene_post_move_tactic_picker_flow(failures)
|
||||
_check_scene_post_move_item_picker_flow(failures)
|
||||
@@ -170,6 +171,39 @@ func _check_scene_post_move_edge_positioning(failures: Array[String]) -> void:
|
||||
scene.free()
|
||||
|
||||
|
||||
func _check_scene_post_move_scrolled_view_positioning(failures: Array[String]) -> void:
|
||||
var scene = BattleSceneScript.new()
|
||||
scene._create_hud()
|
||||
if not scene.state.load_battle("res://data/scenarios/001_yellow_turbans.json"):
|
||||
failures.append("could not load opening battle for scrolled menu positioning")
|
||||
scene.free()
|
||||
return
|
||||
scene.battle_started = true
|
||||
scene.campaign_complete_screen = false
|
||||
scene.briefing_panel.visible = false
|
||||
scene.result_panel.visible = false
|
||||
scene._clear_pending_move_state()
|
||||
scene.board_scroll_offset = scene._clamped_board_scroll_offset(Vector2(-9999.0, -9999.0))
|
||||
|
||||
var edge_cell := Vector2i(scene.state.map_size.x - 1, scene.state.map_size.y - 1)
|
||||
var cao_cao: Dictionary = scene.state.get_unit("cao_cao")
|
||||
cao_cao["pos"] = edge_cell
|
||||
cao_cao["moved"] = true
|
||||
cao_cao["acted"] = false
|
||||
scene.state.select_unit("cao_cao")
|
||||
scene.pending_move_unit_id = "cao_cao"
|
||||
scene.pending_move_from_cell = Vector2i(edge_cell.x - 1, edge_cell.y)
|
||||
scene.pending_move_to_cell = edge_cell
|
||||
scene._show_post_move_menu()
|
||||
|
||||
if scene.post_move_menu == null or not scene.post_move_menu.visible:
|
||||
failures.append("scrolled post-move action menu should be visible")
|
||||
else:
|
||||
_check_local_panel_position(failures, scene, scene.post_move_menu, edge_cell, "scrolled post-move action menu")
|
||||
|
||||
scene.free()
|
||||
|
||||
|
||||
func _check_scene_post_move_text_fit(failures: Array[String]) -> void:
|
||||
var scene = BattleSceneScript.new()
|
||||
scene._create_hud()
|
||||
@@ -577,17 +611,18 @@ func _check_scene_post_move_item_picker_flow(failures: Array[String]) -> void:
|
||||
|
||||
func _check_local_panel_position(failures: Array[String], scene, panel: Control, cell: Vector2i, label: String) -> void:
|
||||
var padding := BattleSceneScript.LOCAL_COMMAND_PANEL_BOARD_PADDING
|
||||
var board_position := BattleSceneScript.BOARD_OFFSET + Vector2(padding, padding)
|
||||
var board_size := Vector2(scene.state.map_size.x, scene.state.map_size.y) * BattleSceneScript.TILE_SIZE - Vector2(padding * 2.0, padding * 2.0)
|
||||
var board_rect := Rect2(board_position, board_size)
|
||||
var board_rect: Rect2 = scene._board_rect().intersection(scene._map_view_rect())
|
||||
if board_rect.size.x <= 0.0 or board_rect.size.y <= 0.0:
|
||||
board_rect = scene._board_rect()
|
||||
board_rect = board_rect.grow(-padding)
|
||||
var panel_rect := Rect2(panel.position, panel.size)
|
||||
var cell_rect: Rect2 = scene._rect_for_cell(cell).grow(2.0)
|
||||
if panel_rect.size.x <= 0.0 or panel_rect.size.y <= 0.0:
|
||||
failures.append("%s should have a stable visible size" % label)
|
||||
if panel_rect.position.x < board_rect.position.x or panel_rect.position.y < board_rect.position.y:
|
||||
failures.append("%s should stay inside the board minimum: %s" % [label, str(panel_rect)])
|
||||
failures.append("%s should stay inside the visible board minimum: %s" % [label, str(panel_rect)])
|
||||
if panel_rect.end.x > board_rect.end.x or panel_rect.end.y > board_rect.end.y:
|
||||
failures.append("%s should stay inside the board maximum: %s" % [label, str(panel_rect)])
|
||||
failures.append("%s should stay inside the visible board maximum: %s" % [label, str(panel_rect)])
|
||||
if panel_rect.intersects(cell_rect):
|
||||
failures.append("%s should not cover the moved unit cell: %s over %s" % [label, str(panel_rect), str(cell_rect)])
|
||||
|
||||
|
||||
@@ -3585,12 +3585,12 @@ func _check_hover_intent_badges(failures: Array[String]) -> void:
|
||||
failures.append("COUNTER badge should use a distinct color")
|
||||
if scene._target_preview_badge_color("danger") == default_color:
|
||||
failures.append("DANGER badge should use a distinct color")
|
||||
var board_rect: Rect2 = scene._board_rect()
|
||||
var board_rect: Rect2 = scene._board_rect().intersection(scene._map_view_rect())
|
||||
var edge_badge_rect: Rect2 = scene._target_preview_badge_rect(Vector2i(13, 9))
|
||||
if edge_badge_rect.position.x < board_rect.position.x or edge_badge_rect.position.y < board_rect.position.y:
|
||||
failures.append("edge target preview badge should stay inside board minimum: %s / %s" % [str(edge_badge_rect), str(board_rect)])
|
||||
failures.append("edge target preview badge should stay inside visible board minimum: %s / %s" % [str(edge_badge_rect), str(board_rect)])
|
||||
if edge_badge_rect.end.x > board_rect.end.x or edge_badge_rect.end.y > board_rect.end.y:
|
||||
failures.append("edge target preview badge should stay inside board maximum: %s / %s" % [str(edge_badge_rect), str(board_rect)])
|
||||
failures.append("edge target preview badge should stay inside visible board maximum: %s / %s" % [str(edge_badge_rect), str(board_rect)])
|
||||
if edge_badge_rect.size.x <= BattleSceneScript.TILE_SIZE:
|
||||
failures.append("target preview badge should remain wide enough for Korean tactical text")
|
||||
scene.free()
|
||||
|
||||
Reference in New Issue
Block a user