Refine large map edge navigation

This commit is contained in:
2026-06-19 19:22:48 +09:00
parent 9a9c677863
commit 3427116513
3 changed files with 111 additions and 18 deletions

View File

@@ -120,7 +120,11 @@ func _check_edge_scroll_velocity_curve(scene, view_rect: Rect2, failures: Array[
"_edge_scroll_pressure",
"_edge_scroll_speed_for_pressure",
"_edge_scroll_activation_rect",
"_edge_scroll_next_offset"
"_edge_scroll_next_offset",
"_edge_scroll_active_sides",
"_edge_scroll_cue_strip_width",
"_edge_scroll_cue_fill_color",
"_edge_scroll_cue_line_color"
]:
if not scene.has_method(method_name):
failures.append("missing edge-scroll helper: %s" % method_name)
@@ -150,6 +154,26 @@ func _check_edge_scroll_velocity_curve(scene, view_rect: Rect2, failures: Array[
if top_left.length() > max_edge_speed + 0.01:
failures.append("corner edge scroll should cap diagonal speed: %.2f > %.2f" % [top_left.length(), max_edge_speed])
var idle_sides: Dictionary = scene._edge_scroll_active_sides(view_rect.get_center(), view_rect)
if bool(idle_sides.get("left", false)) or bool(idle_sides.get("right", false)) or bool(idle_sides.get("up", false)) or bool(idle_sides.get("down", false)):
failures.append("edge cue sides should stay idle away from the frame: %s" % str(idle_sides))
var left_active_sides: Dictionary = scene._edge_scroll_active_sides(Vector2(view_rect.position.x + 2.0, view_rect.get_center().y), view_rect)
if not bool(left_active_sides.get("left", false)) or bool(left_active_sides.get("right", false)):
failures.append("left edge cue should activate only the left side: %s" % str(left_active_sides))
var right_active_sides: Dictionary = scene._edge_scroll_active_sides(Vector2(view_rect.end.x - 2.0, view_rect.get_center().y), view_rect)
if not bool(right_active_sides.get("right", false)) or bool(right_active_sides.get("left", false)):
failures.append("right edge cue should activate only the right side: %s" % str(right_active_sides))
if float(scene._edge_scroll_cue_strip_width(true)) <= float(scene._edge_scroll_cue_strip_width(false)):
failures.append("active edge cue should draw a wider response strip")
var active_fill: Color = scene._edge_scroll_cue_fill_color(true)
var idle_fill: Color = scene._edge_scroll_cue_fill_color(false)
if active_fill.a <= idle_fill.a:
failures.append("active edge cue fill should be brighter than idle fill")
var active_line: Color = scene._edge_scroll_cue_line_color(true)
var idle_line: Color = scene._edge_scroll_cue_line_color(false)
if active_line.a <= idle_line.a:
failures.append("active edge cue line should be brighter than idle line")
var near_outside_left: Vector2 = scene._edge_scroll_velocity_for_position(view_rect.position - Vector2(4.0, 0.0), view_rect)
if near_outside_left.x <= 0.0:
failures.append("edge scroll should continue when the mouse slightly crosses the left map edge: %s" % str(near_outside_left))
@@ -199,7 +223,10 @@ func _check_minimap_navigation_contract(failures: Array[String]) -> void:
"_minimap_cell_rect",
"_minimap_view_rect",
"_board_scroll_offset_for_minimap_position",
"_scroll_board_to_minimap_position"
"_scroll_board_to_minimap_position",
"_handle_minimap_mouse_button",
"_handle_minimap_mouse_motion",
"_is_minimap_visible"
]:
if not scene.has_method(method_name):
failures.append("missing minimap helper: %s" % method_name)
@@ -245,6 +272,33 @@ func _check_minimap_navigation_contract(failures: Array[String]) -> void:
scene._scroll_board_to_minimap_position(map_rect.get_center())
if scene.board_scroll_offset.distance_squared_to(center_offset) > 0.01:
failures.append("minimap scroll action should apply the calculated center offset: %s vs %s" % [str(scene.board_scroll_offset), str(center_offset)])
scene.board_scroll_offset = Vector2.ZERO
var drag_start := map_rect.position + Vector2(map_rect.size.x * 0.35, map_rect.size.y * 0.35)
var drag_end := map_rect.end
var press := InputEventMouseButton.new()
press.button_index = MOUSE_BUTTON_LEFT
press.pressed = true
press.position = drag_start
if not scene._handle_minimap_mouse_button(press):
failures.append("minimap press inside the map body should be consumed")
if not scene.minimap_dragging:
failures.append("minimap press inside the map body should start dragging")
var drag_motion := InputEventMouseMotion.new()
drag_motion.position = drag_end
var expected_drag_offset: Vector2 = scene._board_scroll_offset_for_minimap_position(drag_end)
if not scene._handle_minimap_mouse_motion(drag_motion):
failures.append("minimap drag motion should be consumed while dragging")
if scene.board_scroll_offset.distance_squared_to(expected_drag_offset) > 0.01:
failures.append("minimap drag should keep recentering the tactical viewport: %s vs %s" % [str(scene.board_scroll_offset), str(expected_drag_offset)])
var release := InputEventMouseButton.new()
release.button_index = MOUSE_BUTTON_LEFT
release.pressed = false
release.position = drag_end
if not scene._handle_minimap_mouse_button(release):
failures.append("minimap release should be consumed after dragging")
if scene.minimap_dragging:
failures.append("minimap release should end dragging")
scene.free()