From 30ac2479c4624f8462b21d42f9c1a2178fc1b212 Mon Sep 17 00:00:00 2001 From: Wickedness Date: Fri, 19 Jun 2026 05:48:39 +0900 Subject: [PATCH] Antique-localize battle briefings and camp UI --- data/scenarios/001_yellow_turbans.json | 78 ++-- scripts/core/battle_state.gd | 69 +-- scripts/scenes/battle_scene.gd | 562 +++++++++++++++-------- tools/check_godot46_readiness.ps1 | 2 +- tools/smoke_camp_conversation_rewards.gd | 454 +++++++++--------- tools/smoke_objective_progress.gd | 16 +- tools/smoke_post_move_action_flow.gd | 2 +- tools/smoke_result_summary.gd | 14 +- tools/smoke_status_effect_summary.gd | 4 +- tools/smoke_visual_assets.gd | 54 +-- tools/validate_data.ps1 | 2 +- 11 files changed, 717 insertions(+), 540 deletions(-) diff --git a/data/scenarios/001_yellow_turbans.json b/data/scenarios/001_yellow_turbans.json index 0aa19c8..b31e050 100644 --- a/data/scenarios/001_yellow_turbans.json +++ b/data/scenarios/001_yellow_turbans.json @@ -1,9 +1,9 @@ { "id": "001_yellow_turbans", - "name": "Yingchuan Skirmish", + "name": "영천 소전", "objectives": { - "victory": "Defeat all Yellow Turban units.", - "defeat": "Cao Cao is defeated or the battle reaches Turn 8." + "victory": "황건적 전군을 격파하라.", + "defeat": "조조가 퇴각하거나 제8턴에 이르면 패한다." }, "conditions": { "victory": { "type": "all_units_defeated", "team": "enemy" }, @@ -13,62 +13,64 @@ ] }, "briefing": { - "title": "Yingchuan Skirmish", - "location": "Yingchuan, 184 CE", + "title": "영천 소전", + "location": "영천, 중평 원년", "lines": [ - "Yellow Turban rebels have gathered near Yingchuan.", - "Cao Cao and Xiahou Dun must break their formation before the revolt spreads." + "황건의 무리가 영천 근방에 깃발을 세웠다.", + "조조와 하후돈은 난세의 불길이 번지기 전에 그 진형을 꺾어야 한다." ], "camp_dialogue": [ - { "speaker": "Cao Cao", "side": "left", "text": "Yingchuan is a spark in dry grass. If we move decisively, the court may still believe order can return." }, - { "speaker": "Xiahou Dun", "side": "right", "text": "The men are ready. Give me the front, and I will keep the rebels fixed while you cut their nerve." } + { "speaker": "Cao Cao", "display_speaker": "조조", "side": "left", "text": "영천은 마른 풀밭의 불씨와 같다. 결단이 빠르면 조정도 아직 질서가 돌아올 수 있음을 믿을 것이다." }, + { "speaker": "Xiahou Dun", "display_speaker": "하후돈", "side": "right", "text": "군사는 이미 창끝을 세웠습니다. 선봉을 맡겨 주시면 적의 앞줄을 묶어 두겠습니다." } ], "camp_conversations": [ { "id": "cao_cao_strategy", "group": "officer", "officer_id": "cao_cao", - "label": "Cao Cao - Strategy", + "label": "조조 - 군략", "speaker": "Cao Cao", - "summary": "Read the revolt before the first move.", + "display_speaker": "조조", + "summary": "첫 행군 전에 난세의 형세를 살핀다.", "lines": [ - { "speaker": "Cao Cao", "side": "left", "text": "Yingchuan is a spark in dry grass. If we move decisively, the court may still believe order can return." }, - { "speaker": "Cao Cao", "side": "left", "text": "Their center is loose. Break the front, then deny them time to gather more banners." } + { "speaker": "Cao Cao", "display_speaker": "조조", "side": "left", "text": "영천은 마른 풀밭의 불씨와 같다. 결단이 빠르면 조정도 아직 질서가 돌아올 수 있음을 믿을 것이다." }, + { "speaker": "Cao Cao", "display_speaker": "조조", "side": "left", "text": "적의 가운데가 허술하다. 앞줄을 깨고 깃발을 다시 모을 시간을 주지 마라." } ] }, { "id": "xiahou_dun_vanguard", "group": "officer", "officer_id": "xiahou_dun", - "label": "Xiahou Dun - Vanguard", + "label": "하후돈 - 선봉", "speaker": "Xiahou Dun", - "summary": "Discuss the first clash.", + "display_speaker": "하후돈", + "summary": "첫 접전에 앞서 선봉의 길을 정한다.", "lines": [ - { "speaker": "Xiahou Dun", "side": "right", "text": "The men are ready. Give me the front, and I will keep the rebels fixed while you cut their nerve." }, - { "speaker": "Cao Cao", "side": "left", "text": "Hold them in place, but do not chase too deep. We still need eyes on the woods." } + { "speaker": "Xiahou Dun", "display_speaker": "하후돈", "side": "right", "text": "군사는 이미 창끝을 세웠습니다. 선봉을 맡겨 주시면 적의 앞줄을 묶어 두겠습니다." }, + { "speaker": "Cao Cao", "display_speaker": "조조", "side": "left", "text": "붙잡되 깊이 쫓지는 마라. 숲 쪽에도 눈을 두어야 한다." } ] }, { "id": "northern_woods_cache", "group": "topic", - "label": "Northern Woods Cache", - "summary": "Follow up on the merchant's rumor.", + "label": "북쪽 숲 보급고", + "summary": "상인이 흘린 보급 소문을 살핀다.", "lines": [ - { "speaker": "Cao Cao", "side": "left", "text": "The merchant's rumor may be useful. If the line holds, send a scout through the northern woods." }, - { "speaker": "Xiahou Dun", "side": "right", "text": "A hidden cache in rebel country? Then we take it before they remember where they left it." } + { "speaker": "Cao Cao", "display_speaker": "조조", "side": "left", "text": "상인의 말이 허황되지만은 않을 것이다. 전열이 버티면 북쪽 숲으로 척후를 보내라." }, + { "speaker": "Xiahou Dun", "display_speaker": "하후돈", "side": "right", "text": "적지에 숨은 보급이라면, 저들이 기억해 내기 전에 우리가 거두겠습니다." } ], "effects": [ - { "type": "grant_item", "item_id": "bean", "count": 1, "text": "The scout detail adds a Bean to the field supplies." } + { "type": "grant_item", "item_id": "bean", "count": 1, "text": "척후가 북쪽 숲에서 콩 한 줌을 거두어 군수에 보탰다." } ] } ] }, "shop": { "merchant": { - "name": "Camp Merchant", + "name": "군막 상인", "lines": [ - "Roadside stores are thin, my lord, but I saved beans and antidotes for your column.", - "The northern woods have rumors of a hidden cache, if your scouts can reach it." + "길가의 물자는 박하오나, 장군의 행렬을 위해 콩과 해독약만은 남겨 두었습니다.", + "북쪽 숲에는 묻어 둔 보급이 있다는 말도 도니, 척후가 닿으면 살펴보십시오." ] }, "items": ["bean", "antidote"] @@ -110,7 +112,7 @@ }, { "unit_id": "yellow_turban_1", - "name": "Zhang Mancheng", + "name": "장만성", "class_id": "bandit", "team": "enemy", "level": 1, @@ -119,7 +121,7 @@ }, { "unit_id": "yellow_turban_2", - "name": "Peasant Rebel", + "name": "농민 반군", "class_id": "infantry", "team": "enemy", "level": 1, @@ -128,7 +130,7 @@ }, { "unit_id": "yellow_turban_3", - "name": "Rebel Archer", + "name": "황건 궁수", "class_id": "archer", "team": "enemy", "level": 1, @@ -142,8 +144,8 @@ "once": true, "when": { "type": "battle_start" }, "actions": [ - { "type": "log", "text": "Cao Cao engages the Yellow Turbans." }, - { "type": "log", "text": "A small supply cache is hidden in the northern woods." } + { "type": "log", "text": "조조군이 황건적과 맞붙었다." }, + { "type": "log", "text": "북쪽 숲 어딘가에 작은 보급고가 숨겨져 있다." } ] }, { @@ -154,8 +156,8 @@ { "type": "dialogue", "lines": [ - { "speaker": "Cao Cao", "side": "left", "text": "The rebels are scattered, but their numbers will swell if we hesitate." }, - { "speaker": "Xiahou Dun", "side": "right", "text": "Then we strike now. I will open a path through their front line." } + { "speaker": "Cao Cao", "display_speaker": "조조", "side": "left", "text": "적은 흩어져 있으나, 머뭇거리면 그 수가 불어날 것이다." }, + { "speaker": "Xiahou Dun", "display_speaker": "하후돈", "side": "right", "text": "그렇다면 지금 치겠습니다. 제가 앞줄을 열어 길을 내겠습니다." } ] } ] @@ -165,7 +167,7 @@ "once": true, "when": { "type": "unit_reaches_tile", "team": "player", "pos": [3, 2] }, "actions": [ - { "type": "log", "text": "The northern woods cache is recovered." }, + { "type": "log", "text": "북쪽 숲 보급고를 거두었다." }, { "type": "grant_item", "item_id": "bean" } ] }, @@ -174,7 +176,7 @@ "once": true, "when": { "type": "turn_start", "team": "enemy", "turn": 2 }, "actions": [ - { "type": "log", "text": "The Yellow Turbans are looking for an opening." } + { "type": "log", "text": "황건적이 빈틈을 엿보고 있다." } ] } ], @@ -184,9 +186,9 @@ "join_officers": ["xiahou_yuan", "cao_ren"] }, "post_battle_dialogue": [ - { "speaker": "Xiahou Dun", "side": "right", "text": "The rebels are scattered. Yingchuan should breathe easier tonight." }, - { "speaker": "Cao Cao", "side": "left", "text": "This is only the first fire. If the court cannot move quickly, we must." }, - { "speaker": "Xiahou Yuan", "side": "right", "text": "Then call on us for the next campaign. We will ride with you." }, - { "speaker": "Cao Ren", "side": "right", "text": "The clan stands ready, my lord." } + { "speaker": "Xiahou Dun", "display_speaker": "하후돈", "side": "right", "text": "적이 흩어졌습니다. 오늘 밤 영천은 한숨 돌릴 수 있겠습니다." }, + { "speaker": "Cao Cao", "display_speaker": "조조", "side": "left", "text": "이는 첫 불길일 뿐이다. 조정이 빨리 움직이지 못한다면 우리가 움직여야 한다." }, + { "speaker": "Xiahou Yuan", "display_speaker": "하후연", "side": "right", "text": "그렇다면 다음 출정에도 저희를 부르십시오. 함께 달리겠습니다." }, + { "speaker": "Cao Ren", "display_speaker": "조인", "side": "right", "text": "일족은 명을 기다리고 있습니다, 주공." } ] } diff --git a/scripts/core/battle_state.gd b/scripts/core/battle_state.gd index 544db76..2635b81 100644 --- a/scripts/core/battle_state.gd +++ b/scripts/core/battle_state.gd @@ -271,12 +271,14 @@ func _normalized_camp_conversations(source) -> Array: var label := str(entry.get("label", conversation_id.capitalize())).strip_edges() if label.is_empty(): label = conversation_id.capitalize() + var speaker := str(entry.get("speaker", "")).strip_edges() + var display_speaker := str(entry.get("display_speaker", speaker)).strip_edges() result.append({ "id": conversation_id, "group": str(entry.get("group", "topic")).strip_edges(), "officer_id": str(entry.get("officer_id", "")).strip_edges(), "label": label, - "speaker": str(entry.get("speaker", "")).strip_edges(), + "speaker": display_speaker, "summary": str(entry.get("summary", "")).strip_edges(), "lines": lines, "effects": _normalized_camp_conversation_effects(entry.get("effects", [])) @@ -1309,7 +1311,7 @@ func end_player_turn() -> void: selected_unit_id = "" current_team = TEAM_ENEMY - _emit_log("Enemy phase begins.") + _emit_log("적군 차례가 열렸습니다.") _reset_team_actions(TEAM_ENEMY) if battle_status == STATUS_ACTIVE: _run_events("turn_start", current_team, turn_number) @@ -2068,13 +2070,21 @@ func can_player_act() -> bool: func get_status_text() -> String: if battle_status == STATUS_VICTORY: - return "Victory" + return "승전" if battle_status == STATUS_DEFEAT: - return "Defeat" + return "패전" var turn_limit := get_turn_limit() if turn_limit > 0: - return "Turn %d/%d - %s" % [turn_number, turn_limit, current_team.capitalize()] - return "Turn %d - %s" % [turn_number, current_team.capitalize()] + return "제%d턴/%d · %s" % [turn_number, turn_limit, _team_status_text(current_team)] + return "제%d턴 · %s" % [turn_number, _team_status_text(current_team)] + + +func _team_status_text(team: String) -> String: + if team == TEAM_PLAYER: + return "아군" + if team == TEAM_ENEMY: + return "적군" + return team.capitalize() func get_turn_limit() -> int: @@ -2793,7 +2803,7 @@ func _run_enemy_turn() -> void: if battle_status == STATUS_ACTIVE: turn_number += 1 current_team = TEAM_PLAYER - _emit_log("Player phase begins.") + _emit_log("아군 차례가 열렸습니다.") _reset_team_actions(TEAM_PLAYER) if battle_status == STATUS_ACTIVE: _run_events("turn_start", current_team, turn_number) @@ -3494,9 +3504,9 @@ func _append_all_units_progress_line(result: Array[String], team: String, mode: return var living := _count_living_deployed_units(team) if mode == "defeat": - _append_progress_line(result, "%s remaining %d/%d" % [_condition_team_label(team), living, total], pending) + _append_progress_line(result, "%s 잔존 %d/%d" % [_condition_team_label(team), living, total], pending) return - _append_progress_line(result, "%s defeated %d/%d" % [_condition_team_label(team), total - living, total], pending) + _append_progress_line(result, "%s 격파 %d/%d" % [_condition_team_label(team), total - living, total], pending) func _append_target_units_progress_line(result: Array[String], unit_ids, mode: String, pending := false) -> void: @@ -3507,11 +3517,11 @@ func _append_target_units_progress_line(result: Array[String], unit_ids, mode: S var defeated := int(counts.get("defeated", 0)) if mode == "defeat" and total == 1: var unit_name := _condition_unit_display_name(unit_ids[0]) - var status := "defeated" if defeated > 0 else "safe" + var status := "퇴각" if defeated > 0 else "건재" _append_progress_line(result, "%s %s" % [unit_name, status], pending) return - var label := "Protected losses" if mode == "defeat" else "Target units defeated" - var suffix := " (defeat at 1)" if mode == "defeat" else "" + var label := "호위 손실" if mode == "defeat" else "격파 표식" + var suffix := " (1 이상이면 패전)" if mode == "defeat" else "" _append_progress_line(result, "%s %d/%d%s" % [label, defeated, total, suffix], pending) @@ -3529,11 +3539,11 @@ func _append_target_officers_progress_line( var defeated := int(counts.get("defeated", 0)) if mode == "defeat" and total == 1: var officer_name := _condition_officer_display_name(str(officer_ids[0]), team) - var status := "defeated" if defeated > 0 else "safe" + var status := "퇴각" if defeated > 0 else "건재" _append_progress_line(result, "%s %s" % [officer_name, status], pending) return - var label := "Officer losses" if mode == "defeat" else "Target officers defeated" - var suffix := " (defeat at 1)" if mode == "defeat" else "" + var label := "장수 손실" if mode == "defeat" else "대상 장수 격파" + var suffix := " (1 이상이면 패전)" if mode == "defeat" else "" _append_progress_line(result, "%s %d/%d%s" % [label, defeated, total, suffix], pending) @@ -3541,8 +3551,8 @@ func _append_destination_progress_line(result: Array[String], condition: Diction var targets := _condition_cells(condition) if targets.is_empty(): return - var status := "reached" if _unit_reaches_tile(condition) else "not reached" - _append_progress_line(result, "Destination %s: %s" % [_format_cells(targets), status], pending) + var status := "도달" if _unit_reaches_tile(condition) else "미도달" + _append_progress_line(result, "목표 지점 %s: %s" % [_format_cells(targets), status], pending) func _append_turn_limit_progress_line(result: Array[String]) -> void: @@ -3550,7 +3560,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, "Turns left %d" % turns_left) + _append_progress_line(result, "남은 턴 %d" % turns_left) func _append_after_event_progress_line(result: Array[String], event_id: String) -> void: @@ -3566,15 +3576,15 @@ 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, "Objective unlocks on Turn %d" % target_turn) + _append_progress_line(result, "제%d턴에 전공 갱신" % target_turn) func _append_event_destination_progress_line(result: Array[String], when: Dictionary) -> void: var targets := _condition_cells(when) if targets.is_empty(): return - var status := "reached" if _unit_reaches_tile(when) else "not reached" - _append_progress_line(result, "Reach %s: %s" % [_format_cells(targets), status]) + var status := "도달" if _unit_reaches_tile(when) else "미도달" + _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: @@ -3583,7 +3593,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, "Turns left %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: @@ -3591,16 +3601,16 @@ 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, "Turns left %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, "Turn %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: if text.is_empty(): return if pending: - text += " (pending)" + text += " (대기)" if not result.has(text): result.append(text) @@ -3700,10 +3710,10 @@ func _condition_officer_display_name(officer_id: String, team := "") -> String: func _condition_team_label(team: String) -> String: if team == TEAM_ENEMY: - return "Enemies" + return "적군" if team == TEAM_PLAYER: - return "Allies" - return "Units" + return "아군" + return "부대" func _event_by_id(event_id: String) -> Dictionary: @@ -4157,11 +4167,12 @@ func _normalize_dialogue_line(line) -> Dictionary: if text.is_empty(): return {} var speaker := str(line.get("speaker", "")) + var display_speaker := str(line.get("display_speaker", speaker)) var portrait := str(line.get("portrait", "")) if portrait.is_empty(): portrait = data_catalog.get_portrait_for_speaker(speaker) return { - "speaker": speaker, + "speaker": display_speaker, "text": text, "portrait": portrait, "side": _normalize_dialogue_side(line.get("side", "left")) diff --git a/scripts/scenes/battle_scene.gd b/scripts/scenes/battle_scene.gd index 4f9c8fa..487f763 100644 --- a/scripts/scenes/battle_scene.gd +++ b/scripts/scenes/battle_scene.gd @@ -929,7 +929,7 @@ func _create_hud() -> void: post_move_column.add_child(post_move_grid) post_move_attack_button = Button.new() - post_move_attack_button.text = "Strike" + post_move_attack_button.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) @@ -971,7 +971,7 @@ func _create_hud() -> void: post_move_picker_panel.add_child(picker_column) post_move_picker_title_label = Label.new() - post_move_picker_title_label.text = "Select Writ" + post_move_picker_title_label.text = "군령 선택" post_move_picker_title_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER _apply_label_style(post_move_picker_title_label, UI_OLD_BRONZE, 14) picker_column.add_child(post_move_picker_title_label) @@ -1661,7 +1661,7 @@ func _play_log_sfx(message: String) -> void: _play_sfx("fire_skill") elif message.contains(" moved to ") or message.contains(" advances to ") or message.contains(" takes formation at ") or message.contains(" arrives at "): _play_sfx("footstep") - elif message.contains(" uses ") or message.contains(" equips ") or message.begins_with("Bought ") or message.begins_with("Sold ") or message.begins_with("Received "): + elif message.contains(" uses ") or message.contains(" equips ") or message.contains(" 매입:") or message.contains(" 매각:") or message.begins_with("Received "): _play_sfx("item_pickup") elif message.contains(" reaches Lv.") or message.contains(" promotes to "): _play_sfx("menu_confirm") @@ -2455,7 +2455,7 @@ func _attack_target_marker_entries() -> Array[Dictionary]: if preview.is_empty() or not bool(preview.get("in_range", false)) or bool(preview.get("attack_locked", false)): continue var hit_chance := int(preview.get("hit_chance", 100)) - var result_text := "KO" if bool(preview.get("would_defeat", false)) else "-%d" % int(preview.get("damage", 0)) + var result_text := "퇴각" if bool(preview.get("would_defeat", false)) else "-%d" % int(preview.get("damage", 0)) result.append({ "cell": cell, "target_id": str(target.get("id", "")), @@ -3018,12 +3018,12 @@ func _attack_target_preview_badge(selected: Dictionary, target: Dictionary) -> D return {} if bool(preview.get("attack_locked", false)): - return _make_target_preview_badge("DISARMED", "disarm") + return _make_target_preview_badge("무장해제", "disarm") if not bool(preview.get("in_range", false)): - return _make_target_preview_badge("OUT", "invalid") + return _make_target_preview_badge("거리밖", "invalid") var hit_chance := int(preview.get("hit_chance", 100)) - var result_text := "KO" if bool(preview.get("would_defeat", false)) else "-%d" % int(preview.get("damage", 0)) + var result_text := "퇴각" if bool(preview.get("would_defeat", false)) else "-%d" % int(preview.get("damage", 0)) return _make_target_preview_badge("%s %d%%" % [result_text, hit_chance], "damage") @@ -3037,13 +3037,13 @@ func _skill_target_preview_badge_for_cell(selected: Dictionary, target: Dictiona return {} if bool(preview.get("skill_locked", false)): - return _make_target_preview_badge_at("SEALED", "seal", cell) + return _make_target_preview_badge_at("봉인", "seal", cell) if not bool(preview.get("in_range", false)): - return _make_target_preview_badge_at("OUT", "invalid", cell) + return _make_target_preview_badge_at("거리밖", "invalid", cell) if not bool(preview.get("has_mp", false)): - return _make_target_preview_badge_at("NO MP", "invalid", cell) + return _make_target_preview_badge_at("기력부족", "invalid", cell) if not bool(preview.get("valid_target", false)): - return _make_target_preview_badge_at("NO TGT" if bool(preview.get("has_area", false)) else "INVALID", "invalid", cell) + return _make_target_preview_badge_at("표식없음" if bool(preview.get("has_area", false)) else "불가", "invalid", cell) if target.is_empty() and not bool(preview.get("has_area", false)): return {} @@ -3053,7 +3053,7 @@ func _skill_target_preview_badge_for_cell(selected: Dictionary, target: Dictiona var heal := int(preview.get("heal", 0)) var total_heal := int(preview.get("total_heal", heal)) if total_heal <= 0: - return _make_target_preview_badge_at("FULL", "invalid", cell) + return _make_target_preview_badge_at("가득", "invalid", cell) if bool(preview.get("has_area", false)): return _make_target_preview_badge_at("+%d x%d" % [total_heal, target_count], "heal", cell) return _make_target_preview_badge_at("+%d HP" % heal, "heal", cell) @@ -3067,9 +3067,9 @@ func _skill_target_preview_badge_for_cell(selected: Dictionary, target: Dictiona if bool(preview.get("has_area", false)): var defeat_count := int(preview.get("defeat_count", 0)) if defeat_count > 0: - return _make_target_preview_badge_at("KO x%d" % defeat_count, "damage", cell) + return _make_target_preview_badge_at("퇴각 x%d" % defeat_count, "damage", cell) return _make_target_preview_badge_at("-%d x%d" % [int(preview.get("total_damage", 0)), target_count], "damage", cell) - var result_text := "KO" if bool(preview.get("would_defeat", false)) else "-%d" % int(preview.get("damage", 0)) + var result_text := "퇴각" if bool(preview.get("would_defeat", false)) else "-%d" % int(preview.get("damage", 0)) return _make_target_preview_badge_at(result_text, "damage", cell) @@ -3083,19 +3083,19 @@ func _item_target_preview_badge_for_cell(selected: Dictionary, target: Dictionar return {} if not bool(preview.get("valid_target", false)): - return _make_target_preview_badge_at("INVALID", "invalid", cell) + return _make_target_preview_badge_at("불가", "invalid", cell) if not bool(preview.get("in_range", false)): - return _make_target_preview_badge_at("OUT", "invalid", cell) + return _make_target_preview_badge_at("거리밖", "invalid", cell) if int(preview.get("count", 0)) <= 0: - return _make_target_preview_badge_at("NONE", "invalid", cell) + return _make_target_preview_badge_at("없음", "invalid", cell) var hp_heal := int(preview.get("heal", 0)) var mp_heal := int(preview.get("mp_heal", 0)) var cure_statuses: Array = preview.get("cure_statuses", []) if hp_heal <= 0 and mp_heal <= 0 and cure_statuses.is_empty(): - return _make_target_preview_badge_at("NO FX", "invalid", cell) + return _make_target_preview_badge_at("무효", "invalid", cell) if not cure_statuses.is_empty(): - return _make_target_preview_badge_at("CURE", "support", cell) + return _make_target_preview_badge_at("치료", "support", cell) if hp_heal > 0 and mp_heal > 0: return _make_target_preview_badge_at("+%d/%d" % [hp_heal, mp_heal], "heal", cell) if hp_heal > 0: @@ -3114,10 +3114,10 @@ func _hover_intent_preview_badge(selected: Dictionary, target: Dictionary) -> Di return {} if not target.is_empty(): if target.get("team", "") == selected.get("team", "") and _can_select(target): - return _make_target_preview_badge("SELECT", "select") + return _make_target_preview_badge("선택", "select") return {} if move_cells.has(hover_cell): - return _make_target_preview_badge("MOVE", "move") + return _make_target_preview_badge("행군", "move") return {} @@ -3146,14 +3146,28 @@ func _compact_support_preview_text(effect_text: String) -> String: if for_index >= 0: part = part.substr(0, for_index) if not part.is_empty() and part != "No support effect.": - parts.append(part) + parts.append(_compact_support_badge_text(part)) if parts.is_empty(): - return "SUPPORT" + return "지원" if parts.size() > 1: return "%s+" % parts[0] return str(parts[0]) +func _compact_support_badge_text(text: String) -> String: + if text.contains("Disarm"): + return "무장해제" + if text.contains("Snare"): + return "속박" + if text.contains("Seal"): + return "봉인" + if text.contains("Poison"): + return "독" + if text.contains("Cleanse"): + return "해소" + return text + + func _support_preview_badge_kind(effect_text: String) -> String: if effect_text.contains("Disarm"): return "disarm" @@ -3259,7 +3273,7 @@ func _update_hud() -> void: var hovered_unit := _hovered_unit_for_hud_portrait() _update_hud_unit_portrait(hovered_unit) if hovered_unit.is_empty(): - selected_label.text = "No banner marked." + selected_label.text = "표식 없는 빈 전장입니다." else: selected_label.text = _format_unit_focus_text(hovered_unit, "Hover") _update_wait_button({}) @@ -3293,7 +3307,7 @@ func _update_hud() -> void: func _format_objective_hud_text() -> String: var lines := [] - var victory := String(state.objectives.get("victory", "Defeat all enemies.")) + var victory := String(state.objectives.get("victory", "적군을 모두 격파하라.")) if not victory.is_empty(): lines.append("승리 조서: %s" % victory) var defeat := String(state.objectives.get("defeat", "")) @@ -3306,9 +3320,9 @@ func _format_objective_hud_text() -> String: func _format_unit_focus_text(unit: Dictionary, prefix: String) -> String: if unit.is_empty(): - return "No banner marked." + return "표식 없는 빈 전장입니다." var roster_mark := " *" if unit.get("loaded_from_roster", false) else "" - var control_label := " Protected" if not bool(unit.get("controllable", true)) else "" + var control_label := " 호위" if not bool(unit.get("controllable", true)) else "" var lines := [] lines.append("%s: %s%s%s" % [ _unit_focus_prefix_text(prefix), @@ -3317,25 +3331,25 @@ func _format_unit_focus_text(unit: Dictionary, prefix: String) -> String: control_label ]) lines.append("%s Lv.%d %s %s" % [ - str(unit.get("team", "")).capitalize(), + _unit_team_text(str(unit.get("team", ""))), int(unit.get("level", 1)), - str(unit.get("class", "Unit")), + _unit_class_display_name(unit), _unit_role_text(unit) ]) - lines.append("Troops %d/%d Qi %d/%d Merit %d" % [ + lines.append("병력 %d/%d 기력 %d/%d 전공 %d" % [ int(unit.get("hp", 0)), int(unit.get("max_hp", 1)), int(unit.get("mp", 0)), int(unit.get("max_mp", 0)), int(unit.get("exp", 0)) ]) - lines.append("Might %d Guard %d Counsel %d Tempo %d" % [ + lines.append("무위 %d 방비 %d 지략 %d 기동 %d" % [ int(unit.get("atk", 0)), int(unit.get("def", 0)), int(unit.get("int", 0)), int(unit.get("agi", 0)) ]) - lines.append("March %d (%s) Strike reach %d-%d" % [ + lines.append("행군 %d (%s) 타격 %d-%d" % [ int(unit.get("move", 0)), _format_move_type(str(unit.get("move_type", "foot"))), int(unit.get("min_range", 1)), @@ -3347,7 +3361,7 @@ func _format_unit_focus_text(unit: Dictionary, prefix: String) -> String: lines.append(terrain_text) var status_effects := state.get_status_effect_summary(str(unit.get("id", ""))) if not status_effects.is_empty(): - lines.append("Conditions: %s" % status_effects) + lines.append("상태: %s" % status_effects) return _join_strings(lines, "\n") @@ -3376,9 +3390,9 @@ func _unit_action_status_text(unit: Dictionary) -> String: return "군령: 차례 대기" var actions: Array[String] = [] if not bool(unit.get("moved", false)) and not state.get_movement_range(unit_id).is_empty(): - actions.append("March") + actions.append("행군") if not state.get_attack_cells(unit_id).is_empty(): - actions.append("Strike") + actions.append("타격") var skill_id := state.get_first_usable_skill_id(unit_id) if not skill_id.is_empty() and not state.get_skill_cells(unit_id, skill_id).is_empty(): actions.append("책략") @@ -3387,7 +3401,7 @@ func _unit_action_status_text(unit: Dictionary) -> String: if not bool(unit.get("moved", false)): actions.append("병장") actions.append("대기") - var suffix := " (marched)" if bool(unit.get("moved", false)) else "" + var suffix := " (행군 완료)" if bool(unit.get("moved", false)) else "" return "군령: %s%s" % [_join_strings(actions, ", "), suffix] @@ -3435,26 +3449,51 @@ func _item_preview_can_apply(preview: Dictionary) -> bool: func _unit_role_text(unit: Dictionary) -> String: var class_id := str(unit.get("class_id", "")) if class_id.contains("cavalry"): - return "Shock cavalry" + return "돌격 기병" if class_id.contains("archer") or class_id.contains("marksman"): - return "Bow pressure" + return "원거리 견제" if class_id.contains("strategist") or class_id.contains("advisor"): return "책략 참모" if class_id.contains("hero") or class_id.contains("commander"): - return "Command authority" + return "군령 지휘" if class_id.contains("warrior") or class_id.contains("champion") or class_id.contains("bandit"): - return "Assault vanguard" - return "Line infantry" + return "선봉 돌파" + return "전열 보병" + + +func _unit_team_text(team: String) -> String: + if team == BattleState.TEAM_PLAYER: + return "아군" + if team == BattleState.TEAM_ENEMY: + return "적군" + return team.capitalize() + + +func _unit_class_display_name(unit: Dictionary) -> String: + var class_id := str(unit.get("class_id", "")) + if class_id.contains("cavalry"): + return "기병" + if class_id.contains("archer") or class_id.contains("marksman"): + return "궁병" + if class_id.contains("strategist") or class_id.contains("advisor"): + return "책사" + if class_id.contains("hero") or class_id.contains("commander"): + return "지휘관" + if class_id.contains("warrior") or class_id.contains("champion"): + return "무장" + if class_id.contains("bandit"): + return "산적" + return str(unit.get("class", "부대")) func _unit_current_terrain_text(unit: Dictionary) -> String: var cell: Vector2i = unit.get("pos", Vector2i(-1, -1)) if not state.is_inside(cell): return "" - return "Ground %d,%d %s March %d Guard +%d Dodge +%d%%" % [ + return "지형 %d,%d %s 행군 %d 방비 +%d 회피 +%d%%" % [ cell.x + 1, cell.y + 1, - state.get_terrain_name(cell), + _terrain_display_name(state.get_terrain_name(cell)), state.get_move_cost(cell, str(unit.get("move_type", "foot"))), state.get_terrain_defense(cell), state.get_terrain_avoid(cell) @@ -3521,15 +3560,15 @@ func _update_hud_unit_portrait(unit: Dictionary) -> void: func _update_cell_info() -> void: if not state.is_inside(hover_cell): - cell_info_label.text = "Ground: -" + cell_info_label.text = "지형: -" return var summary := state.get_cell_summary(hover_cell) var cell: Vector2i = summary["cell"] - var text := "Ground %d,%d %s\nMarch %d Guard +%d Dodge +%d%%" % [ + var text := "지형 %d,%d %s\n행군 %d 방비 +%d 회피 +%d%%" % [ cell.x + 1, cell.y + 1, - summary["terrain"], + _terrain_display_name(str(summary["terrain"])), summary["move_cost"], summary["defense"], summary.get("avoid", 0) @@ -3539,17 +3578,17 @@ func _update_cell_info() -> void: if show_threat_overlay: var threat_names := state.get_threatening_unit_names(cell, BattleState.TEAM_ENEMY) if not threat_names.is_empty(): - text += "\nWatched by %s" % _compact_name_list(threat_names, 3) + text += "\n감시: %s" % _compact_name_list(threat_names, 3) var unit: Dictionary = summary["unit"] if not unit.is_empty(): - var control_label := " Protected" if not bool(unit.get("controllable", true)) else "" + var control_label := " 호위" if not bool(unit.get("controllable", true)) else "" text += "\n군기: %s%s %s Lv.%d\n%s %s 병력 %d/%d 기력 %d/%d\n병장: %s" % [ unit["name"], control_label, - str(unit["team"]).capitalize(), + _unit_team_text(str(unit["team"])), unit["level"], - str(unit.get("class", "Unit")), + _unit_class_display_name(unit), _unit_role_text(unit), unit["hp"], unit["max_hp"], @@ -3559,11 +3598,11 @@ func _update_cell_info() -> void: ] var status_effects := state.get_status_effect_summary(unit["id"]) if not status_effects.is_empty(): - text += "\nConditions: %s" % status_effects + text += "\n상태: %s" % status_effects if show_threat_overlay: var physical_threats := state.get_physical_threat_previews(cell, BattleState.TEAM_ENEMY) if not physical_threats.is_empty(): - text += "\nWeapon threat: %s" % _format_physical_threat_preview_text(physical_threats, 3) + text += "\n병장 위협: %s" % _format_physical_threat_preview_text(physical_threats, 3) var skill_threats := state.get_skill_threat_previews(cell, BattleState.TEAM_ENEMY) if not skill_threats.is_empty(): text += "\n책략 위협: %s" % _format_skill_threat_preview_text(skill_threats, 3) @@ -3576,14 +3615,14 @@ func _format_physical_threat_preview_text(previews: Array[Dictionary], limit: in var safe_limit: int = maxi(1, limit) for index in range(mini(previews.size(), safe_limit)): var preview: Dictionary = previews[index] - var defeat_text := " KO" if bool(preview.get("would_defeat", false)) else "" + var defeat_text := " 퇴각" if bool(preview.get("would_defeat", false)) else "" var effective_text := "" var effective_bonus := int(preview.get("effective_bonus", 0)) if effective_bonus > 0: var effective_type := _format_move_type(str(preview.get("effective_target_type", ""))) - var effective_target_text := "" if effective_type.is_empty() else " vs %s" % effective_type - effective_text = " Eff +%d%s" % [effective_bonus, effective_target_text] - parts.append("%s %d/%d%%%s%s" % [ + 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")), int(preview.get("damage", 0)), int(preview.get("hit_chance", 0)), @@ -3604,8 +3643,8 @@ func _format_skill_threat_preview_text(previews: Array[Dictionary], limit: int) var skill_text := str(preview.get("skill_name", "Skill")) var area_text := _format_skill_threat_area_text(preview) if str(preview.get("kind", "")) == "damage": - var defeat_text := " KO" if bool(preview.get("would_defeat", false)) else "" - parts.append("%s %s %d dmg%s%s" % [ + var defeat_text := " 퇴각" if bool(preview.get("would_defeat", false)) else "" + parts.append("%s %s 피해 %d%s%s" % [ source_text, skill_text, int(preview.get("damage", 0)), @@ -3613,7 +3652,7 @@ func _format_skill_threat_preview_text(previews: Array[Dictionary], limit: int) defeat_text ]) else: - var active_text := " active" if bool(preview.get("already_active", false)) else "" + var active_text := " 지속" if bool(preview.get("already_active", false)) else "" parts.append("%s %s %s%s%s" % [ source_text, skill_text, @@ -3646,7 +3685,7 @@ func _compact_name_list(names: Array[String], limit: int) -> String: func _update_forecast() -> void: var selected := state.get_selected_unit() if selected.is_empty() or not state.is_inside(hover_cell): - forecast_label.text = "War Read: -" + forecast_label.text = "전황: -" return if not selected_skill_id.is_empty(): @@ -3658,26 +3697,26 @@ func _update_forecast() -> void: var target := state.get_unit_at(hover_cell) if target.is_empty() or target.get("team", "") == selected.get("team", ""): - forecast_label.text = "War Read: -" + forecast_label.text = "전황: -" return var preview := state.get_damage_preview(selected["id"], target["id"]) if preview.is_empty(): - forecast_label.text = "War Read: -" + forecast_label.text = "전황: -" return if bool(preview.get("attack_locked", false)): - forecast_label.text = "War Read: disarmed.\nCannot strike with weapons." + forecast_label.text = "전황: 병장 봉인\n무기로 공격할 수 없습니다." return - var range_text := "ready" if preview["in_range"] else "out of range" - var defeat_text := " Defeat" if preview["would_defeat"] else "" + var range_text := "사거리 안" if preview["in_range"] else "사거리 밖" + var defeat_text := " 퇴각" if preview["would_defeat"] else "" var effective_text := _format_effective_forecast_text(preview, "effective_bonus", "effective_target_type") var counter_text := "" if preview["counter_in_range"]: - var counter_defeat := " Defeat" if preview["counter_would_defeat"] else "" + var counter_defeat := " 퇴각" if preview["counter_would_defeat"] else "" var counter_effective_text := _format_effective_forecast_text(preview, "counter_effective_bonus", "counter_effective_target_type") - counter_text = "\nCounter %d%s, Hit %d%%, your Troops %d/%d.%s" % [ + counter_text = "\n반격 %d%s, 명중 %d%%, 아군 병력 %d/%d.%s" % [ preview["counter_damage"], counter_effective_text, preview.get("counter_hit_chance", 0), @@ -3685,7 +3724,7 @@ func _update_forecast() -> void: selected["max_hp"], counter_defeat ] - forecast_label.text = "War Read: %s\n%d damage%s, Hit %d%%, foe Troops %d/%d.%s%s" % [ + forecast_label.text = "전황: %s\n피해 %d%s, 명중 %d%%, 적 병력 %d/%d.%s%s" % [ range_text, preview["damage"], effective_text, @@ -3703,26 +3742,26 @@ func _format_effective_forecast_text(preview: Dictionary, bonus_key: String, typ return "" var move_type := _format_move_type(str(preview.get(type_key, ""))) if move_type.is_empty(): - move_type = "Target" - return " (Effective +%d vs %s)" % [bonus, move_type] + move_type = "대상" + return " (특효 +%d 대 %s)" % [bonus, move_type] func _update_skill_forecast(selected: Dictionary) -> void: var preview := state.get_skill_preview(selected["id"], selected_skill_id, hover_cell) if preview.is_empty(): - forecast_label.text = "War Read: -" + forecast_label.text = "전황: -" return - var range_text := "ready" if preview["in_range"] else "out of range" - var mp_text := "" if preview["has_mp"] else " Not enough Qi." + var range_text := "사거리 안" if preview["in_range"] else "사거리 밖" + var mp_text := "" if preview["has_mp"] else " 기력이 부족합니다." if bool(preview.get("skill_locked", false)): - forecast_label.text = "%s: sealed, %d Qi.\nCannot use stratagems." % [ + forecast_label.text = "%s: 봉인, 기력 %d.\n책략을 펼칠 수 없습니다." % [ preview["skill_name"], preview["mp_cost"] ] return if not preview["valid_target"]: - forecast_label.text = "%s: %s, %d Qi.%s\nNo valid mark." % [ + forecast_label.text = "%s: %s, 기력 %d.%s\n지목할 대상이 없습니다." % [ preview["skill_name"], range_text, preview["mp_cost"], @@ -3734,11 +3773,11 @@ func _update_skill_forecast(selected: Dictionary) -> void: var target_max_hp := int(target.get("max_hp", 1)) if not target.is_empty() else 1 var target_count := int(preview.get("target_count", 1)) var has_area := bool(preview.get("has_area", false)) - var area_text := " Area marks: %d." % target_count if has_area else "" + var area_text := " 범위 대상: %d." % target_count if has_area else "" if preview["kind"] == "heal": var total_heal := int(preview.get("total_heal", preview.get("heal", 0))) if not has_area: - forecast_label.text = "%s: %s, %d Qi.%s\nRestore %d Troops, banner Troops %d/%d." % [ + forecast_label.text = "%s: %s, 기력 %d.%s\n병력 %d 회복, 군기 병력 %d/%d." % [ preview["skill_name"], range_text, preview["mp_cost"], @@ -3748,7 +3787,7 @@ func _update_skill_forecast(selected: Dictionary) -> void: target_max_hp ] return - forecast_label.text = "%s: %s, %d Qi.%s%s\nRestore %d Troops total, focus Troops %d/%d." % [ + forecast_label.text = "%s: %s, 기력 %d.%s%s\n총 병력 %d 회복, 지목 병력 %d/%d." % [ preview["skill_name"], range_text, preview["mp_cost"], @@ -3759,8 +3798,8 @@ func _update_skill_forecast(selected: Dictionary) -> void: target_max_hp ] elif preview["kind"] == "support": - var refresh_text := " Refresh." if bool(preview.get("already_active", false)) else "" - forecast_label.text = "%s: %s, %d Qi.%s%s\n%s.%s" % [ + var refresh_text := " 갱신." if bool(preview.get("already_active", false)) else "" + forecast_label.text = "%s: %s, 기력 %d.%s%s\n%s.%s" % [ preview["skill_name"], range_text, preview["mp_cost"], @@ -3771,11 +3810,11 @@ func _update_skill_forecast(selected: Dictionary) -> void: ] else: var defeat_count := int(preview.get("defeat_count", 0)) - var defeat_text := " Defeat x%d" % defeat_count if defeat_count > 0 else "" + var defeat_text := " 퇴각 x%d" % defeat_count if defeat_count > 0 else "" var total_damage := int(preview.get("total_damage", preview.get("damage", 0))) if not has_area: - var single_defeat_text := " Defeat" if bool(preview.get("would_defeat", false)) else "" - forecast_label.text = "%s: %s, %d Qi.%s\n%d damage, foe Troops %d/%d.%s" % [ + var single_defeat_text := " 퇴각" if bool(preview.get("would_defeat", false)) else "" + forecast_label.text = "%s: %s, 기력 %d.%s\n피해 %d, 적 병력 %d/%d.%s" % [ preview["skill_name"], range_text, preview["mp_cost"], @@ -3786,7 +3825,7 @@ func _update_skill_forecast(selected: Dictionary) -> void: single_defeat_text ] return - forecast_label.text = "%s: %s, %d Qi.%s%s\n%d total damage, focus Troops %d/%d.%s" % [ + forecast_label.text = "%s: %s, 기력 %d.%s%s\n총 피해 %d, 지목 병력 %d/%d.%s" % [ preview["skill_name"], range_text, preview["mp_cost"], @@ -3802,14 +3841,14 @@ func _update_skill_forecast(selected: Dictionary) -> void: func _update_item_forecast(selected: Dictionary) -> void: var preview := state.get_item_preview(selected["id"], selected_item_id, hover_cell) if preview.is_empty(): - forecast_label.text = "War Read: -" + forecast_label.text = "전황: -" return var target := state.get_unit_at(hover_cell) - var range_text := "ready" if preview["in_range"] else "out of range" + var range_text := "사거리 안" if preview["in_range"] else "사거리 밖" var count_text := "x%d" % int(preview.get("count", 0)) if target.is_empty() or not preview["valid_target"]: - forecast_label.text = "%s: %s, %s\nNo valid mark." % [ + forecast_label.text = "%s: %s, %s\n지목할 대상이 없습니다." % [ preview["item_name"], range_text, count_text @@ -3820,7 +3859,7 @@ func _update_item_forecast(selected: Dictionary) -> void: var mp_heal := int(preview.get("mp_heal", 0)) var cure_statuses: Array = preview.get("cure_statuses", []) if hp_heal <= 0 and mp_heal <= 0 and cure_statuses.is_empty(): - forecast_label.text = "%s: %s, %s\nNo supply effect needed." % [ + forecast_label.text = "%s: %s, %s\n보급 효과가 필요하지 않습니다." % [ preview["item_name"], range_text, count_text @@ -3829,19 +3868,19 @@ func _update_item_forecast(selected: Dictionary) -> void: var recovery_parts := [] if hp_heal > 0: - recovery_parts.append("Restore %d Troops, banner Troops %d/%d" % [ + recovery_parts.append("병력 %d 회복, 군기 병력 %d/%d" % [ hp_heal, preview["target_hp_after"], target["max_hp"] ]) if mp_heal > 0: - recovery_parts.append("Restore %d Qi, banner Qi %d/%d" % [ + recovery_parts.append("기력 %d 회복, 군기 기력 %d/%d" % [ mp_heal, preview["target_mp_after"], target.get("max_mp", 0) ]) if not cure_statuses.is_empty(): - recovery_parts.append("Cure %s" % _join_strings(cure_statuses, ", ")) + recovery_parts.append("치료 %s" % _join_strings(cure_statuses, ", ")) forecast_label.text = "%s: %s, %s\n%s." % [ preview["item_name"], @@ -4701,7 +4740,7 @@ func _format_briefing_rewards() -> String: var items = rewards.get("items", []) if typeof(items) == TYPE_ARRAY and not items.is_empty(): var item_text := _format_reward_items(items) - if item_text != "none": + if item_text != "없음": parts.append(item_text) var joined_text := _format_officer_id_list(rewards.get("join_officers", [])) if not joined_text.is_empty(): @@ -4761,12 +4800,12 @@ func _format_briefing_talk_overview_text() -> String: var supply_counts := _camp_conversation_supply_counts(conversations) var ready := int(supply_counts.get("ready", 0)) var claimed := int(supply_counts.get("claimed", 0)) - var parts := ["군막 회의 %d" % conversations.size()] + var parts := ["군막 회의 · %d건" % conversations.size()] if ready > 0: - parts.append("보급 %d" % ready) + parts.append("보급 대기 %d건" % ready) if claimed > 0: - parts.append("수령 %d" % claimed) - return _join_strings(parts, ", ") + parts.append("수령 완료 %d건" % claimed) + return _join_strings(parts, " · ") func _format_briefing_shop_overview_text() -> String: @@ -4775,8 +4814,8 @@ func _format_briefing_shop_overview_text() -> String: if buy_count <= 0 and sell_count <= 0: return "" if sell_count > 0: - return "군상 물품 %d, 매각 %d" % [buy_count, sell_count] - return "군상 물품 %d" % buy_count + return "군상 물품 · %d종, 매각 · %d종" % [buy_count, sell_count] + return "군상 물품 · %d종" % buy_count func _format_briefing_roster_overview_text() -> String: @@ -4919,14 +4958,14 @@ func _rebuild_chapter_menu() -> void: child.queue_free() var entries := campaign_state.get_chapter_progress_entries() if chapter_status_label != null: - chapter_status_label.text = "%s scrolls - %d/%d fields sealed" % [ + chapter_status_label.text = "%s 병서 · 봉인 전장 %d/%d" % [ campaign_state.campaign_title, campaign_state.completed_scenarios.size(), campaign_state.get_scenario_count() ] if entries.is_empty(): var empty_label := Label.new() - empty_label.text = "No campaign chapters are defined." + empty_label.text = "아직 엮인 병서가 없습니다." _apply_label_style(empty_label, UI_AGED_INK) chapter_list.add_child(empty_label) return @@ -4934,9 +4973,9 @@ func _rebuild_chapter_menu() -> void: var completed := int(entry.get("completed", 0)) var total := int(entry.get("total", 0)) var current := bool(entry.get("current", false)) - var status := "Current" if current else ("Complete" if total > 0 and completed >= total else "Upcoming") + var status := "현 전장" if current else ("봉인 완료" if total > 0 and completed >= total else "미개봉") var current_title := str(entry.get("current_scenario_title", "")) - var line := "Chapter %02d/%02d - %s [%s] %d/%d" % [ + var line := "병서 %02d/%02d · %s [%s] %d/%d" % [ int(entry.get("position", 0)), int(entry.get("chapter_count", 0)), entry.get("title", ""), @@ -4945,7 +4984,7 @@ func _rebuild_chapter_menu() -> void: total ] if current and not current_title.is_empty(): - line += "\nCurrent battle: %s" % current_title + line += "\n현 전장: %s" % current_title var chapter_label := Label.new() chapter_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART chapter_label.custom_minimum_size = Vector2(560, 0) @@ -4964,7 +5003,7 @@ func _add_chapter_scenario_entry(scenario: Dictionary) -> void: var completed := bool(scenario.get("completed", false)) var current := bool(scenario.get("current", false)) var available := bool(scenario.get("available", false)) - var status := "Current" if current else ("Replay" if completed else "Upcoming") + var status := "현 전장" if current else ("회상 가능" if completed else "미개봉") var text := " %02d/%02d %s [%s]" % [position, total, title, status] if available: var scenario_button := Button.new() @@ -5059,7 +5098,7 @@ func _rebuild_talk_menu() -> void: talk_status_label.text = _format_talk_status_text(conversations) if conversations.is_empty(): var empty_label := Label.new() - empty_label.text = "No camp conversations" + empty_label.text = "군막에 들을 말이 없습니다." _apply_label_style(empty_label, UI_AGED_INK) talk_list.add_child(empty_label) return @@ -5151,12 +5190,12 @@ func _format_talk_status_text(conversations: Array) -> String: supply_claimed += 1 else: supply_available += 1 - var parts := ["Camp conversations", "%d topics" % conversations.size()] + var parts := ["군막 회의", "%d건" % conversations.size()] if supply_available > 0: - parts.append("%d supplies ready" % supply_available) + parts.append("보급 대기 %d건" % supply_available) if supply_claimed > 0: - parts.append("%d claimed" % supply_claimed) - return _join_strings(parts, " | ") + parts.append("수령 완료 %d건" % supply_claimed) + return _join_strings(parts, " · ") func _clear_talk_list() -> void: @@ -5185,10 +5224,10 @@ func _camp_conversation_entries() -> Array: func _format_camp_conversation_button_text(conversation: Dictionary) -> String: - var label := str(conversation.get("label", "Camp Talk")) + var label := str(conversation.get("label", "군막 담화")) var speaker := str(conversation.get("speaker", "")) var summary := str(conversation.get("summary", "")) - var group := str(conversation.get("group", "topic")).capitalize() + var group := _camp_conversation_group_text(str(conversation.get("group", "topic"))) var parts := [group, label] if not speaker.is_empty(): parts.append(speaker) @@ -5201,9 +5240,9 @@ func _format_camp_conversation_button_text(conversation: Dictionary) -> String: func _format_camp_conversation_row_title(conversation: Dictionary) -> String: - var label := str(conversation.get("label", "Camp Talk")) + var label := str(conversation.get("label", "군막 담화")) var speaker := _camp_conversation_preview_speaker(conversation) - var group := str(conversation.get("group", "topic")).capitalize() + var group := _camp_conversation_group_text(str(conversation.get("group", "topic"))) var parts := [group, label] if not speaker.is_empty(): parts.append(speaker) @@ -5222,10 +5261,18 @@ func _format_camp_conversation_preview_text(conversation: Dictionary) -> String: if not first_text.is_empty(): parts.append(_short_preview_text(first_text, 96)) if parts.is_empty(): - return "No preview text" + return "아직 적힌 말이 없습니다." return _join_strings(parts, " - ") +func _camp_conversation_group_text(group: String) -> String: + if group == "officer": + return "장수" + if group == "topic": + return "의제" + return _format_identifier_label(group) + + func _camp_conversation_preview_speaker(conversation: Dictionary) -> String: var speaker := str(conversation.get("speaker", "")).strip_edges() if not speaker.is_empty(): @@ -5305,11 +5352,11 @@ func _format_camp_conversation_effects_text(conversation: Dictionary) -> String: continue var count := maxi(1, int(effect.get("count", 1))) var count_text := "" if count == 1 else " x%d" % count - parts.append("보급 %s%s" % [str(item.get("name", item_id)), count_text]) + parts.append("보급 %s%s" % [_item_display_name(item_id), count_text]) if parts.is_empty(): return "" var conversation_id := str(conversation.get("id", "")) - var claimed_text := "claimed" if campaign_state.has_claimed_camp_conversation_effects(active_scenario_id, conversation_id) else "available" + var claimed_text := "수령 완료" if campaign_state.has_claimed_camp_conversation_effects(active_scenario_id, conversation_id) else "수령 가능" return "%s (%s)" % [_join_strings(parts, ", "), claimed_text] @@ -5331,7 +5378,7 @@ func _apply_camp_conversation_effects(conversation: Dictionary) -> void: _rebuild_talk_menu() return _play_ui_cancel() - _on_log_added("Could not claim camp supplies.") + _on_log_added("군막 보급을 거두지 못했습니다.") func _format_camp_conversation_effect_claim_text(conversation: Dictionary) -> String: @@ -5351,9 +5398,9 @@ func _format_camp_conversation_effect_claim_text(conversation: Dictionary) -> St continue var count := maxi(1, int(effect.get("count", 1))) var count_text := "" if count == 1 else " x%d" % count - messages.append("Camp supplies received: %s%s." % [_item_display_name(item_id), count_text]) + messages.append("군막 보급 수령: %s%s." % [_item_display_name(item_id), count_text]) if messages.is_empty(): - return "Camp supplies received." + return "군막 보급을 수령했습니다." return _join_strings(messages, " ") @@ -5599,7 +5646,7 @@ func _rebuild_roster_menu() -> void: if units.is_empty(): var empty_label := Label.new() - empty_label.text = "No officers" + empty_label.text = "장수가 없습니다" _apply_label_style(empty_label, UI_AGED_INK) roster_list.add_child(empty_label) return @@ -5625,14 +5672,14 @@ func _clear_roster_list() -> void: func _format_roster_unit_button_text(unit: Dictionary) -> String: - var state_text := "Deploy" if bool(unit.get("deployed", true)) else "Reserve" - var required_text := " Required" if bool(unit.get("required_deployment", false)) else "" - var protected_text := " Protected" if not bool(unit.get("controllable", true)) else "" + var state_text := "출진" if bool(unit.get("deployed", true)) else "예비" + var required_text := " 필수" if bool(unit.get("required_deployment", false)) else "" + var protected_text := " 호위" if not bool(unit.get("controllable", true)) else "" return "%s%s Lv.%d %s %s%s" % [ - str(unit.get("name", "Officer")), + str(unit.get("name", "장수")), protected_text, int(unit.get("level", 1)), - str(unit.get("class", "")), + _unit_class_display_name(unit), state_text, required_text ] @@ -5665,16 +5712,16 @@ func _rebuild_formation_menu() -> void: if formation_status_label != null: var selected := state.get_unit(formation_unit_id) if selected.is_empty(): - formation_status_label.text = "Array" + formation_status_label.text = "진형" else: - formation_status_label.text = "Array: %s at %s" % [ - str(selected.get("name", "Officer")), + formation_status_label.text = "진형: %s · %s" % [ + str(selected.get("name", "장수")), _format_cell_label(selected.get("pos", Vector2i.ZERO)) ] if units.is_empty(): var empty_label := Label.new() - empty_label.text = "No deployed officers" + empty_label.text = "출진 장수가 없습니다" _apply_label_style(empty_label, UI_AGED_INK) formation_list.add_child(empty_label) return @@ -5699,7 +5746,7 @@ func _format_formation_unit_button_text(unit: Dictionary) -> String: var marker := "> " if str(unit.get("id", "")) == formation_unit_id else "" return "%s%s %s" % [ marker, - str(unit.get("name", "Officer")), + str(unit.get("name", "장수")), _format_cell_label(unit.get("pos", Vector2i.ZERO)) ] @@ -5744,13 +5791,13 @@ func _rebuild_armory_menu() -> void: if units.is_empty(): var empty_label := Label.new() - empty_label.text = "No deployed officers" + empty_label.text = "출진 장수가 없습니다" _apply_label_style(empty_label, UI_AGED_INK) armory_list.add_child(empty_label) return var unit_title := Label.new() - unit_title.text = "Officers" + unit_title.text = "장수 명부" _apply_label_style(unit_title, UI_CINNABAR, 14) armory_list.add_child(unit_title) @@ -5793,7 +5840,7 @@ func _rebuild_armory_menu() -> void: var item_ids := state.get_equippable_item_ids(armory_unit_id) if item_ids.is_empty(): var empty_equipment_label := Label.new() - empty_equipment_label.text = "No compatible equipment in inventory" + empty_equipment_label.text = "군수고에 맞는 병장이 없습니다" _apply_label_style(empty_equipment_label, UI_AGED_INK) armory_list.add_child(empty_equipment_label) else: @@ -5830,7 +5877,7 @@ func _format_armory_unit_button_text(unit: Dictionary) -> String: var marker := "> " if str(unit.get("id", "")) == armory_unit_id else "" return "%s%s Lv.%d %s" % [ marker, - str(unit.get("name", "Officer")), + str(unit.get("name", "장수")), int(unit.get("level", 1)), _format_unit_equipment(unit) ] @@ -5911,7 +5958,7 @@ func _rebuild_shop_buy_list() -> void: var item_ids := state.get_shop_item_ids() if item_ids.is_empty(): var empty_label := Label.new() - empty_label.text = "No shop stock" + empty_label.text = "군상이 내놓은 물품이 없습니다." _apply_label_style(empty_label, UI_AGED_INK) shop_list.add_child(empty_label) return @@ -5941,7 +5988,7 @@ func _rebuild_shop_sell_list() -> void: var item_ids := _get_sellable_item_ids() if item_ids.is_empty(): var empty_label := Label.new() - empty_label.text = "No sellable stock" + empty_label.text = "매각할 물품이 없습니다." _apply_label_style(empty_label, UI_AGED_INK) shop_list.add_child(empty_label) return @@ -6077,28 +6124,28 @@ func _make_shop_item_icon_panel(item_id: String, item: Dictionary) -> PanelConta func _format_shop_buy_action_text(item_id: String, _item: Dictionary, price: int) -> String: - return "Acquire %s %dG" % [_item_display_name(item_id), price] + return "매입 %s %dG" % [_item_display_name(item_id), price] func _format_shop_sell_action_text(item_id: String, _item: Dictionary, sale_price: int) -> String: - return "Offer %s %dG" % [_item_display_name(item_id), sale_price] + return "매각 %s %dG" % [_item_display_name(item_id), sale_price] func _format_shop_buy_item_detail_text(_item_id: String, item: Dictionary, price: int, owned: int, stock_limit: int = -1, remaining: int = -1) -> String: var parts := _shop_item_common_detail_parts(item, owned) if stock_limit >= 0: - parts.append("Stock %d/%d" % [max(0, remaining), stock_limit]) + parts.append("재고 %d/%d" % [max(0, remaining), stock_limit]) if stock_limit >= 0 and remaining <= 0: - parts.append("Sold out") + parts.append("품절") elif campaign_state.gold < price: - parts.append("Need %dG" % (price - campaign_state.gold)) - return _join_strings(parts, " - ") + parts.append("부족 %dG" % (price - campaign_state.gold)) + return _join_strings(parts, " · ") func _format_shop_sell_item_detail_text(_item_id: String, item: Dictionary, _sale_price: int, owned: int) -> String: var parts := _shop_item_common_detail_parts(item, owned) - parts.append("Half-price sale") - return _join_strings(parts, " - ") + parts.append("반값 매각") + return _join_strings(parts, " · ") func _shop_item_common_detail_parts(item: Dictionary, owned: int) -> Array: @@ -6108,8 +6155,8 @@ func _shop_item_common_detail_parts(item: Dictionary, owned: int) -> Array: parts.append(effect_text) var kind := str(item.get("kind", "item")).capitalize() if not kind.is_empty(): - parts.append(kind) - parts.append("Owned x%d" % owned) + parts.append(_item_kind_text(kind)) + parts.append("보유 x%d" % owned) return parts @@ -6122,13 +6169,13 @@ func _format_shop_item_tooltip_text(primary_text: String, detail_text: String) - func _format_shop_item_button_text(item_id: String, item: Dictionary, price: int, owned: int, stock_limit: int = -1, remaining: int = -1) -> String: var unavailable := "" if stock_limit >= 0 and remaining <= 0: - unavailable = " - sold out" + unavailable = " - 품절" elif campaign_state.gold < price: - unavailable = " - need %dG" % (price - campaign_state.gold) + unavailable = " - 부족 %dG" % (price - campaign_state.gold) var stock_text := "" if stock_limit >= 0: - stock_text = " Stock %d/%d" % [max(0, remaining), stock_limit] - return "%s %dG %s Owned x%d%s%s" % [ + stock_text = " 재고 %d/%d" % [max(0, remaining), stock_limit] + return "%s %dG %s 보유 x%d%s%s" % [ _item_display_name(item_id), price, _format_shop_item_effect_text(item), @@ -6139,7 +6186,7 @@ func _format_shop_item_button_text(item_id: String, item: Dictionary, price: int func _format_shop_sell_item_button_text(item_id: String, item: Dictionary, sale_price: int, owned: int) -> String: - return "%s Offer %dG %s Owned x%d" % [ + return "%s 매각 %dG %s 보유 x%d" % [ _item_display_name(item_id), sale_price, _format_shop_item_effect_text(item), @@ -6159,9 +6206,24 @@ func _format_shop_item_effect_text(item: Dictionary) -> String: if item.has("range"): var range_value: Array = item.get("range", []) if range_value.size() >= 2: - parts.append("RNG %d-%d" % [int(range_value[0]), int(range_value[1])]) + parts.append("사거리 %d-%d" % [int(range_value[0]), int(range_value[1])]) parts.append(_format_equipment_bonus_text(item)) return _join_strings(parts, ", ") + return _item_kind_text(kind) + + +func _item_kind_text(kind: String) -> String: + var normalized := kind.strip_edges().to_lower() + if normalized == "consumable": + return "소모품" + if normalized == "weapon": + return "무기" + if normalized == "armor": + return "갑옷" + if normalized == "accessory": + return "보물" + if normalized == "item": + return "도구" return kind.capitalize() @@ -6186,15 +6248,15 @@ func _on_shop_item_pressed(item_id: String) -> void: var purchased := campaign_state.get_shop_purchase_count(active_scenario_id, item_id) if stock_limit >= 0 and purchased >= stock_limit: _play_ui_cancel() - _on_log_added("%s is sold out." % item_name) + _on_log_added("%s 품절." % item_name) _rebuild_shop_menu() return if campaign_state.try_buy_item(item_id, price, active_scenario_id, stock_limit): state.set_inventory_snapshot(campaign_state.get_inventory_snapshot()) - _on_log_added("Bought %s for %d gold." % [item_name, price]) + _on_log_added("%s 매입: %dG." % [item_name, price]) else: _play_ui_cancel() - _on_log_added("Could not buy %s." % item_name) + _on_log_added("%s 매입 실패." % item_name) _rebuild_shop_menu() _update_hud() @@ -6209,10 +6271,10 @@ func _on_shop_sell_item_pressed(item_id: String) -> void: return if campaign_state.try_sell_item(item_id, sale_price): state.set_inventory_snapshot(campaign_state.get_inventory_snapshot()) - _on_log_added("Sold %s for %d gold." % [item_name, sale_price]) + _on_log_added("%s 매각: %dG." % [item_name, sale_price]) else: _play_ui_cancel() - _on_log_added("Could not sell %s." % item_name) + _on_log_added("%s 매각 실패." % item_name) if _get_sellable_item_ids().is_empty(): shop_sell_mode = false _rebuild_shop_menu() @@ -6429,7 +6491,7 @@ func _format_battle_result_summary() -> String: var gold_reward := int(battle_result_summary.get("gold", 0)) if gold_reward > 0: reward_lines.append("군자금 +%d" % gold_reward) - if item_text != "none": + if item_text != "없음": reward_lines.append("물자: %s" % item_text) else: reward_lines.append("아직 기록되지 않음") @@ -6503,12 +6565,12 @@ func _format_next_camp_preview_text(next_scenario_id: String) -> String: parts.append(location) var talk_count := _briefing_camp_conversation_count(briefing) if talk_count > 0: - parts.append("군막 회의 %d" % talk_count) + parts.append("군막 회의 · %d건" % talk_count) var shop_count := preview_state.get_shop_item_ids().size() if shop_count > 0: - parts.append("군상 물품 %d" % shop_count) + parts.append("군상 물품 · %d종" % shop_count) if preview_state.has_deployment_roster(): - parts.append("출진 명부 %d/%d" % [ + parts.append("출진 명부 · %d/%d" % [ preview_state.get_deployed_player_count(), preview_state.get_deployment_max_units() ]) @@ -6556,7 +6618,7 @@ func _format_inventory_status_text() -> String: var inventory := state.get_inventory_snapshot() if campaign_complete_screen or state.battle_status != BattleState.STATUS_ACTIVE: inventory = campaign_state.get_inventory_snapshot() - return "Inventory: %s" % _format_inventory_by_category(inventory) + return "군수: %s" % _format_inventory_by_category(inventory) func _format_reward_items(items: Array) -> String: @@ -6578,7 +6640,7 @@ func _format_inventory_items(inventory: Dictionary) -> String: item_ids.append(key) item_ids.sort() if item_ids.is_empty(): - return "none" + return "없음" var parts := [] for item_id in item_ids: @@ -6607,13 +6669,13 @@ func _format_inventory_by_category(inventory: Dictionary) -> String: var sections := [] if not consumables.is_empty(): - sections.append("Consumables: %s" % _format_inventory_items(consumables)) + sections.append("소모품: %s" % _format_inventory_items(consumables)) if not equipment.is_empty(): - sections.append("Equipment: %s" % _format_inventory_items(equipment)) + sections.append("병장: %s" % _format_inventory_items(equipment)) if not other.is_empty(): - sections.append("Other: %s" % _format_inventory_items(other)) + sections.append("잡물: %s" % _format_inventory_items(other)) if sections.is_empty(): - return "none" + return "없음" return _join_strings(sections, " - ") @@ -6622,18 +6684,41 @@ func _format_officer_id_list(values) -> String: return "" var labels := [] for value in values: - var label := _format_identifier_label(str(value)) + var label := _officer_display_name_from_id(str(value)) if label.is_empty(): continue labels.append(label) return _join_strings(labels, ", ") +func _officer_display_name_from_id(officer_id: String) -> String: + match officer_id: + "cao_cao": + return "조조" + "xiahou_dun": + return "하후돈" + "xiahou_yuan": + return "하후연" + "cao_ren": + return "조인" + "dian_wei": + return "전위" + "guo_jia": + return "곽가" + "zhang_he": + return "장합" + _: + return _format_identifier_label(officer_id) + + func _format_identifier_label(value: String) -> String: return value.strip_edges().replace("_", " ").capitalize() func _item_display_name(item_id: String) -> String: + var localized_name := _localized_item_name(item_id) + if not localized_name.is_empty(): + return localized_name var item := state.get_item_def(item_id) if item.is_empty(): return item_id @@ -6644,13 +6729,51 @@ func _item_inventory_display_name(item_id: String) -> String: var item := state.get_item_def(item_id) if item.is_empty(): return item_id - var display_name := str(item.get("name", item_id)) + var display_name := _item_display_name(item_id) var rarity_text := _format_item_rarity_text(item) if rarity_text.is_empty(): return display_name return "%s [%s]" % [display_name, rarity_text] +func _localized_item_name(item_id: String) -> String: + match item_id: + "bronze_sword": + return "청동검" + "iron_sword": + return "철검" + "training_spear": + return "연습창" + "short_bow": + return "단궁" + "hand_axe": + return "손도끼" + "war_axe": + return "전부" + "war_drum": + return "전고" + "imperial_seal": + return "옥새" + "yitian_sword": + return "의천검" + "dragon_spear": + return "용담창" + "wind_chaser_bow": + return "추풍궁" + "black_tortoise_robe": + return "현무도포" + "bean": + return "콩" + "antidote": + return "해독약" + "panacea": + return "만능약" + "wine": + return "술" + _: + return "" + + func _join_strings(values: Array, delimiter: String) -> String: var text := "" for value in values: @@ -6972,16 +7095,16 @@ func _format_post_move_tactic_button_text(skill_id: String, skill: Dictionary, s var marker := "> " if selected_skill_id == skill_id else "" var skill_name := str(skill.get("name", skill_id)) var mp_cost := int(skill.get("mp_cost", 0)) - var kind := str(skill.get("kind", "skill")).capitalize() + var kind := _skill_kind_text(str(skill.get("kind", "skill"))) var range_text := _format_tactic_range_text(skill) var disabled_text := "" if state.is_unit_skill_sealed(selected["id"]): disabled_text = " - 봉인" elif int(selected.get("mp", 0)) < mp_cost: - disabled_text = " - Qi" + disabled_text = " - 기력" elif not _skill_has_valid_target(str(selected.get("id", "")), skill_id): - disabled_text = " - No mark" - return "%s%s %d Qi %s Reach %s%s" % [marker, skill_name, mp_cost, kind, range_text, disabled_text] + disabled_text = " - 표식 없음" + return "%s%s 기력 %d %s 사거리 %s%s" % [marker, skill_name, mp_cost, kind, range_text, disabled_text] func _format_post_move_item_button_text(item_id: String, item: Dictionary, count: int) -> String: @@ -6997,35 +7120,35 @@ func _format_post_move_item_effect_text(item: Dictionary) -> String: continue var effect_type := str(effect.get("type", "")) if effect_type == "heal_hp": - return "Troops +%d" % int(effect.get("amount", 0)) + return "병력 +%d" % int(effect.get("amount", 0)) if effect_type == "heal_mp": - return "Qi +%d" % int(effect.get("amount", 0)) + return "기력 +%d" % int(effect.get("amount", 0)) if effect_type == "cure_status" or effect_type == "cleanse_debuffs": has_cure = true if has_cure: - return "Cure" - return str(item.get("kind", "item")).capitalize() + return "치료" + return _item_kind_text(str(item.get("kind", "item"))) func _post_move_tactic_disabled_reason(selected: Dictionary, skill_id: String, skill: Dictionary) -> String: if skill.is_empty(): - return "Unknown stratagem." + return "알 수 없는 책략입니다." if state.is_unit_skill_sealed(selected["id"]): - return "This banner is sealed." + return "이 군기는 책략이 봉인되었습니다." if bool(selected.get("acted", false)): - return "This banner has already acted." + return "이 군기는 이미 군령을 마쳤습니다." if int(selected.get("mp", 0)) < int(skill.get("mp_cost", 0)): - return "Not enough Qi." + return "기력이 부족합니다." if not _skill_has_valid_target(str(selected.get("id", "")), skill_id): - return "No valid mark from this ground." + return "이 자리에서 지목할 대상이 없습니다." return "" func _post_move_item_disabled_reason(selected: Dictionary, item_id: String, count: int) -> String: if count <= 0: - return "No stock remains." + return "남은 보급이 없습니다." if not _item_has_valid_target(str(selected.get("id", "")), item_id): - return "No valid mark from this ground." + return "이 자리에서 지목할 대상이 없습니다." return "" @@ -7398,15 +7521,15 @@ func _format_tactic_button_text(skill_id: String, skill: Dictionary, selected: D var marker := "> " if selected_skill_id == skill_id else "" var skill_name := str(skill.get("name", skill_id)) var mp_cost := int(skill.get("mp_cost", 0)) - var kind := str(skill.get("kind", "skill")).capitalize() + var kind := _skill_kind_text(str(skill.get("kind", "skill"))) var range_text := _format_tactic_range_text(skill) var effect_text := _format_tactic_effect_text(skill) var disabled_text := "" if state.is_unit_skill_sealed(selected["id"]): disabled_text = " - 봉인" elif int(selected.get("mp", 0)) < mp_cost: - disabled_text = " - Qi" - return "%s%s %d Qi %s Reach %s %s%s" % [marker, skill_name, mp_cost, kind, range_text, effect_text, disabled_text] + disabled_text = " - 기력" + return "%s%s 기력 %d %s 사거리 %s %s%s" % [marker, skill_name, mp_cost, kind, range_text, effect_text, disabled_text] func _format_tactic_effect_text(skill: Dictionary) -> String: @@ -7442,7 +7565,7 @@ func _format_tactic_area_text(skill: Dictionary) -> String: var shape := str(skill.get("area_shape", "single")) var radius := int(skill.get("area_radius", 0)) if shape == "diamond" and radius > 0: - return "Area %d" % radius + return "범위 %d" % radius return "" @@ -7461,12 +7584,25 @@ func _format_tactic_range_text(skill: Dictionary) -> String: func _action_lock_effect_label(action: String) -> String: if action == "skill": - return "tactics" + return "책략 봉인" if action == "move": - return "movement" + return "행군 봉인" if action == "attack": - return "attacks" - return "action" + return "타격 봉인" + return "군령 봉인" + + +func _skill_kind_text(kind: String) -> String: + var normalized := kind.strip_edges().to_lower() + if normalized == "damage": + return "공격책" + if normalized == "heal": + return "회복책" + if normalized == "support": + return "보조책" + if normalized == "skill": + return "책략" + return kind.capitalize() func _on_tactic_skill_pressed(skill_id: String) -> void: @@ -7588,15 +7724,15 @@ func _format_item_effect_text(item: Dictionary) -> String: if typeof(effect) != TYPE_DICTIONARY: continue if str(effect.get("type", "")) == "heal_hp": - parts.append("Heal %d" % int(effect.get("amount", 0))) + parts.append("병력 +%d" % int(effect.get("amount", 0))) elif str(effect.get("type", "")) == "heal_mp": - parts.append("Qi %d" % int(effect.get("amount", 0))) + parts.append("기력 +%d" % int(effect.get("amount", 0))) elif str(effect.get("type", "")) == "cure_status": - parts.append("Cure %s" % str(effect.get("status", "status")).replace("_", " ").capitalize()) + parts.append("치료 %s" % str(effect.get("status", "status")).replace("_", " ").capitalize()) elif str(effect.get("type", "")) == "cleanse_debuffs": - parts.append("Cleanse debuffs") + parts.append("약화 해소") if parts.is_empty(): - return str(item.get("kind", "item")).capitalize() + return _item_kind_text(str(item.get("kind", "item"))) return _join_strings(parts, ", ") @@ -7833,8 +7969,8 @@ func _format_equipment_change_text(unit: Dictionary, item: Dictionary) -> String if not effectiveness_text.is_empty(): parts.append(effectiveness_text) if parts.is_empty(): - return "Change none" - return "Change %s" % _join_strings(parts, ", ") + return "교체 없음" + return "교체 %s" % _join_strings(parts, ", ") func _equipment_slot_for_display(item: Dictionary) -> String: @@ -7942,9 +8078,37 @@ func _format_equipment_effectiveness_text(item: Dictionary) -> String: func _format_move_type(move_type: String) -> String: + var normalized := move_type.strip_edges().to_lower() + if normalized == "foot": + return "보병" + if normalized == "cavalry" or normalized == "mounted": + return "기병" + if normalized == "archer": + return "궁병" + if normalized == "water": + return "수군" + if normalized == "flying": + return "비행" return move_type.strip_edges().replace("_", " ").capitalize() +func _terrain_display_name(terrain_name: String) -> String: + var normalized := terrain_name.strip_edges().to_lower() + if normalized == "plain": + return "평지" + if normalized == "forest": + return "수풀" + if normalized == "hill": + return "산지" + if normalized == "water": + return "하천" + if normalized == "road": + return "길" + if normalized == "castle": + return "성채" + return terrain_name + + func _on_equip_item_pressed(item_id: String) -> void: var selected := state.get_selected_unit() if selected.is_empty(): diff --git a/tools/check_godot46_readiness.ps1 b/tools/check_godot46_readiness.ps1 index 5bd0f45..b4625ca 100644 --- a/tools/check_godot46_readiness.ps1 +++ b/tools/check_godot46_readiness.ps1 @@ -65,7 +65,7 @@ try { $jsonFiles = Get-ChildItem -Path (Join-Path $Root "data") -Filter "*.json" -Recurse foreach ($file in $jsonFiles) { try { - Get-Content $file.FullName -Raw | ConvertFrom-Json | Out-Null + Get-Content $file.FullName -Raw -Encoding UTF8 | ConvertFrom-Json | Out-Null } catch { Add-Failure "invalid JSON: $($file.FullName) - $($_.Exception.Message)" } diff --git a/tools/smoke_camp_conversation_rewards.gd b/tools/smoke_camp_conversation_rewards.gd index 35d22bb..27e5541 100644 --- a/tools/smoke_camp_conversation_rewards.gd +++ b/tools/smoke_camp_conversation_rewards.gd @@ -1,4 +1,4 @@ -extends SceneTree +extends SceneTree const BattleSceneScript := preload("res://scripts/scenes/battle_scene.gd") @@ -233,7 +233,7 @@ func _check_claim_updates_campaign_and_battle(failures: Array[String]) -> void: return var before := int(scene.campaign_state.get_inventory_snapshot().get("bean", 0)) - if not scene._format_camp_conversation_button_text(conversation).contains("available"): + if not scene._format_camp_conversation_button_text(conversation).contains("수령 가능"): failures.append("camp conversation button should show available before claim") scene._apply_camp_conversation_effects(conversation) @@ -245,7 +245,7 @@ func _check_claim_updates_campaign_and_battle(failures: Array[String]) -> void: failures.append("camp conversation should refresh loaded battle inventory") if not scene.campaign_state.has_claimed_camp_conversation_effects(SCENARIO_ID, CONVERSATION_ID): failures.append("camp conversation claim should be saved in campaign ledger") - if not scene._format_camp_conversation_button_text(conversation).contains("claimed"): + if not scene._format_camp_conversation_button_text(conversation).contains("수령 완료"): failures.append("camp conversation button should show claimed after claim") scene._apply_camp_conversation_effects(conversation) @@ -297,7 +297,7 @@ func _check_sishui_gate_camp_supplies(failures: Array[String]) -> void: failures.append("Sishui should expose quartermaster antidote conversation") scene.free() return - if not scene._format_camp_conversation_button_text(conversation).contains("보급 Antidote"): + if not scene._format_camp_conversation_button_text(conversation).contains("보급 해독약"): failures.append("Sishui quartermaster button should preview Antidote supply") var before_antidote := int(scene.campaign_state.get_inventory_snapshot().get("antidote", 0)) scene._apply_camp_conversation_effects(conversation) @@ -333,9 +333,9 @@ func _check_puyang_raid_camp_supplies(failures: Array[String]) -> void: var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Puyang shop merchant should expose flavor lines") - if scene._format_talk_status_text(scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if scene._format_talk_status_text(scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Puyang talk status should show one ready supply") - if not scene._format_camp_conversation_button_text(conversation).contains("보급 Bean"): + if not scene._format_camp_conversation_button_text(conversation).contains("보급 콩"): failures.append("Puyang raider stores button should preview Bean supply") var before_bean := int(scene.campaign_state.get_inventory_snapshot().get("bean", 0)) scene._apply_camp_conversation_effects(conversation) @@ -345,7 +345,7 @@ func _check_puyang_raid_camp_supplies(failures: Array[String]) -> void: failures.append("Puyang raider stores should refresh battle Bean inventory") if not scene.campaign_state.has_claimed_camp_conversation_effects(PUYANG_SCENARIO_ID, PUYANG_CONVERSATION_ID): failures.append("Puyang raider stores claim should be saved") - if scene._format_talk_status_text(scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if scene._format_talk_status_text(scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Puyang talk status should show claimed supply after claim") scene.free() @@ -363,9 +363,9 @@ func _check_puyang_raid_camp_supplies(failures: Array[String]) -> void: if not pursuit_scene._camp_conversation_by_id(PUYANG_REGROUP_CONVERSATION_ID).is_empty(): failures.append("Puyang pursuit flag should not expose Qingzhou reserve wagon") if not vanguard.is_empty(): - if pursuit_scene._format_talk_status_text(pursuit_scene._camp_conversation_entries()) != "Camp conversations | 4 topics | 2 supplies ready": + if pursuit_scene._format_talk_status_text(pursuit_scene._camp_conversation_entries()) != "군막 회의 · 4건 · 보급 대기 2건": failures.append("Puyang pursuit talk status should show two ready supplies") - if not pursuit_scene._format_camp_conversation_button_text(vanguard).contains("보급 Wine"): + if not pursuit_scene._format_camp_conversation_button_text(vanguard).contains("보급 술"): failures.append("Puyang hardened vanguard button should preview Wine supply") var before_wine := int(pursuit_scene.campaign_state.get_inventory_snapshot().get("wine", 0)) pursuit_scene._apply_camp_conversation_effects(vanguard) @@ -391,9 +391,9 @@ func _check_puyang_raid_camp_supplies(failures: Array[String]) -> void: if not regroup_scene._camp_conversation_by_id(PUYANG_PURSUIT_CONVERSATION_ID).is_empty(): failures.append("Puyang regroup flag should not expose hardened vanguard") if not reserve.is_empty(): - if regroup_scene._format_talk_status_text(regroup_scene._camp_conversation_entries()) != "Camp conversations | 4 topics | 2 supplies ready": + if regroup_scene._format_talk_status_text(regroup_scene._camp_conversation_entries()) != "군막 회의 · 4건 · 보급 대기 2건": failures.append("Puyang regroup talk status should show two ready supplies") - if not regroup_scene._format_camp_conversation_button_text(reserve).contains("보급 Panacea"): + if not regroup_scene._format_camp_conversation_button_text(reserve).contains("보급 만능약"): failures.append("Puyang Qingzhou reserve button should preview Panacea supply") var before_panacea := int(regroup_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) regroup_scene._apply_camp_conversation_effects(reserve) @@ -423,7 +423,7 @@ func _check_dingtao_branch_camp_conversations(failures: Array[String]) -> void: var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Dingtao shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Dingtao base talk status should summarize two non-supply topics") base_scene.free() @@ -441,9 +441,9 @@ func _check_dingtao_branch_camp_conversations(failures: Array[String]) -> void: if not fortified_scene._camp_conversation_by_id(DINGTAO_PRESSED_CONVERSATION_ID).is_empty(): failures.append("fortified flag should not expose Dingtao pressed vanguard") if not reserves.is_empty(): - if fortified_scene._format_talk_status_text(fortified_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if fortified_scene._format_talk_status_text(fortified_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Dingtao fortified talk status should show one ready supply") - if not fortified_scene._format_camp_conversation_button_text(reserves).contains("보급 Panacea"): + if not fortified_scene._format_camp_conversation_button_text(reserves).contains("보급 만능약"): failures.append("Dingtao fortified reserves button should preview Panacea supply") var before_panacea := int(fortified_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) fortified_scene._apply_camp_conversation_effects(reserves) @@ -453,7 +453,7 @@ func _check_dingtao_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Dingtao fortified reserves should refresh battle Panacea inventory") if not fortified_scene.campaign_state.has_claimed_camp_conversation_effects(DINGTAO_SCENARIO_ID, DINGTAO_FORTIFIED_CONVERSATION_ID): failures.append("Dingtao fortified reserves claim should be saved") - if fortified_scene._format_talk_status_text(fortified_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if fortified_scene._format_talk_status_text(fortified_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Dingtao fortified talk status should show claimed supply after claim") fortified_scene.free() @@ -471,9 +471,9 @@ func _check_dingtao_branch_camp_conversations(failures: Array[String]) -> void: if not pressed_scene._camp_conversation_by_id(DINGTAO_FORTIFIED_CONVERSATION_ID).is_empty(): failures.append("pressed flag should not expose Dingtao fortified reserves") if not vanguard.is_empty(): - if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Dingtao pressed talk status should show one ready supply") - if not pressed_scene._format_camp_conversation_button_text(vanguard).contains("보급 Wine"): + if not pressed_scene._format_camp_conversation_button_text(vanguard).contains("보급 술"): failures.append("Dingtao pressed vanguard button should preview Wine supply") var before_wine := int(pressed_scene.campaign_state.get_inventory_snapshot().get("wine", 0)) pressed_scene._apply_camp_conversation_effects(vanguard) @@ -483,7 +483,7 @@ func _check_dingtao_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Dingtao pressed vanguard should refresh battle Wine inventory") if not pressed_scene.campaign_state.has_claimed_camp_conversation_effects(DINGTAO_SCENARIO_ID, DINGTAO_PRESSED_CONVERSATION_ID): failures.append("Dingtao pressed vanguard claim should be saved") - if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Dingtao pressed talk status should show claimed supply after claim") pressed_scene.free() @@ -505,7 +505,7 @@ func _check_xian_branch_camp_conversations(failures: Array[String]) -> void: var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Xian escort shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Xian escort base talk status should summarize two non-supply topics") base_scene.free() @@ -523,9 +523,9 @@ func _check_xian_branch_camp_conversations(failures: Array[String]) -> void: if not fortified_scene._camp_conversation_by_id(XIAN_PRESSED_CONVERSATION_ID).is_empty(): failures.append("fortified flag should not expose Xian forced march canteens") if not supplies.is_empty(): - if fortified_scene._format_talk_status_text(fortified_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if fortified_scene._format_talk_status_text(fortified_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Xian fortified talk status should show one ready supply") - if not fortified_scene._format_camp_conversation_button_text(supplies).contains("보급 Bean"): + if not fortified_scene._format_camp_conversation_button_text(supplies).contains("보급 콩"): failures.append("Xian fortified road supplies button should preview Bean supply") var before_bean := int(fortified_scene.campaign_state.get_inventory_snapshot().get("bean", 0)) fortified_scene._apply_camp_conversation_effects(supplies) @@ -535,7 +535,7 @@ func _check_xian_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Xian fortified road supplies should refresh battle Bean inventory") if not fortified_scene.campaign_state.has_claimed_camp_conversation_effects(XIAN_SCENARIO_ID, XIAN_FORTIFIED_CONVERSATION_ID): failures.append("Xian fortified road supplies claim should be saved") - if fortified_scene._format_talk_status_text(fortified_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if fortified_scene._format_talk_status_text(fortified_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Xian fortified talk status should show claimed supply after claim") fortified_scene.free() @@ -553,9 +553,9 @@ func _check_xian_branch_camp_conversations(failures: Array[String]) -> void: if not pressed_scene._camp_conversation_by_id(XIAN_FORTIFIED_CONVERSATION_ID).is_empty(): failures.append("pressed flag should not expose Xian fortified road supplies") if not canteens.is_empty(): - if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Xian pressed talk status should show one ready supply") - if not pressed_scene._format_camp_conversation_button_text(canteens).contains("보급 Wine"): + if not pressed_scene._format_camp_conversation_button_text(canteens).contains("보급 술"): failures.append("Xian forced march canteens button should preview Wine supply") var before_wine := int(pressed_scene.campaign_state.get_inventory_snapshot().get("wine", 0)) pressed_scene._apply_camp_conversation_effects(canteens) @@ -565,7 +565,7 @@ func _check_xian_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Xian forced march canteens should refresh battle Wine inventory") if not pressed_scene.campaign_state.has_claimed_camp_conversation_effects(XIAN_SCENARIO_ID, XIAN_PRESSED_CONVERSATION_ID): failures.append("Xian forced march canteens claim should be saved") - if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Xian pressed talk status should show claimed supply after claim") pressed_scene.free() @@ -587,7 +587,7 @@ func _check_wan_branch_camp_conversations(failures: Array[String]) -> void: var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Wan Castle shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Wan Castle base talk status should summarize two non-supply topics") base_scene.free() @@ -605,9 +605,9 @@ func _check_wan_branch_camp_conversations(failures: Array[String]) -> void: if not court_scene._camp_conversation_by_id(WAN_PURSUIT_CONVERSATION_ID).is_empty(): failures.append("court seal flag should not expose Wan hard pursuit drums") if not postern.is_empty(): - if court_scene._format_talk_status_text(court_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if court_scene._format_talk_status_text(court_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Wan court seal talk status should show one ready supply") - if not court_scene._format_camp_conversation_button_text(postern).contains("보급 Bean"): + if not court_scene._format_camp_conversation_button_text(postern).contains("보급 콩"): failures.append("Wan court seal postern button should preview Bean supply") var before_bean := int(court_scene.campaign_state.get_inventory_snapshot().get("bean", 0)) court_scene._apply_camp_conversation_effects(postern) @@ -617,7 +617,7 @@ func _check_wan_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Wan court seal postern should refresh battle Bean inventory") if not court_scene.campaign_state.has_claimed_camp_conversation_effects(WAN_SCENARIO_ID, WAN_COURT_CONVERSATION_ID): failures.append("Wan court seal postern claim should be saved") - if court_scene._format_talk_status_text(court_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if court_scene._format_talk_status_text(court_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Wan court seal talk status should show claimed supply after claim") court_scene.free() @@ -635,9 +635,9 @@ func _check_wan_branch_camp_conversations(failures: Array[String]) -> void: if not pursuit_scene._camp_conversation_by_id(WAN_COURT_CONVERSATION_ID).is_empty(): failures.append("hard pursuit flag should not expose Wan postern supplies") if not drums.is_empty(): - if pursuit_scene._format_talk_status_text(pursuit_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if pursuit_scene._format_talk_status_text(pursuit_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Wan hard pursuit talk status should show one ready supply") - if not pursuit_scene._format_camp_conversation_button_text(drums).contains("보급 Wine"): + if not pursuit_scene._format_camp_conversation_button_text(drums).contains("보급 술"): failures.append("Wan hard pursuit drums button should preview Wine supply") var before_wine := int(pursuit_scene.campaign_state.get_inventory_snapshot().get("wine", 0)) pursuit_scene._apply_camp_conversation_effects(drums) @@ -647,7 +647,7 @@ func _check_wan_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Wan hard pursuit drums should refresh battle Wine inventory") if not pursuit_scene.campaign_state.has_claimed_camp_conversation_effects(WAN_SCENARIO_ID, WAN_PURSUIT_CONVERSATION_ID): failures.append("Wan hard pursuit drums claim should be saved") - if pursuit_scene._format_talk_status_text(pursuit_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if pursuit_scene._format_talk_status_text(pursuit_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Wan hard pursuit talk status should show claimed supply after claim") pursuit_scene.free() @@ -669,7 +669,7 @@ func _check_xiapi_branch_camp_conversations(failures: Array[String]) -> void: var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Xiapi shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Xiapi base talk status should summarize two non-supply topics") base_scene.free() @@ -687,9 +687,9 @@ func _check_xiapi_branch_camp_conversations(failures: Array[String]) -> void: if not held_scene._camp_conversation_by_id(XIAPI_SWIFT_CONVERSATION_ID).is_empty(): failures.append("held Wan gate flag should not expose Xiapi forced march rations") if not dressings.is_empty(): - if held_scene._format_talk_status_text(held_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if held_scene._format_talk_status_text(held_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Xiapi held Wan gate talk status should show one ready supply") - if not held_scene._format_camp_conversation_button_text(dressings).contains("보급 Panacea"): + if not held_scene._format_camp_conversation_button_text(dressings).contains("보급 만능약"): failures.append("Xiapi Wan baggage dressings button should preview Panacea supply") var before_panacea := int(held_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) held_scene._apply_camp_conversation_effects(dressings) @@ -699,7 +699,7 @@ func _check_xiapi_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Xiapi Wan baggage dressings should refresh battle Panacea inventory") if not held_scene.campaign_state.has_claimed_camp_conversation_effects(XIAPI_SCENARIO_ID, XIAPI_HELD_CONVERSATION_ID): failures.append("Xiapi Wan baggage dressings claim should be saved") - if held_scene._format_talk_status_text(held_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if held_scene._format_talk_status_text(held_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Xiapi held Wan gate talk status should show claimed supply after claim") held_scene.free() @@ -717,9 +717,9 @@ func _check_xiapi_branch_camp_conversations(failures: Array[String]) -> void: if not swift_scene._camp_conversation_by_id(XIAPI_HELD_CONVERSATION_ID).is_empty(): failures.append("swift Wan escape flag should not expose Xiapi Wan baggage dressings") if not rations.is_empty(): - if swift_scene._format_talk_status_text(swift_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if swift_scene._format_talk_status_text(swift_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Xiapi swift Wan escape talk status should show one ready supply") - if not swift_scene._format_camp_conversation_button_text(rations).contains("보급 Bean"): + if not swift_scene._format_camp_conversation_button_text(rations).contains("보급 콩"): failures.append("Xiapi forced march rations button should preview Bean supply") var before_bean := int(swift_scene.campaign_state.get_inventory_snapshot().get("bean", 0)) swift_scene._apply_camp_conversation_effects(rations) @@ -729,7 +729,7 @@ func _check_xiapi_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Xiapi forced march rations should refresh battle Bean inventory") if not swift_scene.campaign_state.has_claimed_camp_conversation_effects(XIAPI_SCENARIO_ID, XIAPI_SWIFT_CONVERSATION_ID): failures.append("Xiapi forced march rations claim should be saved") - if swift_scene._format_talk_status_text(swift_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if swift_scene._format_talk_status_text(swift_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Xiapi swift Wan escape talk status should show claimed supply after claim") swift_scene.free() @@ -751,7 +751,7 @@ func _check_white_horse_branch_camp_conversations(failures: Array[String]) -> vo var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("White Horse shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("White Horse base talk status should summarize two non-supply topics") base_scene.free() @@ -769,9 +769,9 @@ func _check_white_horse_branch_camp_conversations(failures: Array[String]) -> vo if not xu_scene._camp_conversation_by_id(WHITE_HORSE_PRESSED_CONVERSATION_ID).is_empty(): failures.append("integrated Xu flag should not expose White Horse fast march beans") if not medicine.is_empty(): - if xu_scene._format_talk_status_text(xu_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if xu_scene._format_talk_status_text(xu_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("White Horse integrated Xu talk status should show one ready supply") - if not xu_scene._format_camp_conversation_button_text(medicine).contains("보급 Panacea"): + if not xu_scene._format_camp_conversation_button_text(medicine).contains("보급 만능약"): failures.append("White Horse Xu reserve medicine button should preview Panacea supply") var before_panacea := int(xu_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) xu_scene._apply_camp_conversation_effects(medicine) @@ -781,7 +781,7 @@ func _check_white_horse_branch_camp_conversations(failures: Array[String]) -> vo failures.append("White Horse Xu reserve medicine should refresh battle Panacea inventory") if not xu_scene.campaign_state.has_claimed_camp_conversation_effects(WHITE_HORSE_SCENARIO_ID, WHITE_HORSE_XU_CONVERSATION_ID): failures.append("White Horse Xu reserve medicine claim should be saved") - if xu_scene._format_talk_status_text(xu_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if xu_scene._format_talk_status_text(xu_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("White Horse integrated Xu talk status should show claimed supply after claim") xu_scene.free() @@ -799,9 +799,9 @@ func _check_white_horse_branch_camp_conversations(failures: Array[String]) -> vo if not pressed_scene._camp_conversation_by_id(WHITE_HORSE_XU_CONVERSATION_ID).is_empty(): failures.append("pressed north flag should not expose White Horse reserve medicine") if not beans.is_empty(): - if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("White Horse pressed north talk status should show one ready supply") - if not pressed_scene._format_camp_conversation_button_text(beans).contains("보급 Bean"): + if not pressed_scene._format_camp_conversation_button_text(beans).contains("보급 콩"): failures.append("White Horse fast march beans button should preview Bean supply") var before_bean := int(pressed_scene.campaign_state.get_inventory_snapshot().get("bean", 0)) pressed_scene._apply_camp_conversation_effects(beans) @@ -811,7 +811,7 @@ func _check_white_horse_branch_camp_conversations(failures: Array[String]) -> vo failures.append("White Horse fast march beans should refresh battle Bean inventory") if not pressed_scene.campaign_state.has_claimed_camp_conversation_effects(WHITE_HORSE_SCENARIO_ID, WHITE_HORSE_PRESSED_CONVERSATION_ID): failures.append("White Horse fast march beans claim should be saved") - if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("White Horse pressed north talk status should show claimed supply after claim") pressed_scene.free() @@ -833,7 +833,7 @@ func _check_yan_ford_branch_camp_conversations(failures: Array[String]) -> void: var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Yan Ford shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Yan Ford base talk status should summarize two non-supply topics") base_scene.free() @@ -851,9 +851,9 @@ func _check_yan_ford_branch_camp_conversations(failures: Array[String]) -> void: if not fortified_scene._camp_conversation_by_id(YAN_FORD_RAIDED_CONVERSATION_ID).is_empty(): failures.append("fortified White Horse flag should not expose Yan Ford raided supply beans") if not medicine.is_empty(): - if fortified_scene._format_talk_status_text(fortified_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if fortified_scene._format_talk_status_text(fortified_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Yan Ford fortified talk status should show one ready supply") - if not fortified_scene._format_camp_conversation_button_text(medicine).contains("보급 Panacea"): + if not fortified_scene._format_camp_conversation_button_text(medicine).contains("보급 만능약"): failures.append("Yan Ford crossing medicine button should preview Panacea supply") var before_panacea := int(fortified_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) fortified_scene._apply_camp_conversation_effects(medicine) @@ -863,7 +863,7 @@ func _check_yan_ford_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Yan Ford crossing medicine should refresh battle Panacea inventory") if not fortified_scene.campaign_state.has_claimed_camp_conversation_effects(YAN_FORD_SCENARIO_ID, YAN_FORD_FORTIFIED_CONVERSATION_ID): failures.append("Yan Ford crossing medicine claim should be saved") - if fortified_scene._format_talk_status_text(fortified_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if fortified_scene._format_talk_status_text(fortified_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Yan Ford fortified talk status should show claimed supply after claim") fortified_scene.free() @@ -881,9 +881,9 @@ func _check_yan_ford_branch_camp_conversations(failures: Array[String]) -> void: if not raided_scene._camp_conversation_by_id(YAN_FORD_FORTIFIED_CONVERSATION_ID).is_empty(): failures.append("raided Yuan supplies flag should not expose Yan Ford crossing medicine") if not beans.is_empty(): - if raided_scene._format_talk_status_text(raided_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if raided_scene._format_talk_status_text(raided_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Yan Ford raided supplies talk status should show one ready supply") - if not raided_scene._format_camp_conversation_button_text(beans).contains("보급 Bean"): + if not raided_scene._format_camp_conversation_button_text(beans).contains("보급 콩"): failures.append("Yan Ford raided supply beans button should preview Bean supply") var before_bean := int(raided_scene.campaign_state.get_inventory_snapshot().get("bean", 0)) raided_scene._apply_camp_conversation_effects(beans) @@ -893,7 +893,7 @@ func _check_yan_ford_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Yan Ford raided supply beans should refresh battle Bean inventory") if not raided_scene.campaign_state.has_claimed_camp_conversation_effects(YAN_FORD_SCENARIO_ID, YAN_FORD_RAIDED_CONVERSATION_ID): failures.append("Yan Ford raided supply beans claim should be saved") - if raided_scene._format_talk_status_text(raided_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if raided_scene._format_talk_status_text(raided_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Yan Ford raided supplies talk status should show claimed supply after claim") raided_scene.free() @@ -915,7 +915,7 @@ func _check_guandu_branch_camp_conversations(failures: Array[String]) -> void: var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Guandu shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Guandu base talk status should summarize two non-supply topics") base_scene.free() @@ -933,9 +933,9 @@ func _check_guandu_branch_camp_conversations(failures: Array[String]) -> void: if not secured_scene._camp_conversation_by_id(GUANDU_SCOUTED_CONVERSATION_ID).is_empty(): failures.append("secured Guandu line flag should not expose Guandu Wuchao scout wine") if not medicine.is_empty(): - if secured_scene._format_talk_status_text(secured_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if secured_scene._format_talk_status_text(secured_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Guandu secured line talk status should show one ready supply") - if not secured_scene._format_camp_conversation_button_text(medicine).contains("보급 Panacea"): + if not secured_scene._format_camp_conversation_button_text(medicine).contains("보급 만능약"): failures.append("Guandu secured line medicine button should preview Panacea supply") var before_panacea := int(secured_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) secured_scene._apply_camp_conversation_effects(medicine) @@ -945,7 +945,7 @@ func _check_guandu_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Guandu secured line medicine should refresh battle Panacea inventory") if not secured_scene.campaign_state.has_claimed_camp_conversation_effects(GUANDU_SCENARIO_ID, GUANDU_SECURED_CONVERSATION_ID): failures.append("Guandu secured line medicine claim should be saved") - if secured_scene._format_talk_status_text(secured_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if secured_scene._format_talk_status_text(secured_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Guandu secured line talk status should show claimed supply after claim") secured_scene.free() @@ -963,9 +963,9 @@ func _check_guandu_branch_camp_conversations(failures: Array[String]) -> void: if not scouted_scene._camp_conversation_by_id(GUANDU_SECURED_CONVERSATION_ID).is_empty(): failures.append("scouted Wuchao flag should not expose Guandu secured line medicine") if not wine.is_empty(): - if scouted_scene._format_talk_status_text(scouted_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if scouted_scene._format_talk_status_text(scouted_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Guandu scouted Wuchao talk status should show one ready supply") - if not scouted_scene._format_camp_conversation_button_text(wine).contains("보급 Wine"): + if not scouted_scene._format_camp_conversation_button_text(wine).contains("보급 술"): failures.append("Guandu Wuchao scout wine button should preview Wine supply") var before_wine := int(scouted_scene.campaign_state.get_inventory_snapshot().get("wine", 0)) scouted_scene._apply_camp_conversation_effects(wine) @@ -975,7 +975,7 @@ func _check_guandu_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Guandu Wuchao scout wine should refresh battle Wine inventory") if not scouted_scene.campaign_state.has_claimed_camp_conversation_effects(GUANDU_SCENARIO_ID, GUANDU_SCOUTED_CONVERSATION_ID): failures.append("Guandu Wuchao scout wine claim should be saved") - if scouted_scene._format_talk_status_text(scouted_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if scouted_scene._format_talk_status_text(scouted_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Guandu scouted Wuchao talk status should show claimed supply after claim") scouted_scene.free() @@ -3280,7 +3280,7 @@ func _check_qingzhou_branch_camp_conversations(failures: Array[String]) -> void: var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Qingzhou shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Qingzhou base talk status should summarize two non-supply topics") base_scene.free() @@ -3298,9 +3298,9 @@ func _check_qingzhou_branch_camp_conversations(failures: Array[String]) -> void: if not pursuit_scene._camp_conversation_by_id("qingzhou_sishui_stores").is_empty(): failures.append("pursuit flag should not expose Qingzhou Sishui stores") if not veterans.is_empty(): - if pursuit_scene._format_talk_status_text(pursuit_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if pursuit_scene._format_talk_status_text(pursuit_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Qingzhou pursuit talk status should show one ready supply") - if not pursuit_scene._format_camp_conversation_button_text(veterans).contains("보급 Wine"): + if not pursuit_scene._format_camp_conversation_button_text(veterans).contains("보급 술"): failures.append("Qingzhou hardened veterans button should show Wine supply") var before_wine := int(pursuit_scene.campaign_state.get_inventory_snapshot().get("wine", 0)) pursuit_scene._apply_camp_conversation_effects(veterans) @@ -3310,7 +3310,7 @@ func _check_qingzhou_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Qingzhou hardened veterans should refresh battle Wine inventory") if not pursuit_scene.campaign_state.has_claimed_camp_conversation_effects(QINGZHOU_SCENARIO_ID, "qingzhou_hardened_veterans"): failures.append("Qingzhou hardened veterans claim should be saved") - if pursuit_scene._format_talk_status_text(pursuit_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if pursuit_scene._format_talk_status_text(pursuit_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Qingzhou pursuit talk status should show claimed supply after claim") pursuit_scene.free() @@ -3328,9 +3328,9 @@ func _check_qingzhou_branch_camp_conversations(failures: Array[String]) -> void: if not regroup_scene._camp_conversation_by_id("qingzhou_hardened_veterans").is_empty(): failures.append("regroup flag should not expose Qingzhou hardened veterans") if not stores.is_empty(): - if regroup_scene._format_talk_status_text(regroup_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if regroup_scene._format_talk_status_text(regroup_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Qingzhou regroup talk status should show one ready supply") - if not regroup_scene._format_camp_conversation_button_text(stores).contains("보급 Bean"): + if not regroup_scene._format_camp_conversation_button_text(stores).contains("보급 콩"): failures.append("Qingzhou Sishui stores button should show Bean supply") var before_bean := int(regroup_scene.campaign_state.get_inventory_snapshot().get("bean", 0)) regroup_scene._apply_camp_conversation_effects(stores) @@ -3340,7 +3340,7 @@ func _check_qingzhou_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Qingzhou Sishui stores should refresh battle Bean inventory") if not regroup_scene.campaign_state.has_claimed_camp_conversation_effects(QINGZHOU_SCENARIO_ID, "qingzhou_sishui_stores"): failures.append("Qingzhou Sishui stores claim should be saved") - if regroup_scene._format_talk_status_text(regroup_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if regroup_scene._format_talk_status_text(regroup_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Qingzhou regroup talk status should show claimed supply after claim") regroup_scene.free() @@ -3362,7 +3362,7 @@ func _check_wuchao_branch_camp_conversations(failures: Array[String]) -> void: var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Wuchao shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Wuchao base talk status should summarize two non-supply topics") base_scene.free() @@ -3380,9 +3380,9 @@ func _check_wuchao_branch_camp_conversations(failures: Array[String]) -> void: if not raid_scene._camp_conversation_by_id("wuchao_guandu_reserve_wagon").is_empty(): failures.append("prepared raid flag should not expose Wuchao reserve wagon") if not fast_supplies.is_empty(): - if raid_scene._format_talk_status_text(raid_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if raid_scene._format_talk_status_text(raid_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Wuchao prepared raid talk status should show one ready supply") - if not raid_scene._format_camp_conversation_button_text(fast_supplies).contains("보급 Bean"): + if not raid_scene._format_camp_conversation_button_text(fast_supplies).contains("보급 콩"): failures.append("Wuchao fast supplies button should show Bean supply") var before_bean := int(raid_scene.campaign_state.get_inventory_snapshot().get("bean", 0)) raid_scene._apply_camp_conversation_effects(fast_supplies) @@ -3392,7 +3392,7 @@ func _check_wuchao_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Wuchao fast supplies should refresh battle Bean inventory") if not raid_scene.campaign_state.has_claimed_camp_conversation_effects(WUCHAO_SCENARIO_ID, "wuchao_fast_raid_supplies"): failures.append("Wuchao fast supplies claim should be saved") - if raid_scene._format_talk_status_text(raid_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if raid_scene._format_talk_status_text(raid_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Wuchao prepared raid talk status should show claimed supply after claim") raid_scene.free() @@ -3410,9 +3410,9 @@ func _check_wuchao_branch_camp_conversations(failures: Array[String]) -> void: if not defense_scene._camp_conversation_by_id("wuchao_fast_raid_supplies").is_empty(): failures.append("strengthened defense flag should not expose Wuchao fast supplies") if not reserve_wagon.is_empty(): - if defense_scene._format_talk_status_text(defense_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if defense_scene._format_talk_status_text(defense_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Wuchao strengthened defense talk status should show one ready supply") - if not defense_scene._format_camp_conversation_button_text(reserve_wagon).contains("보급 Panacea"): + if not defense_scene._format_camp_conversation_button_text(reserve_wagon).contains("보급 만능약"): failures.append("Wuchao reserve wagon button should show Panacea supply") var before_panacea := int(defense_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) defense_scene._apply_camp_conversation_effects(reserve_wagon) @@ -3442,7 +3442,7 @@ func _check_cangting_branch_camp_conversations(failures: Array[String]) -> void: var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Cangting shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Cangting base talk status should summarize two non-supply topics") base_scene.free() @@ -3460,9 +3460,9 @@ func _check_cangting_branch_camp_conversations(failures: Array[String]) -> void: if not pressed_scene._camp_conversation_by_id(CANGTING_STORES_CONVERSATION_ID).is_empty(): failures.append("pressed Yuan rout flag should not expose Cangting Wuchao store medicine") if not fast_rations.is_empty(): - if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Cangting pressed rout talk status should show one ready supply") - if not pressed_scene._format_camp_conversation_button_text(fast_rations).contains("보급 Bean"): + if not pressed_scene._format_camp_conversation_button_text(fast_rations).contains("보급 콩"): failures.append("Cangting fast pursuit rations button should show Bean supply") var before_bean := int(pressed_scene.campaign_state.get_inventory_snapshot().get("bean", 0)) pressed_scene._apply_camp_conversation_effects(fast_rations) @@ -3472,7 +3472,7 @@ func _check_cangting_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Cangting fast pursuit rations should refresh battle Bean inventory") if not pressed_scene.campaign_state.has_claimed_camp_conversation_effects(CANGTING_SCENARIO_ID, CANGTING_PRESSED_CONVERSATION_ID): failures.append("Cangting fast pursuit rations claim should be saved") - if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Cangting pressed rout talk status should show claimed supply after claim") pressed_scene.free() @@ -3490,9 +3490,9 @@ func _check_cangting_branch_camp_conversations(failures: Array[String]) -> void: if not stores_scene._camp_conversation_by_id(CANGTING_PRESSED_CONVERSATION_ID).is_empty(): failures.append("secured Wuchao stores flag should not expose Cangting fast pursuit rations") if not store_medicine.is_empty(): - if stores_scene._format_talk_status_text(stores_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if stores_scene._format_talk_status_text(stores_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Cangting secured stores talk status should show one ready supply") - if not stores_scene._format_camp_conversation_button_text(store_medicine).contains("보급 Panacea"): + if not stores_scene._format_camp_conversation_button_text(store_medicine).contains("보급 만능약"): failures.append("Cangting store medicine button should show Panacea supply") var before_panacea := int(stores_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) stores_scene._apply_camp_conversation_effects(store_medicine) @@ -3502,7 +3502,7 @@ func _check_cangting_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Cangting store medicine should refresh battle Panacea inventory") if not stores_scene.campaign_state.has_claimed_camp_conversation_effects(CANGTING_SCENARIO_ID, CANGTING_STORES_CONVERSATION_ID): failures.append("Cangting store medicine claim should be saved") - if stores_scene._format_talk_status_text(stores_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if stores_scene._format_talk_status_text(stores_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Cangting secured stores talk status should show claimed supply after claim") stores_scene.free() @@ -3524,7 +3524,7 @@ func _check_ye_branch_camp_conversations(failures: Array[String]) -> void: var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Ye shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Ye base talk status should summarize two non-supply topics") base_scene.free() @@ -3542,9 +3542,9 @@ func _check_ye_branch_camp_conversations(failures: Array[String]) -> void: if not advanced_scene._camp_conversation_by_id(YE_CROSSING_CONVERSATION_ID).is_empty(): failures.append("advanced to Ye flag should not expose crossing medicine") if not rapid_rations.is_empty(): - if advanced_scene._format_talk_status_text(advanced_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if advanced_scene._format_talk_status_text(advanced_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Ye advanced talk status should show one ready supply") - if not advanced_scene._format_camp_conversation_button_text(rapid_rations).contains("보급 Bean"): + if not advanced_scene._format_camp_conversation_button_text(rapid_rations).contains("보급 콩"): failures.append("Ye rapid rations button should show Bean supply") var before_bean := int(advanced_scene.campaign_state.get_inventory_snapshot().get("bean", 0)) advanced_scene._apply_camp_conversation_effects(rapid_rations) @@ -3554,7 +3554,7 @@ func _check_ye_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Ye rapid rations should refresh battle Bean inventory") if not advanced_scene.campaign_state.has_claimed_camp_conversation_effects(YE_SCENARIO_ID, YE_RAPID_CONVERSATION_ID): failures.append("Ye rapid rations claim should be saved") - if advanced_scene._format_talk_status_text(advanced_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if advanced_scene._format_talk_status_text(advanced_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Ye advanced talk status should show claimed supply after claim") advanced_scene.free() @@ -3572,9 +3572,9 @@ func _check_ye_branch_camp_conversations(failures: Array[String]) -> void: if not crossing_scene._camp_conversation_by_id(YE_RAPID_CONVERSATION_ID).is_empty(): failures.append("secured Hebei crossings flag should not expose Ye rapid rations") if not crossing_medicine.is_empty(): - if crossing_scene._format_talk_status_text(crossing_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if crossing_scene._format_talk_status_text(crossing_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Ye crossings talk status should show one ready supply") - if not crossing_scene._format_camp_conversation_button_text(crossing_medicine).contains("보급 Panacea"): + if not crossing_scene._format_camp_conversation_button_text(crossing_medicine).contains("보급 만능약"): failures.append("Ye crossing medicine button should show Panacea supply") var before_panacea := int(crossing_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) crossing_scene._apply_camp_conversation_effects(crossing_medicine) @@ -3584,7 +3584,7 @@ func _check_ye_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Ye crossing medicine should refresh battle Panacea inventory") if not crossing_scene.campaign_state.has_claimed_camp_conversation_effects(YE_SCENARIO_ID, YE_CROSSING_CONVERSATION_ID): failures.append("Ye crossing medicine claim should be saved") - if crossing_scene._format_talk_status_text(crossing_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if crossing_scene._format_talk_status_text(crossing_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Ye crossings talk status should show claimed supply after claim") crossing_scene.free() @@ -3606,7 +3606,7 @@ func _check_ye_siege_branch_camp_conversations(failures: Array[String]) -> void: var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Ye Siege shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Ye Siege base talk status should summarize two non-supply topics") base_scene.free() @@ -3624,9 +3624,9 @@ func _check_ye_siege_branch_camp_conversations(failures: Array[String]) -> void: if not pressed_scene._camp_conversation_by_id(YE_SIEGE_SPLIT_CONVERSATION_ID).is_empty(): failures.append("pressed Ye siege flag should not expose defector medicine") if not ladder_rations.is_empty(): - if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Ye Siege pressed talk status should show one ready supply") - if not pressed_scene._format_camp_conversation_button_text(ladder_rations).contains("보급 Bean"): + if not pressed_scene._format_camp_conversation_button_text(ladder_rations).contains("보급 콩"): failures.append("Ye Siege ladder rations button should show Bean supply") var before_bean := int(pressed_scene.campaign_state.get_inventory_snapshot().get("bean", 0)) pressed_scene._apply_camp_conversation_effects(ladder_rations) @@ -3636,7 +3636,7 @@ func _check_ye_siege_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Ye Siege ladder rations should refresh battle Bean inventory") if not pressed_scene.campaign_state.has_claimed_camp_conversation_effects(YE_SIEGE_SCENARIO_ID, YE_SIEGE_PRESSED_CONVERSATION_ID): failures.append("Ye Siege ladder rations claim should be saved") - if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Ye Siege pressed talk status should show claimed supply after claim") pressed_scene.free() @@ -3654,9 +3654,9 @@ func _check_ye_siege_branch_camp_conversations(failures: Array[String]) -> void: if not split_scene._camp_conversation_by_id(YE_SIEGE_PRESSED_CONVERSATION_ID).is_empty(): failures.append("split Yuan heirs flag should not expose ladder rations") if not defector_medicine.is_empty(): - if split_scene._format_talk_status_text(split_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if split_scene._format_talk_status_text(split_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Ye Siege split heirs talk status should show one ready supply") - if not split_scene._format_camp_conversation_button_text(defector_medicine).contains("보급 Panacea"): + if not split_scene._format_camp_conversation_button_text(defector_medicine).contains("보급 만능약"): failures.append("Ye Siege defector medicine button should show Panacea supply") var before_panacea := int(split_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) split_scene._apply_camp_conversation_effects(defector_medicine) @@ -3666,7 +3666,7 @@ func _check_ye_siege_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Ye Siege defector medicine should refresh battle Panacea inventory") if not split_scene.campaign_state.has_claimed_camp_conversation_effects(YE_SIEGE_SCENARIO_ID, YE_SIEGE_SPLIT_CONVERSATION_ID): failures.append("Ye Siege defector medicine claim should be saved") - if split_scene._format_talk_status_text(split_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if split_scene._format_talk_status_text(split_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Ye Siege split heirs talk status should show claimed supply after claim") split_scene.free() @@ -3688,7 +3688,7 @@ func _check_ye_surrender_branch_camp_conversations(failures: Array[String]) -> v var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Ye Surrender shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Ye Surrender base talk status should summarize two non-supply topics") base_scene.free() @@ -3706,9 +3706,9 @@ func _check_ye_surrender_branch_camp_conversations(failures: Array[String]) -> v if not forced_scene._camp_conversation_by_id(YE_SURRENDER_DEFECTOR_CONVERSATION_ID).is_empty(): failures.append("forced Ye surrender flag should not expose defector medicine") if not pressure_rations.is_empty(): - if forced_scene._format_talk_status_text(forced_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if forced_scene._format_talk_status_text(forced_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Ye Surrender forced talk status should show one ready supply") - if not forced_scene._format_camp_conversation_button_text(pressure_rations).contains("보급 Bean"): + if not forced_scene._format_camp_conversation_button_text(pressure_rations).contains("보급 콩"): failures.append("Ye Surrender pressure rations button should show Bean supply") var before_bean := int(forced_scene.campaign_state.get_inventory_snapshot().get("bean", 0)) forced_scene._apply_camp_conversation_effects(pressure_rations) @@ -3718,7 +3718,7 @@ func _check_ye_surrender_branch_camp_conversations(failures: Array[String]) -> v failures.append("Ye Surrender pressure rations should refresh battle Bean inventory") if not forced_scene.campaign_state.has_claimed_camp_conversation_effects(YE_SURRENDER_SCENARIO_ID, YE_SURRENDER_PRESSURE_CONVERSATION_ID): failures.append("Ye Surrender pressure rations claim should be saved") - if forced_scene._format_talk_status_text(forced_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if forced_scene._format_talk_status_text(forced_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Ye Surrender forced talk status should show claimed supply after claim") forced_scene.free() @@ -3736,9 +3736,9 @@ func _check_ye_surrender_branch_camp_conversations(failures: Array[String]) -> v if not negotiated_scene._camp_conversation_by_id(YE_SURRENDER_PRESSURE_CONVERSATION_ID).is_empty(): failures.append("negotiated Yuan defections flag should not expose pressure rations") if not defector_medicine.is_empty(): - if negotiated_scene._format_talk_status_text(negotiated_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if negotiated_scene._format_talk_status_text(negotiated_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Ye Surrender negotiated talk status should show one ready supply") - if not negotiated_scene._format_camp_conversation_button_text(defector_medicine).contains("보급 Panacea"): + if not negotiated_scene._format_camp_conversation_button_text(defector_medicine).contains("보급 만능약"): failures.append("Ye Surrender defector medicine button should show Panacea supply") var before_panacea := int(negotiated_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) negotiated_scene._apply_camp_conversation_effects(defector_medicine) @@ -3748,7 +3748,7 @@ func _check_ye_surrender_branch_camp_conversations(failures: Array[String]) -> v failures.append("Ye Surrender defector medicine should refresh battle Panacea inventory") if not negotiated_scene.campaign_state.has_claimed_camp_conversation_effects(YE_SURRENDER_SCENARIO_ID, YE_SURRENDER_DEFECTOR_CONVERSATION_ID): failures.append("Ye Surrender defector medicine claim should be saved") - if negotiated_scene._format_talk_status_text(negotiated_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if negotiated_scene._format_talk_status_text(negotiated_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Ye Surrender negotiated talk status should show claimed supply after claim") negotiated_scene.free() @@ -3770,7 +3770,7 @@ func _check_northern_pursuit_branch_camp_conversations(failures: Array[String]) var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Northern Pursuit shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Northern Pursuit base talk status should summarize two non-supply topics") base_scene.free() @@ -3788,9 +3788,9 @@ func _check_northern_pursuit_branch_camp_conversations(failures: Array[String]) if not pursued_scene._camp_conversation_by_id(NORTHERN_PURSUIT_JI_SUPPLY_CONVERSATION_ID).is_empty(): failures.append("pursued Yuan Shang flag should not expose Ji supply medicine") if not hard_march_beans.is_empty(): - if pursued_scene._format_talk_status_text(pursued_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if pursued_scene._format_talk_status_text(pursued_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Northern Pursuit pursued talk status should show one ready supply") - if not pursued_scene._format_camp_conversation_button_text(hard_march_beans).contains("보급 Bean"): + if not pursued_scene._format_camp_conversation_button_text(hard_march_beans).contains("보급 콩"): failures.append("Northern Pursuit hard march beans button should show Bean supply") var before_bean := int(pursued_scene.campaign_state.get_inventory_snapshot().get("bean", 0)) pursued_scene._apply_camp_conversation_effects(hard_march_beans) @@ -3800,7 +3800,7 @@ func _check_northern_pursuit_branch_camp_conversations(failures: Array[String]) failures.append("Northern Pursuit hard march beans should refresh battle Bean inventory") if not pursued_scene.campaign_state.has_claimed_camp_conversation_effects(NORTHERN_PURSUIT_SCENARIO_ID, NORTHERN_PURSUIT_HARD_MARCH_CONVERSATION_ID): failures.append("Northern Pursuit hard march beans claim should be saved") - if pursued_scene._format_talk_status_text(pursued_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if pursued_scene._format_talk_status_text(pursued_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Northern Pursuit pursued talk status should show claimed supply after claim") pursued_scene.free() @@ -3818,9 +3818,9 @@ func _check_northern_pursuit_branch_camp_conversations(failures: Array[String]) if not stabilized_scene._camp_conversation_by_id(NORTHERN_PURSUIT_HARD_MARCH_CONVERSATION_ID).is_empty(): failures.append("stabilized Ye flag should not expose hard march beans") if not ji_supply_medicine.is_empty(): - if stabilized_scene._format_talk_status_text(stabilized_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if stabilized_scene._format_talk_status_text(stabilized_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Northern Pursuit stabilized talk status should show one ready supply") - if not stabilized_scene._format_camp_conversation_button_text(ji_supply_medicine).contains("보급 Panacea"): + if not stabilized_scene._format_camp_conversation_button_text(ji_supply_medicine).contains("보급 만능약"): failures.append("Northern Pursuit Ji supply medicine button should show Panacea supply") var before_panacea := int(stabilized_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) stabilized_scene._apply_camp_conversation_effects(ji_supply_medicine) @@ -3830,7 +3830,7 @@ func _check_northern_pursuit_branch_camp_conversations(failures: Array[String]) failures.append("Northern Pursuit Ji supply medicine should refresh battle Panacea inventory") if not stabilized_scene.campaign_state.has_claimed_camp_conversation_effects(NORTHERN_PURSUIT_SCENARIO_ID, NORTHERN_PURSUIT_JI_SUPPLY_CONVERSATION_ID): failures.append("Northern Pursuit Ji supply medicine claim should be saved") - if stabilized_scene._format_talk_status_text(stabilized_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if stabilized_scene._format_talk_status_text(stabilized_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Northern Pursuit stabilized talk status should show claimed supply after claim") stabilized_scene.free() @@ -3852,7 +3852,7 @@ func _check_nanpi_branch_camp_conversations(failures: Array[String]) -> void: var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Nanpi shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Nanpi base talk status should summarize two non-supply topics") base_scene.free() @@ -3870,9 +3870,9 @@ func _check_nanpi_branch_camp_conversations(failures: Array[String]) -> void: if not pressed_scene._camp_conversation_by_id(NANPI_PRESSURE_ADMIN_SUPPLY_CONVERSATION_ID).is_empty(): failures.append("pressed north flag should not expose Nanpi admin medicine") if not hard_push_beans.is_empty(): - if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Nanpi pressed talk status should show one ready supply") - if not pressed_scene._format_camp_conversation_button_text(hard_push_beans).contains("보급 Bean"): + if not pressed_scene._format_camp_conversation_button_text(hard_push_beans).contains("보급 콩"): failures.append("Nanpi hard push beans button should show Bean supply") var before_bean := int(pressed_scene.campaign_state.get_inventory_snapshot().get("bean", 0)) pressed_scene._apply_camp_conversation_effects(hard_push_beans) @@ -3882,7 +3882,7 @@ func _check_nanpi_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Nanpi hard push beans should refresh battle Bean inventory") if not pressed_scene.campaign_state.has_claimed_camp_conversation_effects(NANPI_SCENARIO_ID, NANPI_PRESSURE_HARD_PUSH_CONVERSATION_ID): failures.append("Nanpi hard push beans claim should be saved") - if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Nanpi pressed talk status should show claimed supply after claim") pressed_scene.free() @@ -3900,9 +3900,9 @@ func _check_nanpi_branch_camp_conversations(failures: Array[String]) -> void: if not secured_scene._camp_conversation_by_id(NANPI_PRESSURE_HARD_PUSH_CONVERSATION_ID).is_empty(): failures.append("secured Ji flag should not expose Nanpi hard push beans") if not admin_medicine.is_empty(): - if secured_scene._format_talk_status_text(secured_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if secured_scene._format_talk_status_text(secured_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Nanpi secured talk status should show one ready supply") - if not secured_scene._format_camp_conversation_button_text(admin_medicine).contains("보급 Panacea"): + if not secured_scene._format_camp_conversation_button_text(admin_medicine).contains("보급 만능약"): failures.append("Nanpi admin medicine button should show Panacea supply") var before_panacea := int(secured_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) secured_scene._apply_camp_conversation_effects(admin_medicine) @@ -3912,7 +3912,7 @@ func _check_nanpi_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Nanpi admin medicine should refresh battle Panacea inventory") if not secured_scene.campaign_state.has_claimed_camp_conversation_effects(NANPI_SCENARIO_ID, NANPI_PRESSURE_ADMIN_SUPPLY_CONVERSATION_ID): failures.append("Nanpi admin medicine claim should be saved") - if secured_scene._format_talk_status_text(secured_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if secured_scene._format_talk_status_text(secured_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Nanpi secured talk status should show claimed supply after claim") secured_scene.free() @@ -3934,7 +3934,7 @@ func _check_nanpi_surrender_branch_camp_conversations(failures: Array[String]) - var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Nanpi Surrender shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Nanpi Surrender base talk status should summarize two non-supply topics") base_scene.free() @@ -3952,9 +3952,9 @@ func _check_nanpi_surrender_branch_camp_conversations(failures: Array[String]) - if not pressure_scene._camp_conversation_by_id(NANPI_SURRENDER_ADMIN_CONVERSATION_ID).is_empty(): failures.append("pressed Yuan Tan surrender flag should not expose Nanpi Surrender admin medicine") if not pressure_wine.is_empty(): - if pressure_scene._format_talk_status_text(pressure_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if pressure_scene._format_talk_status_text(pressure_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Nanpi Surrender pressure talk status should show one ready supply") - if not pressure_scene._format_camp_conversation_button_text(pressure_wine).contains("보급 Wine"): + if not pressure_scene._format_camp_conversation_button_text(pressure_wine).contains("보급 술"): failures.append("Nanpi Surrender pressure wine button should show Wine supply") var before_wine := int(pressure_scene.campaign_state.get_inventory_snapshot().get("wine", 0)) pressure_scene._apply_camp_conversation_effects(pressure_wine) @@ -3964,7 +3964,7 @@ func _check_nanpi_surrender_branch_camp_conversations(failures: Array[String]) - failures.append("Nanpi Surrender pressure wine should refresh battle Wine inventory") if not pressure_scene.campaign_state.has_claimed_camp_conversation_effects(NANPI_SURRENDER_SCENARIO_ID, NANPI_SURRENDER_PRESSURE_CONVERSATION_ID): failures.append("Nanpi Surrender pressure wine claim should be saved") - if pressure_scene._format_talk_status_text(pressure_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if pressure_scene._format_talk_status_text(pressure_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Nanpi Surrender pressure talk status should show claimed supply after claim") pressure_scene.free() @@ -3982,9 +3982,9 @@ func _check_nanpi_surrender_branch_camp_conversations(failures: Array[String]) - if not admin_scene._camp_conversation_by_id(NANPI_SURRENDER_PRESSURE_CONVERSATION_ID).is_empty(): failures.append("secured Nanpi admin flag should not expose Nanpi Surrender pressure wine") if not admin_medicine.is_empty(): - if admin_scene._format_talk_status_text(admin_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if admin_scene._format_talk_status_text(admin_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Nanpi Surrender admin talk status should show one ready supply") - if not admin_scene._format_camp_conversation_button_text(admin_medicine).contains("보급 Panacea"): + if not admin_scene._format_camp_conversation_button_text(admin_medicine).contains("보급 만능약"): failures.append("Nanpi Surrender admin medicine button should show Panacea supply") var before_panacea := int(admin_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) admin_scene._apply_camp_conversation_effects(admin_medicine) @@ -3994,7 +3994,7 @@ func _check_nanpi_surrender_branch_camp_conversations(failures: Array[String]) - failures.append("Nanpi Surrender admin medicine should refresh battle Panacea inventory") if not admin_scene.campaign_state.has_claimed_camp_conversation_effects(NANPI_SURRENDER_SCENARIO_ID, NANPI_SURRENDER_ADMIN_CONVERSATION_ID): failures.append("Nanpi Surrender admin medicine claim should be saved") - if admin_scene._format_talk_status_text(admin_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if admin_scene._format_talk_status_text(admin_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Nanpi Surrender admin talk status should show claimed supply after claim") admin_scene.free() @@ -4016,7 +4016,7 @@ func _check_bohai_branch_camp_conversations(failures: Array[String]) -> void: var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Bohai shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Bohai base talk status should summarize two non-supply topics") base_scene.free() @@ -4034,9 +4034,9 @@ func _check_bohai_branch_camp_conversations(failures: Array[String]) -> void: if not pursued_scene._camp_conversation_by_id(BOHAI_COMMANDERY_CONVERSATION_ID).is_empty(): failures.append("pursued Yuan brothers flag should not expose Bohai commandery medicine") if not fast_wine.is_empty(): - if pursued_scene._format_talk_status_text(pursued_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if pursued_scene._format_talk_status_text(pursued_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Bohai pursued talk status should show one ready supply") - if not pursued_scene._format_camp_conversation_button_text(fast_wine).contains("보급 Wine"): + if not pursued_scene._format_camp_conversation_button_text(fast_wine).contains("보급 술"): failures.append("Bohai fast column wine button should show Wine supply") var before_wine := int(pursued_scene.campaign_state.get_inventory_snapshot().get("wine", 0)) pursued_scene._apply_camp_conversation_effects(fast_wine) @@ -4046,7 +4046,7 @@ func _check_bohai_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Bohai fast column wine should refresh battle Wine inventory") if not pursued_scene.campaign_state.has_claimed_camp_conversation_effects(BOHAI_SCENARIO_ID, BOHAI_FAST_COLUMN_CONVERSATION_ID): failures.append("Bohai fast column wine claim should be saved") - if pursued_scene._format_talk_status_text(pursued_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if pursued_scene._format_talk_status_text(pursued_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Bohai pursued talk status should show claimed supply after claim") pursued_scene.free() @@ -4064,9 +4064,9 @@ func _check_bohai_branch_camp_conversations(failures: Array[String]) -> void: if not secured_scene._camp_conversation_by_id(BOHAI_FAST_COLUMN_CONVERSATION_ID).is_empty(): failures.append("secured Bohai flag should not expose Bohai fast column wine") if not commandery_medicine.is_empty(): - if secured_scene._format_talk_status_text(secured_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if secured_scene._format_talk_status_text(secured_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Bohai secured talk status should show one ready supply") - if not secured_scene._format_camp_conversation_button_text(commandery_medicine).contains("보급 Panacea"): + if not secured_scene._format_camp_conversation_button_text(commandery_medicine).contains("보급 만능약"): failures.append("Bohai commandery medicine button should show Panacea supply") var before_panacea := int(secured_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) secured_scene._apply_camp_conversation_effects(commandery_medicine) @@ -4076,7 +4076,7 @@ func _check_bohai_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Bohai commandery medicine should refresh battle Panacea inventory") if not secured_scene.campaign_state.has_claimed_camp_conversation_effects(BOHAI_SCENARIO_ID, BOHAI_COMMANDERY_CONVERSATION_ID): failures.append("Bohai commandery medicine claim should be saved") - if secured_scene._format_talk_status_text(secured_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if secured_scene._format_talk_status_text(secured_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Bohai secured talk status should show claimed supply after claim") secured_scene.free() @@ -4098,7 +4098,7 @@ func _check_liaoxi_branch_camp_conversations(failures: Array[String]) -> void: var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Liaoxi shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Liaoxi base talk status should summarize two non-supply topics") base_scene.free() @@ -4116,9 +4116,9 @@ func _check_liaoxi_branch_camp_conversations(failures: Array[String]) -> void: if not pressed_scene._camp_conversation_by_id(LIAOXI_APPROACH_MEDICINE_CONVERSATION_ID).is_empty(): failures.append("pressed Liaoxi flag should not expose Liaoxi approach medicine") if not fast_drums.is_empty(): - if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Liaoxi pressed talk status should show one ready supply") - if not pressed_scene._format_camp_conversation_button_text(fast_drums).contains("보급 War Drum"): + if not pressed_scene._format_camp_conversation_button_text(fast_drums).contains("보급 전고"): failures.append("Liaoxi fast drums button should show War Drum supply") var before_drums := int(pressed_scene.campaign_state.get_inventory_snapshot().get("war_drum", 0)) pressed_scene._apply_camp_conversation_effects(fast_drums) @@ -4128,7 +4128,7 @@ func _check_liaoxi_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Liaoxi fast drums should refresh battle War Drum inventory") if not pressed_scene.campaign_state.has_claimed_camp_conversation_effects(LIAOXI_SCENARIO_ID, LIAOXI_FAST_DRUMS_CONVERSATION_ID): failures.append("Liaoxi fast drums claim should be saved") - if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Liaoxi pressed talk status should show claimed supply after claim") pressed_scene.free() @@ -4146,9 +4146,9 @@ func _check_liaoxi_branch_camp_conversations(failures: Array[String]) -> void: if not secured_scene._camp_conversation_by_id(LIAOXI_FAST_DRUMS_CONVERSATION_ID).is_empty(): failures.append("secured Liaoxi flag should not expose Liaoxi fast drums") if not approach_medicine.is_empty(): - if secured_scene._format_talk_status_text(secured_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if secured_scene._format_talk_status_text(secured_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Liaoxi secured talk status should show one ready supply") - if not secured_scene._format_camp_conversation_button_text(approach_medicine).contains("보급 Panacea"): + if not secured_scene._format_camp_conversation_button_text(approach_medicine).contains("보급 만능약"): failures.append("Liaoxi approach medicine button should show Panacea supply") var before_panacea := int(secured_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) secured_scene._apply_camp_conversation_effects(approach_medicine) @@ -4158,7 +4158,7 @@ func _check_liaoxi_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Liaoxi approach medicine should refresh battle Panacea inventory") if not secured_scene.campaign_state.has_claimed_camp_conversation_effects(LIAOXI_SCENARIO_ID, LIAOXI_APPROACH_MEDICINE_CONVERSATION_ID): failures.append("Liaoxi approach medicine claim should be saved") - if secured_scene._format_talk_status_text(secured_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if secured_scene._format_talk_status_text(secured_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Liaoxi secured talk status should show claimed supply after claim") secured_scene.free() @@ -4180,7 +4180,7 @@ func _check_white_wolf_branch_camp_conversations(failures: Array[String]) -> voi var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("White Wolf shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("White Wolf base talk status should summarize two non-supply topics") base_scene.free() @@ -4198,9 +4198,9 @@ func _check_white_wolf_branch_camp_conversations(failures: Array[String]) -> voi if not struck_scene._camp_conversation_by_id(WHITE_WOLF_MEDICINE_CONVERSATION_ID).is_empty(): failures.append("struck Wuhuan flag should not expose White Wolf medicine") if not canteens.is_empty(): - if struck_scene._format_talk_status_text(struck_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if struck_scene._format_talk_status_text(struck_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("White Wolf struck talk status should show one ready supply") - if not struck_scene._format_camp_conversation_button_text(canteens).contains("보급 Wine"): + if not struck_scene._format_camp_conversation_button_text(canteens).contains("보급 술"): failures.append("White Wolf canteens button should show Wine supply") var before_wine := int(struck_scene.campaign_state.get_inventory_snapshot().get("wine", 0)) struck_scene._apply_camp_conversation_effects(canteens) @@ -4210,7 +4210,7 @@ func _check_white_wolf_branch_camp_conversations(failures: Array[String]) -> voi failures.append("White Wolf canteens should refresh battle Wine inventory") if not struck_scene.campaign_state.has_claimed_camp_conversation_effects(WHITE_WOLF_SCENARIO_ID, WHITE_WOLF_CANTEENS_CONVERSATION_ID): failures.append("White Wolf canteens claim should be saved") - if struck_scene._format_talk_status_text(struck_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if struck_scene._format_talk_status_text(struck_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("White Wolf struck talk status should show claimed supply after claim") struck_scene.free() @@ -4228,9 +4228,9 @@ func _check_white_wolf_branch_camp_conversations(failures: Array[String]) -> voi if not fortified_scene._camp_conversation_by_id(WHITE_WOLF_CANTEENS_CONVERSATION_ID).is_empty(): failures.append("fortified White Wolf flag should not expose White Wolf canteens") if not medicine.is_empty(): - if fortified_scene._format_talk_status_text(fortified_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if fortified_scene._format_talk_status_text(fortified_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("White Wolf fortified talk status should show one ready supply") - if not fortified_scene._format_camp_conversation_button_text(medicine).contains("보급 Panacea"): + if not fortified_scene._format_camp_conversation_button_text(medicine).contains("보급 만능약"): failures.append("White Wolf medicine button should show Panacea supply") var before_panacea := int(fortified_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) fortified_scene._apply_camp_conversation_effects(medicine) @@ -4240,7 +4240,7 @@ func _check_white_wolf_branch_camp_conversations(failures: Array[String]) -> voi failures.append("White Wolf medicine should refresh battle Panacea inventory") if not fortified_scene.campaign_state.has_claimed_camp_conversation_effects(WHITE_WOLF_SCENARIO_ID, WHITE_WOLF_MEDICINE_CONVERSATION_ID): failures.append("White Wolf medicine claim should be saved") - if fortified_scene._format_talk_status_text(fortified_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if fortified_scene._format_talk_status_text(fortified_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("White Wolf fortified talk status should show claimed supply after claim") fortified_scene.free() @@ -4262,7 +4262,7 @@ func _check_liaodong_branch_camp_conversations(failures: Array[String]) -> void: var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Liaodong shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Liaodong base talk status should summarize two non-supply topics") base_scene.free() @@ -4280,9 +4280,9 @@ func _check_liaodong_branch_camp_conversations(failures: Array[String]) -> void: if not pressed_scene._camp_conversation_by_id(LIAODONG_GUIDE_MEDICINE_CONVERSATION_ID).is_empty(): failures.append("pressed Liaodong flag should not expose Liaodong guide medicine") if not hard_wine.is_empty(): - if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Liaodong pressed talk status should show one ready supply") - if not pressed_scene._format_camp_conversation_button_text(hard_wine).contains("보급 Wine"): + if not pressed_scene._format_camp_conversation_button_text(hard_wine).contains("보급 술"): failures.append("Liaodong hard wine button should show Wine supply") var before_wine := int(pressed_scene.campaign_state.get_inventory_snapshot().get("wine", 0)) pressed_scene._apply_camp_conversation_effects(hard_wine) @@ -4292,7 +4292,7 @@ func _check_liaodong_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Liaodong hard wine should refresh battle Wine inventory") if not pressed_scene.campaign_state.has_claimed_camp_conversation_effects(LIAODONG_SCENARIO_ID, LIAODONG_HARD_WINE_CONVERSATION_ID): failures.append("Liaodong hard wine claim should be saved") - if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Liaodong pressed talk status should show claimed supply after claim") pressed_scene.free() @@ -4310,9 +4310,9 @@ func _check_liaodong_branch_camp_conversations(failures: Array[String]) -> void: if not secured_scene._camp_conversation_by_id(LIAODONG_HARD_WINE_CONVERSATION_ID).is_empty(): failures.append("secured Wuhuan flag should not expose Liaodong hard wine") if not guide_medicine.is_empty(): - if secured_scene._format_talk_status_text(secured_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if secured_scene._format_talk_status_text(secured_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Liaodong secured talk status should show one ready supply") - if not secured_scene._format_camp_conversation_button_text(guide_medicine).contains("보급 Panacea"): + if not secured_scene._format_camp_conversation_button_text(guide_medicine).contains("보급 만능약"): failures.append("Liaodong guide medicine button should show Panacea supply") var before_panacea := int(secured_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) secured_scene._apply_camp_conversation_effects(guide_medicine) @@ -4322,7 +4322,7 @@ func _check_liaodong_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Liaodong guide medicine should refresh battle Panacea inventory") if not secured_scene.campaign_state.has_claimed_camp_conversation_effects(LIAODONG_SCENARIO_ID, LIAODONG_GUIDE_MEDICINE_CONVERSATION_ID): failures.append("Liaodong guide medicine claim should be saved") - if secured_scene._format_talk_status_text(secured_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if secured_scene._format_talk_status_text(secured_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Liaodong secured talk status should show claimed supply after claim") secured_scene.free() @@ -4355,7 +4355,7 @@ func _check_xinye_branch_camp_conversations(failures: Array[String]) -> void: var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Xinye shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Xinye base talk status should summarize two non-supply topics") base_scene.free() @@ -4373,9 +4373,9 @@ func _check_xinye_branch_camp_conversations(failures: Array[String]) -> void: if not accepted_scene._camp_conversation_by_id(XINYE_AUTHORITY_WINE_CONVERSATION_ID).is_empty(): failures.append("accepted Liaodong flag should not expose Xinye authority wine") if not ordered_medicine.is_empty(): - if accepted_scene._format_talk_status_text(accepted_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if accepted_scene._format_talk_status_text(accepted_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Xinye accepted talk status should show one ready supply") - if not accepted_scene._format_camp_conversation_button_text(ordered_medicine).contains("보급 Panacea"): + if not accepted_scene._format_camp_conversation_button_text(ordered_medicine).contains("보급 만능약"): failures.append("Xinye ordered medicine button should show Panacea supply") var before_panacea := int(accepted_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) accepted_scene._apply_camp_conversation_effects(ordered_medicine) @@ -4385,7 +4385,7 @@ func _check_xinye_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Xinye ordered medicine should refresh battle Panacea inventory") if not accepted_scene.campaign_state.has_claimed_camp_conversation_effects(XINYE_SCENARIO_ID, XINYE_ORDERED_MEDICINE_CONVERSATION_ID): failures.append("Xinye ordered medicine claim should be saved") - if accepted_scene._format_talk_status_text(accepted_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if accepted_scene._format_talk_status_text(accepted_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Xinye accepted talk status should show claimed supply after claim") accepted_scene.free() @@ -4403,9 +4403,9 @@ func _check_xinye_branch_camp_conversations(failures: Array[String]) -> void: if not authority_scene._camp_conversation_by_id(XINYE_ORDERED_MEDICINE_CONVERSATION_ID).is_empty(): failures.append("pressed Liaodong authority flag should not expose Xinye ordered medicine") if not authority_wine.is_empty(): - if authority_scene._format_talk_status_text(authority_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if authority_scene._format_talk_status_text(authority_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Xinye authority talk status should show one ready supply") - if not authority_scene._format_camp_conversation_button_text(authority_wine).contains("보급 Wine"): + if not authority_scene._format_camp_conversation_button_text(authority_wine).contains("보급 술"): failures.append("Xinye authority wine button should show Wine supply") var before_wine := int(authority_scene.campaign_state.get_inventory_snapshot().get("wine", 0)) authority_scene._apply_camp_conversation_effects(authority_wine) @@ -4415,7 +4415,7 @@ func _check_xinye_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Xinye authority wine should refresh battle Wine inventory") if not authority_scene.campaign_state.has_claimed_camp_conversation_effects(XINYE_SCENARIO_ID, XINYE_AUTHORITY_WINE_CONVERSATION_ID): failures.append("Xinye authority wine claim should be saved") - if authority_scene._format_talk_status_text(authority_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if authority_scene._format_talk_status_text(authority_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Xinye authority talk status should show claimed supply after claim") authority_scene.free() @@ -4448,7 +4448,7 @@ func _check_changban_branch_camp_conversations(failures: Array[String]) -> void: var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Changban shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Changban base talk status should summarize two non-supply topics") base_scene.free() @@ -4477,9 +4477,9 @@ func _check_changban_branch_camp_conversations(failures: Array[String]) -> void: if not vanguard_scene._camp_conversation_by_id(CHANGBAN_HAN_MEDICINE_CONVERSATION_ID).is_empty(): failures.append("pressed Xinye vanguard flag should not expose Changban Han medicine") if not vanguard_rations.is_empty(): - if vanguard_scene._format_talk_status_text(vanguard_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if vanguard_scene._format_talk_status_text(vanguard_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Changban vanguard talk status should show one ready supply") - if not vanguard_scene._format_camp_conversation_button_text(vanguard_rations).contains("보급 Bean"): + if not vanguard_scene._format_camp_conversation_button_text(vanguard_rations).contains("보급 콩"): failures.append("Changban vanguard rations button should show Bean supply") var before_bean := int(vanguard_scene.campaign_state.get_inventory_snapshot().get("bean", 0)) vanguard_scene._apply_camp_conversation_effects(vanguard_rations) @@ -4489,7 +4489,7 @@ func _check_changban_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Changban vanguard rations should refresh battle Bean inventory") if not vanguard_scene.campaign_state.has_claimed_camp_conversation_effects(CHANGBAN_SCENARIO_ID, CHANGBAN_VANGUARD_RATIONS_CONVERSATION_ID): failures.append("Changban vanguard rations claim should be saved") - if vanguard_scene._format_talk_status_text(vanguard_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if vanguard_scene._format_talk_status_text(vanguard_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Changban vanguard talk status should show claimed supply after claim") vanguard_scene.free() @@ -4518,9 +4518,9 @@ func _check_changban_branch_camp_conversations(failures: Array[String]) -> void: if not supply_scene._camp_conversation_by_id(CHANGBAN_VANGUARD_RATIONS_CONVERSATION_ID).is_empty(): failures.append("secured Han supply flag should not expose Changban vanguard rations") if not han_medicine.is_empty(): - if supply_scene._format_talk_status_text(supply_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if supply_scene._format_talk_status_text(supply_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Changban secured talk status should show one ready supply") - if not supply_scene._format_camp_conversation_button_text(han_medicine).contains("보급 Panacea"): + if not supply_scene._format_camp_conversation_button_text(han_medicine).contains("보급 만능약"): failures.append("Changban Han medicine button should show Panacea supply") var before_panacea := int(supply_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) supply_scene._apply_camp_conversation_effects(han_medicine) @@ -4530,7 +4530,7 @@ func _check_changban_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Changban Han medicine should refresh battle Panacea inventory") if not supply_scene.campaign_state.has_claimed_camp_conversation_effects(CHANGBAN_SCENARIO_ID, CHANGBAN_HAN_MEDICINE_CONVERSATION_ID): failures.append("Changban Han medicine claim should be saved") - if supply_scene._format_talk_status_text(supply_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if supply_scene._format_talk_status_text(supply_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Changban secured talk status should show claimed supply after claim") supply_scene.free() @@ -4563,7 +4563,7 @@ func _check_jiangling_branch_camp_conversations(failures: Array[String]) -> void var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Jiangling shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Jiangling base talk status should summarize two non-supply topics") base_scene.free() @@ -4592,9 +4592,9 @@ func _check_jiangling_branch_camp_conversations(failures: Array[String]) -> void if not chase_scene._camp_conversation_by_id(JIANGLING_CROSSING_MEDICINE_CONVERSATION_ID).is_empty(): failures.append("pressed Jiangling chase flag should not expose Jiangling crossing medicine") if not fast_beans.is_empty(): - if chase_scene._format_talk_status_text(chase_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if chase_scene._format_talk_status_text(chase_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Jiangling chase talk status should show one ready supply") - if not chase_scene._format_camp_conversation_button_text(fast_beans).contains("보급 Bean"): + if not chase_scene._format_camp_conversation_button_text(fast_beans).contains("보급 콩"): failures.append("Jiangling fast beans button should show Bean supply") var before_bean := int(chase_scene.campaign_state.get_inventory_snapshot().get("bean", 0)) chase_scene._apply_camp_conversation_effects(fast_beans) @@ -4604,7 +4604,7 @@ func _check_jiangling_branch_camp_conversations(failures: Array[String]) -> void failures.append("Jiangling fast beans should refresh battle Bean inventory") if not chase_scene.campaign_state.has_claimed_camp_conversation_effects(JIANGLING_SCENARIO_ID, JIANGLING_FAST_BEANS_CONVERSATION_ID): failures.append("Jiangling fast beans claim should be saved") - if chase_scene._format_talk_status_text(chase_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if chase_scene._format_talk_status_text(chase_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Jiangling chase talk status should show claimed supply after claim") chase_scene.free() @@ -4633,9 +4633,9 @@ func _check_jiangling_branch_camp_conversations(failures: Array[String]) -> void if not crossings_scene._camp_conversation_by_id(JIANGLING_FAST_BEANS_CONVERSATION_ID).is_empty(): failures.append("secured Changban crossings flag should not expose Jiangling fast beans") if not crossing_medicine.is_empty(): - if crossings_scene._format_talk_status_text(crossings_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if crossings_scene._format_talk_status_text(crossings_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Jiangling crossings talk status should show one ready supply") - if not crossings_scene._format_camp_conversation_button_text(crossing_medicine).contains("보급 Panacea"): + if not crossings_scene._format_camp_conversation_button_text(crossing_medicine).contains("보급 만능약"): failures.append("Jiangling crossing medicine button should show Panacea supply") var before_panacea := int(crossings_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) crossings_scene._apply_camp_conversation_effects(crossing_medicine) @@ -4645,7 +4645,7 @@ func _check_jiangling_branch_camp_conversations(failures: Array[String]) -> void failures.append("Jiangling crossing medicine should refresh battle Panacea inventory") if not crossings_scene.campaign_state.has_claimed_camp_conversation_effects(JIANGLING_SCENARIO_ID, JIANGLING_CROSSING_MEDICINE_CONVERSATION_ID): failures.append("Jiangling crossing medicine claim should be saved") - if crossings_scene._format_talk_status_text(crossings_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if crossings_scene._format_talk_status_text(crossings_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Jiangling crossings talk status should show claimed supply after claim") crossings_scene.free() @@ -4678,7 +4678,7 @@ func _check_xiakou_branch_camp_conversations(failures: Array[String]) -> void: var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Xiakou shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Xiakou base talk status should summarize two non-supply topics") base_scene.free() @@ -4707,9 +4707,9 @@ func _check_xiakou_branch_camp_conversations(failures: Array[String]) -> void: if not pursuit_scene._camp_conversation_by_id(XIAKOU_STOREHOUSE_MEDICINE_CONVERSATION_ID).is_empty(): failures.append("pressed Xiakou pursuit flag should not expose Xiakou storehouse medicine") if not envoy_beans.is_empty(): - if pursuit_scene._format_talk_status_text(pursuit_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if pursuit_scene._format_talk_status_text(pursuit_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Xiakou pursuit talk status should show one ready supply") - if not pursuit_scene._format_camp_conversation_button_text(envoy_beans).contains("보급 Bean"): + if not pursuit_scene._format_camp_conversation_button_text(envoy_beans).contains("보급 콩"): failures.append("Xiakou envoy beans button should show Bean supply") var before_bean := int(pursuit_scene.campaign_state.get_inventory_snapshot().get("bean", 0)) pursuit_scene._apply_camp_conversation_effects(envoy_beans) @@ -4719,7 +4719,7 @@ func _check_xiakou_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Xiakou envoy beans should refresh battle Bean inventory") if not pursuit_scene.campaign_state.has_claimed_camp_conversation_effects(XIAKOU_SCENARIO_ID, XIAKOU_ENVOY_BEANS_CONVERSATION_ID): failures.append("Xiakou envoy beans claim should be saved") - if pursuit_scene._format_talk_status_text(pursuit_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if pursuit_scene._format_talk_status_text(pursuit_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Xiakou pursuit talk status should show claimed supply after claim") pursuit_scene.free() @@ -4748,9 +4748,9 @@ func _check_xiakou_branch_camp_conversations(failures: Array[String]) -> void: if not storehouse_scene._camp_conversation_by_id(XIAKOU_ENVOY_BEANS_CONVERSATION_ID).is_empty(): failures.append("secured Jiangling storehouses flag should not expose Xiakou envoy beans") if not storehouse_medicine.is_empty(): - if storehouse_scene._format_talk_status_text(storehouse_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if storehouse_scene._format_talk_status_text(storehouse_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Xiakou storehouse talk status should show one ready supply") - if not storehouse_scene._format_camp_conversation_button_text(storehouse_medicine).contains("보급 Panacea"): + if not storehouse_scene._format_camp_conversation_button_text(storehouse_medicine).contains("보급 만능약"): failures.append("Xiakou storehouse medicine button should show Panacea supply") var before_panacea := int(storehouse_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) storehouse_scene._apply_camp_conversation_effects(storehouse_medicine) @@ -4760,7 +4760,7 @@ func _check_xiakou_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Xiakou storehouse medicine should refresh battle Panacea inventory") if not storehouse_scene.campaign_state.has_claimed_camp_conversation_effects(XIAKOU_SCENARIO_ID, XIAKOU_STOREHOUSE_MEDICINE_CONVERSATION_ID): failures.append("Xiakou storehouse medicine claim should be saved") - if storehouse_scene._format_talk_status_text(storehouse_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if storehouse_scene._format_talk_status_text(storehouse_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Xiakou storehouse talk status should show claimed supply after claim") storehouse_scene.free() @@ -4793,7 +4793,7 @@ func _check_red_cliffs_branch_camp_conversations(failures: Array[String]) -> voi var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Red Cliffs shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Red Cliffs base talk status should summarize two non-supply topics") base_scene.free() @@ -4822,9 +4822,9 @@ func _check_red_cliffs_branch_camp_conversations(failures: Array[String]) -> voi if not pressed_scene._camp_conversation_by_id(RED_CLIFFS_HARBOR_MEDICINE_CONVERSATION_ID).is_empty(): failures.append("pressed Red Cliffs fleet flag should not expose harbor medicine") if not forward_beans.is_empty(): - if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Red Cliffs pressed talk status should show one ready supply") - if not pressed_scene._format_camp_conversation_button_text(forward_beans).contains("보급 Bean"): + if not pressed_scene._format_camp_conversation_button_text(forward_beans).contains("보급 콩"): failures.append("Red Cliffs forward beans button should show Bean supply") var before_bean := int(pressed_scene.campaign_state.get_inventory_snapshot().get("bean", 0)) pressed_scene._apply_camp_conversation_effects(forward_beans) @@ -4834,7 +4834,7 @@ func _check_red_cliffs_branch_camp_conversations(failures: Array[String]) -> voi failures.append("Red Cliffs forward beans should refresh battle Bean inventory") if not pressed_scene.campaign_state.has_claimed_camp_conversation_effects(RED_CLIFFS_SCENARIO_ID, RED_CLIFFS_FORWARD_BEANS_CONVERSATION_ID): failures.append("Red Cliffs forward beans claim should be saved") - if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Red Cliffs pressed talk status should show claimed supply after claim") pressed_scene.free() @@ -4863,9 +4863,9 @@ func _check_red_cliffs_branch_camp_conversations(failures: Array[String]) -> voi if not harbor_scene._camp_conversation_by_id(RED_CLIFFS_FORWARD_BEANS_CONVERSATION_ID).is_empty(): failures.append("secured Xiakou harbor flag should not expose Red Cliffs forward beans") if not harbor_medicine.is_empty(): - if harbor_scene._format_talk_status_text(harbor_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if harbor_scene._format_talk_status_text(harbor_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Red Cliffs harbor talk status should show one ready supply") - if not harbor_scene._format_camp_conversation_button_text(harbor_medicine).contains("보급 Panacea"): + if not harbor_scene._format_camp_conversation_button_text(harbor_medicine).contains("보급 만능약"): failures.append("Red Cliffs harbor medicine button should show Panacea supply") var before_panacea := int(harbor_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) harbor_scene._apply_camp_conversation_effects(harbor_medicine) @@ -4875,7 +4875,7 @@ func _check_red_cliffs_branch_camp_conversations(failures: Array[String]) -> voi failures.append("Red Cliffs harbor medicine should refresh battle Panacea inventory") if not harbor_scene.campaign_state.has_claimed_camp_conversation_effects(RED_CLIFFS_SCENARIO_ID, RED_CLIFFS_HARBOR_MEDICINE_CONVERSATION_ID): failures.append("Red Cliffs harbor medicine claim should be saved") - if harbor_scene._format_talk_status_text(harbor_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if harbor_scene._format_talk_status_text(harbor_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Red Cliffs harbor talk status should show claimed supply after claim") harbor_scene.free() @@ -4908,7 +4908,7 @@ func _check_red_cliffs_fire_branch_camp_conversations(failures: Array[String]) - var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Red Cliffs Fire shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Red Cliffs Fire base talk status should summarize two non-supply topics") base_scene.free() @@ -4937,9 +4937,9 @@ func _check_red_cliffs_fire_branch_camp_conversations(failures: Array[String]) - if not chain_scene._camp_conversation_by_id(RED_CLIFFS_FIRE_NIGHT_BEANS_CONVERSATION_ID).is_empty(): failures.append("reinforced chain flag should not expose Red Cliffs Fire night beans") if not chain_medicine.is_empty(): - if chain_scene._format_talk_status_text(chain_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if chain_scene._format_talk_status_text(chain_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Red Cliffs Fire chain talk status should show one ready supply") - if not chain_scene._format_camp_conversation_button_text(chain_medicine).contains("보급 Panacea"): + if not chain_scene._format_camp_conversation_button_text(chain_medicine).contains("보급 만능약"): failures.append("Red Cliffs Fire chain medicine button should show Panacea supply") var before_panacea := int(chain_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) chain_scene._apply_camp_conversation_effects(chain_medicine) @@ -4949,7 +4949,7 @@ func _check_red_cliffs_fire_branch_camp_conversations(failures: Array[String]) - failures.append("Red Cliffs Fire chain medicine should refresh battle Panacea inventory") if not chain_scene.campaign_state.has_claimed_camp_conversation_effects(RED_CLIFFS_FIRE_SCENARIO_ID, RED_CLIFFS_FIRE_CHAIN_MEDICINE_CONVERSATION_ID): failures.append("Red Cliffs Fire chain medicine claim should be saved") - if chain_scene._format_talk_status_text(chain_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if chain_scene._format_talk_status_text(chain_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Red Cliffs Fire chain talk status should show claimed supply after claim") chain_scene.free() @@ -4978,9 +4978,9 @@ func _check_red_cliffs_fire_branch_camp_conversations(failures: Array[String]) - if not raid_scene._camp_conversation_by_id(RED_CLIFFS_FIRE_CHAIN_MEDICINE_CONVERSATION_ID).is_empty(): failures.append("night raid flag should not expose Red Cliffs Fire chain medicine") if not night_beans.is_empty(): - if raid_scene._format_talk_status_text(raid_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if raid_scene._format_talk_status_text(raid_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Red Cliffs Fire night raid talk status should show one ready supply") - if not raid_scene._format_camp_conversation_button_text(night_beans).contains("보급 Bean"): + if not raid_scene._format_camp_conversation_button_text(night_beans).contains("보급 콩"): failures.append("Red Cliffs Fire night beans button should show Bean supply") var before_bean := int(raid_scene.campaign_state.get_inventory_snapshot().get("bean", 0)) raid_scene._apply_camp_conversation_effects(night_beans) @@ -4990,7 +4990,7 @@ func _check_red_cliffs_fire_branch_camp_conversations(failures: Array[String]) - failures.append("Red Cliffs Fire night beans should refresh battle Bean inventory") if not raid_scene.campaign_state.has_claimed_camp_conversation_effects(RED_CLIFFS_FIRE_SCENARIO_ID, RED_CLIFFS_FIRE_NIGHT_BEANS_CONVERSATION_ID): failures.append("Red Cliffs Fire night beans claim should be saved") - if raid_scene._format_talk_status_text(raid_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if raid_scene._format_talk_status_text(raid_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Red Cliffs Fire night raid talk status should show claimed supply after claim") raid_scene.free() @@ -5023,7 +5023,7 @@ func _check_huarong_branch_camp_conversations(failures: Array[String]) -> void: var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Huarong shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Huarong base talk status should summarize two non-supply topics") base_scene.free() @@ -5052,9 +5052,9 @@ func _check_huarong_branch_camp_conversations(failures: Array[String]) -> void: if not held_scene._camp_conversation_by_id(HUARONG_OPEN_RETREAT_BEANS_CONVERSATION_ID).is_empty(): failures.append("held Red Cliffs line flag should not expose Huarong retreat beans") if not held_medicine.is_empty(): - if held_scene._format_talk_status_text(held_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if held_scene._format_talk_status_text(held_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Huarong held line talk status should show one ready supply") - if not held_scene._format_camp_conversation_button_text(held_medicine).contains("보급 Panacea"): + if not held_scene._format_camp_conversation_button_text(held_medicine).contains("보급 만능약"): failures.append("Huarong held medicine button should show Panacea supply") var before_panacea := int(held_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) held_scene._apply_camp_conversation_effects(held_medicine) @@ -5064,7 +5064,7 @@ func _check_huarong_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Huarong held medicine should refresh battle Panacea inventory") if not held_scene.campaign_state.has_claimed_camp_conversation_effects(HUARONG_SCENARIO_ID, HUARONG_HELD_MEDICINE_CONVERSATION_ID): failures.append("Huarong held medicine claim should be saved") - if held_scene._format_talk_status_text(held_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if held_scene._format_talk_status_text(held_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Huarong held line talk status should show claimed supply after claim") held_scene.free() @@ -5093,9 +5093,9 @@ func _check_huarong_branch_camp_conversations(failures: Array[String]) -> void: if not opened_scene._camp_conversation_by_id(HUARONG_HELD_MEDICINE_CONVERSATION_ID).is_empty(): failures.append("opened Huarong retreat flag should not expose Huarong medicine") if not retreat_beans.is_empty(): - if opened_scene._format_talk_status_text(opened_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if opened_scene._format_talk_status_text(opened_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Huarong opened retreat talk status should show one ready supply") - if not opened_scene._format_camp_conversation_button_text(retreat_beans).contains("보급 Bean"): + if not opened_scene._format_camp_conversation_button_text(retreat_beans).contains("보급 콩"): failures.append("Huarong retreat beans button should show Bean supply") var before_bean := int(opened_scene.campaign_state.get_inventory_snapshot().get("bean", 0)) opened_scene._apply_camp_conversation_effects(retreat_beans) @@ -5105,7 +5105,7 @@ func _check_huarong_branch_camp_conversations(failures: Array[String]) -> void: failures.append("Huarong retreat beans should refresh battle Bean inventory") if not opened_scene.campaign_state.has_claimed_camp_conversation_effects(HUARONG_SCENARIO_ID, HUARONG_OPEN_RETREAT_BEANS_CONVERSATION_ID): failures.append("Huarong retreat beans claim should be saved") - if opened_scene._format_talk_status_text(opened_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if opened_scene._format_talk_status_text(opened_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Huarong opened retreat talk status should show claimed supply after claim") opened_scene.free() @@ -5138,7 +5138,7 @@ func _check_jiangling_rearguard_branch_camp_conversations(failures: Array[String var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Jiangling Rearguard shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Jiangling Rearguard base talk status should summarize two non-supply topics") base_scene.free() @@ -5167,9 +5167,9 @@ func _check_jiangling_rearguard_branch_camp_conversations(failures: Array[String if not secured_scene._camp_conversation_by_id(JIANGLING_REARGUARD_FORCED_MARCH_BEANS_CONVERSATION_ID).is_empty(): failures.append("secured Huarong rearguard flag should not expose Jiangling forced march beans") if not stability_medicine.is_empty(): - if secured_scene._format_talk_status_text(secured_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if secured_scene._format_talk_status_text(secured_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Jiangling secured Huarong talk status should show one ready supply") - if not secured_scene._format_camp_conversation_button_text(stability_medicine).contains("보급 Panacea"): + if not secured_scene._format_camp_conversation_button_text(stability_medicine).contains("보급 만능약"): failures.append("Jiangling stability medicine button should show Panacea supply") var before_panacea := int(secured_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) secured_scene._apply_camp_conversation_effects(stability_medicine) @@ -5179,7 +5179,7 @@ func _check_jiangling_rearguard_branch_camp_conversations(failures: Array[String failures.append("Jiangling stability medicine should refresh battle Panacea inventory") if not secured_scene.campaign_state.has_claimed_camp_conversation_effects(JIANGLING_REARGUARD_SCENARIO_ID, JIANGLING_REARGUARD_STABILITY_MEDICINE_CONVERSATION_ID): failures.append("Jiangling stability medicine claim should be saved") - if secured_scene._format_talk_status_text(secured_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if secured_scene._format_talk_status_text(secured_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Jiangling secured Huarong talk status should show claimed supply after claim") secured_scene.free() @@ -5208,9 +5208,9 @@ func _check_jiangling_rearguard_branch_camp_conversations(failures: Array[String if not rushed_scene._camp_conversation_by_id(JIANGLING_REARGUARD_STABILITY_MEDICINE_CONVERSATION_ID).is_empty(): failures.append("rushed Xuchang return flag should not expose Jiangling stability medicine") if not forced_beans.is_empty(): - if rushed_scene._format_talk_status_text(rushed_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if rushed_scene._format_talk_status_text(rushed_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Jiangling rushed return talk status should show one ready supply") - if not rushed_scene._format_camp_conversation_button_text(forced_beans).contains("보급 Bean"): + if not rushed_scene._format_camp_conversation_button_text(forced_beans).contains("보급 콩"): failures.append("Jiangling forced march beans button should show Bean supply") var before_bean := int(rushed_scene.campaign_state.get_inventory_snapshot().get("bean", 0)) rushed_scene._apply_camp_conversation_effects(forced_beans) @@ -5220,7 +5220,7 @@ func _check_jiangling_rearguard_branch_camp_conversations(failures: Array[String failures.append("Jiangling forced march beans should refresh battle Bean inventory") if not rushed_scene.campaign_state.has_claimed_camp_conversation_effects(JIANGLING_REARGUARD_SCENARIO_ID, JIANGLING_REARGUARD_FORCED_MARCH_BEANS_CONVERSATION_ID): failures.append("Jiangling forced march beans claim should be saved") - if rushed_scene._format_talk_status_text(rushed_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if rushed_scene._format_talk_status_text(rushed_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Jiangling rushed return talk status should show claimed supply after claim") rushed_scene.free() @@ -5253,7 +5253,7 @@ func _check_tong_pass_branch_camp_conversations(failures: Array[String]) -> void var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Tong Pass shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Tong Pass base talk status should summarize two non-supply topics") base_scene.free() @@ -5282,9 +5282,9 @@ func _check_tong_pass_branch_camp_conversations(failures: Array[String]) -> void if not stabilized_scene._camp_conversation_by_id(TONG_PASS_VANGUARD_RATIONS_CONVERSATION_ID).is_empty(): failures.append("stabilized Jiangling flag should not expose Tong Pass vanguard rations") if not jiangling_medicine.is_empty(): - if stabilized_scene._format_talk_status_text(stabilized_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if stabilized_scene._format_talk_status_text(stabilized_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Tong Pass stabilized Jiangling talk status should show one ready supply") - if not stabilized_scene._format_camp_conversation_button_text(jiangling_medicine).contains("보급 Panacea"): + if not stabilized_scene._format_camp_conversation_button_text(jiangling_medicine).contains("보급 만능약"): failures.append("Tong Pass Jiangling medicine button should show Panacea supply") var before_panacea := int(stabilized_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) stabilized_scene._apply_camp_conversation_effects(jiangling_medicine) @@ -5294,7 +5294,7 @@ func _check_tong_pass_branch_camp_conversations(failures: Array[String]) -> void failures.append("Tong Pass Jiangling medicine should refresh battle Panacea inventory") if not stabilized_scene.campaign_state.has_claimed_camp_conversation_effects(TONG_PASS_SCENARIO_ID, TONG_PASS_JIANGLING_MEDICINE_CONVERSATION_ID): failures.append("Tong Pass Jiangling medicine claim should be saved") - if stabilized_scene._format_talk_status_text(stabilized_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if stabilized_scene._format_talk_status_text(stabilized_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Tong Pass stabilized Jiangling talk status should show claimed supply after claim") stabilized_scene.free() @@ -5323,9 +5323,9 @@ func _check_tong_pass_branch_camp_conversations(failures: Array[String]) -> void if not mobilized_scene._camp_conversation_by_id(TONG_PASS_JIANGLING_MEDICINE_CONVERSATION_ID).is_empty(): failures.append("mobilized Tong Pass vanguard flag should not expose Tong Pass medicine") if not vanguard_rations.is_empty(): - if mobilized_scene._format_talk_status_text(mobilized_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if mobilized_scene._format_talk_status_text(mobilized_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Tong Pass mobilized vanguard talk status should show one ready supply") - if not mobilized_scene._format_camp_conversation_button_text(vanguard_rations).contains("보급 Bean"): + if not mobilized_scene._format_camp_conversation_button_text(vanguard_rations).contains("보급 콩"): failures.append("Tong Pass vanguard rations button should show Bean supply") var before_bean := int(mobilized_scene.campaign_state.get_inventory_snapshot().get("bean", 0)) mobilized_scene._apply_camp_conversation_effects(vanguard_rations) @@ -5335,7 +5335,7 @@ func _check_tong_pass_branch_camp_conversations(failures: Array[String]) -> void failures.append("Tong Pass vanguard rations should refresh battle Bean inventory") if not mobilized_scene.campaign_state.has_claimed_camp_conversation_effects(TONG_PASS_SCENARIO_ID, TONG_PASS_VANGUARD_RATIONS_CONVERSATION_ID): failures.append("Tong Pass vanguard rations claim should be saved") - if mobilized_scene._format_talk_status_text(mobilized_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if mobilized_scene._format_talk_status_text(mobilized_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Tong Pass mobilized vanguard talk status should show claimed supply after claim") mobilized_scene.free() @@ -5368,7 +5368,7 @@ func _check_ma_chao_counterstroke_branch_camp_conversations(failures: Array[Stri var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Ma Chao Counterstroke shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Ma Chao Counterstroke base talk status should summarize two non-supply topics") base_scene.free() @@ -5397,9 +5397,9 @@ func _check_ma_chao_counterstroke_branch_camp_conversations(failures: Array[Stri if not fortified_scene._camp_conversation_by_id(MA_CHAO_COUNTERSTROKE_PRESSED_BEANS_CONVERSATION_ID).is_empty(): failures.append("fortified Tong Pass flag should not expose Ma Chao Counterstroke pressed beans") if not fortified_medicine.is_empty(): - if fortified_scene._format_talk_status_text(fortified_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if fortified_scene._format_talk_status_text(fortified_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Ma Chao Counterstroke fortified talk status should show one ready supply") - if not fortified_scene._format_camp_conversation_button_text(fortified_medicine).contains("보급 Panacea"): + if not fortified_scene._format_camp_conversation_button_text(fortified_medicine).contains("보급 만능약"): failures.append("Ma Chao Counterstroke fortified medicine button should show Panacea supply") var before_panacea := int(fortified_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) fortified_scene._apply_camp_conversation_effects(fortified_medicine) @@ -5409,7 +5409,7 @@ func _check_ma_chao_counterstroke_branch_camp_conversations(failures: Array[Stri failures.append("Ma Chao Counterstroke fortified medicine should refresh battle Panacea inventory") if not fortified_scene.campaign_state.has_claimed_camp_conversation_effects(MA_CHAO_COUNTERSTROKE_SCENARIO_ID, MA_CHAO_COUNTERSTROKE_FORTIFIED_MEDICINE_CONVERSATION_ID): failures.append("Ma Chao Counterstroke fortified medicine claim should be saved") - if fortified_scene._format_talk_status_text(fortified_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if fortified_scene._format_talk_status_text(fortified_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Ma Chao Counterstroke fortified talk status should show claimed supply after claim") fortified_scene.free() @@ -5438,9 +5438,9 @@ func _check_ma_chao_counterstroke_branch_camp_conversations(failures: Array[Stri if not pressed_scene._camp_conversation_by_id(MA_CHAO_COUNTERSTROKE_FORTIFIED_MEDICINE_CONVERSATION_ID).is_empty(): failures.append("pressed Ma Chao vanguard flag should not expose Ma Chao Counterstroke medicine") if not pressed_beans.is_empty(): - if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Ma Chao Counterstroke pressed vanguard talk status should show one ready supply") - if not pressed_scene._format_camp_conversation_button_text(pressed_beans).contains("보급 Bean"): + if not pressed_scene._format_camp_conversation_button_text(pressed_beans).contains("보급 콩"): failures.append("Ma Chao Counterstroke pressed beans button should show Bean supply") var before_bean := int(pressed_scene.campaign_state.get_inventory_snapshot().get("bean", 0)) pressed_scene._apply_camp_conversation_effects(pressed_beans) @@ -5450,7 +5450,7 @@ func _check_ma_chao_counterstroke_branch_camp_conversations(failures: Array[Stri failures.append("Ma Chao Counterstroke pressed beans should refresh battle Bean inventory") if not pressed_scene.campaign_state.has_claimed_camp_conversation_effects(MA_CHAO_COUNTERSTROKE_SCENARIO_ID, MA_CHAO_COUNTERSTROKE_PRESSED_BEANS_CONVERSATION_ID): failures.append("Ma Chao Counterstroke pressed beans claim should be saved") - if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if pressed_scene._format_talk_status_text(pressed_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Ma Chao Counterstroke pressed vanguard talk status should show claimed supply after claim") pressed_scene.free() @@ -5483,7 +5483,7 @@ func _check_weishui_camps_branch_camp_conversations(failures: Array[String]) -> var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: failures.append("Weishui Camps shop merchant should expose flavor lines") - if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "Camp conversations | 2 topics": + if base_scene._format_talk_status_text(base_scene._camp_conversation_entries()) != "군막 회의 · 2건": failures.append("Weishui Camps base talk status should summarize two non-supply topics") base_scene.free() @@ -5512,9 +5512,9 @@ func _check_weishui_camps_branch_camp_conversations(failures: Array[String]) -> if not anchored_scene._camp_conversation_by_id(WEISHUI_CAMPS_DOUBT_RATIONS_CONVERSATION_ID).is_empty(): failures.append("anchored Weishui camps flag should not expose Weishui doubt rations") if not anchor_medicine.is_empty(): - if anchored_scene._format_talk_status_text(anchored_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if anchored_scene._format_talk_status_text(anchored_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Weishui anchored talk status should show one ready supply") - if not anchored_scene._format_camp_conversation_button_text(anchor_medicine).contains("보급 Panacea"): + if not anchored_scene._format_camp_conversation_button_text(anchor_medicine).contains("보급 만능약"): failures.append("Weishui anchor medicine button should show Panacea supply") var before_panacea := int(anchored_scene.campaign_state.get_inventory_snapshot().get("panacea", 0)) anchored_scene._apply_camp_conversation_effects(anchor_medicine) @@ -5524,7 +5524,7 @@ func _check_weishui_camps_branch_camp_conversations(failures: Array[String]) -> failures.append("Weishui anchor medicine should refresh battle Panacea inventory") if not anchored_scene.campaign_state.has_claimed_camp_conversation_effects(WEISHUI_CAMPS_SCENARIO_ID, WEISHUI_CAMPS_ANCHOR_MEDICINE_CONVERSATION_ID): failures.append("Weishui anchor medicine claim should be saved") - if anchored_scene._format_talk_status_text(anchored_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if anchored_scene._format_talk_status_text(anchored_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Weishui anchored talk status should show claimed supply after claim") anchored_scene.free() @@ -5553,9 +5553,9 @@ func _check_weishui_camps_branch_camp_conversations(failures: Array[String]) -> if not doubt_scene._camp_conversation_by_id(WEISHUI_CAMPS_ANCHOR_MEDICINE_CONVERSATION_ID).is_empty(): failures.append("sowed Han Sui doubt flag should not expose Weishui anchor medicine") if not doubt_rations.is_empty(): - if doubt_scene._format_talk_status_text(doubt_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 supplies ready": + if doubt_scene._format_talk_status_text(doubt_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 보급 대기 1건": failures.append("Weishui Han Sui doubt talk status should show one ready supply") - if not doubt_scene._format_camp_conversation_button_text(doubt_rations).contains("보급 Bean"): + if not doubt_scene._format_camp_conversation_button_text(doubt_rations).contains("보급 콩"): failures.append("Weishui doubt rations button should show Bean supply") var before_bean := int(doubt_scene.campaign_state.get_inventory_snapshot().get("bean", 0)) doubt_scene._apply_camp_conversation_effects(doubt_rations) @@ -5565,7 +5565,7 @@ func _check_weishui_camps_branch_camp_conversations(failures: Array[String]) -> failures.append("Weishui doubt rations should refresh battle Bean inventory") if not doubt_scene.campaign_state.has_claimed_camp_conversation_effects(WEISHUI_CAMPS_SCENARIO_ID, WEISHUI_CAMPS_DOUBT_RATIONS_CONVERSATION_ID): failures.append("Weishui doubt rations claim should be saved") - if doubt_scene._format_talk_status_text(doubt_scene._camp_conversation_entries()) != "Camp conversations | 3 topics | 1 claimed": + if doubt_scene._format_talk_status_text(doubt_scene._camp_conversation_entries()) != "군막 회의 · 3건 · 수령 완료 1건": failures.append("Weishui Han Sui doubt talk status should show claimed supply after claim") doubt_scene.free() diff --git a/tools/smoke_objective_progress.gd b/tools/smoke_objective_progress.gd index ded0f40..1872897 100644 --- a/tools/smoke_objective_progress.gd +++ b/tools/smoke_objective_progress.gd @@ -11,49 +11,49 @@ func _init() -> void: failures, "001 HUD progress", _progress_text("res://data/scenarios/001_yellow_turbans.json", false), - "Enemies defeated 0/" + "적군 격파 0/" ) _check_contains( failures, "001 commander defeat risk", _defeat_text("res://data/scenarios/001_yellow_turbans.json"), - "Cao Cao safe" + "Cao Cao 건재" ) _check_contains( failures, "001 turn pressure risk", _defeat_text("res://data/scenarios/001_yellow_turbans.json"), - "Turns left 7" + "남은 턴 7" ) _check_contains( failures, "002 gated victory progress", _progress_text("res://data/scenarios/002_sishui_gate.json", false), - "Objective unlocks on Turn 2" + "제2턴에 전공 갱신" ) _check_contains( failures, "002 pending enemy progress", _progress_text("res://data/scenarios/002_sishui_gate.json", false), - "Enemies defeated 0/" + "적군 격파 0/" ) _check_contains( failures, "007 destination progress", _progress_text("res://data/scenarios/007_xian_emperor_escort.json", false), - "Destination (14, 5): not reached" + "목표 지점 (14, 5): 미도달" ) _check_contains( failures, "007 protected-unit risk progress", _defeat_text("res://data/scenarios/007_xian_emperor_escort.json"), - "Imperial Envoy safe" + "Imperial Envoy 건재" ) _check_contains( failures, "045 gated destination progress", _progress_text("res://data/scenarios/045_fancheng_relief.json", false), - "Reach (10, 5): not reached" + "목표 지점 (10, 5): 미도달" ) _check_event_gated_objective_markers(failures) _check_event_gated_multi_cell_objective_markers(failures) diff --git a/tools/smoke_post_move_action_flow.gd b/tools/smoke_post_move_action_flow.gd index aa4592f..96a6be1 100644 --- a/tools/smoke_post_move_action_flow.gd +++ b/tools/smoke_post_move_action_flow.gd @@ -327,7 +327,7 @@ func _check_scene_post_move_tactic_picker_flow(failures: Array[String]) -> void: if tactic_markers.size() != 1 or tactic_markers[0].get("cell", Vector2i.ZERO) != Vector2i(3, 3): failures.append("tactic target markers should include only the Spark target: %s" % str(tactic_markers)) else: - if str(tactic_markers[0].get("text", "")) != "KO": + if str(tactic_markers[0].get("text", "")) != "퇴각": failures.append("tactic target marker should preview the deterministic KO: %s" % str(tactic_markers[0])) if str(tactic_markers[0].get("kind", "")) != "damage": failures.append("tactic target marker should use damage color: %s" % str(tactic_markers[0])) diff --git a/tools/smoke_result_summary.gd b/tools/smoke_result_summary.gd index 5253f78..fb29539 100644 --- a/tools/smoke_result_summary.gd +++ b/tools/smoke_result_summary.gd @@ -37,15 +37,15 @@ func _init() -> void: var result_text: String = scene._format_battle_result_summary() _check_contains(failures, "reward section", result_text, "전리품") _check_contains(failures, "gold reward", result_text, "군자금 +100") - _check_contains(failures, "item reward", result_text, "Bean x2") - _check_contains(failures, "roster section", result_text, "합류: Dian Wei") + _check_contains(failures, "item reward", result_text, "콩 x2") + _check_contains(failures, "roster section", result_text, "합류: 전위") _check_contains(failures, "growth section", result_text, "Cao Cao Lv.2") _check_contains(failures, "campaign section", result_text, "다음 행군: Sishui Gate") _check_contains(failures, "next camp section", result_text, "다음 군막") _check_contains(failures, "next camp location", result_text, "Sishui Gate, 190 CE") - _check_contains(failures, "next camp talk", result_text, "군막 회의 3") - _check_contains(failures, "next camp shop", result_text, "군상 물품 6") - _check_contains(failures, "next camp deploy", result_text, "출진 명부 2/3") + _check_contains(failures, "next camp talk", result_text, "군막 회의 · 3건") + _check_contains(failures, "next camp shop", result_text, "군상 물품 · 6종") + _check_contains(failures, "next camp deploy", result_text, "출진 명부 · 2/3") _check_contains(failures, "next camp formation", result_text, "진형 배치 6칸") scene.battle_result_summary = { @@ -104,8 +104,8 @@ func _init() -> void: "join_officers": ["dian_wei"] }) _check_contains(failures, "choice gold", choice_text, "+50G") - _check_contains(failures, "choice item", choice_text, "War Axe") - _check_contains(failures, "choice join", choice_text, "합류 Dian Wei") + _check_contains(failures, "choice item", choice_text, "전부") + _check_contains(failures, "choice join", choice_text, "합류 전위") if failures.is_empty(): scene.free() diff --git a/tools/smoke_status_effect_summary.gd b/tools/smoke_status_effect_summary.gd index 413859b..ec797e4 100644 --- a/tools/smoke_status_effect_summary.gd +++ b/tools/smoke_status_effect_summary.gd @@ -66,8 +66,8 @@ func _check_hud_reuses_status_summary(failures: Array[String]) -> void: scene.state.selected_unit_id = "cao_cao" scene.hover_cell = Vector2i(1, 3) scene._update_hud() - _check_contains(failures, "selected HUD status", scene.selected_label.text, "Conditions: DEF -2 (2 phases)") - _check_contains(failures, "hover tile status", scene.cell_info_label.text, "Conditions: DEF -2 (2 phases)") + _check_contains(failures, "selected HUD status", scene.selected_label.text, "상태: DEF -2 (2 phases)") + _check_contains(failures, "hover tile status", scene.cell_info_label.text, "상태: DEF -2 (2 phases)") scene.free() diff --git a/tools/smoke_visual_assets.gd b/tools/smoke_visual_assets.gd index ab721d7..47dcf03 100644 --- a/tools/smoke_visual_assets.gd +++ b/tools/smoke_visual_assets.gd @@ -1,4 +1,4 @@ -extends SceneTree +extends SceneTree const BattleStateScript := preload("res://scripts/core/battle_state.gd") const BattleSceneScript := preload("res://scripts/scenes/battle_scene.gd") @@ -2518,50 +2518,50 @@ func _check_scene_texture_loading(failures: Array[String]) -> void: var strategy := scene._camp_conversation_by_id("cao_cao_strategy") if strategy.is_empty(): failures.append("battle scene should find Cao Cao camp conversation by id") - elif not scene._format_camp_conversation_button_text(strategy).contains("Cao Cao"): + elif not scene._format_camp_conversation_button_text(strategy).contains("조조"): failures.append("camp conversation button text should include label/speaker") elif scene._camp_conversation_preview_portrait_path(strategy).is_empty(): failures.append("camp conversation preview should resolve Cao Cao portrait") elif scene._load_art_texture(scene._camp_conversation_preview_portrait_path(strategy)) == null: failures.append("camp conversation preview portrait should load") - elif not scene._format_camp_conversation_row_title(strategy).contains("Officer"): + elif not scene._format_camp_conversation_row_title(strategy).contains("장수"): failures.append("camp conversation row title should include group") - elif not scene._format_camp_conversation_preview_text(strategy).contains("Yingchuan"): + elif not scene._format_camp_conversation_preview_text(strategy).contains("영천"): failures.append("camp conversation preview should include first dialogue text") var cache := scene._camp_conversation_by_id("northern_woods_cache") if cache.is_empty(): failures.append("battle scene should find cache camp conversation by id") - elif not scene._format_camp_conversation_button_text(cache).contains("보급 Bean"): + elif not scene._format_camp_conversation_button_text(cache).contains("보급 콩"): failures.append("camp conversation button text should preview supply effect") var merchant_notice := scene._format_shop_merchant_notice_text(scene.state.get_shop_merchant()) - if not merchant_notice.contains("Camp Merchant") or not merchant_notice.contains("Roadside stores"): + 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 ["Yingchuan, 184 CE", "군자금 0G", "군막 회의 3", "보급 1", "군상 물품 2", "출진 명부 2/2", "진형 배치 4칸", "병장고 비축"]: + for expected in ["영천, 중평 원년", "군자금 0G", "군막 회의 · 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") var bean_buy_detail := scene._format_shop_buy_item_detail_text("bean", bean, int(bean.get("price", 0)), 0) - if not bean_buy_detail.contains("Heal 20") or not bean_buy_detail.contains("Owned x0"): + if not bean_buy_detail.contains("병력 +20") or not bean_buy_detail.contains("보유 x0"): failures.append("shop buy detail should summarize item effect and owned count") scene.campaign_state.gold = 10 var need_gold_detail := scene._format_shop_buy_item_detail_text("bean", bean, int(bean.get("price", 0)), 0) - if not need_gold_detail.contains("Need 40G"): + if not need_gold_detail.contains("부족 40G"): failures.append("shop buy detail should explain missing gold") var sold_out_detail := scene._format_shop_buy_item_detail_text("bean", bean, int(bean.get("price", 0)), 2, 3, 0) - if not sold_out_detail.contains("Stock 0/3") or not sold_out_detail.contains("Sold out"): + if not sold_out_detail.contains("재고 0/3") or not sold_out_detail.contains("품절"): failures.append("shop buy detail should explain exhausted finite stock") var sell_detail := scene._format_shop_sell_item_detail_text("bean", bean, 25, 2) - if not sell_detail.contains("Half-price sale") or not sell_detail.contains("Owned x2"): + if not sell_detail.contains("반값 매각") or not sell_detail.contains("보유 x2"): failures.append("shop sell detail should summarize sale rule and owned count") var bean_action := scene._format_shop_buy_action_text("bean", bean, int(bean.get("price", 0))) - if not bean_action.contains("Acquire Bean") or not bean_action.contains("50G"): + if not bean_action.contains("매입 콩") or not bean_action.contains("50G"): failures.append("shop buy action should be concise and priced") var bean_tooltip := scene._format_shop_item_tooltip_text( scene._format_shop_item_button_text("bean", bean, int(bean.get("price", 0)), 0), bean_buy_detail ) - if not bean_tooltip.contains("\n") or not bean_tooltip.contains("Owned x0"): + if not bean_tooltip.contains("\n") or not bean_tooltip.contains("보유 x0"): failures.append("shop item tooltip should preserve full item detail") scene.free() @@ -2598,32 +2598,32 @@ func _check_hud_focus_text(failures: Array[String]) -> void: return var cao_cao: Dictionary = scene.state.get_unit("cao_cao") var cao_text := scene._format_unit_focus_text(cao_cao, "Selected") - if not cao_text.contains("Command authority"): + if not cao_text.contains("군령 지휘"): failures.append("Cao Cao HUD focus should describe command role: %s" % cao_text) - if not cao_text.contains("March 4 (Foot)") or not cao_text.contains("Strike reach 1-1"): + if not cao_text.contains("행군 4 (보병)") or not cao_text.contains("타격 1-1"): failures.append("Cao Cao HUD focus should clarify move/attack affordance: %s" % cao_text) - if not cao_text.contains("군령:") or not cao_text.contains("March") or not cao_text.contains("Strike") or not cao_text.contains("책략") or not cao_text.contains("병장") or not cao_text.contains("대기"): + if not cao_text.contains("군령:") or not cao_text.contains("행군") or not cao_text.contains("타격") or not cao_text.contains("책략") or not cao_text.contains("병장") or not cao_text.contains("대기"): failures.append("Cao Cao HUD focus should summarize available actions: %s" % cao_text) - if not cao_text.contains("Ground 2,4"): + if not cao_text.contains("지형 2,4"): failures.append("Cao Cao HUD focus should include current tile: %s" % cao_text) - if not cao_text.contains("March 1"): + if not cao_text.contains("행군 1"): failures.append("Cao Cao HUD focus should include terrain move cost: %s" % cao_text) - if not cao_text.contains("Guard +0"): + if not cao_text.contains("방비 +0"): failures.append("Cao Cao HUD focus should include terrain defense: %s" % cao_text) var xiahou_dun: Dictionary = scene.state.get_unit("xiahou_dun") xiahou_dun["pos"] = Vector2i(3, 1) var forest_text := scene._unit_current_terrain_text(xiahou_dun) - if not forest_text.contains("Forest") or not forest_text.contains("March 3"): + if not forest_text.contains("수풀") or not forest_text.contains("행군 3"): failures.append("Cavalry movement should use mounted move_type cost on forest: %s" % forest_text) var archer: Dictionary = scene.state.get_unit("yellow_turban_3") var archer_text := scene._format_unit_focus_text(archer, "Hover") - if not archer_text.contains("Bow pressure"): + if not archer_text.contains("원거리 견제"): failures.append("Archer HUD focus should describe ranged role: %s" % archer_text) - if not archer_text.contains("March 4 (Archer)") or not archer_text.contains("Strike reach 2-2"): + if not archer_text.contains("행군 4 (궁병)") or not archer_text.contains("타격 2-2"): failures.append("Archer HUD focus should clarify ranged attack affordance: %s" % archer_text) if not archer_text.contains("군령: 적군 군기"): failures.append("Enemy archer HUD focus should describe enemy control: %s" % archer_text) - if not scene._unit_current_terrain_text(archer).contains("Plain"): + if not scene._unit_current_terrain_text(archer).contains("평지"): failures.append("Archer terrain text should reflect its current plain tile") scene.free() @@ -2894,17 +2894,17 @@ func _check_hover_intent_badges(failures: Array[String]) -> void: scene.hover_cell = Vector2i(2, 3) var move_badge := scene._target_preview_badge() - if str(move_badge.get("text", "")) != "MOVE" or str(move_badge.get("kind", "")) != "move": + if str(move_badge.get("text", "")) != "행군" or str(move_badge.get("kind", "")) != "move": failures.append("reachable empty tile should show MOVE badge: %s" % str(move_badge)) scene.hover_cell = Vector2i(1, 4) var select_badge := scene._target_preview_badge() - if str(select_badge.get("text", "")) != "SELECT" or str(select_badge.get("kind", "")) != "select": + 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) 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", "")) == "MOVE": + 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)) var cao_cao: Dictionary = scene.state.get_unit("cao_cao") @@ -2912,7 +2912,7 @@ func _check_hover_intent_badges(failures: Array[String]) -> void: scene._refresh_ranges() scene.hover_cell = Vector2i(2, 3) var moved_badge := scene._target_preview_badge() - if str(moved_badge.get("kind", "")) == "move" or str(moved_badge.get("text", "")) == "MOVE": + if str(moved_badge.get("kind", "")) == "move" or str(moved_badge.get("text", "")) == "행군": failures.append("moved unit should not show MOVE badge: %s" % str(moved_badge)) var default_color := scene._target_preview_badge_color("") diff --git a/tools/validate_data.ps1 b/tools/validate_data.ps1 index 72b8c16..1a0b147 100644 --- a/tools/validate_data.ps1 +++ b/tools/validate_data.ps1 @@ -7,7 +7,7 @@ function Read-Json($RelativePath) { if (-not (Test-Path $path)) { throw "Missing file: $RelativePath" } - return Get-Content $path -Raw | ConvertFrom-Json + return Get-Content $path -Raw -Encoding UTF8 | ConvertFrom-Json } function Has-Prop($Object, [string]$Name) {