diff --git a/data/defs/terrain.json b/data/defs/terrain.json index 46ff5ae..555865d 100644 --- a/data/defs/terrain.json +++ b/data/defs/terrain.json @@ -23,6 +23,14 @@ "avoid": 5, "move_cost": { "foot": 2, "mounted": 3, "archer": 2, "water": 99 } }, + "D": { + "id": "wasteland", + "name": "황무지", + "color": "#96734a", + "defense": 0, + "avoid": 0, + "move_cost": { "foot": 1, "mounted": 2, "archer": 1, "water": 99 } + }, "R": { "id": "road", "name": "관도", diff --git a/data/scenarios/014_cangting_pursuit.json b/data/scenarios/014_cangting_pursuit.json index 302381d..d634ba3 100644 --- a/data/scenarios/014_cangting_pursuit.json +++ b/data/scenarios/014_cangting_pursuit.json @@ -176,16 +176,16 @@ "width": 17, "height": 11, "terrain": [ - "GGGGGHHGGGGGGGGGG", - "GGFFGHHGGGFFGGGGG", - "GGRRRRRRRRRRRGFFG", - "GGGGGRGGGGRRGGGGG", + "DDGGGHHGGGGGGDDDD", + "GGFFGHHGGGFFGDDDG", + "DDRRRRRRRRRRRDFFG", + "DGGGGRGDGGRRGDDGG", "RRRRRRRRRRRRRRRRG", - "GGGGGRGGGGRRGGGGG", - "GGHHGFFFGGFFFGGGG", - "GGHHGFFFGGFFFGGGG", - "GGGGGGFFGGHHHGGGG", - "GGFFGGGGGGHHHFFGG", + "DGGGGRGDGGRRGGDGG", + "DDHHGFFFGGFFFGDGG", + "DDHHGFFFGGFFFGDDG", + "DDDGGGFFGGHHHDDGG", + "GGFFGGDGGGHHHFFDD", "GGGGGGGGGGGGGGGGG" ] }, diff --git a/data/scenarios/015_ye_campaign.json b/data/scenarios/015_ye_campaign.json index 8f71100..907300b 100644 --- a/data/scenarios/015_ye_campaign.json +++ b/data/scenarios/015_ye_campaign.json @@ -181,15 +181,15 @@ "width": 18, "height": 11, "terrain": [ - "GGGGGHHGGGGGGGGGGG", - "GGFFGHHGGGFFGGGFFG", - "GGRRRRRRRRRRRRGFFG", - "GGGGGRGGGGRRGGGGGG", + "GGGGGHHCCCCCCCCCCC", + "GGFFGHHGCCCCCCGFFG", + "DDRRRRRRRRRRRRGFFG", + "DGGGGRDDDGRRGGDGGG", "RRRRRRRRRRRRRRRRRR", - "GGGGGRGGGGRRGGGGGG", + "DGGGDRDDDGRRGGDGGD", + "DDHHGFFFGGFFFGGHHD", "GGHHGFFFGGFFFGGHHG", - "GGHHGFFFGGFFFGGHHG", - "GGGGGGFFGGHHHGGGGG", + "DDGGGGFFGGHHHDDGGG", "GGFFGGGGGGHHHFFGGG", "GGGGGGGGGGGGGGGGGG" ] diff --git a/data/scenarios/016_ye_siege.json b/data/scenarios/016_ye_siege.json index 93ed907..3a545c4 100644 --- a/data/scenarios/016_ye_siege.json +++ b/data/scenarios/016_ye_siege.json @@ -176,13 +176,13 @@ "width": 18, "height": 11, "terrain": [ - "GGGGGHHGGGGGGGGGGG", - "GGFFGHHGGGFFGGGFFG", - "GGRRRRRRRRRRRRGFFG", - "GGGGGRGGGGRRGGGGGG", - "RRRRRRRRRRRRRRRRRR", - "GGGGGRGGGGRRGGGGGG", - "GGHHGFFFGGFFFGGHHG", + "CCCCCCCCCCCCCCCCCC", + "DDDDCCCCCCCCCCDDDD", + "DDRRRRRRCCCCCRGDDG", + "DGGGGRDDDGCCGGGDDD", + "RRRRCCCCCCRRCCRCRC", + "DGGGDRDDDGCCGGDGGD", + "DDHHDDDDGGDDDGGDDD", "GGHHGFFFGGFFFGGHHG", "GGGGGGFFGGHHHGGGGG", "GGFFGGGGGGHHHFFGGG", diff --git a/data/scenarios/017_ye_surrender.json b/data/scenarios/017_ye_surrender.json index db1547b..ee5f89b 100644 --- a/data/scenarios/017_ye_surrender.json +++ b/data/scenarios/017_ye_surrender.json @@ -176,12 +176,12 @@ "width": 18, "height": 11, "terrain": [ - "GGGGGHHGGGGGGGGGGG", - "GGFFGHHGGGFFGGGFFG", - "GGRRRRRRRRRRRRGFFG", - "GGGGGRGGGGRRGGGGGG", - "RRRRRRRRRRRRRRRRRR", - "GGGGGRGGGGRRGGGGGG", + "CCCCCCCCCCCCCCCCCC", + "CCFFCCCCCCCCCCFFCC", + "GGRRRRRRCCCCCRGFFG", + "GGGGGRDGGGCCGGGDGG", + "RRRRCCCCCCRCRCRCRC", + "DGGGDRDDDGCCGGDGGD", "GGHHGFFFGGFFFGGHHG", "GGHHGFFFGGFFFGGHHG", "GGGGGGFFGGHHHGGGGG", diff --git a/scripts/core/battle_state.gd b/scripts/core/battle_state.gd index 78474a6..add8c00 100644 --- a/scripts/core/battle_state.gd +++ b/scripts/core/battle_state.gd @@ -66,6 +66,13 @@ const DEFAULT_TERRAIN_DEFS := { "avoid": 5, "color": Color(0.55, 0.50, 0.34) }, + "D": { + "name": "황무지", + "move_cost": {"foot": 1, "mounted": 2, "archer": 1, "water": 99}, + "defense": 0, + "avoid": 0, + "color": Color(0.59, 0.45, 0.29) + }, "R": { "name": "관도", "move_cost": 1, diff --git a/scripts/scenes/battle_scene.gd b/scripts/scenes/battle_scene.gd index 791d170..ba06e38 100644 --- a/scripts/scenes/battle_scene.gd +++ b/scripts/scenes/battle_scene.gd @@ -103,6 +103,9 @@ const UI_SEAL_RED_DARK := Color(0.28, 0.020, 0.014, 1.0) const UI_CHARCOAL_WASH := Color(0.045, 0.026, 0.016, 1.0) const UI_SCROLL_CENTER := Color(0.74, 0.58, 0.32, 0.996) const UI_SCROLL_EDGE := Color(0.43, 0.25, 0.095, 0.996) +const UI_OLD_SILK := Color(0.61, 0.43, 0.20, 0.997) +const UI_BURNT_PAPER := Color(0.33, 0.19, 0.075, 0.996) +const UI_BRUSH_RULE := Color(0.12, 0.060, 0.026, 0.98) const MAP_SCROLL_FRAME_PADDING := 12.0 const SPEAKER_DISPLAY_NAMES := { "Cao Cao": "조조", @@ -452,17 +455,17 @@ func _apply_panel_style(panel: PanelContainer, variant: String) -> void: var shadow_size := 6 match variant: "paper": - fill = Color(0.58, 0.39, 0.17, 0.997) - border = UI_SCROLL_EDGE - border_width = 9 - margin = 22 - shadow_size = 18 + fill = UI_BURNT_PAPER + border = UI_BAMBOO_DARK + border_width = 12 + margin = 18 + shadow_size = 24 "edict": - fill = Color(0.70, 0.55, 0.30, 0.997) - border = UI_SCROLL_EDGE - border_width = 6 + fill = Color(0.67, 0.49, 0.25, 0.998) + border = UI_BRUSH_RULE + border_width = 7 margin = 16 - shadow_size = 7 + shadow_size = 9 "edict_compact": fill = Color(0.66, 0.50, 0.27, 0.996) border = UI_SCROLL_EDGE @@ -491,17 +494,17 @@ func _apply_panel_style(panel: PanelContainer, variant: String) -> void: border_width = 5 margin = 3 "dialogue": - fill = Color(0.045, 0.018, 0.010, 0.998) - border = UI_TARNISHED_BRONZE - border_width = 9 + fill = Color(0.030, 0.012, 0.007, 0.998) + border = UI_BAMBOO_DARK + border_width = 11 margin = 20 - shadow_size = 22 + shadow_size = 26 "speech_scroll": - fill = Color(0.70, 0.54, 0.29, 0.998) - border = UI_SCROLL_EDGE - border_width = 6 + fill = UI_OLD_SILK + border = UI_BRUSH_RULE + border_width = 7 margin = 15 - shadow_size = 4 + shadow_size = 7 "notice": fill = Color(0.070, 0.020, 0.014, 0.982) border = UI_SEAL_RED @@ -513,11 +516,11 @@ func _apply_panel_style(panel: PanelContainer, variant: String) -> void: border_width = 5 margin = 4 "silk_map": - fill = Color(0.54, 0.38, 0.18, 0.992) - border = UI_SCROLL_EDGE - border_width = 4 + fill = Color(0.45, 0.30, 0.13, 0.994) + border = UI_BRUSH_RULE + border_width = 5 margin = 10 - shadow_size = 5 + shadow_size = 7 "compact": fill = Color(0.058, 0.026, 0.014, 0.988) border = UI_TARNISHED_BRONZE @@ -537,11 +540,11 @@ func _apply_panel_style(panel: PanelContainer, variant: String) -> void: margin = 5 shadow_size = 2 "result_tablet": - fill = Color(0.54, 0.36, 0.15, 0.997) - border = UI_SCROLL_EDGE - border_width = 9 + fill = UI_BURNT_PAPER + border = UI_BAMBOO_DARK + border_width = 11 margin = 20 - shadow_size = 16 + shadow_size = 22 "command_seal": fill = Color(0.065, 0.020, 0.012, 0.992) border = UI_TARNISHED_BRONZE @@ -754,6 +757,36 @@ func _make_ink_wash_rule(width: float = 0.0, height: float = 7.0) -> HBoxContain return row +func _make_edict_title_strip(labels: Array, width: float = 0.0, height: float = 24.0) -> HBoxContainer: + var row := HBoxContainer.new() + row.custom_minimum_size = Vector2(width, height) + row.size_flags_horizontal = Control.SIZE_EXPAND_FILL + row.mouse_filter = Control.MOUSE_FILTER_IGNORE + row.add_theme_constant_override("separation", 4) + row.add_child(_make_lacquer_clasp(height)) + row.add_child(_make_binding_strip(5.0, UI_TARNISHED_BRONZE, 0.0)) + for label_text in labels: + row.add_child(_make_seal_tile(str(label_text), height)) + row.add_child(_make_binding_strip(5.0, UI_TARNISHED_BRONZE, 0.0)) + row.add_child(_make_lacquer_clasp(height)) + return row + + +func _make_seal_tile(text: String, size: float = 24.0) -> PanelContainer: + var panel := PanelContainer.new() + panel.custom_minimum_size = Vector2(size, size) + panel.mouse_filter = Control.MOUSE_FILTER_IGNORE + panel.add_theme_stylebox_override("panel", _make_panel_style(UI_SEAL_RED_DARK, UI_OLD_BRONZE, 2, 0, 3, 0)) + var label := Label.new() + label.text = text + label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER + label.custom_minimum_size = Vector2(size - 6.0, size - 6.0) + _apply_label_style(label, UI_PARCHMENT_TEXT, 13) + panel.add_child(label) + return panel + + func _make_seal_ribbon(width: float = 0.0, height: float = 18.0) -> HBoxContainer: var row := HBoxContainer.new() row.custom_minimum_size = Vector2(width, height) @@ -1314,14 +1347,23 @@ func _create_hud() -> void: briefing_panel = PanelContainer.new() briefing_panel.visible = false - briefing_panel.position = Vector2(248, 52) - briefing_panel.size = Vector2(784, 660) + briefing_panel.position = Vector2(212, 16) + briefing_panel.size = Vector2(856, 688) _apply_panel_style(briefing_panel, "paper") root.add_child(briefing_panel) + var briefing_shell := HBoxContainer.new() + briefing_shell.custom_minimum_size = Vector2(800, 632) + briefing_shell.add_theme_constant_override("separation", 10) + briefing_panel.add_child(briefing_shell) + briefing_shell.add_child(_make_bamboo_gutter(22, 632)) + var briefing_column := VBoxContainer.new() - briefing_column.add_theme_constant_override("separation", 7) - briefing_panel.add_child(briefing_column) + briefing_column.add_theme_constant_override("separation", 5) + briefing_shell.add_child(briefing_column) + briefing_shell.add_child(_make_bamboo_gutter(22, 632)) + briefing_column.add_child(_make_scroll_rod(680, 6)) + briefing_column.add_child(_make_edict_title_strip(["魏", "軍", "令"], 680, 24)) briefing_column.add_child(_make_tablet_binding(680, 16)) var briefing_title_panel := PanelContainer.new() @@ -1347,8 +1389,8 @@ func _create_hud() -> void: _apply_label_style(briefing_location_label, UI_INK_WASH, 14) briefing_column.add_child(briefing_location_label) - briefing_column.add_child(_make_scroll_rod(680, 4)) - briefing_column.add_child(_make_section_caption("軍令 勝敗 죽간", 680)) + briefing_column.add_child(_make_scroll_rod(680, 5)) + briefing_column.add_child(_make_section_caption("軍令 · 勝敗之條", 680)) briefing_objective_panel = PanelContainer.new() briefing_objective_panel.custom_minimum_size = Vector2(680, 104) @@ -1371,8 +1413,8 @@ func _create_hud() -> void: briefing_objective_row.add_child(_make_edict_marker_stack(["軍", "功", "封"], 84)) briefing_objective_row.add_child(_make_bamboo_gutter(18, 84)) - briefing_column.add_child(_make_ink_wash_rule(680, 7)) - briefing_column.add_child(_make_section_caption("비단 전장도 · 군막 장계", 680)) + briefing_column.add_child(_make_ink_wash_rule(680, 8)) + briefing_column.add_child(_make_section_caption("戰圖 · 軍幕 장계", 680)) briefing_camp_overview_panel = PanelContainer.new() briefing_camp_overview_panel.custom_minimum_size = Vector2(680, 102) @@ -1422,7 +1464,7 @@ func _create_hud() -> void: briefing_camp_overview_row.add_child(briefing_camp_overview_label) briefing_camp_overview_shell.add_child(_make_bamboo_gutter(14, 72)) - briefing_column.add_child(_make_scroll_rod(680, 3)) + briefing_column.add_child(_make_scroll_rod(680, 4)) var briefing_scroll := ScrollContainer.new() briefing_scroll.custom_minimum_size = Vector2(680, 66) @@ -1435,6 +1477,7 @@ func _create_hud() -> void: briefing_scroll.add_child(briefing_label) briefing_column.add_child(_make_tablet_binding(680, 14)) + briefing_column.add_child(_make_edict_title_strip(["印", "兵", "發"], 680, 22)) var prep_button_row := HBoxContainer.new() prep_button_row.add_theme_constant_override("separation", 8) @@ -1680,13 +1723,14 @@ func _create_hud() -> void: dialogue_column = VBoxContainer.new() dialogue_column.custom_minimum_size = DIALOGUE_COLUMN_SIZE dialogue_column.size_flags_horizontal = Control.SIZE_EXPAND_FILL - dialogue_column.add_theme_constant_override("separation", 7) + dialogue_column.add_theme_constant_override("separation", 4) dialogue_row.add_child(dialogue_column) dialogue_right_tassel = _make_hanging_tassel(DIALOGUE_PORTRAIT_SIZE.y) dialogue_row.add_child(dialogue_right_tassel) dialogue_column.add_child(_make_tablet_binding(DIALOGUE_TEXT_SIZE.x, 13)) + dialogue_column.add_child(_make_edict_title_strip(["軍", "談", "錄"], DIALOGUE_TEXT_SIZE.x, 22)) dialogue_seal_ribbon = _make_seal_ribbon(DIALOGUE_TEXT_SIZE.x, 18) dialogue_column.add_child(dialogue_seal_ribbon) @@ -2404,6 +2448,8 @@ func _terrain_fill_color(cell: Vector2i, terrain_key: String, has_background: bo alpha += 0.04 elif terrain_key == "C" or terrain_key == "H": alpha += 0.02 + elif terrain_key == "D": + alpha += 0.015 color.a = alpha return color @@ -2415,7 +2461,13 @@ func _map_grid_color(has_background: bool) -> Color: func _draw_terrain_detail(cell: Vector2i, rect: Rect2, terrain_key: String) -> void: - if terrain_key == "F": + if terrain_key == "G": + for index in range(3): + var point := _terrain_detail_point(cell, rect, index + 15) + var tint := Color(0.74, 0.88, 0.42, 0.24 + _cell_noise(cell, index + 101) * 0.10) + draw_line(point, point + Vector2(3, -7), tint, 1.2) + draw_line(point + Vector2(5, 3), point + Vector2(9, -3), Color(0.46, 0.66, 0.28, 0.18), 1.0) + elif terrain_key == "F": for index in range(4): var point := _terrain_detail_point(cell, rect, index) draw_circle(point, 4.5 + _cell_noise(cell, index + 11) * 2.0, Color(0.05, 0.20, 0.09, 0.42)) @@ -2424,8 +2476,11 @@ func _draw_terrain_detail(cell: Vector2i, rect: Rect2, terrain_key: String) -> v for index in range(3): var point := _terrain_detail_point(cell, rect, index + 8) var peak := point + Vector2(0, -9) - draw_line(point + Vector2(-10, 8), peak, Color(0.88, 0.84, 0.72, 0.38), 2.0) - draw_line(peak, point + Vector2(10, 8), Color(0.22, 0.20, 0.16, 0.34), 2.0) + draw_line(point + Vector2(-12, 9), peak, Color(0.92, 0.86, 0.68, 0.46), 2.2) + draw_line(peak, point + Vector2(12, 9), Color(0.20, 0.18, 0.14, 0.42), 2.2) + draw_line(point + Vector2(-5, 5), point + Vector2(5, 6), Color(0.10, 0.09, 0.07, 0.20), 1.1) + elif terrain_key == "D": + _draw_wasteland_detail(cell, rect) elif terrain_key == "R": _draw_road_detail(cell, rect) elif terrain_key == "W": @@ -2434,11 +2489,6 @@ func _draw_terrain_detail(cell: Vector2i, rect: Rect2, terrain_key: String) -> v draw_line(rect.position + Vector2(10, y - rect.position.y), rect.position + Vector2(rect.size.x - 10, y - rect.position.y + 4), Color(0.70, 0.88, 1.0, 0.32), 1.6) _draw_water_shoreline(cell, rect) elif terrain_key == "C": - draw_rect(rect.grow(-7.0), Color(0.16, 0.15, 0.14, 0.28), false, 2.0) - draw_line(rect.position + Vector2(10, 21), rect.position + Vector2(rect.size.x - 10, 21), Color(0.84, 0.80, 0.72, 0.30), 1.4) - draw_line(rect.position + Vector2(10, 39), rect.position + Vector2(rect.size.x - 10, 39), Color(0.84, 0.80, 0.72, 0.22), 1.2) - draw_line(rect.position + Vector2(23, 11), rect.position + Vector2(23, rect.size.y - 11), Color(0.05, 0.05, 0.05, 0.20), 1.2) - draw_line(rect.position + Vector2(43, 11), rect.position + Vector2(43, rect.size.y - 11), Color(0.05, 0.05, 0.05, 0.20), 1.2) _draw_castle_detail(rect) else: for index in range(2): @@ -2482,10 +2532,29 @@ func _draw_water_shoreline(cell: Vector2i, rect: Rect2) -> void: draw_line(rect.position + Vector2(rect.size.x - 6, 7), rect.position + Vector2(rect.size.x - 4, rect.size.y - 7), shore, 2.0) +func _draw_wasteland_detail(cell: Vector2i, rect: Rect2) -> void: + var crack := Color(0.16, 0.10, 0.055, 0.32) + var dust := Color(0.86, 0.68, 0.42, 0.20) + for index in range(3): + var point := _terrain_detail_point(cell, rect, index + 31) + var end := point + Vector2(10.0 + _cell_noise(cell, index + 41) * 8.0, -2.0 + _cell_noise(cell, index + 43) * 5.0) + draw_line(point, end, crack, 1.2) + draw_line(point + Vector2(2, 5), point + Vector2(9, 7), dust, 1.0) + for index in range(2): + var pebble := _terrain_detail_point(cell, rect, index + 61) + draw_circle(pebble, 1.6 + _cell_noise(cell, index + 63) * 1.2, Color(0.24, 0.18, 0.12, 0.24)) + + func _draw_castle_detail(rect: Rect2) -> void: + draw_rect(rect.grow(-6.0), Color(0.12, 0.115, 0.105, 0.32), false, 2.2) + draw_rect(rect.grow(-12.0), Color(0.86, 0.80, 0.68, 0.12)) + for y in [15.0, 30.0, 45.0]: + draw_line(rect.position + Vector2(9, y), rect.position + Vector2(rect.size.x - 9, y + 1.5), Color(0.86, 0.82, 0.74, 0.34), 1.2) + for x in [18.0, 34.0, 50.0]: + draw_line(rect.position + Vector2(x, 10), rect.position + Vector2(x + 1.5, rect.size.y - 10), Color(0.04, 0.04, 0.04, 0.26), 1.1) for index in range(3): var notch := Rect2(rect.position + Vector2(11.0 + float(index) * 16.0, 7.0), Vector2(8.0, 5.0)) - draw_rect(notch, Color(0.84, 0.80, 0.72, 0.22)) + draw_rect(notch, Color(0.84, 0.80, 0.72, 0.28)) func _draw_terrain_edge_blend(cell: Vector2i, rect: Rect2, terrain_key: String) -> void: @@ -2538,6 +2607,8 @@ func _terrain_edge_priority(terrain_key: String) -> int: return 40 if terrain_key == "H": return 30 + if terrain_key == "D": + return 25 if terrain_key == "R": return 20 return 10 @@ -2548,6 +2619,8 @@ func _terrain_edge_color(terrain_key: String, neighbor_key: String) -> Color: return Color(0.03, 0.16, 0.06, 0.34) if terrain_key == "H": return Color(0.88, 0.78, 0.48, 0.26) + if terrain_key == "D": + return Color(0.82, 0.58, 0.32, 0.28) if terrain_key == "W": return Color(0.72, 0.90, 1.0, 0.28) if terrain_key == "C": diff --git a/tools/smoke_visual_assets.gd b/tools/smoke_visual_assets.gd index f0f707b..b5af1bb 100644 --- a/tools/smoke_visual_assets.gd +++ b/tools/smoke_visual_assets.gd @@ -2717,17 +2717,17 @@ func _check_ancient_ui_theme(failures: Array[String]) -> void: for expected in ["勝令", "敗兆", "戰功 죽간", "凶兆 징후"]: if not mission_text.contains(expected): failures.append("mission panel should use old campaign wording `%s`: %s" % [expected, mission_text]) - _check_panel_style_fill(failures, scene.briefing_panel, "briefing panel", Color(0.58, 0.39, 0.17, 0.997)) - _check_panel_style_frame(failures, scene.briefing_panel, "briefing panel", Color(0.43, 0.25, 0.095, 0.996), 10) - _check_panel_style_fill(failures, scene.briefing_objective_panel, "briefing objective edict panel", Color(0.70, 0.55, 0.30, 0.997)) - _check_panel_style_frame(failures, scene.briefing_objective_panel, "briefing objective edict panel", Color(0.43, 0.25, 0.095, 0.996), 6) - _check_panel_style_fill(failures, scene.briefing_camp_overview_panel, "briefing silk map panel", Color(0.54, 0.38, 0.18, 0.992)) - _check_panel_style_frame(failures, scene.briefing_camp_overview_panel, "briefing silk map panel", Color(0.43, 0.25, 0.095, 0.996), 4) - _check_panel_style_fill(failures, scene.dialogue_panel, "dialogue panel", Color(0.045, 0.018, 0.010, 0.998)) - _check_panel_style_frame(failures, scene.dialogue_panel, "dialogue panel", Color(0.50, 0.36, 0.16, 1.0), 10) + _check_panel_style_fill(failures, scene.briefing_panel, "briefing panel", Color(0.33, 0.19, 0.075, 0.996)) + _check_panel_style_frame(failures, scene.briefing_panel, "briefing panel", Color(0.20, 0.11, 0.045, 1.0), 13) + _check_panel_style_fill(failures, scene.briefing_objective_panel, "briefing objective edict panel", Color(0.67, 0.49, 0.25, 0.998)) + _check_panel_style_frame(failures, scene.briefing_objective_panel, "briefing objective edict panel", Color(0.12, 0.060, 0.026, 0.98), 7) + _check_panel_style_fill(failures, scene.briefing_camp_overview_panel, "briefing silk map panel", Color(0.45, 0.30, 0.13, 0.994)) + _check_panel_style_frame(failures, scene.briefing_camp_overview_panel, "briefing silk map panel", Color(0.12, 0.060, 0.026, 0.98), 5) + _check_panel_style_fill(failures, scene.dialogue_panel, "dialogue panel", Color(0.030, 0.012, 0.007, 0.998)) + _check_panel_style_frame(failures, scene.dialogue_panel, "dialogue panel", Color(0.20, 0.11, 0.045, 1.0), 12) _check_panel_style_fill(failures, scene.dialogue_portrait_panel, "dialogue portrait panel", Color(0.035, 0.014, 0.008, 1.0)) _check_panel_style_fill(failures, scene.dialogue_speaker_panel, "dialogue speaker seal panel", Color(0.28, 0.020, 0.014, 1.0)) - _check_panel_style_fill(failures, scene.dialogue_text_panel, "dialogue text scroll panel", Color(0.70, 0.54, 0.29, 0.998)) + _check_panel_style_fill(failures, scene.dialogue_text_panel, "dialogue text scroll panel", Color(0.61, 0.43, 0.20, 0.997)) _check_seal_ribbon(failures, scene.briefing_seal_ribbon, "briefing seal ribbon") _check_seal_ribbon(failures, scene.dialogue_seal_ribbon, "dialogue seal ribbon") _check_seal_ribbon(failures, scene.result_seal_ribbon, "result seal ribbon") @@ -2798,7 +2798,7 @@ func _check_ancient_ui_theme(failures: Array[String]) -> void: scene._update_briefing_camp_overview(scene.state.get_briefing(), false) if scene.briefing_camp_overview_fallback_label == null or scene.briefing_camp_overview_fallback_label.text != "비단 전장도": failures.append("briefing map fallback should read as an old campaign map") - _check_panel_style_fill(failures, scene.result_panel, "result panel", Color(0.54, 0.36, 0.15, 0.997)) + _check_panel_style_fill(failures, scene.result_panel, "result panel", Color(0.33, 0.19, 0.075, 0.996)) if not scene._format_victory_result_text().contains("승전 조서"): failures.append("victory result should read like a bronze proclamation") if not scene._format_defeat_result_text().contains("패전 비문"): @@ -3100,6 +3100,17 @@ func _check_terrain_and_unit_presentation(failures: Array[String]) -> void: failures.append("matching terrain should not draw edge blends") if scene._terrain_edge_width("W", "G") <= scene._terrain_edge_width("G", "F"): failures.append("water shoreline edge should be wider than grass blend") + var wasteland_fill: Color = scene._terrain_fill_color(Vector2i(0, 0), "D", true) + if wasteland_fill.a <= background_fill.a: + failures.append("wasteland fill should sit slightly above grass over background art") + if scene._terrain_edge_color("D", "G").a <= 0.0: + failures.append("wasteland edge blend should be visible") + if scene._terrain_edge_priority("D") <= scene._terrain_edge_priority("R"): + failures.append("wasteland should draw over roads at broken dirt edges") + if not scene.state.load_battle("res://data/scenarios/014_cangting_pursuit.json"): + failures.append("could not load Cangting Pursuit for wasteland presentation helpers") + elif scene._terrain_key_at(Vector2i(0, 0)) != "D" or scene.state.get_terrain_name(Vector2i(0, 0)) != "황무지": + failures.append("Cangting Pursuit should expose wasteland terrain at the dry outer edge") if not scene.state.load_battle("res://data/scenarios/002_sishui_gate.json"): failures.append("could not load Sishui Gate for road presentation helpers") else: