diff --git a/art/backgrounds/luoyang_escort_road.png b/art/backgrounds/luoyang_escort_road.png new file mode 100644 index 0000000..61409a4 Binary files /dev/null and b/art/backgrounds/luoyang_escort_road.png differ diff --git a/data/campaign/campaign.json b/data/campaign/campaign.json index a2678ac..a90bf93 100644 --- a/data/campaign/campaign.json +++ b/data/campaign/campaign.json @@ -86,7 +86,7 @@ }, { "id": "007_xian_emperor_escort", - "title": "Xian Emperor Escort", + "title": "헌제 호송전", "path": "res://data/scenarios/007_xian_emperor_escort.json" }, { diff --git a/data/scenarios/007_xian_emperor_escort.json b/data/scenarios/007_xian_emperor_escort.json index 3b1356f..dbaabec 100644 --- a/data/scenarios/007_xian_emperor_escort.json +++ b/data/scenarios/007_xian_emperor_escort.json @@ -1,9 +1,9 @@ { "id": "007_xian_emperor_escort", - "name": "Xian Emperor Escort", + "name": "헌제 호송전", "objectives": { - "victory": "Move Cao Cao to the eastern road marker.", - "defeat": "Cao Cao or the imperial envoy is defeated, or the battle reaches Turn 11." + "victory": "조조를 동쪽 행로 표식까지 이동시켜라.", + "defeat": "조조 또는 천자 사자가 퇴각하거나 제11군령에 이르면 패한다." }, "conditions": { "victory": { @@ -19,23 +19,23 @@ ] }, "briefing": { - "title": "Xian Emperor Escort", - "location": "Luoyang Road, 196 CE", + "title": "헌제 호송전", + "location": "낙양 동도, 건안 원년", "lines": [ - "The imperial carriage has slipped out of the ruined capital under pressure from rival warlords.", - "Cao Cao must reach the eastern road marker and secure the escort route before the remnants close in." + "폐허가 된 낙양에서 천자의 거가가 제후들의 압박을 피해 동쪽 길로 나섰다.", + "잔당이 길목을 죄기 전에 조조를 동도 표식까지 이끌어 호송로를 장악하라." ], "conditional_lines": [ { "campaign_flags": { "fortified_yan_province": true }, "lines": [ - "The fortified roads in Yan Province have kept supplies moving, giving the escort column a steadier pace." + "연주에서 굳힌 보급로 덕에 호송 행렬의 군량과 약상이 끊기지 않고 뒤따른다." ] }, { "campaign_flags": { "pressed_lu_bu": true }, "lines": [ - "The army arrives quickly after pressing Lu Bu, but the forced march leaves little time to rest." + "여포를 몰아붙인 뒤 곧장 달려온 군사는 빠르게 길을 잡았으나, 숨을 고를 틈이 적다." ] } ], @@ -44,52 +44,52 @@ "id": "xian_escort_council", "group": "officer", "officer_id": "cao_cao", - "label": "Cao Cao - Imperial Escort", + "label": "조조 - 천자 호송", "speaker": "Cao Cao", - "summary": "Set the escort route before rival remnants close in.", + "summary": "제후 잔당이 좁혀 오기 전 천자의 행로를 정한다.", "lines": [ - { "speaker": "Cao Cao", "side": "left", "text": "The Son of Heaven travels with us now. Every cart wheel on this road will sound louder than a battle drum." }, - { "speaker": "Xiahou Dun", "side": "right", "text": "Then we keep the column moving and let the remnants waste their blades on empty dust." } + { "speaker": "Cao Cao", "side": "left", "text": "이제 천자가 우리와 같은 길 위에 있다. 수레바퀴 하나 구르는 소리도 전고보다 크게 울릴 것이다." }, + { "speaker": "Xiahou Dun", "side": "right", "text": "그렇다면 행렬을 멈추지 않겠습니다. 잔당의 칼은 빈 먼지만 베게 만들겠습니다." } ] }, { "id": "xian_dian_wei_envoy_screen", "group": "officer", "officer_id": "dian_wei", - "label": "Dian Wei - Envoy Screen", + "label": "전위 - 사자 엄호", "speaker": "Dian Wei", - "summary": "Assign Dian Wei to shield the imperial envoy.", + "summary": "전위가 천자 사자의 곁을 지키겠다고 나선다.", "lines": [ - { "speaker": "Dian Wei", "side": "right", "text": "The envoy is not a soldier, but every spear will look for him once the road narrows." }, - { "speaker": "Cao Cao", "side": "left", "text": "Then stand where the road narrows first. If the carriage halts, the realm itself hesitates." } + { "speaker": "Dian Wei", "side": "right", "text": "사자는 병사가 아니나 길이 좁아지면 창끝은 가장 부드러운 곳부터 찾을 것입니다." }, + { "speaker": "Cao Cao", "side": "left", "text": "그렇다면 길목이 먼저 좁아지는 곳에 서라. 거가가 멈추면 천하도 머뭇거린다." } ] }, { "id": "xian_fortified_road_supplies", "campaign_flags": { "fortified_yan_province": true }, "group": "topic", - "label": "Fortified Road Supplies", - "summary": "Open the food stores kept moving by the fortified Yan Province roads.", + "label": "연주 보급 수레", + "summary": "연주 보급로가 지켜 낸 군량 수레를 연다.", "lines": [ - { "speaker": "Escort Road Sutler", "side": "right", "text": "The fortified roads did their work. I brought beans forward without losing a cart to the dust." }, - { "speaker": "Cao Ren", "side": "left", "text": "Good. Feed the men guarding the carriage before the remnants test the road." } + { "speaker": "Escort Road Sutler", "side": "right", "text": "굳힌 길이 제 몫을 했습니다. 먼지 속에서도 수레 하나 잃지 않고 콩을 앞으로 옮겼습니다." }, + { "speaker": "Cao Ren", "side": "left", "text": "좋다. 잔당이 길을 시험하기 전에 거가를 지키는 병사부터 먹여라." } ], "effects": [ - { "type": "grant_item", "item_id": "bean", "count": 1, "text": "The fortified road supplies add a Bean to the field supplies." } + { "type": "grant_item", "item_id": "bean", "count": 1, "text": "연주 보급 수레에서 콩 한 꾸러미를 군수에 보탰다." } ] }, { "id": "xian_forced_march_canteens", "campaign_flags": { "pressed_lu_bu": true }, "group": "topic", - "label": "Forced March Canteens", - "summary": "Issue wine to soldiers exhausted by the rapid march from Lu Bu's front.", + "label": "강행군 술병", + "summary": "여포 전선에서 급히 달려온 병사에게 술을 나눈다.", "lines": [ - { "speaker": "Xiahou Yuan", "side": "right", "text": "We reached the emperor's road quickly, but the men are counting rest by mouthfuls now." }, - { "speaker": "Cao Cao", "side": "left", "text": "Give the vanguard wine before the column moves. Speed bought us this chance; discipline must keep it." } + { "speaker": "Xiahou Yuan", "side": "right", "text": "천자의 길에는 빨리 닿았으나, 병사들은 이제 한 모금으로 휴식을 세고 있습니다." }, + { "speaker": "Cao Cao", "side": "left", "text": "행렬이 움직이기 전 선봉에게 술을 주어라. 속도가 기회를 샀으니, 군기가 그것을 지켜야 한다." } ], "effects": [ - { "type": "grant_item", "item_id": "wine", "count": 1, "text": "The forced march canteens add Wine to the field supplies." } + { "type": "grant_item", "item_id": "wine", "count": 1, "text": "강행군 술병에서 술 한 병을 군수에 보탰다." } ] } ] @@ -117,10 +117,10 @@ } ], "merchant": { - "name": "Escort Road Sutler", + "name": "호송 야상", "lines": [ - "No shouting near the carriage. Point at what you need and count the coin quietly.", - "A court escort spends more medicine than arrows. Warlord remnants prefer soft targets." + "거가 가까이서는 소리를 낮추십시오. 필요한 물건은 손으로 짚고, 동전은 조용히 세면 됩니다.", + "조정 호송에는 화살보다 약이 더 빨리 닳습니다. 잔당은 언제나 약한 곳을 먼저 봅니다." ] } }, @@ -135,6 +135,7 @@ "map": { "width": 15, "height": 10, + "background": "res://art/backgrounds/luoyang_escort_road.png", "terrain": [ "GGGGGGGGGGGGGGG", "GGGFFGGGHHGGGGG", @@ -157,7 +158,7 @@ }, { "unit_id": "imperial_envoy_ch7", - "name": "Imperial Envoy", + "name": "천자 사자", "class_id": "infantry", "team": "player", "level": 1, @@ -196,7 +197,7 @@ }, { "unit_id": "li_jue_vanguard", - "name": "Li Jue Vanguard", + "name": "이각 선봉기", "class_id": "cavalry", "team": "enemy", "level": 7, @@ -205,7 +206,7 @@ }, { "unit_id": "guo_si_guard", - "name": "Guo Si Guard", + "name": "곽사 호위병", "class_id": "infantry", "team": "enemy", "level": 7, @@ -214,7 +215,7 @@ }, { "unit_id": "escort_road_archer", - "name": "Road Archer", + "name": "동도 궁병", "class_id": "archer", "team": "enemy", "level": 7, @@ -223,7 +224,7 @@ }, { "unit_id": "escort_hill_bandit", - "name": "Hill Bandit", + "name": "언덕 도적", "class_id": "bandit", "team": "enemy", "level": 7, @@ -232,7 +233,7 @@ }, { "unit_id": "escort_strategist", - "name": "Court Remnant", + "name": "조정 잔당", "class_id": "strategist", "team": "enemy", "level": 7, @@ -246,7 +247,7 @@ "once": true, "when": { "type": "battle_start" }, "actions": [ - { "type": "log", "text": "The imperial escort road lies beyond the enemy vanguard." } + { "type": "log", "text": "천자 호송로는 적 선봉 너머 동쪽 길에 놓여 있다." } ] }, { @@ -257,9 +258,9 @@ { "type": "dialogue", "lines": [ - { "speaker": "Cao Cao", "text": "Do not chase every remnant. Our task is the road ahead." }, - { "speaker": "Xiahou Dun", "text": "Then we punch through the center and keep you moving." }, - { "speaker": "Dian Wei", "text": "I will keep their blades away from the envoy." } + { "speaker": "Cao Cao", "text": "잔당 하나하나를 쫓지 마라. 오늘의 군령은 앞길을 여는 데 있다." }, + { "speaker": "Xiahou Dun", "text": "그렇다면 중앙을 뚫고, 주공의 행렬을 계속 움직이게 하겠습니다." }, + { "speaker": "Dian Wei", "text": "사자에게 칼끝이 닿지 못하게 하겠습니다." } ] } ] @@ -272,8 +273,8 @@ { "type": "dialogue", "lines": [ - { "speaker": "Scout", "text": "Enemy riders are circling behind us!" }, - { "speaker": "Cao Cao", "text": "Then the envoy cannot linger. Forward." } + { "speaker": "Scout", "text": "적 기병이 뒤쪽으로 돌아듭니다!" }, + { "speaker": "Cao Cao", "text": "그렇다면 사자를 지체시킬 수 없다. 앞으로 나아가라." } ] }, { @@ -281,7 +282,7 @@ "deployments": [ { "unit_id": "rear_pressure_rider", - "name": "Rear Rider", + "name": "후미 기병", "class_id": "cavalry", "team": "enemy", "level": 7, @@ -290,7 +291,7 @@ }, { "unit_id": "rear_pressure_bandit", - "name": "Rear Bandit", + "name": "후미 도적", "class_id": "bandit", "team": "enemy", "level": 7, @@ -309,8 +310,8 @@ { "type": "dialogue", "lines": [ - { "speaker": "Imperial Envoy", "text": "There are banners moving in the northern trees!" }, - { "speaker": "Cao Cao", "text": "So the road was bait. Keep the envoy covered and break through." } + { "speaker": "Imperial Envoy", "text": "북쪽 숲에서 깃발이 움직입니다!" }, + { "speaker": "Cao Cao", "text": "길 자체가 미끼였군. 사자를 감싸고 그대로 돌파하라." } ] }, { @@ -318,7 +319,7 @@ "deployments": [ { "unit_id": "midroad_ambush_guard", - "name": "Ambush Guard", + "name": "매복 방패병", "class_id": "infantry", "team": "enemy", "level": 7, @@ -327,7 +328,7 @@ }, { "unit_id": "midroad_ambush_archer", - "name": "Ambush Archer", + "name": "매복 궁병", "class_id": "archer", "team": "enemy", "level": 7, @@ -346,8 +347,8 @@ { "type": "dialogue", "lines": [ - { "speaker": "Xiahou Yuan", "text": "The eastern road marker is in sight. Cao Cao only needs a clear lane." }, - { "speaker": "Cao Cao", "text": "Good. Hold the flanks and do not let the rear pressure break our pace." } + { "speaker": "Xiahou Yuan", "text": "동쪽 행로 표식이 보입니다. 주공께는 열린 길 하나면 충분합니다." }, + { "speaker": "Cao Cao", "text": "좋다. 양익을 붙들고 후미의 압박이 행렬의 속도를 꺾지 못하게 하라." } ] } ] @@ -358,23 +359,23 @@ "items": ["bean", "iron_armor"] }, "post_battle_dialogue": [ - { "speaker": "Cao Cao", "text": "The Son of Heaven is safe on the road. That changes every banner in the realm." }, - { "speaker": "Xiahou Dun", "text": "Then every rival will look at us differently after today." }, - { "speaker": "Cao Cao", "text": "Let them. Authority is also a battlefield." } + { "speaker": "Cao Cao", "text": "천자가 길 위에서 무사하다. 이제 천하의 깃발은 모두 다른 뜻으로 흔들릴 것이다." }, + { "speaker": "Xiahou Dun", "text": "그렇다면 오늘 뒤로 모든 적이 우리를 다르게 보겠습니다." }, + { "speaker": "Cao Cao", "text": "보게 두어라. 권위 또한 하나의 전장이다." } ], "post_battle_choices": [ { "id": "secure_imperial_court", - "label": "Secure the Court", - "description": "Cao Cao focuses on stabilizing the imperial court.", + "label": "조정 안정", + "description": "조조가 천자의 조정을 안정시키는 일에 힘을 둔다.", "set_flags": { "secured_imperial_court": true }, "gold": 200, "items": ["imperial_seal"] }, { "id": "pursue_li_jue_remnants", - "label": "Pursue Remnants", - "description": "The army presses the scattered warlord remnants.", + "label": "잔당 추격", + "description": "흩어진 이각과 곽사의 잔당을 계속 압박한다.", "set_flags": { "pursued_li_jue_remnants": true }, "items": ["war_drum", "training_spear", "bean", "wine"] } diff --git a/scripts/scenes/battle_scene.gd b/scripts/scenes/battle_scene.gd index 4f0b1eb..2a5dd4a 100644 --- a/scripts/scenes/battle_scene.gd +++ b/scripts/scenes/battle_scene.gd @@ -117,6 +117,8 @@ const SPEAKER_DISPLAY_NAMES := { "Lu Bu": "여포", "Puyang Night Trader": "복양 야상", "Dingtao Field Sutler": "정도 야상", + "Escort Road Sutler": "호송 야상", + "Imperial Envoy": "천자 사자", "Coalition Merchant": "군막 상인", "Coalition Quartermaster": "연합 군수관", "Camp Merchant": "군막 상인", diff --git a/tools/smoke_camp_conversation_rewards.gd b/tools/smoke_camp_conversation_rewards.gd index d7e6308..4ba7aea 100644 --- a/tools/smoke_camp_conversation_rewards.gd +++ b/tools/smoke_camp_conversation_rewards.gd @@ -500,7 +500,7 @@ func _check_xian_branch_camp_conversations(failures: Array[String]) -> void: if not base_scene._camp_conversation_by_id(XIAN_PRESSED_CONVERSATION_ID).is_empty(): failures.append("Xian pressed supplies should be hidden without pressed flag") var merchant: Dictionary = base_scene.state.get_shop_merchant() - if str(merchant.get("name", "")) != "Escort Road Sutler": + if str(merchant.get("name", "")) != "호송 야상": failures.append("Xian escort shop merchant name should be present") var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: diff --git a/tools/smoke_objective_progress.gd b/tools/smoke_objective_progress.gd index fa909d2..baa576e 100644 --- a/tools/smoke_objective_progress.gd +++ b/tools/smoke_objective_progress.gd @@ -47,7 +47,7 @@ func _init() -> void: failures, "007 protected-unit risk progress", _defeat_text("res://data/scenarios/007_xian_emperor_escort.json"), - "Imperial Envoy 건재" + "천자 사자 건재" ) _check_contains( failures, diff --git a/tools/smoke_visual_assets.gd b/tools/smoke_visual_assets.gd index 0f05989..fb391e0 100644 --- a/tools/smoke_visual_assets.gd +++ b/tools/smoke_visual_assets.gd @@ -35,6 +35,11 @@ const SCENARIO_BACKGROUNDS := [ "background_path": "res://art/backgrounds/qingzhou_village_road.png", "label": "006 Dingtao field background" }, + { + "scenario_path": "res://data/scenarios/007_xian_emperor_escort.json", + "background_path": "res://art/backgrounds/luoyang_escort_road.png", + "label": "007 Luoyang escort road background" + }, { "scenario_path": "res://data/scenarios/008_wan_castle_escape.json", "background_path": "res://art/backgrounds/wan_castle_escape.png", @@ -333,7 +338,7 @@ func _check_battle_visual_data(failures: Array[String]) -> void: _check_camp_conversation(failures, xian_conversations[0], "xian_escort_council", "officer", "cao_cao") _check_camp_conversation(failures, xian_conversations[1], "xian_dian_wei_envoy_screen", "officer", "dian_wei") var xian_merchant := xian_state.get_shop_merchant() - if str(xian_merchant.get("name", "")) != "Escort Road Sutler": + if str(xian_merchant.get("name", "")) != "호송 야상": failures.append("007 shop should expose escort merchant name") if (xian_merchant.get("lines", []) as Array).size() < 2: failures.append("007 shop should expose merchant flavor lines")