Refine Korean briefing and expand first battle

This commit is contained in:
2026-06-19 12:33:37 +09:00
parent 0a23b8aa75
commit 77db064d03
9 changed files with 403 additions and 170 deletions

View File

@@ -2964,7 +2964,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")
@@ -3052,11 +3052,11 @@ func _check_hud_focus_text(failures: Array[String]) -> void:
failures.append("Enemy archer HUD focus should describe enemy control: %s" % archer_text)
if not scene._unit_current_terrain_text(archer).contains("평원"):
failures.append("Archer terrain text should reflect its current plain tile")
_check_unit_class_mark(failures, scene, "cao_cao", "tactic", "")
_check_unit_class_mark(failures, scene, "xiahou_dun", "cavalry", "")
_check_unit_class_mark(failures, scene, "yellow_turban_2", "infantry", "")
_check_unit_class_mark(failures, scene, "yellow_turban_3", "ranged", "")
_check_unit_class_mark(failures, scene, "yellow_turban_1", "heavy", "")
_check_unit_class_mark(failures, scene, "cao_cao", "tactic", "")
_check_unit_class_mark(failures, scene, "xiahou_dun", "cavalry", "")
_check_unit_class_mark(failures, scene, "yellow_turban_2", "infantry", "")
_check_unit_class_mark(failures, scene, "yellow_turban_3", "ranged", "")
_check_unit_class_mark(failures, scene, "yellow_turban_1", "heavy", "")
scene.free()
@@ -3084,18 +3084,19 @@ 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])
failures.append("briefing objective parchment should use Korean heading `%s`: %s" % [expected, briefing_text])
for clutter in ["진행", "위험"]:
if briefing_text.contains(clutter):
failures.append("briefing objective parchment should stay concise without `%s`: %s" % [clutter, briefing_text])
var hud_objective := scene._format_objective_hud_text()
if not hud_objective.contains("勝令|") or not hud_objective.contains("敗兆|"):
failures.append("HUD objective should read as paired edict and omen text: %s" % hud_objective)
if not hud_objective.contains("朱批") or not hud_objective.contains("墨戒"):
failures.append("HUD objective should use brush annotation wording: %s" % hud_objective)
if not hud_objective.contains("승리:") or not hud_objective.contains("패배:"):
failures.append("HUD objective should use concise Korean labels: %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])
failures.append("mission panel should use Korean campaign wording `%s`: %s" % [expected, mission_text])
_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))
@@ -3136,10 +3137,10 @@ 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 != "次簡":
failures.append("dialogue continue button should use ancient slip text")
if scene.dialogue_previous_button == null or scene.dialogue_previous_button.text != "前簡":
failures.append("dialogue previous button should use ancient slip text")
if scene.dialogue_continue_button == null or scene.dialogue_continue_button.text != "다음":
failures.append("dialogue continue button should use Korean text")
if scene.dialogue_previous_button == null or scene.dialogue_previous_button.text != "이전":
failures.append("dialogue previous button should use Korean 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", "")) != "조조":
failures.append("dialogue normalization should preserve display_speaker for localized names")
@@ -3147,10 +3148,10 @@ 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 != "墨書\n 「군령을 전하라.」":
failures.append("dialogue text should render as an old quotation scroll")
if scene.dialogue_text_label == null or scene.dialogue_text_label.text != "「군령을 전하라.」":
failures.append("dialogue text should render as a concise quotation scroll")
scene._hide_dialogue_panel()
var enemy_lines := scene._normalized_dialogue_lines([{"speaker": "Wen Chou", "text": "전진!"}])
if enemy_lines.is_empty() or str((enemy_lines[0] as Dictionary).get("speaker", "")) != "문추":
@@ -3178,8 +3179,10 @@ func _check_ancient_ui_theme(failures: Array[String]) -> void:
failures.append("dialogue text should use the project serif font override")
if scene.dialogue_continue_button == null or not scene.dialogue_continue_button.has_theme_font_override("font"):
failures.append("dialogue continue button should use the project serif font override")
if scene.mission_title_label == null or scene.mission_title_label.text != "軍令":
failures.append("mission panel title should use bronze tablet wording")
if scene.mission_title_label == null or scene.mission_title_label.text != "전투":
failures.append("mission panel title should use clear Korean wording")
if scene.briefing_start_button == null or scene.briefing_start_button.text != "닫고 전투 시작":
failures.append("briefing start button should clearly close the briefing")
if scene.shop_button == null or scene.shop_button.text != "군상":
failures.append("briefing shop button should use sutler wording")
if scene.talk_button == null or scene.talk_button.text != "군막 회의":
@@ -3209,8 +3212,8 @@ func _check_ancient_ui_theme(failures: Array[String]) -> void:
if scene.targeting_hint_back_button == null or scene.targeting_hint_back_button.text != "죽간 거두기":
failures.append("targeting hint back button should use bamboo-slip wording")
scene._on_objective_updated("동문에 조서를 꽂아라.", "조조가 퇴각하면 패전이다.")
if scene.objective_notice_label == null or not scene.objective_notice_label.text.contains("朱批") or not scene.objective_notice_label.text.contains("墨戒"):
failures.append("objective update notice should use brush annotation wording")
if scene.objective_notice_label == null or not scene.objective_notice_label.text.contains("목표|") or not scene.objective_notice_label.text.contains("주의|"):
failures.append("objective update notice should use Korean annotation wording")
scene._update_briefing_camp_overview(scene.state.get_briefing(), false)
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")
@@ -3218,10 +3221,10 @@ func _check_ancient_ui_theme(failures: Array[String]) -> void:
_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.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("敗軍 碑牘"):
failures.append("defeat result should read like a memorial tablet")
if not scene._format_victory_result_text().contains("승리"):
failures.append("victory result should use Korean title")
if not scene._format_defeat_result_text().contains("패배"):
failures.append("defeat result should use Korean title")
var scroll_rod := scene._make_scroll_rod(120, 4)
if scroll_rod.get_child_count() != 5:
failures.append("scroll rod ornament should use five visual strips")
@@ -3469,6 +3472,8 @@ func _check_hover_intent_badges(failures: Array[String]) -> void:
scene.free()
return
scene.battle_started = true
var enemy: Dictionary = scene.state.get_unit("yellow_turban_1")
enemy["pos"] = Vector2i(1, 2)
scene.state.select_unit("cao_cao")
scene._refresh_ranges()
@@ -3482,7 +3487,7 @@ func _check_hover_intent_badges(failures: Array[String]) -> void:
if str(select_badge.get("text", "")) != "선택" or str(select_badge.get("kind", "")) != "select":
failures.append("friendly selectable unit should show SELECT badge: %s" % str(select_badge))
scene.hover_cell = Vector2i(7, 2)
scene.hover_cell = Vector2i(1, 2)
var attack_badge := scene._target_preview_badge()
if attack_badge.is_empty() or str(attack_badge.get("kind", "")) == "move" or str(attack_badge.get("text", "")) == "행군":
failures.append("enemy hover should keep attack badge priority: %s" % str(attack_badge))
@@ -3511,8 +3516,14 @@ func _check_terrain_and_unit_presentation(failures: Array[String]) -> void:
return
if scene._terrain_key_at(Vector2i(3, 1)) != "F":
failures.append("terrain helper should read forest cells")
if scene._terrain_key_at(Vector2i(6, 5)) != "T":
failures.append("terrain helper should read village cells")
if not scene._terrain_key_at(Vector2i(-1, 0)).is_empty():
failures.append("terrain helper should return empty outside the board")
if scene.state.get_terrain_name(Vector2i(6, 5)) != "마을" or scene.state.get_terrain_heal(Vector2i(6, 5)) != 6:
failures.append("village terrain should expose Korean name and healing")
if scene.state.get_terrain_heal(Vector2i(12, 1)) != 8:
failures.append("castle terrain should expose stronger healing")
var background_fill: Color = scene._terrain_fill_color(Vector2i(0, 0), "G", true)
var fallback_fill: Color = scene._terrain_fill_color(Vector2i(0, 0), "G", false)
if background_fill.a >= 0.20:
@@ -3531,6 +3542,8 @@ func _check_terrain_and_unit_presentation(failures: Array[String]) -> void:
failures.append("matching terrain should not draw edge blends")
if scene._terrain_edge_width("W", "G") <= scene._terrain_edge_width("G", "F"):
failures.append("water shoreline edge should be wider than grass blend")
if scene._terrain_edge_priority("T") <= scene._terrain_edge_priority("F"):
failures.append("village should draw above forest/grass terrain blends")
var wasteland_fill: Color = scene._terrain_fill_color(Vector2i(0, 0), "D", true)
if wasteland_fill.a <= background_fill.a:
failures.append("wasteland fill should sit slightly above grass over background art")
@@ -3584,9 +3597,9 @@ func _check_attack_motion_profiles(failures: Array[String]) -> void:
return
_check_attack_profile(failures, scene, "cao_cao", Vector2i(1, 3), Vector2i(2, 3), "command_strike")
_check_attack_profile(failures, scene, "xiahou_dun", Vector2i(1, 4), Vector2i(2, 4), "cavalry_charge")
_check_attack_profile(failures, scene, "yellow_turban_1", Vector2i(7, 2), Vector2i(6, 2), "heavy_strike")
_check_attack_profile(failures, scene, "yellow_turban_2", Vector2i(8, 5), Vector2i(7, 5), "infantry_strike")
_check_attack_profile(failures, scene, "yellow_turban_3", Vector2i(7, 6), Vector2i(7, 4), "arrow")
_check_attack_profile(failures, scene, "yellow_turban_1", Vector2i(12, 1), Vector2i(11, 1), "heavy_strike")
_check_attack_profile(failures, scene, "yellow_turban_2", Vector2i(9, 4), Vector2i(8, 4), "infantry_strike")
_check_attack_profile(failures, scene, "yellow_turban_3", Vector2i(11, 2), Vector2i(11, 0), "arrow")
_check_synthetic_attack_profile(failures, scene, "elite_cavalry", "cavalry_charge")
_check_synthetic_attack_profile(failures, scene, "guard_captain", "infantry_strike")
_check_synthetic_attack_profile(failures, scene, "marksman", "arrow", 2)
@@ -3599,7 +3612,7 @@ func _check_attack_motion_profiles(failures: Array[String]) -> void:
_check_skill_action_profile(failures, scene, "skill_support", "tactic_support", "order_banner")
scene._on_unit_action_motion_requested("xiahou_dun", Vector2i(1, 4), Vector2i(2, 4), "attack")
_check_stored_attack_motion(failures, scene, "xiahou_dun", "cavalry_charge", "melee", "attack", "charge_dust")
scene._on_unit_action_motion_requested("yellow_turban_3", Vector2i(7, 6), Vector2i(7, 4), "attack")
scene._on_unit_action_motion_requested("yellow_turban_3", Vector2i(11, 2), Vector2i(11, 0), "attack")
_check_stored_attack_motion(failures, scene, "yellow_turban_3", "arrow", "ranged", "attack", "piercing_trace")
scene._on_unit_action_motion_requested("cao_cao", Vector2i(1, 3), Vector2i(3, 3), "skill_damage")
_check_stored_attack_motion(failures, scene, "cao_cao", "tactic_damage", "tactic", "skill_damage", "tactic_flare")