Improve Korean text readability checks

This commit is contained in:
2026-06-20 17:39:57 +09:00
parent 482a88ba4a
commit a5e5ddc310
5 changed files with 196 additions and 13 deletions

View File

@@ -25,6 +25,7 @@ func _init() -> void:
_check_battle_presentation_sequence_contract(failures)
_check_battle_start_notice_sequence(failures)
_check_readability_contract(failures)
_check_first_battle_rendered_text_fit(failures)
_check_korean_fallback_labels(failures)
_check_dialogue_localization_and_side(failures)
_check_event_dialogue_side_passthrough(failures)
@@ -731,6 +732,69 @@ func _check_text_fit_contract(scene, failures: Array[String]) -> void:
failures.append("fitted briefing objective text should stay within its panel")
func _check_first_battle_rendered_text_fit(failures: Array[String]) -> void:
var scene = BattleSceneScript.new()
scene._create_hud()
scene._show_opening_prologue()
for index in range(BattleSceneScript.OPENING_PROLOGUE_PAGES.size()):
scene.opening_prologue_index = index
scene._update_opening_prologue_page()
_check_label_fits_visible_area(scene, failures, scene.opening_prologue_title_label, "opening prologue title page %d" % (index + 1))
_check_label_fits_visible_area(scene, failures, scene.opening_prologue_step_label, "opening prologue step page %d" % (index + 1))
_check_label_fits_visible_area(scene, failures, scene.opening_prologue_body_label, "opening prologue body page %d" % (index + 1))
if not scene.state.load_battle("res://data/scenarios/001_yellow_turbans.json"):
failures.append("could not load opening battle for rendered text fit")
scene.free()
return
scene._show_briefing()
_check_label_fits_visible_area(scene, failures, scene.briefing_title_label, "opening briefing title")
_check_label_fits_visible_area(scene, failures, scene.briefing_location_label, "opening briefing location")
_check_label_fits_visible_area(scene, failures, scene.briefing_objective_label, "opening briefing objective")
_check_label_fits_visible_area(scene, failures, scene.briefing_camp_overview_label, "opening briefing map overview")
_check_label_fits_visible_area(scene, failures, scene.briefing_label, "opening briefing body")
var briefing: Dictionary = scene.state.get_briefing()
var dialogue_lines: Array = []
dialogue_lines.append_array(briefing.get("camp_dialogue", []))
for conversation in briefing.get("camp_conversations", []):
if typeof(conversation) != TYPE_DICTIONARY:
continue
dialogue_lines.append_array((conversation as Dictionary).get("lines", []))
for index in range(dialogue_lines.size()):
var normalized_lines := scene._normalized_dialogue_lines([dialogue_lines[index]])
if normalized_lines.is_empty():
continue
scene.active_dialogue_lines = normalized_lines
scene.active_dialogue_index = 0
scene._render_dialogue_line()
_check_label_fits_visible_area(scene, failures, scene.dialogue_speaker_label, "opening dialogue speaker %d" % (index + 1))
_check_label_fits_visible_area(scene, failures, scene.dialogue_text_label, "opening dialogue body %d" % (index + 1))
scene.free()
func _check_label_fits_visible_area(scene, failures: Array[String], label: Label, context: String) -> void:
if label == null:
failures.append("%s missing" % context)
return
var text := str(label.text).strip_edges()
if text.is_empty():
failures.append("%s should render visible text" % context)
return
var area := label.custom_minimum_size
if area.x <= 0.0 or area.y <= 0.0:
failures.append("%s should reserve a stable text area, got %s" % [context, str(area)])
return
var font_size := label.get_theme_font_size("font_size")
var fitted_height := float(scene._estimated_wrapped_text_height(text, area.x, font_size))
if fitted_height > area.y + 2.0:
failures.append("%s text should fit its visible area: height %.1f > %.1f at font %d text=`%s`" % [context, fitted_height, area.y, font_size, text])
if font_size < 12:
failures.append("%s should not shrink below readable Korean text size: %d" % [context, font_size])
if label.clip_text:
failures.append("%s should not hard-clip Korean text" % context)
func _check_dialogue_localization_and_side(failures: Array[String]) -> void:
var scene = BattleSceneScript.new()
var lines := scene._normalized_dialogue_lines([