diff --git a/scripts/scenes/battle_scene.gd b/scripts/scenes/battle_scene.gd index e3b2b16..5dec1fd 100644 --- a/scripts/scenes/battle_scene.gd +++ b/scripts/scenes/battle_scene.gd @@ -264,9 +264,9 @@ const UI_TEXT_SHADOW := Color(0.010, 0.007, 0.004, 0.66) const UI_TITLE_TEXT := Color(1.0, 0.96, 0.82, 1.0) const UI_TITLE_MUTED_TEXT := Color(0.92, 0.84, 0.66, 1.0) const UI_TITLE_BUTTON_TEXT := Color(1.0, 0.97, 0.86, 1.0) -const UI_OPENING_CAPTION_TITLE := Color(0.98, 0.93, 0.78, 1.0) -const UI_OPENING_CAPTION_BODY := Color(0.97, 0.95, 0.88, 1.0) -const UI_OPENING_CAPTION_MUTED := Color(0.78, 0.70, 0.52, 1.0) +const UI_OPENING_CAPTION_TITLE := Color(1.0, 0.96, 0.82, 1.0) +const UI_OPENING_CAPTION_BODY := Color(1.0, 0.985, 0.92, 1.0) +const UI_OPENING_CAPTION_MUTED := Color(0.92, 0.84, 0.64, 1.0) const MAP_SCROLL_FRAME_PADDING := 12.0 const SPEAKER_DISPLAY_NAMES := { "Cao Cao": "조조", @@ -968,12 +968,12 @@ func _apply_panel_style(panel: PanelContainer, variant: String) -> void: margin = 5 shadow_size = 2 "cinematic_caption": - fill = Color(0.018, 0.018, 0.016, 0.972) + fill = Color(0.010, 0.010, 0.009, 0.996) border = UI_TARNISHED_BRONZE border_width = 4 radius = 10 margin = 14 - shadow_size = 16 + shadow_size = 22 "story_caption": fill = Color(0.15, 0.13, 0.10, 0.94) border = UI_TARNISHED_BRONZE @@ -2194,7 +2194,11 @@ func _apply_label_style(label: Label, font_color: Color, font_size: int = 0) -> func _apply_opening_caption_text_style(label: Label, font_color: Color, font_size: int = 0) -> void: if label == null: return - label.z_index = 2 + 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.z_as_relative = false + label.z_index = 92 label.add_theme_color_override("font_color", font_color) if font_size > 0: label.add_theme_font_size_override("font_size", font_size) @@ -2203,6 +2207,11 @@ func _apply_opening_caption_text_style(label: Label, font_color: Color, font_siz if resolved_size <= 0: resolved_size = label.get_theme_font_size("font_size") _apply_strong_text_legibility(label, font_color, resolved_size) + label.add_theme_color_override("font_outline_color", Color(0.0, 0.0, 0.0, 1.0)) + label.add_theme_constant_override("outline_size", 6 if resolved_size >= 18 else 5) + label.add_theme_color_override("font_shadow_color", Color(0.0, 0.0, 0.0, 0.96)) + label.add_theme_constant_override("shadow_offset_x", 3) + label.add_theme_constant_override("shadow_offset_y", 3) label.add_theme_constant_override("line_spacing", 4) @@ -3753,10 +3762,12 @@ func _create_hud() -> void: var opening_bottom_dim := ColorRect.new() opening_bottom_dim.name = "OpeningBottomInkShade" - opening_bottom_dim.color = Color(0.020, 0.018, 0.015, 0.34) + opening_bottom_dim.color = Color(0.020, 0.018, 0.015, 0.58) opening_bottom_dim.mouse_filter = Control.MOUSE_FILTER_IGNORE - opening_bottom_dim.position = Vector2(0, 486) - opening_bottom_dim.size = Vector2(1280, 234) + opening_bottom_dim.position = Vector2(0, 458) + opening_bottom_dim.size = Vector2(1280, 262) + opening_bottom_dim.z_as_relative = false + opening_bottom_dim.z_index = 48 opening_prologue_root.add_child(opening_bottom_dim) var opening_chapter_panel := PanelContainer.new() @@ -3776,13 +3787,24 @@ func _create_hud() -> void: opening_prologue_root.add_child(_make_opening_story_beat_strip()) + var opening_caption_readability_mat := ColorRect.new() + opening_caption_readability_mat.name = "OpeningCaptionTextBacking" + opening_caption_readability_mat.color = Color(0.0, 0.0, 0.0, 0.62) + opening_caption_readability_mat.mouse_filter = Control.MOUSE_FILTER_IGNORE + opening_caption_readability_mat.position = Vector2(38, 488) + opening_caption_readability_mat.size = Vector2(1204, 198) + 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(50, 500) opening_caption_panel.size = Vector2(1180, 174) opening_caption_panel.custom_minimum_size = Vector2(1180, 174) opening_caption_panel.modulate = Color(1.0, 1.0, 1.0, 1.0) - opening_caption_panel.z_index = 30 + opening_caption_panel.z_as_relative = false + opening_caption_panel.z_index = 68 _apply_panel_style(opening_caption_panel, "cinematic_caption") opening_prologue_root.add_child(opening_caption_panel) diff --git a/tools/smoke_title_menu.gd b/tools/smoke_title_menu.gd index 76b8393..183ef6f 100644 --- a/tools/smoke_title_menu.gd +++ b/tools/smoke_title_menu.gd @@ -278,17 +278,28 @@ func _check_title_menu_start_load_and_settings(failures: Array[String]) -> void: var opening_title_color: Color = scene.opening_prologue_title_label.get_theme_color("font_color") if opening_title_color.get_luminance() < 0.78: failures.append("opening prologue title should use bright caption text over the artwork") - if scene.opening_prologue_title_label.get_theme_constant("outline_size") < 3: + if scene.opening_prologue_title_label.get_theme_constant("outline_size") < 5: failures.append("opening prologue title should have a strong outline over the artwork") + if scene.opening_prologue_title_label.modulate.a < 0.99 or scene.opening_prologue_title_label.self_modulate.a < 0.99: + failures.append("opening prologue title should render at full opacity") if scene.opening_prologue_body_label != null: var opening_body_color: Color = scene.opening_prologue_body_label.get_theme_color("font_color") if opening_body_color.get_luminance() < 0.86: failures.append("opening prologue body should use bright readable text over the artwork") - if scene.opening_prologue_body_label.get_theme_constant("outline_size") < 3: + if scene.opening_prologue_body_label.get_theme_constant("outline_size") < 5: failures.append("opening prologue body should keep a strong outline over generated art") + if scene.opening_prologue_body_label.get_theme_color("font_outline_color").a < 0.95: + failures.append("opening prologue body should use an opaque ink outline") + if scene.opening_prologue_body_label.get_theme_color("font_shadow_color").a < 0.90: + failures.append("opening prologue body should keep a strong shadow over bright artwork") + if scene.opening_prologue_body_label.modulate.a < 0.99 or scene.opening_prologue_body_label.self_modulate.a < 0.99: + failures.append("opening prologue body should render at full opacity") var opening_caption: PanelContainer = null if scene.opening_prologue_root != null: opening_caption = scene.opening_prologue_root.find_child("OpeningCaptionScroll", true, false) as PanelContainer + var opening_caption_backing: ColorRect = null + if scene.opening_prologue_root != null: + opening_caption_backing = scene.opening_prologue_root.find_child("OpeningCaptionTextBacking", true, false) as ColorRect if opening_caption == null: failures.append("opening prologue should keep a bottom scroll caption over the artwork") elif opening_caption.custom_minimum_size.y < 160.0 or opening_caption.custom_minimum_size.y > 188.0 or opening_caption.position.y < 492.0: @@ -297,8 +308,19 @@ func _check_title_menu_start_load_and_settings(failures: Array[String]) -> void: failures.append("opening prologue caption should use a dark cinematic panel so text remains visible") elif bool(opening_caption.get_meta("generated_panel_texture", true)): failures.append("opening prologue caption should use a flat high-contrast panel instead of a busy texture") - elif opening_caption.z_index < 20: + elif opening_caption.z_index < 60: failures.append("opening prologue caption should render above the generated story image") + if opening_caption_backing == null: + failures.append("opening prologue should keep a dedicated dark backing behind story text") + elif opening_caption_backing.color.a < 0.55: + failures.append("opening prologue backing should be dark enough for readable Korean text") + elif opening_caption != null and opening_caption_backing.z_index >= opening_caption.z_index: + failures.append("opening prologue backing should sit behind the caption panel") + if scene.opening_prologue_body_label != null and opening_caption != null: + if scene.opening_prologue_body_label.z_as_relative: + failures.append("opening prologue body should use an absolute text layer over the cinematic art") + if scene.opening_prologue_body_label.z_index <= opening_caption.z_index: + failures.append("opening prologue body text should render above the caption panel") var first_story_texture: Texture2D = null if scene.opening_prologue_scene_texture_rect != null: first_story_texture = scene.opening_prologue_scene_texture_rect.texture