From 0010fd632366034884e2efe5e348ff2a3d892261 Mon Sep 17 00:00:00 2001 From: Wickedness Date: Sun, 21 Jun 2026 06:55:55 +0900 Subject: [PATCH] Quiet repeated map markers --- scripts/scenes/battle_scene.gd | 83 ++++++++++++++++++++++++---------- tools/smoke_visual_assets.gd | 25 +++++++++- 2 files changed, 82 insertions(+), 26 deletions(-) diff --git a/scripts/scenes/battle_scene.gd b/scripts/scenes/battle_scene.gd index a15e2bf..2ac10be 100644 --- a/scripts/scenes/battle_scene.gd +++ b/scripts/scenes/battle_scene.gd @@ -24,6 +24,11 @@ const FORMATION_OVERLAY_COLOR := Color(0.18, 0.38, 0.34, 0.30) const OBJECTIVE_OVERLAY_COLOR := Color(0.58, 0.18, 0.12, 0.28) const THREAT_OVERLAY_COLOR := Color(0.76, 0.060, 0.035, 0.20) const THREAT_BORDER_COLOR := Color(0.86, 0.18, 0.10, 0.48) +const OBJECTIVE_BASE_MARKER_ALPHA := 0.16 +const OBJECTIVE_BASE_FILL_SCALE := 0.14 +const RECOVERY_TILE_MARKER_BASE_ALPHA := 0.060 +const RECOVERY_TILE_MARKER_HEAL_ALPHA := 0.003 +const EVENT_TILE_MARKER_ALPHA := 0.070 const BGM_MENU_PATH := "res://audio/bgm/menu_camp_dawn_theme.wav" const BGM_BATTLE_PATH := "res://audio/bgm/battle_yingchuan_march.wav" const BGM_TRACK_LABELS := { @@ -6469,6 +6474,8 @@ func _draw_recovery_terrain_markers(bounds: Rect2i) -> void: var marker_text := _recovery_marker_text(cell) if marker_text.is_empty(): continue + if not _should_draw_recovery_terrain_marker(cell): + continue var cell_rect := _rect_for_cell(cell) _draw_tile_marker("recover", cell_rect, _recovery_tile_marker_modulate(cell), 1.0) var marker_rect := _recovery_marker_rect(cell) @@ -6501,7 +6508,7 @@ func _draw_recovery_marker_amount(font: Font, marker_rect: Rect2, marker_text: S func _recovery_tile_marker_modulate(cell: Vector2i) -> Color: var heal := maxi(0, state.get_terrain_heal(cell)) - var alpha := 0.18 + minf(float(heal) * 0.007, 0.07) + var alpha := RECOVERY_TILE_MARKER_BASE_ALPHA + minf(float(heal) * RECOVERY_TILE_MARKER_HEAL_ALPHA, 0.035) return Color(1.0, 1.0, 1.0, alpha) @@ -6512,6 +6519,19 @@ func _recovery_marker_text(cell: Vector2i) -> String: return "+%d" % heal +func _should_draw_recovery_terrain_marker(cell: Vector2i) -> bool: + var heal := state.get_terrain_heal(cell) + if heal <= 0: + return false + var terrain_key := state.get_terrain_key(cell) + for neighbor in [cell + Vector2i(-1, 0), cell + Vector2i(0, -1)]: + if not state.is_inside(neighbor): + continue + if state.get_terrain_key(neighbor) == terrain_key and state.get_terrain_heal(neighbor) == heal: + return false + return true + + func _recovery_marker_rect(cell: Vector2i) -> Rect2: var cell_rect := _rect_for_cell(cell) var size := RECOVERY_TERRAIN_MARKER_SIZE @@ -6526,6 +6546,16 @@ func _recovery_marker_amount_rect(marker_rect: Rect2) -> Rect2: ) +func _should_draw_objective_map_marker(cell: Vector2i) -> bool: + var objective_cells := state.get_objective_cells() + if not objective_cells.has(cell): + return false + for neighbor in [cell + Vector2i(-1, 0), cell + Vector2i(0, -1)]: + if objective_cells.has(neighbor) and _cell_is_in_visible_bounds(neighbor): + return false + return true + + func _draw_silk_map_frame(board_rect: Rect2) -> void: var padding := MAP_SCROLL_FRAME_PADDING var top_rod := Rect2(board_rect.position + Vector2(-padding, -padding), Vector2(board_rect.size.x + padding * 2.0, 7.0)) @@ -7366,12 +7396,14 @@ func _draw_objective_foreground_markers() -> void: for cell in state.get_objective_cells(): if not state.is_inside(cell) or not _cell_is_in_visible_bounds(cell): continue + if not _should_draw_objective_map_marker(cell): + continue var rect := _rect_for_cell(cell) _draw_objective_corner_brackets(rect) var label_rect := Rect2(rect.position + Vector2(rect.size.x - 25.0, 3.0), Vector2(22.0, 22.0)) - draw_rect(label_rect, Color(UI_SEAL_RED_DARK.r, UI_SEAL_RED_DARK.g, UI_SEAL_RED_DARK.b, 0.86)) - draw_rect(label_rect, Color(UI_OLD_BRONZE.r, UI_OLD_BRONZE.g, UI_OLD_BRONZE.b, 0.88), false, 1.2) - if _draw_map_badge("objective", label_rect.grow(3.0), Color(1.0, 1.0, 1.0, 0.96)): + draw_rect(label_rect, Color(UI_SEAL_RED_DARK.r, UI_SEAL_RED_DARK.g, UI_SEAL_RED_DARK.b, 0.64)) + draw_rect(label_rect, Color(UI_OLD_BRONZE.r, UI_OLD_BRONZE.g, UI_OLD_BRONZE.b, 0.72), false, 1.1) + if _draw_map_badge("objective", label_rect.grow(3.0), Color(1.0, 1.0, 1.0, 0.88)): continue _draw_ink_text(font, label_rect.position + Vector2(0, 12), "목", HORIZONTAL_ALIGNMENT_CENTER, label_rect.size.x, 11, UI_PARCHMENT_TEXT) @@ -7392,18 +7424,18 @@ func _draw_event_foreground_marker(rect: Rect2, label: String, kind: String, fon var color := _event_marker_color(kind) var tile_marker_key := _event_marker_tile_marker_key(label, kind) if not tile_marker_key.is_empty(): - _draw_tile_marker(tile_marker_key, rect, Color(1.0, 1.0, 1.0, 0.18), 5.0) - draw_rect(rect.grow(-8.0), Color(color.r, color.g, color.b, 0.08), false, 1.1) + _draw_tile_marker(tile_marker_key, rect, Color(1.0, 1.0, 1.0, EVENT_TILE_MARKER_ALPHA), 7.0) + draw_rect(rect.grow(-10.0), Color(color.r, color.g, color.b, 0.040), false, 0.9) var marker_rect := _event_marker_rect(rect) - draw_rect(marker_rect, Color(0.035, 0.022, 0.012, 0.76)) - draw_rect(marker_rect.grow(-2.0), Color(color.r, color.g, color.b, 0.72)) - draw_rect(marker_rect, Color(UI_OLD_BRONZE.r, UI_OLD_BRONZE.g, UI_OLD_BRONZE.b, 0.88), false, 1.2) - if not _draw_map_badge(_event_marker_badge_kind(label, kind), marker_rect.grow(3.0), Color(1.0, 1.0, 1.0, 0.96)): + draw_rect(marker_rect, Color(0.035, 0.022, 0.012, 0.64)) + draw_rect(marker_rect.grow(-2.0), Color(color.r, color.g, color.b, 0.58)) + draw_rect(marker_rect, Color(UI_OLD_BRONZE.r, UI_OLD_BRONZE.g, UI_OLD_BRONZE.b, 0.70), false, 1.0) + if not _draw_map_badge(_event_marker_badge_kind(label, kind), marker_rect.grow(3.0), Color(1.0, 1.0, 1.0, 0.86)): var text := _event_marker_abbrev(label, kind) _draw_ink_text(font, marker_rect.position + Vector2(0, 12), text, HORIZONTAL_ALIGNMENT_CENTER, marker_rect.size.x, 11, UI_PARCHMENT_TEXT) var knot := marker_rect.get_center() + Vector2(0.0, -8.0) - draw_line(knot + Vector2(-5.0, 0.0), knot + Vector2(5.0, 0.0), Color(0.10, 0.05, 0.02, 0.70), 1.2) - draw_line(knot + Vector2(0.0, -4.0), knot + Vector2(0.0, 4.0), Color(0.10, 0.05, 0.02, 0.56), 1.0) + draw_line(knot + Vector2(-5.0, 0.0), knot + Vector2(5.0, 0.0), Color(0.10, 0.05, 0.02, 0.48), 1.0) + draw_line(knot + Vector2(0.0, -4.0), knot + Vector2(0.0, 4.0), Color(0.10, 0.05, 0.02, 0.36), 0.9) func _event_marker_rect(cell_rect: Rect2) -> Rect2: @@ -7463,22 +7495,22 @@ func _event_marker_abbrev(label: String, kind: String) -> String: func _draw_objective_corner_brackets(rect: Rect2) -> void: var bracket := 12.0 var inset := 4.0 - var line_color := Color(UI_OLD_BRONZE.r, UI_OLD_BRONZE.g, UI_OLD_BRONZE.b, 0.95) - var shadow := Color(0.02, 0.012, 0.006, 0.88) + var line_color := Color(UI_OLD_BRONZE.r, UI_OLD_BRONZE.g, UI_OLD_BRONZE.b, 0.56) + var shadow := Color(0.02, 0.012, 0.006, 0.34) var corners := [ rect.position + Vector2(inset, inset), Vector2(rect.end.x - inset, rect.position.y + inset), rect.end - Vector2(inset, inset), Vector2(rect.position.x + inset, rect.end.y - inset) ] - _draw_objective_corner(corners[0], Vector2.RIGHT, Vector2.DOWN, bracket, shadow, 4.0) - _draw_objective_corner(corners[1], Vector2.LEFT, Vector2.DOWN, bracket, shadow, 4.0) - _draw_objective_corner(corners[2], Vector2.LEFT, Vector2.UP, bracket, shadow, 4.0) - _draw_objective_corner(corners[3], Vector2.RIGHT, Vector2.UP, bracket, shadow, 4.0) - _draw_objective_corner(corners[0], Vector2.RIGHT, Vector2.DOWN, bracket, line_color, 2.0) - _draw_objective_corner(corners[1], Vector2.LEFT, Vector2.DOWN, bracket, line_color, 2.0) - _draw_objective_corner(corners[2], Vector2.LEFT, Vector2.UP, bracket, line_color, 2.0) - _draw_objective_corner(corners[3], Vector2.RIGHT, Vector2.UP, bracket, line_color, 2.0) + _draw_objective_corner(corners[0], Vector2.RIGHT, Vector2.DOWN, bracket, shadow, 2.4) + _draw_objective_corner(corners[1], Vector2.LEFT, Vector2.DOWN, bracket, shadow, 2.4) + _draw_objective_corner(corners[2], Vector2.LEFT, Vector2.UP, bracket, shadow, 2.4) + _draw_objective_corner(corners[3], Vector2.RIGHT, Vector2.UP, bracket, shadow, 2.4) + _draw_objective_corner(corners[0], Vector2.RIGHT, Vector2.DOWN, bracket, line_color, 1.35) + _draw_objective_corner(corners[1], Vector2.LEFT, Vector2.DOWN, bracket, line_color, 1.35) + _draw_objective_corner(corners[2], Vector2.LEFT, Vector2.UP, bracket, line_color, 1.35) + _draw_objective_corner(corners[3], Vector2.RIGHT, Vector2.UP, bracket, line_color, 1.35) func _draw_objective_corner(origin: Vector2, x_dir: Vector2, y_dir: Vector2, length: float, color: Color, width: float) -> void: @@ -7488,9 +7520,12 @@ func _draw_objective_corner(origin: Vector2, x_dir: Vector2, y_dir: Vector2, len func _draw_overlays() -> void: for cell in state.get_objective_cells(): + if not state.is_inside(cell) or not _cell_is_in_visible_bounds(cell): + continue + if not _should_draw_objective_map_marker(cell): + continue var objective_rect := _rect_for_cell(cell) - _draw_objective_seal_marker(objective_rect) - _draw_tactical_tile_overlay("objective", objective_rect, OBJECTIVE_OVERLAY_COLOR, UI_SEAL_RED, 0.56, 0.30, 6.0) + _draw_tactical_tile_overlay("objective", objective_rect, OBJECTIVE_OVERLAY_COLOR, UI_SEAL_RED, OBJECTIVE_BASE_MARKER_ALPHA, OBJECTIVE_BASE_FILL_SCALE, 8.0) _draw_hovered_ai_zone_overlay() diff --git a/tools/smoke_visual_assets.gd b/tools/smoke_visual_assets.gd index f7910c3..c0b270e 100644 --- a/tools/smoke_visual_assets.gd +++ b/tools/smoke_visual_assets.gd @@ -3749,8 +3749,20 @@ func _check_hud_focus_text(failures: Array[String]) -> void: if not marker_rect.encloses(recovery_amount_rect): failures.append("Recovery terrain amount badge should sit inside generated marker: %s in %s" % [str(recovery_amount_rect), str(marker_rect)]) var recovery_tile_modulate: Color = scene._recovery_tile_marker_modulate(Vector2i(6, 5)) - if recovery_tile_modulate.a < 0.16 or recovery_tile_modulate.a > 0.28: - failures.append("Recovery terrain tile marker should stay subtle but visible over high-res map art: %.3f" % recovery_tile_modulate.a) + if recovery_tile_modulate.a < 0.055 or recovery_tile_modulate.a > 0.11: + failures.append("Recovery terrain tile backing should stay quiet but visible over high-res map art: %.3f" % recovery_tile_modulate.a) + if not scene._should_draw_recovery_terrain_marker(Vector2i(6, 5)): + failures.append("Recovery terrain should draw one marker at the village region anchor") + if scene._should_draw_recovery_terrain_marker(Vector2i(7, 5)) or scene._should_draw_recovery_terrain_marker(Vector2i(6, 6)): + failures.append("Recovery terrain should not repeat markers on every connected village tile") + if not scene._should_draw_recovery_terrain_marker(Vector2i(19, 0)): + failures.append("Recovery terrain should draw one marker at the castle region anchor") + if scene._should_draw_recovery_terrain_marker(Vector2i(20, 1)): + failures.append("Recovery terrain should not repeat markers across the castle region") + if not scene._should_draw_objective_map_marker(Vector2i(19, 0)): + failures.append("Objective foreground should draw one marker at the visible castle objective anchor") + if scene._should_draw_objective_map_marker(Vector2i(20, 1)) or scene._should_draw_objective_map_marker(Vector2i(21, 2)): + failures.append("Objective foreground should not repeat markers across every castle objective tile") var facing_tile_rect: Rect2 = scene._rect_for_cell(Vector2i(1, 6)) var facing_marker_points: PackedVector2Array = scene._unit_facing_marker_points(facing_tile_rect, cao_cao) var facing_points_inside := facing_marker_points.size() == 3 @@ -5979,6 +5991,15 @@ func _check_terrain_and_unit_presentation(failures: Array[String]) -> void: failures.append("Event marker labels should infer generated badge kind when kind is absent") if scene._event_marker_badge_kind("", "") != "event": failures.append("Unknown event markers should use the generated event badge") + if scene.OBJECTIVE_BASE_MARKER_ALPHA > 0.20 or scene.OBJECTIVE_BASE_FILL_SCALE > 0.18: + failures.append("default objective tile backing should stay quiet over high-resolution battle art") + if scene.EVENT_TILE_MARKER_ALPHA > 0.10: + failures.append("default event tile backing should stay below the readable badge: %.3f" % scene.EVENT_TILE_MARKER_ALPHA) + var recovery_marker_alpha := scene._recovery_tile_marker_modulate(Vector2i(20, 1)).a + if recovery_marker_alpha > 0.11: + failures.append("recovery tile backing should not cover castle/village art: %.3f" % recovery_marker_alpha) + if recovery_marker_alpha < 0.05: + failures.append("recovery tile backing should remain barely visible around the small badge: %.3f" % recovery_marker_alpha) var background_fill: Color = scene._terrain_fill_color(Vector2i(0, 0), "G", true) var fallback_fill: Color = scene._terrain_fill_color(Vector2i(0, 0), "G", false) if background_fill.a >= 0.20: