Improve briefing and story readability

This commit is contained in:
2026-06-20 16:33:22 +09:00
parent 4c793194a9
commit 2d15108edb
4 changed files with 138 additions and 125 deletions

View File

@@ -284,19 +284,8 @@ func _check_title_menu_start_load_and_settings(failures: Array[String]) -> void:
if not opening_story_cards.is_empty():
failures.append("opening story ledger should not expose old numbered-card style nodes")
var opening_story_ticks: Array = opening_story_strip.find_children("OpeningStoryLedgerTick*", "", true, false)
if opening_story_ticks.size() != 4:
failures.append("opening story ledger should expose four quiet progress ticks: %d" % opening_story_ticks.size())
var current_count := 0
var current_index := 0
for opening_story_tick in opening_story_ticks:
var tick_node := opening_story_tick as Node
if not bool(tick_node.get_meta("story_progress_tick", false)):
failures.append("opening story tick should be marked as a quiet progress tick")
if bool(tick_node.get_meta("current_story_beat", false)):
current_count += 1
current_index = opening_story_ticks.find(opening_story_tick) + 1
if current_count != 1 or current_index != 1:
failures.append("opening story ledger should highlight the first story tick on entry")
if not opening_story_ticks.is_empty():
failures.append("opening story ledger should avoid unreadable numeric/tick progress marks: %d" % opening_story_ticks.size())
var numeric_labels := opening_story_strip.find_children("*", "Label", true, false)
for numeric_label in numeric_labels:
if str((numeric_label as Label).text).strip_edges() in ["1", "2", "3", "4", "1/4", "2/4", "3/4", "4/4"]:
@@ -307,11 +296,11 @@ func _check_title_menu_start_load_and_settings(failures: Array[String]) -> void:
if opening_story_strip.custom_minimum_size.x > 340.0 or opening_story_strip.custom_minimum_size.y > 54.0:
failures.append("opening story ledger should stay compact beside the chapter seal: %s" % str(opening_story_strip.custom_minimum_size))
_check_control_inside_design_view(failures, opening_story_strip as Control, "opening story ledger")
if scene.opening_prologue_next_button == null or scene.opening_prologue_next_button.text != "기록 넘기기":
if scene.opening_prologue_next_button == null or scene.opening_prologue_next_button.text != "다음 기록":
failures.append("opening prologue next button should read as a story action")
else:
_check_opening_story_button_art(failures, scene.opening_prologue_next_button, "opening next")
if scene.opening_prologue_skip_button == null or scene.opening_prologue_skip_button.text != "군막으로 바로":
if scene.opening_prologue_skip_button == null or scene.opening_prologue_skip_button.text != "군막으로":
failures.append("opening prologue skip button should read as a contextual camp shortcut")
else:
_check_opening_story_button_art(failures, scene.opening_prologue_skip_button, "opening skip")
@@ -383,8 +372,13 @@ func _check_title_menu_start_load_and_settings(failures: Array[String]) -> void:
var second_story_card: Node = null
if scene.opening_prologue_root != null:
second_story_card = scene.opening_prologue_root.find_child("OpeningStoryLedgerTick2", true, false)
if second_story_card == null or not bool(second_story_card.get_meta("current_story_beat", false)):
failures.append("opening story ledger should highlight the second tick after advancing")
if second_story_card != null:
failures.append("opening story ledger should not show a second tick after advancing")
var second_progress: Label = null
if scene.opening_prologue_root != null:
second_progress = scene.opening_prologue_root.find_child("OpeningStoryProgressScene", true, false) as Label
if second_progress == null or not second_progress.text.contains("둘째 기록") or not second_progress.text.contains("맹덕의 군령"):
failures.append("opening story ledger should update the text record after advancing")
if scene.opening_prologue_title_label == null or scene.opening_prologue_title_label.text != "맹덕의 군령":
failures.append("opening prologue should move from Cao Cao background to his decision")
elif not scene.opening_prologue_body_label.text.contains("황건") or not scene.opening_prologue_body_label.text.contains("작은 군세"):
@@ -550,24 +544,23 @@ func _check_opening_story_button_art(failures: Array[String], button: Button, co
return
if not bool(button.get_meta("opening_story_button", false)):
failures.append("%s should use the compact opening-story button profile" % context)
if not bool(button.get_meta("flat_readable_button", false)):
failures.append("%s should use the flat readable story button style" % context)
if button.texture_filter != CanvasItem.TEXTURE_FILTER_LINEAR:
failures.append("%s should use linear filtering so generated button art stays smooth at QHD" % context)
failures.append("%s should use linear filtering at QHD" % context)
if button.expand_icon:
failures.append("%s icon should not stretch in QHD fullscreen" % context)
if button.get_theme_constant("icon_max_width") > 22:
failures.append("%s icon should stay small beside Korean text" % context)
var stylebox := button.get_theme_stylebox("normal")
if not (stylebox is StyleBoxTexture):
failures.append("%s should keep a generated button texture" % context)
if not (stylebox is StyleBoxFlat):
failures.append("%s should use a crisp flat style instead of a smeared generated texture" % context)
return
var style := stylebox as StyleBoxTexture
if style.texture_margin_left < 24 or style.texture_margin_top < 10:
failures.append("%s generated button slices should preserve the ornamental frame at QHD: %d/%d" % [context, style.texture_margin_left, style.texture_margin_top])
if style.axis_stretch_horizontal != StyleBoxTexture.AXIS_STRETCH_MODE_TILE_FIT or style.axis_stretch_vertical != StyleBoxTexture.AXIS_STRETCH_MODE_TILE_FIT:
failures.append("%s generated button surface should tile-fit its 9-slice center at QHD" % context)
_check_button_texture_slice_fit(failures, button, context)
if button.get_theme_font_size("font_size") > 17:
failures.append("%s should stay visually quiet in the story caption" % context)
var style := stylebox as StyleBoxFlat
if style.bg_color.a < 0.92:
failures.append("%s flat button should have a solid readable surface: %s" % [context, str(style.bg_color)])
if button.get_theme_font_size("font_size") < 14:
failures.append("%s should keep readable Korean text in the story caption" % context)
func _check_button_texture_slice_fit(failures: Array[String], button: Button, context: String) -> void:

View File

@@ -3634,21 +3634,18 @@ func _check_ancient_ui_theme(failures: Array[String]) -> void:
for clutter in ["목표|", "주의|", "현황|", "경고|"]:
if mission_text.contains(clutter):
failures.append("mission panel should avoid old verbose marker `%s`: %s" % [clutter, mission_text])
_check_panel_style_fill(failures, scene.briefing_panel, "briefing panel", Color(0.34, 0.32, 0.27, 0.997))
_check_panel_style_frame(failures, scene.briefing_panel, "briefing panel", Color(0.025, 0.023, 0.020, 1.0), 16)
_check_panel_style_fill(failures, scene.briefing_objective_panel, "briefing objective edict panel", Color(0.56, 0.54, 0.47, 0.998))
_check_panel_style_frame(failures, scene.briefing_objective_panel, "briefing objective edict panel", Color(0.065, 0.060, 0.052, 0.98), 8)
_check_panel_style_fill(failures, scene.briefing_camp_overview_panel, "briefing silk map panel", Color(0.32, 0.31, 0.25, 0.995))
_check_panel_style_frame(failures, scene.briefing_camp_overview_panel, "briefing silk map panel", Color(0.065, 0.060, 0.052, 0.98), 5)
_check_panel_style_fill(failures, scene.briefing_panel, "briefing panel", Color(0.66, 0.63, 0.53, 0.998))
_check_panel_style_frame(failures, scene.briefing_panel, "briefing panel", Color(0.14, 0.11, 0.075, 1.0), 5)
_check_panel_style_fill(failures, scene.briefing_objective_panel, "briefing objective readable panel", Color(0.58, 0.55, 0.47, 0.998))
_check_panel_style_frame(failures, scene.briefing_objective_panel, "briefing objective readable panel", Color(0.16, 0.13, 0.090, 1.0), 3)
_check_panel_style_fill(failures, scene.briefing_camp_overview_panel, "briefing readable map panel", Color(0.58, 0.55, 0.47, 0.998))
_check_panel_style_frame(failures, scene.briefing_camp_overview_panel, "briefing readable map panel", Color(0.16, 0.13, 0.090, 1.0), 3)
_check_panel_style_fill(failures, scene.dialogue_panel, "dialogue panel", Color(0.045, 0.045, 0.040, 0.982))
_check_panel_style_frame(failures, scene.dialogue_panel, "dialogue panel", Color(0.18, 0.17, 0.14, 1.0), 9)
_check_panel_style_fill(failures, scene.auto_end_turn_prompt_panel, "auto end turn prompt panel", Color(0.050, 0.045, 0.040, 0.992))
_check_panel_style_fill(failures, scene.dialogue_portrait_panel, "dialogue portrait panel", Color(0.025, 0.023, 0.020, 1.0))
_check_panel_style_fill(failures, scene.dialogue_speaker_panel, "dialogue speaker seal panel", Color(0.26, 0.035, 0.030, 0.995))
_check_panel_style_fill(failures, scene.dialogue_text_panel, "dialogue text scroll panel", Color(0.58, 0.55, 0.48, 0.996))
_check_panel_uses_generated_texture(failures, scene.briefing_panel, "briefing generated frame")
_check_panel_uses_generated_texture(failures, scene.briefing_objective_panel, "briefing objective generated frame")
_check_panel_uses_generated_texture(failures, scene.briefing_camp_overview_panel, "briefing map generated frame")
_check_panel_uses_generated_texture(failures, scene.dialogue_panel, "dialogue generated frame")
_check_panel_uses_generated_texture(failures, scene.dialogue_text_panel, "dialogue text generated frame")
_check_panel_uses_generated_texture(failures, scene.auto_end_turn_prompt_panel, "auto end turn generated frame")
@@ -3672,18 +3669,13 @@ func _check_ancient_ui_theme(failures: Array[String]) -> void:
_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")
_check_bamboo_gutter_row(failures, scene.briefing_objective_panel, "briefing objective bamboo gutters")
_check_bamboo_gutter_row(failures, scene.dialogue_text_panel, "dialogue scroll bamboo gutters")
_check_bamboo_gutter_row(failures, scene.mission_detail_panel, "mission detail bamboo gutters")
_check_edict_marker_stack(failures, scene.briefing_objective_panel, "briefing objective edict markers")
_check_edict_marker_stack(failures, scene.mission_detail_panel, "mission detail edict markers")
_check_panel_style_fill(failures, scene.cell_info_panel, "HUD terrain info panel", Color(0.045, 0.050, 0.048, 0.90))
_check_panel_style_frame(failures, scene.cell_info_panel, "HUD terrain info panel", Color(0.20, 0.24, 0.21, 0.96), 2)
_check_panel_style_fill(failures, scene.forecast_panel, "HUD forecast info panel", Color(0.045, 0.050, 0.048, 0.90))
_check_panel_style_frame(failures, scene.forecast_panel, "HUD forecast info panel", Color(0.20, 0.24, 0.21, 0.96), 2)
_check_panel_uses_generated_texture(failures, scene.mission_detail_panel, "mission detail generated frame")
_check_panel_uses_generated_texture(failures, scene.cell_info_panel, "HUD terrain generated frame")
_check_panel_uses_generated_texture(failures, scene.forecast_panel, "HUD forecast generated frame")
_check_panel_style_fill(failures, scene.cell_info_panel, "HUD terrain info panel", Color(0.060, 0.056, 0.048, 0.982))
_check_panel_style_frame(failures, scene.cell_info_panel, "HUD terrain info panel", Color(0.42, 0.35, 0.24, 0.98), 2)
_check_panel_style_fill(failures, scene.forecast_panel, "HUD forecast info panel", Color(0.060, 0.056, 0.048, 0.982))
_check_panel_style_frame(failures, scene.forecast_panel, "HUD forecast info panel", Color(0.42, 0.35, 0.24, 0.98), 2)
if scene.cell_info_icon == null:
failures.append("HUD terrain info panel should expose an icon chip")
if scene.forecast_icon == null:
@@ -3981,23 +3973,23 @@ func _check_opening_prologue_presentation(failures: Array[String]) -> void:
if scene.opening_prologue_next_button == null:
failures.append("opening prologue should expose a next button")
else:
if scene.opening_prologue_next_button.text != "기록 넘기기":
if scene.opening_prologue_next_button.text != "다음 기록":
failures.append("opening next button should use story-fluent Korean text")
if scene.opening_prologue_next_button.icon == null:
failures.append("opening next button should carry generated icon art")
if scene.opening_prologue_next_button.expand_icon or scene.opening_prologue_next_button.get_theme_constant("icon_max_width") > 22:
failures.append("opening next icon should stay capped so it cannot cover story text")
_check_button_uses_generated_surface(failures, scene.opening_prologue_next_button, "opening next")
_check_button_uses_flat_readable_surface(failures, scene.opening_prologue_next_button, "opening next")
if scene.opening_prologue_skip_button == null:
failures.append("opening prologue should expose a skip button")
else:
if scene.opening_prologue_skip_button.text != "군막으로 바로":
if scene.opening_prologue_skip_button.text != "군막으로":
failures.append("opening skip button should avoid modern skip-button wording")
if scene.opening_prologue_skip_button.icon == null:
failures.append("opening skip button should carry generated icon art")
if scene.opening_prologue_skip_button.expand_icon or scene.opening_prologue_skip_button.get_theme_constant("icon_max_width") > 22:
failures.append("opening skip icon should stay capped so it cannot cover story text")
_check_button_uses_generated_surface(failures, scene.opening_prologue_skip_button, "opening skip")
_check_button_uses_flat_readable_surface(failures, scene.opening_prologue_skip_button, "opening skip")
var opening_ledger := _find_descendant_by_name(scene.opening_prologue_root, "OpeningStoryLedgerStrip") as PanelContainer
if opening_ledger == null:
failures.append("opening prologue should use a story ledger instead of numbered progress cards")
@@ -4012,6 +4004,9 @@ func _check_opening_prologue_presentation(failures: Array[String]) -> void:
var old_cards := opening_ledger.find_children("OpeningStoryBeatCard*", "", true, false)
if not old_cards.is_empty():
failures.append("opening story ledger should not expose old numbered-card style nodes")
var tick_cards := opening_ledger.find_children("OpeningStoryLedgerTick*", "", true, false)
if not tick_cards.is_empty():
failures.append("opening story ledger should not expose unreadable progress tick nodes")
for index in range(BattleSceneScript.OPENING_PROLOGUE_PAGES.size()):
scene.opening_prologue_index = index
scene._update_opening_prologue_page()
@@ -4025,7 +4020,7 @@ func _check_opening_prologue_presentation(failures: Array[String]) -> void:
if scene.opening_prologue_next_button != null:
scene.opening_prologue_index = BattleSceneScript.OPENING_PROLOGUE_PAGES.size() - 1
scene._update_opening_prologue_page()
if scene.opening_prologue_next_button.text != "군막으로" or scene.opening_prologue_next_button.icon == null:
if scene.opening_prologue_next_button.text != "전투 준비" or scene.opening_prologue_next_button.icon == null:
failures.append("opening final page should switch the next control into camp-entry mode")
scene.free()
@@ -4460,6 +4455,25 @@ func _check_button_uses_generated_surface(failures: Array[String], button: Butto
failures.append("%s generated button texture should reserve readable content margins" % context)
func _check_button_uses_flat_readable_surface(failures: Array[String], button: Button, context: String) -> void:
if button == null:
failures.append("%s button missing" % context)
return
if not bool(button.get_meta("flat_readable_button", false)):
failures.append("%s should be marked as a flat readable button" % context)
var stylebox := button.get_theme_stylebox("normal")
if not (stylebox is StyleBoxFlat):
failures.append("%s should use a crisp flat button surface" % context)
return
var style := stylebox as StyleBoxFlat
if style.bg_color.a < 0.92:
failures.append("%s flat button should have an opaque readable surface: %s" % [context, str(style.bg_color)])
if style.border_color.a < 0.80 or style.get_border_width(SIDE_TOP) < 2:
failures.append("%s flat button should keep a clear bronze edge" % context)
if button.get_theme_font_size("font_size") < 14:
failures.append("%s flat button should keep readable Korean text" % context)
func _check_button_texture_slice_for_control(
failures: Array[String],
button: Button,