Improve Korean text readability surfaces

This commit is contained in:
2026-06-20 18:32:40 +09:00
parent 21aaaca441
commit 9da1833949
3 changed files with 93 additions and 53 deletions

View File

@@ -144,26 +144,26 @@ const DIALOGUE_COLUMN_SIZE := Vector2(850, 318)
const DIALOGUE_TEXT_SIZE := Vector2(830, 188)
const OBJECTIVE_HUD_FONT_SIZE := 14
const OBJECTIVE_HUD_MIN_FONT_SIZE := 12
const OBJECTIVE_NOTICE_FONT_SIZE := 16
const OBJECTIVE_NOTICE_MIN_FONT_SIZE := 14
const OBJECTIVE_NOTICE_FONT_SIZE := 17
const OBJECTIVE_NOTICE_MIN_FONT_SIZE := 15
const BRIEFING_TITLE_FONT_SIZE := 22
const BRIEFING_TITLE_MIN_FONT_SIZE := 18
const BRIEFING_LOCATION_FONT_SIZE := 16
const BRIEFING_LOCATION_MIN_FONT_SIZE := 13
const BRIEFING_OBJECTIVE_FONT_SIZE := 17
const BRIEFING_OBJECTIVE_MIN_FONT_SIZE := 14
const BRIEFING_BODY_FONT_SIZE := 17
const BRIEFING_BODY_MIN_FONT_SIZE := 15
const BRIEFING_OVERVIEW_FONT_SIZE := 16
const BRIEFING_OVERVIEW_MIN_FONT_SIZE := 13
const BRIEFING_OBJECTIVE_FONT_SIZE := 18
const BRIEFING_OBJECTIVE_MIN_FONT_SIZE := 15
const BRIEFING_BODY_FONT_SIZE := 18
const BRIEFING_BODY_MIN_FONT_SIZE := 16
const BRIEFING_OVERVIEW_FONT_SIZE := 17
const BRIEFING_OVERVIEW_MIN_FONT_SIZE := 14
const BRIEFING_VISIBLE_BODY_LINES := 3
const BRIEFING_VISIBLE_BODY_CHARS := 46
const COMMAND_NOTICE_VISIBLE_BODY_LINES := 2
const COMMAND_NOTICE_VISIBLE_BODY_CHARS := 44
const DIALOGUE_SPEAKER_FONT_SIZE := 20
const DIALOGUE_SPEAKER_MIN_FONT_SIZE := 16
const DIALOGUE_TEXT_FONT_SIZE := 19
const DIALOGUE_TEXT_MIN_FONT_SIZE := 16
const DIALOGUE_TEXT_FONT_SIZE := 20
const DIALOGUE_TEXT_MIN_FONT_SIZE := 17
const DIALOGUE_VISIBLE_BODY_LINES := 5
const DIALOGUE_VISIBLE_BODY_CHARS := 44
const OPENING_VISIBLE_BODY_LINES := 3
@@ -252,13 +252,13 @@ const LOCAL_COMMAND_PANEL_BOARD_PADDING := 4.0
const UI_RICE_PAPER := Color(0.48, 0.46, 0.39, 0.98)
const UI_RICE_PAPER_LIGHT := Color(0.62, 0.59, 0.50, 0.99)
const UI_RICE_PAPER_DARK := Color(0.18, 0.17, 0.14, 0.98)
const UI_READABLE_PAPER := Color(0.66, 0.63, 0.53, 0.998)
const UI_READABLE_CARD := Color(0.58, 0.55, 0.47, 0.998)
const UI_READABLE_PAPER := Color(0.64, 0.65, 0.60, 0.999)
const UI_READABLE_CARD := Color(0.74, 0.74, 0.68, 0.999)
const UI_HUD_READABLE := Color(0.060, 0.056, 0.048, 0.982)
const UI_TEXT_PAPER_SURFACE := Color(0.72, 0.69, 0.58, 0.998)
const UI_TEXT_PAPER_SURFACE := Color(0.78, 0.77, 0.69, 0.999)
const UI_TEXT_DARK_SURFACE := Color(0.030, 0.028, 0.024, 0.996)
const UI_TEXT_NOTICE_SURFACE := Color(0.68, 0.65, 0.55, 0.998)
const UI_AGED_INK := Color(0.055, 0.060, 0.055, 1.0)
const UI_TEXT_NOTICE_SURFACE := Color(0.74, 0.73, 0.66, 0.999)
const UI_AGED_INK := Color(0.020, 0.021, 0.018, 1.0)
const UI_DARK_LACQUER := Color(0.045, 0.038, 0.034, 0.988)
const UI_LACQUER_EDGE := Color(0.025, 0.023, 0.020, 1.0)
const UI_CINNABAR := Color(0.52, 0.045, 0.025, 1.0)
@@ -876,7 +876,9 @@ func _panel_variant_prefers_flat_text_surface(variant: String) -> bool:
"notice_edict",
"target_hint",
"cinematic_caption",
"story_caption"
"story_caption",
"cinematic_text_plate",
"briefing_text_plate"
]
@@ -1063,6 +1065,20 @@ func _apply_panel_style(panel: PanelContainer, variant: String) -> void:
radius = 10
margin = 14
shadow_size = 22
"cinematic_text_plate":
fill = Color(0.006, 0.006, 0.005, 0.992)
border = Color(0.46, 0.38, 0.24, 0.90)
border_width = 2
radius = 8
margin = 14
shadow_size = 10
"briefing_text_plate":
fill = Color(0.80, 0.79, 0.71, 0.999)
border = Color(0.19, 0.16, 0.11, 1.0)
border_width = 2
radius = 8
margin = 14
shadow_size = 5
"story_caption":
fill = Color(0.030, 0.026, 0.020, 0.988)
border = UI_TARNISHED_BRONZE
@@ -1323,7 +1339,7 @@ func _color_luminance(color: Color) -> float:
func _text_outline_color_for(font_color: Color) -> Color:
if _color_luminance(font_color) >= 0.42:
return UI_TEXT_DARK_OUTLINE
return UI_TEXT_LIGHT_OUTLINE
return Color(UI_TEXT_LIGHT_OUTLINE.r, UI_TEXT_LIGHT_OUTLINE.g, UI_TEXT_LIGHT_OUTLINE.b, 0.42)
func _apply_text_legibility(control: Control, font_color: Color, font_size: int = 0) -> void:
@@ -1332,14 +1348,17 @@ func _apply_text_legibility(control: Control, font_color: Color, font_size: int
var resolved_size := font_size
if resolved_size <= 0:
resolved_size = control.get_theme_font_size("font_size")
var outline_size := 3 if resolved_size >= 16 else (2 if resolved_size >= 12 else 1)
var outline_size := 4 if resolved_size >= 18 else (3 if resolved_size >= 14 else 2)
control.add_theme_color_override("font_outline_color", _text_outline_color_for(font_color))
control.add_theme_constant_override("outline_size", outline_size)
control.add_theme_color_override("font_shadow_color", UI_TEXT_SHADOW)
var shadow_color := UI_TEXT_SHADOW
if _color_luminance(font_color) < 0.24:
shadow_color = Color(0.0, 0.0, 0.0, 0.38)
control.add_theme_color_override("font_shadow_color", shadow_color)
control.add_theme_constant_override("shadow_offset_x", 1)
control.add_theme_constant_override("shadow_offset_y", 1)
if control is Label:
control.add_theme_constant_override("line_spacing", 4 if resolved_size >= 16 else 3)
control.add_theme_constant_override("line_spacing", 6 if resolved_size >= 17 else 4)
func _apply_strong_text_legibility(control: Control, font_color: Color, font_size: int = 0) -> void:
@@ -2342,6 +2361,7 @@ func _icon_line(image: Image, from_point: Vector2i, to_point: Vector2i, color: C
func _apply_label_style(label: Label, font_color: Color, font_size: int = 0) -> void:
if label == null:
return
label.clip_text = false
label.add_theme_color_override("font_color", font_color)
if font_size > 0:
label.add_theme_font_size_override("font_size", font_size)
@@ -2381,6 +2401,7 @@ func _apply_opening_caption_text_style(label: Label, font_color: Color, font_siz
label.visible = true
label.modulate = Color(1.0, 1.0, 1.0, 1.0)
label.self_modulate = Color(1.0, 1.0, 1.0, 1.0)
label.clip_text = false
label.z_as_relative = false
label.z_index = 92
label.add_theme_color_override("font_color", font_color)
@@ -3181,7 +3202,7 @@ func _make_screen_backdrop() -> ColorRect:
var backdrop := ColorRect.new()
backdrop.visible = false
backdrop.set_anchors_preset(Control.PRESET_FULL_RECT)
backdrop.color = Color(0.018, 0.009, 0.004, 0.74)
backdrop.color = Color(0.018, 0.009, 0.004, 0.84)
backdrop.mouse_filter = Control.MOUSE_FILTER_IGNORE
return backdrop
@@ -3536,8 +3557,8 @@ 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, 190)
objective_notice_panel.custom_minimum_size = Vector2(604, 190)
objective_notice_panel.size = Vector2(604, 206)
objective_notice_panel.custom_minimum_size = Vector2(604, 206)
objective_notice_panel.mouse_filter = Control.MOUSE_FILTER_PASS
_apply_panel_style(objective_notice_panel, "notice_edict")
root.add_child(objective_notice_panel)
@@ -3560,7 +3581,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, 72)
objective_notice_label.custom_minimum_size = Vector2(548, 90)
_apply_label_style(objective_notice_label, UI_AGED_INK, OBJECTIVE_NOTICE_FONT_SIZE)
objective_notice_column.add_child(objective_notice_label)
objective_notice_column.add_child(_make_scroll_rod(548, 3))
@@ -4156,17 +4177,17 @@ func _create_hud() -> void:
opening_caption_readability_mat.name = "OpeningCaptionTextBacking"
opening_caption_readability_mat.color = Color(0.0, 0.0, 0.0, 0.74)
opening_caption_readability_mat.mouse_filter = Control.MOUSE_FILTER_IGNORE
opening_caption_readability_mat.position = Vector2(30, 488)
opening_caption_readability_mat.size = Vector2(1220, 198)
opening_caption_readability_mat.position = Vector2(24, 484)
opening_caption_readability_mat.size = Vector2(1232, 206)
opening_caption_readability_mat.z_as_relative = false
opening_caption_readability_mat.z_index = 54
opening_prologue_root.add_child(opening_caption_readability_mat)
var opening_caption_panel := PanelContainer.new()
opening_caption_panel.name = "OpeningCaptionScroll"
opening_caption_panel.position = Vector2(42, 500)
opening_caption_panel.size = Vector2(1196, 174)
opening_caption_panel.custom_minimum_size = Vector2(1196, 174)
opening_caption_panel.position = Vector2(32, 492)
opening_caption_panel.size = Vector2(1216, 182)
opening_caption_panel.custom_minimum_size = Vector2(1216, 182)
opening_caption_panel.modulate = Color(1.0, 1.0, 1.0, 1.0)
opening_caption_panel.z_as_relative = false
opening_caption_panel.z_index = 68
@@ -4174,20 +4195,20 @@ func _create_hud() -> void:
opening_prologue_root.add_child(opening_caption_panel)
var opening_caption_row := HBoxContainer.new()
opening_caption_row.custom_minimum_size = Vector2(1152, 126)
opening_caption_row.custom_minimum_size = Vector2(1172, 134)
opening_caption_row.size_flags_horizontal = Control.SIZE_EXPAND_FILL
opening_caption_row.size_flags_vertical = Control.SIZE_EXPAND_FILL
opening_caption_row.add_theme_constant_override("separation", 14)
opening_caption_panel.add_child(opening_caption_row)
var opening_title_column := VBoxContainer.new()
opening_title_column.custom_minimum_size = Vector2(220, 126)
opening_title_column.custom_minimum_size = Vector2(210, 134)
opening_title_column.add_theme_constant_override("separation", 5)
opening_caption_row.add_child(opening_title_column)
opening_title_column.add_child(_make_seal_ribbon(220, 10))
opening_title_column.add_child(_make_seal_ribbon(210, 10))
opening_prologue_title_label = Label.new()
opening_prologue_title_label.custom_minimum_size = Vector2(220, 42)
opening_prologue_title_label.custom_minimum_size = Vector2(210, 44)
opening_prologue_title_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
opening_prologue_title_label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER
opening_prologue_title_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
@@ -4195,25 +4216,32 @@ func _create_hud() -> void:
opening_title_column.add_child(opening_prologue_title_label)
opening_prologue_step_label = Label.new()
opening_prologue_step_label.custom_minimum_size = Vector2(220, 24)
opening_prologue_step_label.custom_minimum_size = Vector2(210, 26)
opening_prologue_step_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
opening_prologue_step_label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER
opening_prologue_step_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
_apply_opening_caption_text_style(opening_prologue_step_label, UI_OPENING_CAPTION_MUTED, 16)
opening_title_column.add_child(opening_prologue_step_label)
var opening_body_surface := PanelContainer.new()
opening_body_surface.name = "OpeningStoryBodyTextSurface"
opening_body_surface.custom_minimum_size = Vector2(756, 134)
opening_body_surface.size_flags_horizontal = Control.SIZE_EXPAND_FILL
_apply_panel_style(opening_body_surface, "cinematic_text_plate")
opening_caption_row.add_child(opening_body_surface)
opening_prologue_body_label = Label.new()
opening_prologue_body_label.custom_minimum_size = Vector2(730, 126)
opening_prologue_body_label.custom_minimum_size = Vector2(730, 110)
opening_prologue_body_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL
opening_prologue_body_label.size_flags_vertical = Control.SIZE_EXPAND_FILL
opening_prologue_body_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
opening_prologue_body_label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER
opening_prologue_body_label.clip_text = false
_apply_opening_caption_text_style(opening_prologue_body_label, UI_OPENING_CAPTION_BODY, 22)
opening_caption_row.add_child(opening_prologue_body_label)
opening_body_surface.add_child(opening_prologue_body_label)
var opening_button_column := VBoxContainer.new()
opening_button_column.custom_minimum_size = Vector2(184, 126)
opening_button_column.custom_minimum_size = Vector2(178, 134)
opening_button_column.add_theme_constant_override("separation", 9)
opening_caption_row.add_child(opening_button_column)
@@ -4253,13 +4281,13 @@ func _create_hud() -> void:
briefing_panel = PanelContainer.new()
briefing_panel.visible = false
briefing_panel.position = Vector2(212, 16)
briefing_panel.size = Vector2(856, 688)
briefing_panel.position = Vector2(212, 8)
briefing_panel.size = Vector2(856, 704)
_apply_panel_style(briefing_panel, "briefing_sheet")
root.add_child(briefing_panel)
var briefing_shell := HBoxContainer.new()
briefing_shell.custom_minimum_size = Vector2(800, 632)
briefing_shell.custom_minimum_size = Vector2(800, 660)
briefing_shell.add_theme_constant_override("separation", 0)
briefing_panel.add_child(briefing_shell)
@@ -4336,7 +4364,7 @@ func _create_hud() -> void:
briefing_column.add_child(_make_section_caption("전장도와 군막 보고", 680))
briefing_camp_overview_panel = PanelContainer.new()
briefing_camp_overview_panel.custom_minimum_size = Vector2(680, 108)
briefing_camp_overview_panel.custom_minimum_size = Vector2(680, 120)
_apply_panel_style(briefing_camp_overview_panel, "briefing_card")
briefing_column.add_child(briefing_camp_overview_panel)
@@ -4345,7 +4373,7 @@ func _create_hud() -> void:
briefing_camp_overview_panel.add_child(briefing_camp_overview_shell)
briefing_camp_overview_row = HBoxContainer.new()
briefing_camp_overview_row.custom_minimum_size = Vector2(648, 92)
briefing_camp_overview_row.custom_minimum_size = Vector2(648, 104)
briefing_camp_overview_row.add_theme_constant_override("separation", 10)
briefing_camp_overview_row.size_flags_horizontal = Control.SIZE_EXPAND_FILL
briefing_camp_overview_shell.add_child(briefing_camp_overview_row)
@@ -4384,29 +4412,36 @@ func _create_hud() -> void:
briefing_camp_overview_label = Label.new()
briefing_camp_overview_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
briefing_camp_overview_label.custom_minimum_size = Vector2(286, 86)
briefing_camp_overview_label.custom_minimum_size = Vector2(286, 104)
briefing_camp_overview_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL
_apply_label_style(briefing_camp_overview_label, UI_AGED_INK, BRIEFING_OVERVIEW_FONT_SIZE)
briefing_camp_overview_row.add_child(briefing_camp_overview_label)
briefing_tactical_marker_list = VBoxContainer.new()
briefing_tactical_marker_list.name = "BriefingTacticalMarkerList"
briefing_tactical_marker_list.custom_minimum_size = Vector2(BRIEFING_TACTICAL_MARKER_CHIP_SIZE.x, 86)
briefing_tactical_marker_list.custom_minimum_size = Vector2(BRIEFING_TACTICAL_MARKER_CHIP_SIZE.x, 104)
briefing_tactical_marker_list.size_flags_vertical = Control.SIZE_SHRINK_CENTER
briefing_tactical_marker_list.add_theme_constant_override("separation", 4)
briefing_camp_overview_row.add_child(briefing_tactical_marker_list)
var briefing_scroll := ScrollContainer.new()
briefing_scroll.custom_minimum_size = Vector2(680, 96)
briefing_scroll.custom_minimum_size = Vector2(680, 112)
briefing_column.add_child(briefing_scroll)
var briefing_body_surface := PanelContainer.new()
briefing_body_surface.name = "BriefingBodyTextSurface"
briefing_body_surface.custom_minimum_size = Vector2(680, 112)
briefing_body_surface.size_flags_horizontal = Control.SIZE_EXPAND_FILL
_apply_panel_style(briefing_body_surface, "briefing_text_plate")
briefing_scroll.add_child(briefing_body_surface)
briefing_label = Label.new()
briefing_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
briefing_label.custom_minimum_size = Vector2(656, 92)
briefing_label.custom_minimum_size = Vector2(648, 88)
briefing_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL
briefing_label.vertical_alignment = VERTICAL_ALIGNMENT_TOP
_apply_label_style(briefing_label, UI_AGED_INK, BRIEFING_BODY_FONT_SIZE)
briefing_scroll.add_child(briefing_label)
briefing_body_surface.add_child(briefing_label)
var prep_button_row := HBoxContainer.new()
prep_button_row.add_theme_constant_override("separation", 8)
@@ -4695,7 +4730,7 @@ func _create_hud() -> void:
dialogue_progress_label.custom_minimum_size = Vector2(520, 32)
dialogue_progress_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL
dialogue_progress_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT
_apply_label_style(dialogue_progress_label, UI_OLD_BRONZE)
_apply_label_style(dialogue_progress_label, UI_PARCHMENT_TEXT, 15)
dialogue_control_row.add_child(dialogue_progress_label)
dialogue_previous_button = Button.new()