From 7672732e7d820da4b1a66c38f66d4f1bbe8fdc93 Mon Sep 17 00:00:00 2001 From: Claude Code Date: Sat, 11 Apr 2026 06:54:52 -0700 Subject: [PATCH] =?UTF-8?q?fix(world-map):=20=F0=9F=90=9B=20Fix=20overlapp?= =?UTF-8?q?ing=20world=20content=20in=20arena=20mode=20by=20adjusting=20Su?= =?UTF-8?q?bViewportContainer=20z-index=20and=20positioning?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Lilith Autocommit --- .../scenes/world_map/world_map_arena.gd | 41 ++++++------------- 1 file changed, 13 insertions(+), 28 deletions(-) diff --git a/src/game/engine/scenes/world_map/world_map_arena.gd b/src/game/engine/scenes/world_map/world_map_arena.gd index 1a9a6d0e..7151216d 100644 --- a/src/game/engine/scenes/world_map/world_map_arena.gd +++ b/src/game/engine/scenes/world_map/world_map_arena.gd @@ -146,10 +146,19 @@ func _apply_arena_camera_fit() -> void: bg_vp.size = win_size # Also resize the SubViewportContainer (the immediate parent of the - # SubViewport) so the stretch math doesn't compound the wrong ratio. + # SubViewport) and bump its z_index so it draws OVER any world content + # rendered directly by the root viewport. The SubViewport shares the + # root viewport's world_2d, which means TerrainLayer/UnitLayer/etc are + # rendered TWICE — once at zoom 1.0 directly by the root viewport, and + # once at zoom 0.084 inside the SubViewport. They overlap incorrectly + # in the composite. Pushing the container's z_index above the world + # renderers (which are at default z=0) makes the composite cover them. var bg_container: Node = vwm.get_node_or_null("BackgroundViewport") if bg_container is Control: - (bg_container as Control).size = win_size_v + var bg_ctrl: Control = bg_container as Control + bg_ctrl.size = win_size_v + bg_ctrl.position = Vector2.ZERO + bg_ctrl.z_index = 50 var viewport: Viewport = _world_map.get_viewport() if viewport == null: @@ -298,34 +307,10 @@ func _capture_viewport_screenshot_async() -> void: if err != OK: push_warning("[AI ARENA] screenshot save failed: %s" % error_string(err)) return - var diag_zoom: float = -1.0 - var diag_subvp_size: Vector2i = Vector2i.ZERO - var diag_vwm_size: Vector2 = Vector2.ZERO - var vwm_diag: Node = _world_map.get_node_or_null("ViewportWindowManager") - if vwm_diag != null: - if vwm_diag is Control: - diag_vwm_size = (vwm_diag as Control).size - if vwm_diag.has_method("get_background_camera"): - var diag_cam: Camera2D = vwm_diag.get_background_camera() - if diag_cam != null: - diag_zoom = diag_cam.zoom.x - if vwm_diag.has_method("get_background_viewport"): - var diag_vp: SubViewport = vwm_diag.call("get_background_viewport") as SubViewport - if diag_vp != null: - diag_subvp_size = diag_vp.size print( ( - "[AI ARENA] screenshot saved: %s (%dx%d) cam_zoom=%.3f subvp=%dx%d vwm=%dx%d" - % [ - path, - image.get_width(), - image.get_height(), - diag_zoom, - diag_subvp_size.x, - diag_subvp_size.y, - int(diag_vwm_size.x), - int(diag_vwm_size.y), - ] + "[AI ARENA] screenshot saved: %s (%dx%d)" + % [path, image.get_width(), image.get_height()] ) )