diff --git a/scripts/main.gd b/scripts/main.gd index b285ee6..12b8658 100644 --- a/scripts/main.gd +++ b/scripts/main.gd @@ -101,6 +101,9 @@ var grid_h := BOTTOM_GRID_H var stockpile_pos := BOTTOM_STOCKPILE_POS var anchor_family := "bottom" var tile_size := Vector2i(56, 56) +var _last_usable_rect: Rect2i +var _dock_recheck_timer: float = 0.0 +const DOCK_RECHECK_COOLDOWN := 0.5 var worker_overlay_nodes: Dictionary = {} func make_panel_style(bg: Color, border: Color, corner_radius: int = 12) -> StyleBoxFlat: @@ -274,6 +277,7 @@ func apply_dock_position() -> void: DisplayServer.window_set_min_size(dock_size) DisplayServer.window_set_size(dock_size) DisplayServer.window_set_position(dock_position_for_anchor(usable_rect, dock_size, dock_anchor)) + _last_usable_rect = usable_rect func update_tile_metrics(dock_anchor: String) -> void: var tile_px: int = tile_px_for_anchor(dock_anchor) @@ -767,6 +771,16 @@ func _on_tick() -> void: func _process(delta: float) -> void: # Edge snapping: snap window to screen edge when dragging near boundary + # Reapply dock geometry when screen work area changes + if _dock_recheck_timer > 0.0: + _dock_recheck_timer -= delta + return + var screen_idx := DisplayServer.window_get_current_screen() + var current_usable := DisplayServer.screen_get_usable_rect(screen_idx) + if current_usable != _last_usable_rect: + _last_usable_rect = current_usable + apply_dock_position() + _dock_recheck_timer = DOCK_RECHECK_COOLDOWN edge_snap_cooldown = maxf(edge_snap_cooldown - delta, 0.0) var current_pos := DisplayServer.window_get_position() var window_size := DisplayServer.window_get_size() diff --git a/tests/test_e2e.gd b/tests/test_e2e.gd index 8775a7b..a9a0965 100644 --- a/tests/test_e2e.gd +++ b/tests/test_e2e.gd @@ -147,7 +147,7 @@ func flow_boot_and_bootstrap() -> void: var loaded = gs.load_game() _assert_not_empty(loaded, "save/load round-trip returns data") _assert_eq(loaded.get("tick", -1), 0, "loaded tick matches") - _assert_eq(loaded.get("save_version", -1), 1, "loaded save_version matches") + _assert_eq(loaded.get("save_version", -1), 2, "loaded save_version matches") _assert_eq(loaded.get("resources", {}).get("wood", -1), 8, "loaded resources.wood matches") @@ -280,7 +280,7 @@ func flow_tick_simulation() -> void: var loaded = gs.load_game() _assert_eq(loaded.get("tick", -1), 5, "tick advanced to 5") _assert(loaded.get("events", []).size() > 0, "events populated after ticks") - _assert_eq(loaded.get("save_version", -1), 1, "save_version still 1") + _assert_eq(loaded.get("save_version", -1), 2, "save_version still 2") # --------------------------------------------------------------------------- @@ -434,7 +434,7 @@ func flow_anchor_switching() -> void: _assert_eq(loaded.get("tick", -1), 20, "tick preserved after anchor switch") _assert_eq(loaded.get("resources", {}).get("wood", -1), 10, "wood preserved") _assert_eq(loaded.get("workers", []).size(), 2, "workers preserved") - _assert_eq(loaded.get("save_version", -1), 1, "save_version preserved") + _assert_eq(loaded.get("save_version", -1), 2, "save_version preserved") # Simulate anchor switch to "bottom" gs.save_game(state) diff --git a/tests/test_runner.gd b/tests/test_runner.gd index d8d93f6..db2c02a 100644 --- a/tests/test_runner.gd +++ b/tests/test_runner.gd @@ -317,7 +317,7 @@ func test_save_version_tracking(gs: Node) -> void: var loaded = gs.load_game() _assert_not_empty(loaded, "save_version: load returned data") - _assert_eq(int(loaded.get("save_version", -1)), 1, "save_version: version is 1") + _assert_eq(int(loaded.get("save_version", -1)), 2, "save_version: version is 2") func test_settings_roundtrip(gs: Node) -> void: