Age briefing and dialogue UI
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user