From 2c57438c21efe4e5f43e063ab15bc5dc6878c79a Mon Sep 17 00:00:00 2001 From: Wickedness Date: Fri, 19 Jun 2026 08:06:32 +0900 Subject: [PATCH] Antique battle command UI --- scripts/core/battle_state.gd | 31 +++++---- scripts/scenes/battle_scene.gd | 112 ++++++++++++++++-------------- tools/smoke_objective_progress.gd | 18 +++-- tools/smoke_visual_assets.gd | 8 +-- 4 files changed, 92 insertions(+), 77 deletions(-) diff --git a/scripts/core/battle_state.gd b/scripts/core/battle_state.gd index d0b3563..181e430 100644 --- a/scripts/core/battle_state.gd +++ b/scripts/core/battle_state.gd @@ -3551,7 +3551,7 @@ func _append_target_units_progress_line(result: Array[String], unit_ids, mode: S _append_progress_line(result, "%s %s" % [unit_name, status], pending) return var label := "호위 손실" if mode == "defeat" else "격파 표식" - var suffix := " (1 이상이면 패전)" if mode == "defeat" else "" + var suffix := " · 하나라도 잃으면 패전" if mode == "defeat" else "" _append_progress_line(result, "%s %d/%d%s" % [label, defeated, total, suffix], pending) @@ -3573,7 +3573,7 @@ func _append_target_officers_progress_line( _append_progress_line(result, "%s %s" % [officer_name, status], pending) return var label := "장수 손실" if mode == "defeat" else "대상 장수 격파" - var suffix := " (1 이상이면 패전)" if mode == "defeat" else "" + var suffix := " · 하나라도 잃으면 패전" if mode == "defeat" else "" _append_progress_line(result, "%s %d/%d%s" % [label, defeated, total, suffix], pending) @@ -3582,7 +3582,7 @@ func _append_destination_progress_line(result: Array[String], condition: Diction if targets.is_empty(): return var status := "도달" if _unit_reaches_tile(condition) else "미도달" - _append_progress_line(result, "목표 지점 %s: %s" % [_format_cells(targets), status], pending) + _append_progress_line(result, "전장 표식 %s · %s" % [_format_cells(targets), status], pending) func _append_turn_limit_progress_line(result: Array[String]) -> void: @@ -3590,7 +3590,7 @@ func _append_turn_limit_progress_line(result: Array[String]) -> void: if limit <= 0: return var turns_left: int = maxi(0, limit - turn_number + 1) - _append_progress_line(result, "남은 턴 %d" % turns_left) + _append_progress_line(result, "잔여 군령 %d" % turns_left) func _append_after_event_progress_line(result: Array[String], event_id: String) -> void: @@ -3606,7 +3606,7 @@ func _append_after_event_progress_line(result: Array[String], event_id: String) elif trigger_type == "turn_start": var target_turn := int(when.get("turn", 0)) if target_turn > 0: - _append_progress_line(result, "제%d턴에 전공 갱신" % target_turn) + _append_progress_line(result, "제%d군령에 전공 갱신" % target_turn) func _append_event_destination_progress_line(result: Array[String], when: Dictionary) -> void: @@ -3614,7 +3614,7 @@ func _append_event_destination_progress_line(result: Array[String], when: Dictio if targets.is_empty(): return var status := "도달" if _unit_reaches_tile(when) else "미도달" - _append_progress_line(result, "목표 지점 %s: %s" % [_format_cells(targets), status]) + _append_progress_line(result, "전장 표식 %s · %s" % [_format_cells(targets), status]) func _append_turn_condition_progress_line(result: Array[String], condition: Dictionary, mode: String, pending := false) -> void: @@ -3623,7 +3623,7 @@ func _append_turn_condition_progress_line(result: Array[String], condition: Dict var limit := int(condition.get("turn", condition.get("limit", 0))) if limit <= 0: return - _append_progress_line(result, "남은 턴 %d" % maxi(0, limit - turn_number + 1), pending) + _append_progress_line(result, "잔여 군령 %d" % maxi(0, limit - turn_number + 1), pending) elif condition_type == "turn_reached": var target_turn := int(condition.get("turn", 0)) if target_turn <= 0: @@ -3631,9 +3631,9 @@ func _append_turn_condition_progress_line(result: Array[String], condition: Dict if mode == "defeat": var target_team := str(condition.get("team", "")) var limit_turn := target_turn - 1 if target_team == TEAM_PLAYER else target_turn - _append_progress_line(result, "남은 턴 %d" % maxi(0, limit_turn - turn_number + 1), pending) + _append_progress_line(result, "잔여 군령 %d" % maxi(0, limit_turn - turn_number + 1), pending) return - _append_progress_line(result, "제%d턴/%d" % [min(turn_number, target_turn), target_turn], pending) + _append_progress_line(result, "군령 제%d/%d" % [min(turn_number, target_turn), target_turn], pending) func _append_progress_line(result: Array[String], text: String, pending := false) -> void: @@ -4139,15 +4139,16 @@ func _event_action_unit_ids(action: Dictionary) -> Array[String]: func _emit_ai_target_priority_feedback(unit: Dictionary, previous_priority: int, priority: int, text: String = "") -> void: if text.is_empty(): + var unit_name := str(unit.get("name", "부대")) if priority > previous_priority: - text = "%s is exposed to enemy focus." % str(unit.get("name", "Unit")) + text = "%s에게 적 시선이 몰립니다." % unit_name elif priority < previous_priority: - text = "%s is less exposed to enemy focus." % str(unit.get("name", "Unit")) + text = "%s를 향한 적 시선이 느슨해집니다." % unit_name else: - text = "%s remains an enemy priority." % str(unit.get("name", "Unit")) + text = "%s는 여전히 적의 표적입니다." % unit_name _emit_log(text) if bool(unit.get("alive", false)) and bool(unit.get("deployed", true)): - _emit_combat_feedback(unit, "TARGET", "priority") + _emit_combat_feedback(unit, "標的", "priority") func _apply_objective_event(action: Dictionary) -> void: @@ -4165,9 +4166,9 @@ func _apply_objective_event(action: Dictionary) -> void: if not updated: return if action.has("victory") and not updated_victory.is_empty(): - _emit_log("Objective updated: %s" % updated_victory) + _emit_log("軍令 개정: %s" % updated_victory) if action.has("defeat") and not updated_defeat.is_empty(): - _emit_log("Defeat condition updated: %s" % updated_defeat) + _emit_log("敗兆 개정: %s" % updated_defeat) objective_updated.emit(updated_victory, updated_defeat) _notify_changed() diff --git a/scripts/scenes/battle_scene.gd b/scripts/scenes/battle_scene.gd index 5fbbbe7..ac48e2e 100644 --- a/scripts/scenes/battle_scene.gd +++ b/scripts/scenes/battle_scene.gd @@ -71,9 +71,9 @@ const SHOP_MERCHANT_BADGE_SIZE := Vector2(50, 50) const SHOP_ITEM_ICON_SIZE := Vector2(48, 48) const HUD_UNIT_PORTRAIT_SIZE := Vector2(92, 104) const HUD_UNIT_PORTRAIT_STACK_SIZE := Vector2(88, 100) -const POST_MOVE_MENU_SIZE := Vector2(228, 120) -const POST_MOVE_PICKER_PANEL_SIZE := Vector2(320, 210) -const TARGETING_HINT_PANEL_SIZE := Vector2(240, 94) +const POST_MOVE_MENU_SIZE := Vector2(240, 146) +const POST_MOVE_PICKER_PANEL_SIZE := Vector2(336, 236) +const TARGETING_HINT_PANEL_SIZE := Vector2(254, 118) const LOCAL_COMMAND_PANEL_GAP := 8.0 const LOCAL_COMMAND_PANEL_BOARD_PADDING := 4.0 const UI_RICE_PAPER := Color(0.58, 0.45, 0.25, 0.98) @@ -395,7 +395,7 @@ func _age_panel_style(style: StyleBoxFlat, variant: String, border_width: int) - style.set_border_width(SIDE_RIGHT, border_width + 1) style.content_margin_top += 2 style.content_margin_bottom += 2 - "edict", "notice_edict", "speech_scroll", "bamboo_slips", "silk_map": + "edict", "notice_edict", "speech_scroll", "bamboo_slips", "silk_map", "command_seal": style.set_border_width(SIDE_TOP, border_width + 2) style.set_border_width(SIDE_BOTTOM, border_width + 2) "edict_compact": @@ -509,6 +509,12 @@ func _apply_panel_style(panel: PanelContainer, variant: String) -> void: border_width = 8 margin = 19 shadow_size = 12 + "command_seal": + fill = Color(0.065, 0.020, 0.012, 0.992) + border = UI_TARNISHED_BRONZE + border_width = 5 + margin = 10 + shadow_size = 9 _: pass var style := _make_panel_style(fill, border, border_width, radius, margin, shadow_size) @@ -1124,12 +1130,13 @@ func _create_hud() -> void: post_move_menu.mouse_filter = Control.MOUSE_FILTER_STOP post_move_menu.custom_minimum_size = POST_MOVE_MENU_SIZE post_move_menu.size = POST_MOVE_MENU_SIZE - _apply_panel_style(post_move_menu, "compact") + _apply_panel_style(post_move_menu, "command_seal") root.add_child(post_move_menu) var post_move_column := VBoxContainer.new() - post_move_column.add_theme_constant_override("separation", 4) + post_move_column.add_theme_constant_override("separation", 5) post_move_menu.add_child(post_move_column) + post_move_column.add_child(_make_seal_ribbon(196, 10)) post_move_title_label = Label.new() post_move_title_label.text = "군령 선택" @@ -1145,25 +1152,25 @@ func _create_hud() -> void: post_move_attack_button = Button.new() post_move_attack_button.text = "공격" - post_move_attack_button.tooltip_text = "현재 자리에서 공격할 적을 지목합니다." + post_move_attack_button.tooltip_text = "이 자리에서 칠 적군을 지목합니다." post_move_attack_button.pressed.connect(_on_post_move_attack_pressed) post_move_grid.add_child(post_move_attack_button) post_move_tactic_button = Button.new() post_move_tactic_button.text = "책략" - post_move_tactic_button.tooltip_text = "이동 후 책략 목록을 펼칩니다." + post_move_tactic_button.tooltip_text = "군령에 올릴 책략 죽간을 고릅니다." post_move_tactic_button.pressed.connect(_on_post_move_tactic_pressed) post_move_grid.add_child(post_move_tactic_button) post_move_item_button = Button.new() post_move_item_button.text = "도구" - post_move_item_button.tooltip_text = "이동 후 도구 목록을 펼칩니다." + post_move_item_button.tooltip_text = "군령에 올릴 보급 물자를 고릅니다." post_move_item_button.pressed.connect(_on_post_move_item_pressed) post_move_grid.add_child(post_move_item_button) post_move_wait_button = Button.new() post_move_wait_button.text = "대기" - post_move_wait_button.tooltip_text = "이동을 확정하고 부대의 군령을 봉인합니다." + post_move_wait_button.tooltip_text = "행군을 확정하고 군령을 봉인합니다." post_move_wait_button.pressed.connect(_on_post_move_wait_pressed) post_move_grid.add_child(post_move_wait_button) @@ -1178,12 +1185,13 @@ func _create_hud() -> void: post_move_picker_panel.mouse_filter = Control.MOUSE_FILTER_STOP post_move_picker_panel.custom_minimum_size = POST_MOVE_PICKER_PANEL_SIZE post_move_picker_panel.size = POST_MOVE_PICKER_PANEL_SIZE - _apply_panel_style(post_move_picker_panel, "compact") + _apply_panel_style(post_move_picker_panel, "command_seal") root.add_child(post_move_picker_panel) var picker_column := VBoxContainer.new() picker_column.add_theme_constant_override("separation", 5) post_move_picker_panel.add_child(picker_column) + picker_column.add_child(_make_seal_ribbon(296, 10)) post_move_picker_title_label = Label.new() post_move_picker_title_label.text = "군령 선택" @@ -1212,14 +1220,14 @@ func _create_hud() -> void: picker_column.add_child(picker_button_row) post_move_picker_back_button = Button.new() - post_move_picker_back_button.text = "돌아가기" - post_move_picker_back_button.tooltip_text = "군령 선택으로 돌아갑니다." + post_move_picker_back_button.text = "죽간 거두기" + post_move_picker_back_button.tooltip_text = "군령 선택으로 되돌립니다." post_move_picker_back_button.pressed.connect(_on_post_move_picker_back_pressed) picker_button_row.add_child(post_move_picker_back_button) post_move_picker_cancel_move_button = Button.new() post_move_picker_cancel_move_button.text = "발걸음 거두기" - post_move_picker_cancel_move_button.tooltip_text = "우클릭으로도 원래 자리로 되돌릴 수 있습니다." + post_move_picker_cancel_move_button.tooltip_text = "발걸음을 거두면 원래 자리로 되돌립니다." post_move_picker_cancel_move_button.pressed.connect(_on_post_move_picker_cancel_move_pressed) picker_button_row.add_child(post_move_picker_cancel_move_button) @@ -1228,12 +1236,13 @@ func _create_hud() -> void: targeting_hint_panel.mouse_filter = Control.MOUSE_FILTER_STOP targeting_hint_panel.custom_minimum_size = TARGETING_HINT_PANEL_SIZE targeting_hint_panel.size = TARGETING_HINT_PANEL_SIZE - _apply_panel_style(targeting_hint_panel, "compact") + _apply_panel_style(targeting_hint_panel, "command_seal") root.add_child(targeting_hint_panel) var targeting_column := VBoxContainer.new() targeting_column.add_theme_constant_override("separation", 4) targeting_hint_panel.add_child(targeting_column) + targeting_column.add_child(_make_seal_ribbon(218, 9)) targeting_hint_title_label = Label.new() targeting_hint_title_label.text = "적장 지목" @@ -1252,8 +1261,8 @@ func _create_hud() -> void: targeting_column.add_child(targeting_button_row) targeting_hint_back_button = Button.new() - targeting_hint_back_button.text = "돌아가기" - targeting_hint_back_button.tooltip_text = "군령 선택으로 돌아갑니다." + targeting_hint_back_button.text = "죽간 거두기" + targeting_hint_back_button.tooltip_text = "군령 선택으로 되돌립니다." targeting_hint_back_button.pressed.connect(_on_targeting_back_pressed) targeting_button_row.add_child(targeting_hint_back_button) @@ -1891,7 +1900,7 @@ func _play_ui_cancel() -> void: func _play_log_sfx(message: String) -> void: if message.contains(" but misses.") or message.contains("헛쳤다"): _play_sfx("guard_block") - elif message.begins_with("Objective updated:") or message.begins_with("Defeat condition updated:") or message.begins_with("군령 갱신:") or message.begins_with("패전 군령 갱신:"): + elif message.begins_with("Objective updated:") or message.begins_with("Defeat condition updated:") or message.begins_with("軍令 개정:") or message.begins_with("敗兆 개정:") or message.begins_with("군령 갱신:") or message.begins_with("패전 군령 갱신:"): _play_ui_confirm() elif message.ends_with(" withdraws from the battlefield.") or message.ends_with("전장을 물러났다."): _play_ui_confirm() @@ -2698,7 +2707,7 @@ func _draw_target_selection_markers() -> void: draw_rect(rect.grow(-6.0), color, false, 2.2) draw_rect(marker_rect, Color(0.025, 0.028, 0.034, 0.88)) draw_rect(marker_rect, color, false, 1.4) - draw_string(font, marker_rect.position + Vector2(0, 13), str(marker.get("text", "TARGET")), HORIZONTAL_ALIGNMENT_CENTER, marker_rect.size.x, 12, color) + draw_string(font, marker_rect.position + Vector2(0, 13), str(marker.get("text", "標")), HORIZONTAL_ALIGNMENT_CENTER, marker_rect.size.x, 12, color) func _target_selection_marker_entries() -> Array[Dictionary]: @@ -2751,7 +2760,7 @@ func _skill_target_marker_entries() -> Array[Dictionary]: result.append({ "cell": cell, "target_id": str(target.get("id", "")) if not target.is_empty() else "", - "text": str(badge.get("text", "TARGET")), + "text": str(badge.get("text", "標")), "kind": str(badge.get("kind", "support")) }) return result @@ -2772,7 +2781,7 @@ func _item_target_marker_entries() -> Array[Dictionary]: result.append({ "cell": cell, "target_id": str(target.get("id", "")) if not target.is_empty() else "", - "text": str(badge.get("text", "TARGET")), + "text": str(badge.get("text", "標")), "kind": str(badge.get("kind", "support")) }) return result @@ -3670,7 +3679,7 @@ func _format_unit_focus_text(unit: Dictionary, prefix: String) -> String: var lines := [] lines.append("%s: %s%s%s" % [ _unit_focus_prefix_text(prefix), - str(unit.get("name", "Unit")), + str(unit.get("name", "부대")), roster_mark, control_label ]) @@ -3967,7 +3976,7 @@ func _format_physical_threat_preview_text(previews: Array[Dictionary], limit: in var effective_target_text := "" if effective_type.is_empty() else " 대 %s" % effective_type effective_text = " 특효 +%d%s" % [effective_bonus, effective_target_text] parts.append("%s 피해 %d/명중 %d%%%s%s" % [ - str(preview.get("source_name", "Unit")), + str(preview.get("source_name", "부대")), int(preview.get("damage", 0)), int(preview.get("hit_chance", 0)), effective_text, @@ -3983,8 +3992,8 @@ func _format_skill_threat_preview_text(previews: Array[Dictionary], limit: int) var safe_limit: int = maxi(1, limit) for index in range(mini(previews.size(), safe_limit)): var preview: Dictionary = previews[index] - var source_text := str(preview.get("source_name", "Unit")) - var skill_text := str(preview.get("skill_name", "Skill")) + var source_text := str(preview.get("source_name", "부대")) + var skill_text := str(preview.get("skill_name", "책략")) var area_text := _format_skill_threat_area_text(preview) if str(preview.get("kind", "")) == "damage": var defeat_text := " 퇴각" if bool(preview.get("would_defeat", false)) else "" @@ -6027,7 +6036,7 @@ func _rebuild_roster_menu() -> void: var max_units := state.get_deployment_max_units() var deployed_count := state.get_deployed_player_count() if roster_status_label != null: - roster_status_label.text = "Sortie %d/%d" % [deployed_count, max_units] + roster_status_label.text = "출진 명부 %d/%d" % [deployed_count, max_units] if units.is_empty(): var empty_label := Label.new() @@ -6987,13 +6996,13 @@ func _format_progression_events(events) -> String: hidden_count += 1 continue var event_type := str(event.get("type", "")) - var unit_name := str(event.get("name", "Unit")) + var unit_name := str(event.get("name", "부대")) if event_type == "promotion": - parts.append("%s -> %s" % [unit_name, str(event.get("to_class", "Promoted"))]) + parts.append("%s -> %s" % [unit_name, str(event.get("to_class", "승급"))]) elif event_type == "level_up": parts.append("%s Lv.%d" % [unit_name, int(event.get("to_level", 1))]) if hidden_count > 0: - parts.append("+%d more" % hidden_count) + parts.append("외 %d건" % hidden_count) if parts.is_empty(): return "" return _join_strings(parts, "; ") @@ -7219,7 +7228,7 @@ func _on_new_campaign_pressed() -> void: log_box.clear() if not campaign_state.reset_save(campaign_state.get_start_scenario_id()): result_panel.visible = true - result_label.text = "Unable to reset campaign save.\nClose the game and check file permissions." + result_label.text = "전기 봉인을 새로 열지 못했습니다.\n저장 권한을 살펴본 뒤 다시 명하십시오." if result_restart_button != null: result_restart_button.visible = false if next_battle_button != null: @@ -7274,25 +7283,25 @@ func _update_post_move_menu() -> void: return _position_post_move_menu() if post_move_title_label != null: - post_move_title_label.text = "%s: 군령 선택" % str(selected.get("name", "Unit")) + post_move_title_label.text = "%s: 군령 선택" % str(selected.get("name", "부대")) if post_move_attack_button != null: var attack_blocked := not _has_basic_attack_target(pending_move_unit_id) post_move_attack_button.disabled = attack_blocked - post_move_attack_button.tooltip_text = "사거리 안에 적 부대가 없습니다." if attack_blocked else "현재 자리에서 공격할 적을 지목합니다." + post_move_attack_button.tooltip_text = "사거리 안에 적 부대가 없습니다." if attack_blocked else "이 자리에서 칠 적군을 지목합니다." if post_move_tactic_button != null: var skill_blocked := not _unit_has_usable_skill_target(pending_move_unit_id) post_move_tactic_button.disabled = skill_blocked - post_move_tactic_button.tooltip_text = "이 자리에서 닿는 책략 대상이 없습니다." if skill_blocked else "현재 자리에서 쓸 책략을 고릅니다." + post_move_tactic_button.tooltip_text = "이 자리에서 닿는 책략 대상이 없습니다." if skill_blocked else "군령에 올릴 책략 죽간을 고릅니다." if post_move_item_button != null: var item_blocked := not _unit_has_usable_item_target(pending_move_unit_id) post_move_item_button.disabled = item_blocked - post_move_item_button.tooltip_text = "이 자리에서 닿는 도구 대상이 없습니다." if item_blocked else "이동 후 도구 목록을 펼칩니다." + post_move_item_button.tooltip_text = "이 자리에서 닿는 보급 대상이 없습니다." if item_blocked else "군령에 올릴 보급 물자를 고릅니다." if post_move_wait_button != null: post_move_wait_button.disabled = false post_move_wait_button.tooltip_text = "행군을 확정하고 군령을 봉인합니다." if post_move_cancel_button != null: post_move_cancel_button.disabled = false - post_move_cancel_button.tooltip_text = "우클릭으로도 원래 자리로 되돌릴 수 있습니다." + post_move_cancel_button.tooltip_text = "발걸음을 거두면 원래 자리로 되돌립니다." func _local_command_panel_position_for_cell(cell: Vector2i, panel_size: Vector2) -> Vector2: @@ -7396,7 +7405,8 @@ func _rebuild_post_move_picker(selected: Dictionary) -> void: _rebuild_post_move_item_picker(selected) else: var empty_label := Label.new() - empty_label.text = "No choices" + empty_label.text = "열린 군령이 없습니다" + _apply_label_style(empty_label, UI_PARCHMENT_TEXT) post_move_picker_list.add_child(empty_label) @@ -7415,20 +7425,20 @@ func _position_post_move_picker() -> void: func _post_move_picker_title_text(selected: Dictionary) -> String: - var unit_name := str(selected.get("name", "Unit")) + var unit_name := str(selected.get("name", "부대")) if post_move_picker_mode == "tactic": - return "%s: choose stratagem" % unit_name + return "%s: 책략 죽간" % unit_name if post_move_picker_mode == "item": - return "%s: choose supply" % unit_name - return "%s: choose writ" % unit_name + return "%s: 보급 물자" % unit_name + return "%s: 군령 죽간" % unit_name func _post_move_picker_detail_text() -> String: if post_move_picker_mode == "tactic": - return "Select a stratagem, then mark highlighted ground." + return "책략을 고른 뒤 빛나는 표식 칸을 지목합니다." if post_move_picker_mode == "item": - return "Select a supply, then mark a highlighted ally." - return "Select a writ." + return "보급을 고른 뒤 표식이 뜬 아군을 지목합니다." + return "군령에 올릴 죽간을 고릅니다." func _rebuild_post_move_tactic_picker(selected: Dictionary) -> void: @@ -7446,7 +7456,7 @@ func _rebuild_post_move_tactic_picker(selected: Dictionary) -> void: skill_button.text = _format_post_move_tactic_button_text(skill_id, skill, selected) var disabled_reason := _post_move_tactic_disabled_reason(selected, skill_id, skill) skill_button.disabled = not disabled_reason.is_empty() - skill_button.tooltip_text = disabled_reason if not disabled_reason.is_empty() else "Select this tactic writ." + skill_button.tooltip_text = disabled_reason if not disabled_reason.is_empty() else "이 책략 죽간을 군령에 올립니다." _apply_button_style(skill_button) skill_button.pressed.connect(_on_post_move_tactic_option_pressed.bind(skill_id)) post_move_picker_list.add_child(skill_button) @@ -7456,7 +7466,7 @@ func _rebuild_post_move_item_picker(selected: Dictionary) -> void: var item_ids := state.get_usable_item_ids() if item_ids.is_empty(): var empty_label := Label.new() - empty_label.text = "No supplies" + empty_label.text = "쓸 보급이 없습니다" _apply_label_style(empty_label, UI_PARCHMENT_TEXT) post_move_picker_list.add_child(empty_label) return @@ -7664,12 +7674,12 @@ func _update_targeting_hint_panel() -> void: if targeting_hint_detail_label != null: targeting_hint_detail_label.text = _targeting_hint_detail_text() if targeting_hint_back_button != null: - targeting_hint_back_button.text = "돌아가기" - targeting_hint_back_button.tooltip_text = "군령 선택으로 돌아갑니다." if _has_pending_move() else "대상 지정을 풉니다." + targeting_hint_back_button.text = "죽간 거두기" + targeting_hint_back_button.tooltip_text = "군령 선택으로 되돌립니다." if _has_pending_move() else "지목을 거둡니다." if targeting_hint_cancel_move_button != null: targeting_hint_cancel_move_button.visible = _has_pending_move() targeting_hint_cancel_move_button.disabled = not _has_pending_move() - targeting_hint_cancel_move_button.tooltip_text = "우클릭으로도 원래 자리로 되돌릴 수 있습니다." + targeting_hint_cancel_move_button.tooltip_text = "발걸음을 거두면 원래 자리로 되돌립니다." targeting_hint_panel.visible = true @@ -7890,7 +7900,7 @@ func _rebuild_tactic_menu(selected: Dictionary) -> void: tactic_list.add_child(skill_button) var cancel_button := Button.new() - cancel_button.text = "돌아가기" + cancel_button.text = "죽간 거두기" _apply_button_style(cancel_button) cancel_button.pressed.connect(_on_tactic_cancel_pressed) tactic_list.add_child(cancel_button) @@ -8121,7 +8131,7 @@ func _rebuild_item_menu(selected: Dictionary) -> void: item_list.add_child(use_button) var cancel_button := Button.new() - cancel_button.text = "돌아가기" + cancel_button.text = "죽간 거두기" _apply_button_style(cancel_button) cancel_button.pressed.connect(_on_item_cancel_pressed) item_list.add_child(cancel_button) @@ -8275,7 +8285,7 @@ func _rebuild_equip_menu(selected: Dictionary) -> void: equip_list.add_child(equip_item_button) var cancel_button := Button.new() - cancel_button.text = "돌아가기" + cancel_button.text = "죽간 거두기" _apply_button_style(cancel_button) cancel_button.pressed.connect(_on_equip_cancel_pressed) equip_list.add_child(cancel_button) diff --git a/tools/smoke_objective_progress.gd b/tools/smoke_objective_progress.gd index baa576e..b06d8d7 100644 --- a/tools/smoke_objective_progress.gd +++ b/tools/smoke_objective_progress.gd @@ -23,13 +23,13 @@ func _init() -> void: failures, "001 turn pressure risk", _defeat_text("res://data/scenarios/001_yellow_turbans.json"), - "남은 턴 7" + "잔여 군령 7" ) _check_contains( failures, "002 gated victory progress", _progress_text("res://data/scenarios/002_sishui_gate.json", false), - "제2턴에 전공 갱신" + "제2군령에 전공 갱신" ) _check_contains( failures, @@ -41,7 +41,7 @@ func _init() -> void: failures, "007 destination progress", _progress_text("res://data/scenarios/007_xian_emperor_escort.json", false), - "목표 지점 (14, 5): 미도달" + "전장 표식 (14, 5) · 미도달" ) _check_contains( failures, @@ -53,7 +53,7 @@ func _init() -> void: failures, "045 gated destination progress", _progress_text("res://data/scenarios/045_fancheng_relief.json", false), - "목표 지점 (10, 5): 미도달" + "전장 표식 (10, 5) · 미도달" ) _check_event_gated_objective_markers(failures) _check_event_gated_multi_cell_objective_markers(failures) @@ -111,8 +111,8 @@ func _check_objective_update(failures: Array[String]) -> void: failures.append("objective update signal victory mismatch: %s" % str(signal_value.get("victory", ""))) if str(signal_value.get("defeat", "")) != "Cao Cao is defeated.": failures.append("objective update signal defeat mismatch: %s" % str(signal_value.get("defeat", ""))) - _check_log_contains(failures, logs, "Objective updated: Defeat the new vanguard.") - _check_log_contains(failures, logs, "Defeat condition updated: Cao Cao is defeated.") + _check_log_contains(failures, logs, "軍令 개정: Defeat the new vanguard.") + _check_log_contains(failures, logs, "敗兆 개정: Cao Cao is defeated.") signal_values.clear() logs.clear() @@ -125,7 +125,7 @@ func _check_objective_update(failures: Array[String]) -> void: failures.append("defeat-only objective signal should not include victory: %s" % str(defeat_signal_value.get("victory", ""))) if str(defeat_signal_value.get("defeat", "")) != "Supply train is lost.": failures.append("defeat-only objective signal mismatch: %s" % str(defeat_signal_value.get("defeat", ""))) - _check_log_contains(failures, logs, "Defeat condition updated: Supply train is lost.") + _check_log_contains(failures, logs, "敗兆 개정: Supply train is lost.") func _check_event_gated_objective_markers(failures: Array[String]) -> void: @@ -222,6 +222,10 @@ func _check_objective_notice(failures: Array[String]) -> void: failures.append("objective log display should use edict wording") if scene._format_log_entry_text("Defeat condition updated: Supply train is lost.") != "敗兆 개정: Supply train is lost.": failures.append("defeat log display should use omen wording") + if scene._format_log_entry_text("軍令 개정: Defeat the new vanguard.") != "軍令 개정: Defeat the new vanguard.": + failures.append("localized objective log should pass through") + if scene._format_log_entry_text("敗兆 개정: Supply train is lost.") != "敗兆 개정: Supply train is lost.": + failures.append("localized defeat log should pass through") if scene.objective_notice_timer <= 0.0: failures.append("objective notice timer should be active") scene.free() diff --git a/tools/smoke_visual_assets.gd b/tools/smoke_visual_assets.gd index f0dc0cc..553407a 100644 --- a/tools/smoke_visual_assets.gd +++ b/tools/smoke_visual_assets.gd @@ -2761,12 +2761,12 @@ func _check_ancient_ui_theme(failures: Array[String]) -> void: failures.append("post-move command title should use order wording") if scene.post_move_cancel_button == null or scene.post_move_cancel_button.text != "발걸음 거두기": failures.append("post-move cancel button should use recall step wording") - if scene.post_move_picker_back_button == null or scene.post_move_picker_back_button.text != "돌아가기": - failures.append("post-move picker back button should use return wording") + if scene.post_move_picker_back_button == null or scene.post_move_picker_back_button.text != "죽간 거두기": + failures.append("post-move picker back button should use bamboo-slip wording") if scene.targeting_hint_title_label == null or scene.targeting_hint_title_label.text != "적장 지목": failures.append("targeting hint title should use mark foe wording") - if scene.targeting_hint_back_button == null or scene.targeting_hint_back_button.text != "돌아가기": - failures.append("targeting hint back button should use return wording") + 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._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")