Age briefing and dialogue UI

This commit is contained in:
2026-06-19 11:13:05 +09:00
parent 5fcb2f6b84
commit 4bf6489d25
3 changed files with 172 additions and 136 deletions

View File

@@ -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()

View File

@@ -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")

View File

@@ -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: