diff --git a/scripts/scenes/battle_scene.gd b/scripts/scenes/battle_scene.gd index a065e74..46bfbc7 100644 --- a/scripts/scenes/battle_scene.gd +++ b/scripts/scenes/battle_scene.gd @@ -218,6 +218,7 @@ var mission_detail_label: Label var objective_notice_panel: PanelContainer var objective_notice_label: Label var ui_root_control: Control +var screen_backdrop: ColorRect var hud_unit_portrait_panel: PanelContainer var hud_unit_portrait_texture: TextureRect var hud_unit_portrait_label: Label @@ -456,37 +457,37 @@ func _apply_panel_style(panel: PanelContainer, variant: String) -> void: var shadow_size := 6 match variant: "paper": - fill = Color(0.42, 0.27, 0.10, 0.997) - border = UI_SOOT_EDGE - border_width = 13 - margin = 20 - shadow_size = 18 + fill = Color(0.54, 0.36, 0.14, 0.997) + border = UI_LACQUER_EDGE + border_width = 15 + margin = 24 + shadow_size = 24 "edict": - fill = Color(0.58, 0.39, 0.16, 0.998) - border = UI_INK_WASH - border_width = 8 - margin = 16 - shadow_size = 9 - "edict_compact": - fill = Color(0.48, 0.31, 0.13, 0.996) + fill = Color(0.67, 0.49, 0.24, 0.998) + border = UI_BRUSH_RULE + border_width = 10 + margin = 18 + shadow_size = 12 + "edict_compact": + fill = Color(0.55, 0.36, 0.15, 0.996) border = UI_BRUSH_RULE - border_width = 3 - margin = 6 - shadow_size = 2 - "notice_edict": - fill = Color(0.54, 0.34, 0.13, 0.998) - border = UI_INK_WASH - border_width = 7 - margin = 12 - shadow_size = 10 - "seal": - fill = Color(0.18, 0.018, 0.010, 1.0) - border = UI_OLD_BRONZE border_width = 4 + margin = 6 + shadow_size = 4 + "notice_edict": + fill = Color(0.62, 0.42, 0.17, 0.998) + border = UI_LACQUER_EDGE + border_width = 9 + margin = 14 + shadow_size = 14 + "seal": + fill = Color(0.12, 0.014, 0.008, 1.0) + border = UI_OLD_BRONZE + border_width = 5 margin = 10 "speaker_seal": - fill = UI_SEAL_RED_DARK - border = UI_TARNISHED_BRONZE + fill = Color(0.36, 0.025, 0.016, 0.995) + border = UI_OLD_BRONZE border_width = 4 margin = 9 "portrait": @@ -495,17 +496,17 @@ func _apply_panel_style(panel: PanelContainer, variant: String) -> void: border_width = 5 margin = 3 "dialogue": - fill = Color(0.10, 0.045, 0.020, 0.975) - border = UI_SOOT_EDGE - border_width = 11 - margin = 20 - shadow_size = 18 + fill = Color(0.070, 0.024, 0.012, 0.986) + border = Color(0.37, 0.20, 0.070, 1.0) + border_width = 13 + margin = 22 + shadow_size = 22 "speech_scroll": - fill = Color(0.64, 0.43, 0.18, 0.998) - border = UI_INK_WASH - border_width = 8 - margin = 15 - shadow_size = 7 + fill = Color(0.72, 0.53, 0.25, 0.998) + border = UI_BRUSH_RULE + border_width = 9 + margin = 17 + shadow_size = 9 "notice": fill = Color(0.070, 0.020, 0.014, 0.982) border = UI_SEAL_RED @@ -517,11 +518,11 @@ func _apply_panel_style(panel: PanelContainer, variant: String) -> void: border_width = 6 margin = 4 "silk_map": - fill = Color(0.35, 0.22, 0.085, 0.994) - border = UI_INK_WASH - border_width = 6 + fill = Color(0.42, 0.27, 0.095, 0.995) + border = UI_BRUSH_RULE + border_width = 7 margin = 10 - shadow_size = 7 + shadow_size = 10 "compact": fill = Color(0.10, 0.055, 0.030, 0.93) border = UI_TARNISHED_BRONZE @@ -529,11 +530,11 @@ func _apply_panel_style(panel: PanelContainer, variant: String) -> void: margin = 8 shadow_size = 8 "bamboo_slips": - fill = Color(0.36, 0.24, 0.105, 0.990) - border = UI_INK_WASH - border_width = 3 + fill = Color(0.43, 0.28, 0.11, 0.992) + border = UI_BRUSH_RULE + border_width = 5 margin = 10 - shadow_size = 3 + shadow_size = 6 "caption": fill = Color(0.17, 0.030, 0.017, 0.988) border = UI_OLD_BRONZE @@ -541,23 +542,23 @@ func _apply_panel_style(panel: PanelContainer, variant: String) -> void: margin = 5 shadow_size = 2 "result_tablet": - fill = Color(0.40, 0.25, 0.095, 0.997) - border = UI_SOOT_EDGE - border_width = 13 - margin = 22 - shadow_size = 22 + fill = Color(0.47, 0.29, 0.10, 0.997) + border = UI_LACQUER_EDGE + border_width = 15 + margin = 24 + shadow_size = 24 "result_victory_tablet": - fill = Color(0.46, 0.31, 0.13, 0.997) - border = UI_TARNISHED_BRONZE - border_width = 12 - margin = 22 - shadow_size = 18 + fill = Color(0.54, 0.36, 0.15, 0.997) + border = UI_OLD_BRONZE + border_width = 14 + margin = 24 + shadow_size = 22 "result_defeat_tablet": - fill = Color(0.16, 0.055, 0.025, 0.997) + fill = Color(0.13, 0.032, 0.014, 0.997) border = UI_SEAL_RED_DARK - border_width = 12 - margin = 22 - shadow_size = 20 + border_width = 14 + margin = 24 + shadow_size = 24 "command_seal": fill = Color(0.065, 0.020, 0.012, 0.992) border = UI_TARNISHED_BRONZE @@ -637,9 +638,9 @@ func _apply_control_font(control: Control, bold: bool = false) -> void: func _apply_button_style(button: Button, important: bool = false) -> void: if button == null: return - var normal_fill := Color(0.30, 0.040, 0.026, 0.98) if important else Color(0.16, 0.085, 0.035, 0.96) - var hover_fill := Color(0.38, 0.085, 0.040, 1.0) if important else Color(0.24, 0.13, 0.055, 1.0) - var pressed_fill := Color(0.090, 0.035, 0.020, 1.0) + var normal_fill := Color(0.36, 0.035, 0.020, 0.99) if important else Color(0.20, 0.095, 0.035, 0.98) + var hover_fill := Color(0.46, 0.075, 0.035, 1.0) if important else Color(0.30, 0.16, 0.060, 1.0) + var pressed_fill := Color(0.070, 0.024, 0.014, 1.0) button.add_theme_stylebox_override("normal", _make_button_style(normal_fill, UI_TARNISHED_BRONZE, 2)) button.add_theme_stylebox_override("hover", _make_button_style(hover_fill, UI_OLD_BRONZE, 2)) button.add_theme_stylebox_override("pressed", _make_button_style(pressed_fill, UI_OLD_BRONZE, 2)) @@ -956,6 +957,24 @@ func _make_hanging_tassel(height: float = 262.0) -> VBoxContainer: return tassel +func _make_screen_backdrop() -> ColorRect: + var backdrop := ColorRect.new() + backdrop.visible = false + backdrop.set_anchors_preset(Control.PRESET_FULL_RECT) + backdrop.color = Color(0.026, 0.014, 0.006, 0.64) + backdrop.mouse_filter = Control.MOUSE_FILTER_IGNORE + return backdrop + + +func _refresh_screen_backdrop_visibility() -> void: + if screen_backdrop == null: + return + screen_backdrop.visible = ( + (briefing_panel != null and briefing_panel.visible) + or (result_panel != null and result_panel.visible) + ) + + func _create_hud() -> void: var layer := CanvasLayer.new() add_child(layer) @@ -1018,7 +1037,7 @@ func _create_hud() -> void: objective_notice_panel = PanelContainer.new() objective_notice_panel.visible = false objective_notice_panel.position = Vector2(338, 88) - objective_notice_panel.size = Vector2(604, 128) + objective_notice_panel.size = Vector2(604, 154) objective_notice_panel.mouse_filter = Control.MOUSE_FILTER_IGNORE _apply_panel_style(objective_notice_panel, "notice_edict") root.add_child(objective_notice_panel) @@ -1033,7 +1052,7 @@ func _create_hud() -> void: objective_notice_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER objective_notice_label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER objective_notice_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART - objective_notice_label.custom_minimum_size = Vector2(548, 54) + objective_notice_label.custom_minimum_size = Vector2(548, 80) _apply_label_style(objective_notice_label, UI_AGED_INK, 15) objective_notice_column.add_child(objective_notice_label) objective_notice_column.add_child(_make_scroll_rod(548, 3)) @@ -1361,6 +1380,9 @@ func _create_hud() -> void: log_box.add_theme_stylebox_override("normal", _make_panel_style(Color(0.11, 0.07, 0.045, 0.78), UI_RICE_PAPER_DARK, 1, 1, 6, 0)) side_column.add_child(log_box) + screen_backdrop = _make_screen_backdrop() + root.add_child(screen_backdrop) + briefing_panel = PanelContainer.new() briefing_panel.visible = false briefing_panel.position = Vector2(212, 16) @@ -1406,7 +1428,7 @@ func _create_hud() -> void: briefing_column.add_child(briefing_location_label) briefing_column.add_child(_make_scroll_rod(680, 5)) - briefing_column.add_child(_make_section_caption("軍令 · 勝敗之條", 680)) + briefing_column.add_child(_make_section_caption("軍令 · 勝敗條目", 680)) briefing_objective_panel = PanelContainer.new() briefing_objective_panel.custom_minimum_size = Vector2(680, 104) @@ -1430,7 +1452,7 @@ func _create_hud() -> void: briefing_objective_row.add_child(_make_bamboo_gutter(18, 84)) briefing_column.add_child(_make_ink_wash_rule(680, 8)) - briefing_column.add_child(_make_section_caption("戰圖 · 軍幕 장계", 680)) + briefing_column.add_child(_make_section_caption("戰圖 · 軍幕奏報", 680)) briefing_camp_overview_panel = PanelContainer.new() briefing_camp_overview_panel.custom_minimum_size = Vector2(680, 108) @@ -1694,7 +1716,7 @@ func _create_hud() -> void: save_action_row.add_child(manual_load_button) var begin_button := Button.new() - begin_button.text = "전장도 펼치기" + begin_button.text = "전장도 개봉" begin_button.pressed.connect(_on_begin_battle_pressed) briefing_column.add_child(begin_button) @@ -1806,14 +1828,14 @@ func _create_hud() -> void: dialogue_control_row.add_child(dialogue_progress_label) dialogue_previous_button = Button.new() - dialogue_previous_button.text = "앞 죽간" + dialogue_previous_button.text = "前簡" dialogue_previous_button.disabled = true dialogue_previous_button.custom_minimum_size = Vector2(88, 32) dialogue_previous_button.pressed.connect(_retreat_dialogue) dialogue_control_row.add_child(dialogue_previous_button) dialogue_continue_button = Button.new() - dialogue_continue_button.text = "뒤 죽간" + dialogue_continue_button.text = "次簡" dialogue_continue_button.custom_minimum_size = Vector2(120, 32) dialogue_continue_button.pressed.connect(_advance_dialogue) dialogue_control_row.add_child(dialogue_continue_button) @@ -1834,7 +1856,7 @@ func _create_hud() -> void: result_seal_ribbon = _make_seal_ribbon(520, 18) result_column.add_child(result_seal_ribbon) - result_column.add_child(_make_section_caption("戰功 조서", 520)) + result_column.add_child(_make_section_caption("軍功 · 勝敗奏牘", 520)) var result_body_panel := PanelContainer.new() result_body_panel.custom_minimum_size = Vector2(520, 236) @@ -1869,7 +1891,7 @@ func _create_hud() -> void: result_column.add_child(result_restart_button) next_battle_button = Button.new() - next_battle_button.text = "다음 전장도" + next_battle_button.text = "다음 전장도 개봉" next_battle_button.pressed.connect(_on_next_battle_pressed) result_column.add_child(next_battle_button) @@ -3811,7 +3833,7 @@ func _format_objective_hud_text() -> String: if not defeat.is_empty(): lines.append("敗兆|墨戒 %s" % defeat) if lines.is_empty(): - return "勝令" + return "勝令|待詔" return _join_strings(lines, "\n") @@ -4007,24 +4029,18 @@ func _format_mission_panel_text() -> String: var lines := [] var victory := str(state.objectives.get("victory", "")) if not victory.is_empty(): - lines.append("勝令") - lines.append(" 令牌|%s" % victory) + _append_edict_clause(lines, "勝令", "令牌", victory) var defeat := str(state.objectives.get("defeat", "")) if not defeat.is_empty(): - lines.append("敗兆") - lines.append(" 戒牌|%s" % defeat) + _append_edict_clause(lines, "敗兆", "戒牌", defeat) var progress_lines := state.get_objective_progress_lines(false, false) if not progress_lines.is_empty(): - lines.append("戰功 죽간") - for progress_line in progress_lines: - lines.append(" 功簿|%s" % progress_line) + _append_edict_clause(lines, "戰功", "功簿", _join_strings(progress_lines, " · ")) var risk_lines := state.get_defeat_progress_lines() if not risk_lines.is_empty(): - lines.append("凶兆 징후") - for risk_line in risk_lines: - lines.append(" 凶簡|%s" % risk_line) + _append_edict_clause(lines, "凶兆", "凶簡", _join_strings(risk_lines, " · ")) if lines.is_empty(): - return "아직 봉인된 군령이 없습니다." + return "軍令\n 待詔|아직 봉인된 군령이 없습니다." return _join_strings(lines, "\n") @@ -4404,15 +4420,18 @@ func _update_result_panel() -> void: campaign_state.campaign_title, campaign_state.gold ] + _refresh_screen_backdrop_visibility() return if state.battle_status == BattleState.STATUS_VICTORY: if _try_show_post_battle_dialogue(): _clear_result_choices() result_panel.visible = false + _refresh_screen_backdrop_visibility() return if _is_dialogue_visible(): _clear_result_choices() result_panel.visible = false + _refresh_screen_backdrop_visibility() return _apply_battle_result_once() _apply_panel_style(result_panel, "result_victory_tablet") @@ -4439,17 +4458,22 @@ func _update_result_panel() -> void: result_restart_button.visible = true if next_battle_button != null: next_battle_button.visible = false + _refresh_screen_backdrop_visibility() func _format_victory_result_text() -> String: - return "大勝 조서\n受命 勝令\n %s\n%s" % [ - state.objectives.get("victory", ""), - _format_battle_result_summary() - ] + var lines := ["凱旋 勝牘"] + _append_edict_clause(lines, "受命 勝令", "朱批", str(state.objectives.get("victory", ""))) + var summary := _format_battle_result_summary() + if not summary.is_empty(): + lines.append(summary) + return _join_strings(lines, "\n") func _format_defeat_result_text() -> String: - return "敗軍 비문\n戒懼 敗兆\n %s" % state.objectives.get("defeat", "") + var lines := ["敗軍 碑牘"] + _append_edict_clause(lines, "戒懼 敗兆", "墨戒", str(state.objectives.get("defeat", ""))) + return _join_strings(lines, "\n") func _on_state_changed() -> void: @@ -4495,11 +4519,11 @@ func _format_hanja_number(value: int) -> String: func _on_objective_updated(victory: String, defeat: String) -> void: - var notice_lines := ["新詔 軍令 봉인"] + var notice_lines := ["急詔 軍令改封"] if not victory.is_empty(): - notice_lines.append("勝令|朱批 %s" % victory) + _append_edict_clause(notice_lines, "勝令", "朱批", victory) if not defeat.is_empty(): - notice_lines.append("敗兆|墨戒 %s" % defeat) + _append_edict_clause(notice_lines, "敗兆", "墨戒", defeat) if objective_notice_label != null: objective_notice_label.text = "\n".join(notice_lines) if objective_notice_panel != null: @@ -4837,7 +4861,7 @@ func _render_dialogue_line() -> void: var display_speaker := _localized_speaker_name(str(line.get("display_speaker", speaker))) var side := _normalized_dialogue_side(line.get("side", "left")) _apply_dialogue_side(side) - dialogue_speaker_label.text = display_speaker + dialogue_speaker_label.text = "%s 曰" % display_speaker if not display_speaker.is_empty() else "" dialogue_speaker_label.visible = not display_speaker.is_empty() dialogue_text_label.text = _format_dialogue_body_text(str(line.get("text", ""))) _update_dialogue_portrait(display_speaker, str(line.get("portrait", ""))) @@ -4852,8 +4876,8 @@ func _format_dialogue_body_text(text: String) -> String: if stripped.is_empty(): return "" if stripped.begins_with("「") or stripped.begins_with("『"): - return stripped - return "「%s」" % stripped + return "墨書\n %s" % stripped + return "墨書\n 「%s」" % stripped func _update_dialogue_controls() -> void: @@ -4864,7 +4888,7 @@ func _update_dialogue_controls() -> void: ] if dialogue_previous_button != null: dialogue_previous_button.disabled = active_dialogue_index <= 0 - dialogue_continue_button.text = "두루마리 봉함" if active_dialogue_index >= active_dialogue_lines.size() - 1 else "뒤 죽간" + dialogue_continue_button.text = "封緘" if active_dialogue_index >= active_dialogue_lines.size() - 1 else "次簡" func _apply_dialogue_side(side: String) -> void: @@ -5254,32 +5278,32 @@ func _format_briefing_chapter_battle_text(briefing: Dictionary) -> String: return title +func _append_edict_clause(lines: Array, heading: String, seal: String, text: String) -> void: + var body := text.strip_edges() + if body.is_empty(): + return + lines.append(heading) + lines.append(" %s|%s" % [seal, body]) + + func _format_briefing_objectives() -> String: - var text := "" + var lines := [] var victory := str(state.objectives.get("victory", "")) if not victory.is_empty(): - text = "受命 勝令\n 朱批|%s" % victory + _append_edict_clause(lines, "受命 勝令", "朱批", victory) var defeat := str(state.objectives.get("defeat", "")) if not defeat.is_empty(): - if not text.is_empty(): - text += "\n" - text += "戒懼 敗兆\n 墨戒|%s" % defeat + _append_edict_clause(lines, "戒懼 敗兆", "墨戒", defeat) var progress_lines := state.get_objective_progress_lines(false, false) if not progress_lines.is_empty(): - if not text.is_empty(): - text += "\n" - text += "驗功 戰功 죽간\n 功簿|%s" % _join_strings(progress_lines, " · ") + _append_edict_clause(lines, "驗功 戰功", "功簿", _join_strings(progress_lines, " · ")) var risk_lines := state.get_defeat_progress_lines() if not risk_lines.is_empty(): - if not text.is_empty(): - text += "\n" - text += "不祥 凶兆 징후\n 凶簡|%s" % _join_strings(risk_lines, " · ") + _append_edict_clause(lines, "不祥 凶兆", "凶簡", _join_strings(risk_lines, " · ")) var rewards_text := _format_briefing_rewards() if not rewards_text.is_empty(): - if not text.is_empty(): - text += "\n" - text += "封賞 戰利 봉인\n 封賞|%s" % rewards_text - return text + _append_edict_clause(lines, "封賞 戰利", "封賞", rewards_text) + return _join_strings(lines, "\n") func _format_briefing_rewards() -> String: @@ -5327,7 +5351,7 @@ func _format_briefing_camp_overview_text(briefing: Dictionary, prep_locked: bool var lines := [] var location := str(briefing.get("location", "")).strip_edges() if not location.is_empty(): - lines.append("地勢 %s" % location) + lines.append("地勢|%s" % location) var camp_parts := ["軍資 %d냥" % campaign_state.gold] var talk_text := _format_briefing_talk_overview_text() if not talk_text.is_empty(): @@ -5336,7 +5360,7 @@ func _format_briefing_camp_overview_text(briefing: Dictionary, prep_locked: bool if not shop_text.is_empty(): camp_parts.append(shop_text) if not camp_parts.is_empty(): - lines.append("軍幕 %s" % _join_strings(camp_parts, " · ")) + lines.append("軍幕|%s" % _join_strings(camp_parts, " · ")) var prep_parts := [] var roster_text := _format_briefing_roster_overview_text() if not roster_text.is_empty(): @@ -5347,9 +5371,9 @@ func _format_briefing_camp_overview_text(briefing: Dictionary, prep_locked: bool if not state.get_controllable_player_units().is_empty(): prep_parts.append("兵藏 비축") if not prep_parts.is_empty(): - lines.append("軍備 %s" % _join_strings(prep_parts, " · ")) + lines.append("軍備|%s" % _join_strings(prep_parts, " · ")) if prep_locked: - lines.append("封印 회상 두루마리 봉인") + lines.append("封印|회상 두루마리 봉인") return _join_strings(lines, "\n") @@ -5436,6 +5460,7 @@ func _show_briefing() -> void: briefing_objective_label.visible = not briefing_objective_label.text.is_empty() briefing_label.text = body briefing_panel.visible = true + _refresh_screen_backdrop_visibility() battle_started = false var prep_locked := _is_prebattle_prep_locked() _update_briefing_camp_overview(briefing, prep_locked) @@ -5473,6 +5498,7 @@ func _start_battle_from_briefing() -> void: _play_bgm("battle") if briefing_panel != null: briefing_panel.visible = false + _refresh_screen_backdrop_visibility() _hide_chapter_menu() _hide_shop_menu() _hide_talk_menu() diff --git a/tools/smoke_objective_progress.gd b/tools/smoke_objective_progress.gd index e0d946b..167c8f2 100644 --- a/tools/smoke_objective_progress.gd +++ b/tools/smoke_objective_progress.gd @@ -211,12 +211,12 @@ func _check_objective_notice(failures: Array[String]) -> void: scene._on_objective_updated("Defeat the new vanguard.", "") if scene.objective_notice_panel == null or not scene.objective_notice_panel.visible: failures.append("objective notice panel should be visible after objective update") - elif not scene.objective_notice_label.text.contains("新詔 軍令 봉인") or not scene.objective_notice_label.text.contains("勝令|朱批 Defeat the new vanguard."): + elif not scene.objective_notice_label.text.contains("急詔 軍令改封") or not scene.objective_notice_label.text.contains("朱批|Defeat the new vanguard."): failures.append("objective notice label should use sealed edict wording: %s" % scene.objective_notice_label.text) scene._on_objective_updated("", "Supply train is lost.") if scene.objective_notice_panel == null or not scene.objective_notice_panel.visible: failures.append("objective notice panel should be visible after defeat update") - elif not scene.objective_notice_label.text.contains("新詔 軍令 봉인") or not scene.objective_notice_label.text.contains("敗兆|墨戒 Supply train is lost."): + elif not scene.objective_notice_label.text.contains("急詔 軍令改封") or not scene.objective_notice_label.text.contains("墨戒|Supply train is lost."): failures.append("objective notice label should use omen wording: %s" % scene.objective_notice_label.text) if scene._format_log_entry_text("Objective updated: Defeat the new vanguard.") != "軍令 개정: Defeat the new vanguard.": failures.append("objective log display should use edict wording") diff --git a/tools/smoke_visual_assets.gd b/tools/smoke_visual_assets.gd index a7da886..617f2f3 100644 --- a/tools/smoke_visual_assets.gd +++ b/tools/smoke_visual_assets.gd @@ -2783,7 +2783,7 @@ func _check_scene_texture_loading(failures: Array[String]) -> void: if not merchant_notice.contains("군막 상인") or not merchant_notice.contains("길가의 물자"): failures.append("shop merchant notice should include name and flavor lines") var camp_overview := scene._format_briefing_camp_overview_text(scene.state.get_briefing(), false) - for expected in ["地勢 영천, 중평 원년", "軍資 0냥", "군막 회의 · 3건", "보급 대기 1건", "군상 물품 · 2종", "출진 명부 2명 중 2명", "진형 배치 4칸", "兵藏 비축"]: + for expected in ["地勢|영천, 중평 원년", "軍幕|", "軍備|", "軍資 0냥", "군막 회의 · 3건", "보급 대기 1건", "군상 물품 · 2종", "출진 명부 2명 중 2명", "진형 배치 4칸", "兵藏 비축"]: if not camp_overview.contains(expected): failures.append("camp overview should include %s: %s" % [expected, camp_overview]) var bean: Dictionary = scene.state.get_item_def("bean") @@ -2903,7 +2903,7 @@ func _check_ancient_ui_theme(failures: Array[String]) -> void: scene.free() return var briefing_text := scene._format_briefing_objectives() - for expected in ["受命 勝令", "戒懼 敗兆", "驗功 戰功 죽간", "不祥 凶兆 징후", "封賞 戰利 봉인"]: + for expected in ["受命 勝令", "戒懼 敗兆", "驗功 戰功", "不祥 凶兆", "封賞 戰利"]: if not briefing_text.contains(expected): failures.append("briefing objective parchment should use ancient heading `%s`: %s" % [expected, briefing_text]) var hud_objective := scene._format_objective_hud_text() @@ -2912,20 +2912,30 @@ func _check_ancient_ui_theme(failures: Array[String]) -> void: if not hud_objective.contains("朱批") or not hud_objective.contains("墨戒"): failures.append("HUD objective should use brush annotation wording: %s" % hud_objective) var mission_text := scene._format_mission_panel_text() - for expected in ["勝令", "敗兆", "戰功 죽간", "凶兆 징후", "令牌|", "戒牌|", "功簿|", "凶簡|"]: + 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.42, 0.27, 0.10, 0.997)) - _check_panel_style_frame(failures, scene.briefing_panel, "briefing panel", Color(0.035, 0.018, 0.012, 1.0), 14) - _check_panel_style_fill(failures, scene.briefing_objective_panel, "briefing objective edict panel", Color(0.58, 0.39, 0.16, 0.998)) - _check_panel_style_frame(failures, scene.briefing_objective_panel, "briefing objective edict panel", Color(0.10, 0.065, 0.040, 1.0), 8) - _check_panel_style_fill(failures, scene.briefing_camp_overview_panel, "briefing silk map panel", Color(0.35, 0.22, 0.085, 0.994)) - _check_panel_style_frame(failures, scene.briefing_camp_overview_panel, "briefing silk map panel", Color(0.10, 0.065, 0.040, 1.0), 6) - _check_panel_style_fill(failures, scene.dialogue_panel, "dialogue panel", Color(0.10, 0.045, 0.020, 0.975)) - _check_panel_style_frame(failures, scene.dialogue_panel, "dialogue panel", Color(0.035, 0.018, 0.012, 1.0), 12) + _check_panel_style_fill(failures, scene.briefing_panel, "briefing panel", Color(0.54, 0.36, 0.14, 0.997)) + _check_panel_style_frame(failures, scene.briefing_panel, "briefing panel", Color(0.035, 0.014, 0.008, 1.0), 16) + _check_panel_style_fill(failures, scene.briefing_objective_panel, "briefing objective edict panel", Color(0.67, 0.49, 0.24, 0.998)) + _check_panel_style_frame(failures, scene.briefing_objective_panel, "briefing objective edict panel", Color(0.12, 0.060, 0.026, 0.98), 10) + _check_panel_style_fill(failures, scene.briefing_camp_overview_panel, "briefing silk map panel", Color(0.42, 0.27, 0.095, 0.995)) + _check_panel_style_frame(failures, scene.briefing_camp_overview_panel, "briefing silk map panel", Color(0.12, 0.060, 0.026, 0.98), 7) + _check_panel_style_fill(failures, scene.dialogue_panel, "dialogue panel", Color(0.070, 0.024, 0.012, 0.986)) + _check_panel_style_frame(failures, scene.dialogue_panel, "dialogue panel", Color(0.37, 0.20, 0.070, 1.0), 14) _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.64, 0.43, 0.18, 0.998)) + _check_panel_style_fill(failures, scene.dialogue_speaker_panel, "dialogue speaker seal panel", Color(0.36, 0.025, 0.016, 0.995)) + _check_panel_style_fill(failures, scene.dialogue_text_panel, "dialogue text scroll panel", Color(0.72, 0.53, 0.25, 0.998)) + if scene.screen_backdrop == null: + failures.append("ancient briefing screen should create an ink-wash backdrop") + else: + scene.briefing_panel.visible = true + scene.result_panel.visible = false + scene._refresh_screen_backdrop_visibility() + if not scene.screen_backdrop.visible: + failures.append("ink-wash backdrop should appear behind briefing documents") + scene.briefing_panel.visible = false + scene._refresh_screen_backdrop_visibility() _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") @@ -2938,9 +2948,9 @@ func _check_ancient_ui_theme(failures: Array[String]) -> void: _check_hanging_tassel(failures, scene.dialogue_left_tassel, "dialogue left tassel") _check_hanging_tassel(failures, scene.dialogue_right_tassel, "dialogue right tassel") _check_dialogue_column_budget(failures, scene) - if scene.dialogue_continue_button == null or scene.dialogue_continue_button.text != "뒤 죽간": + if scene.dialogue_continue_button == null or scene.dialogue_continue_button.text != "次簡": failures.append("dialogue continue button should use ancient slip text") - if scene.dialogue_previous_button == null or scene.dialogue_previous_button.text != "앞 죽간": + if scene.dialogue_previous_button == null or scene.dialogue_previous_button.text != "前簡": failures.append("dialogue previous button should use ancient slip text") var localized_lines := scene._normalized_dialogue_lines([{"speaker": "Cao Cao", "display_speaker": "조조", "text": "군령을 전하라."}]) if localized_lines.is_empty() or str((localized_lines[0] as Dictionary).get("speaker", "")) != "조조": @@ -2949,9 +2959,9 @@ func _check_ancient_ui_theme(failures: Array[String]) -> void: scene.active_dialogue_lines = localized_lines scene.active_dialogue_index = 0 scene._render_dialogue_line() - if scene.dialogue_speaker_label == null or scene.dialogue_speaker_label.text != "조조": + if scene.dialogue_speaker_label == null or scene.dialogue_speaker_label.text != "조조 曰": failures.append("dialogue speaker label should render localized display_speaker") - if scene.dialogue_text_label == null or scene.dialogue_text_label.text != "「군령을 전하라.」": + if scene.dialogue_text_label == null or scene.dialogue_text_label.text != "墨書\n 「군령을 전하라.」": failures.append("dialogue text should render as an old quotation scroll") scene._hide_dialogue_panel() var enemy_lines := scene._normalized_dialogue_lines([{"speaker": "Wen Chou", "text": "전진!"}]) @@ -3017,12 +3027,12 @@ func _check_ancient_ui_theme(failures: Array[String]) -> void: 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") scene._apply_panel_style(scene.result_panel, "result_victory_tablet") - _check_panel_style_fill(failures, scene.result_panel, "victory result panel", Color(0.46, 0.31, 0.13, 0.997)) + _check_panel_style_fill(failures, scene.result_panel, "victory result panel", Color(0.54, 0.36, 0.15, 0.997)) scene._apply_panel_style(scene.result_panel, "result_defeat_tablet") - _check_panel_style_fill(failures, scene.result_panel, "defeat result panel", Color(0.16, 0.055, 0.025, 0.997)) - if not scene._format_victory_result_text().contains("大勝 조서"): + _check_panel_style_fill(failures, scene.result_panel, "defeat result panel", Color(0.13, 0.032, 0.014, 0.997)) + 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("敗軍 비문"): + if not scene._format_defeat_result_text().contains("敗軍 碑牘"): failures.append("defeat result should read like a memorial tablet") var scroll_rod := scene._make_scroll_rod(120, 4) if scroll_rod.get_child_count() != 5: