From e4c87bf86fee923b20329fcfc3f203f486ee16fc Mon Sep 17 00:00:00 2001 From: Wickedness Date: Fri, 19 Jun 2026 10:04:40 +0900 Subject: [PATCH] Localize western Hanzhong arc --- data/scenarios/036_weishui_crossing.json | 116 +++++++++++------- data/scenarios/037_guanzhong_foothold.json | 118 +++++++++++------- data/scenarios/038_ma_chao_retreat.json | 118 +++++++++++------- data/scenarios/039_hanzhong_approach.json | 118 +++++++++++------- data/scenarios/040_hanzhong_gate.json | 118 +++++++++++------- data/scenarios/041_hanzhong_settlement.json | 118 +++++++++++------- tools/smoke_visual_assets.gd | 129 ++++++++++++++++++++ 7 files changed, 578 insertions(+), 257 deletions(-) diff --git a/data/scenarios/036_weishui_crossing.json b/data/scenarios/036_weishui_crossing.json index 1fea039..3723a0f 100644 --- a/data/scenarios/036_weishui_crossing.json +++ b/data/scenarios/036_weishui_crossing.json @@ -1,9 +1,9 @@ { "id": "036_weishui_crossing", - "name": "Weishui Crossing", + "name": "위수 도하전", "objectives": { - "victory": "Reach the Wei River crossing with Cao Cao, then defeat the western alliance defenders.", - "defeat": "Cao Cao is defeated or the battle reaches Turn 18." + "victory": "조조가 위수 도하점에 닿은 뒤 서량 연합 수비대를 격파하라.", + "defeat": "조조가 퇴각하거나 18턴이 시작된다." }, "conditions": { "victory": { "type": "all_units_defeated", "team": "enemy", "after_event": "weishui_crossing_seized" }, @@ -13,23 +13,48 @@ ] }, "briefing": { - "title": "Weishui Crossing", - "location": "Wei River Crossing, Guanzhong, 211 CE", + "title": "위수 도하전", + "location": "관중 위수 도하점, 건안 16년", "lines": [ - "With the Wei River camps standing, Cao Cao pushes toward a crossing that can turn the western campaign from defense to advance.", - "Ma Chao's riders still guard the riverbank, while Han Sui's captains listen for signs that the alliance is beginning to split." + "위수의 진영이 자리를 잡자 조조는 수비의 형세를 공세로 바꿀 도하점을 향해 군령을 내린다.", + "마초의 기병은 아직 강둑을 지키고, 한수의 장수들은 연합이 갈라지는 소리를 서로의 명령 속에서 듣고 있다." ], "conditional_lines": [ { "campaign_flags": { "secured_weishui_crossing": true }, "lines": [ - "The earlier crossing work gives Cao Cao a prepared ford and a chance to seize the far bank before the riders recover." + "앞서 다져 둔 도하 준비 덕분에 조조군은 기병이 재정비되기 전에 맞은편 강둑을 붙잡을 기회를 얻었다." ] }, { "campaign_flags": { "deepened_han_sui_rift": true }, "lines": [ - "The rift between Han Sui and Ma Chao deepens; western messengers now carry orders and suspicion in equal measure." + "한수와 마초 사이의 균열이 깊어져, 서량의 전령은 명령과 의심을 같은 무게로 나른다." + ] + } + ], + "camp_conversations": [ + { + "id": "weishui_crossing_council", + "group": "topic", + "label": "도하 군의", + "speaker": "Xiahou Yuan", + "summary": "좁은 도하점에서 서량 기병의 첫 충돌을 견딜 방도를 정한다.", + "lines": [ + { "speaker": "Xiahou Yuan", "side": "left", "text": "강폭은 좁고 말발굽은 빠릅니다. 먼저 건너는 부대가 흔들리면 뒤의 군령도 물에 잠깁니다." }, + { "speaker": "Cao Cao", "side": "right", "text": "그러니 첫 줄을 방패처럼 세워라. 위수는 오늘 서량으로 들어가는 문이 된다." } + ] + }, + { + "id": "weishui_guo_jia_alliance_rift", + "group": "officer", + "officer_id": "guo_jia", + "label": "곽가 - 연합의 금", + "speaker": "Guo Jia", + "summary": "한수와 마초의 명령이 엇갈리는 틈을 읽는다.", + "lines": [ + { "speaker": "Guo Jia", "side": "left", "text": "한수의 깃발은 뒤를 보고, 마초의 창끝은 앞을 봅니다. 같은 강둑에 서 있어도 마음은 이미 갈라졌습니다." }, + { "speaker": "Cao Ren", "side": "right", "text": "그 틈을 강보다 넓게 만들면, 도하 뒤의 싸움도 쉬워지겠군." } ] } ] @@ -55,7 +80,14 @@ "campaign_flags": { "deepened_han_sui_rift": true }, "items": ["war_drum"] } - ] + ], + "merchant": { + "name": "위수 도하 야상", + "lines": [ + "강을 건너는 군대는 콩보다 밧줄을 먼저 찾지요. 그래도 굶주린 병사는 밧줄도 놓칩니다.", + "마초의 기병이 물가 먼지를 일으키기 전에 필요한 것을 챙기십시오." + ] + } }, "roster": { "max_units": 7, @@ -131,7 +163,7 @@ }, { "unit_id": "ma_chao_crossing_guard", - "name": "Ma Chao Crossing Guard", + "name": "마초 도하 수비장", "class_id": "elite_cavalry", "team": "enemy", "level": 34, @@ -140,7 +172,7 @@ }, { "unit_id": "han_sui_river_captain", - "name": "Han Sui River Captain", + "name": "한수 강안 대장", "class_id": "commander", "team": "enemy", "level": 33, @@ -149,7 +181,7 @@ }, { "unit_id": "crossing_gate_captain", - "name": "Crossing Gate Captain", + "name": "도하 관문장", "class_id": "guard_captain", "team": "enemy", "level": 33, @@ -158,7 +190,7 @@ }, { "unit_id": "river_crossing_advisor", - "name": "River Crossing Advisor", + "name": "도하 군사", "class_id": "military_advisor", "team": "enemy", "level": 33, @@ -168,7 +200,7 @@ }, { "unit_id": "crossing_spear_north", - "name": "Crossing Spear Guard", + "name": "도하 창병", "class_id": "infantry", "team": "enemy", "level": 33, @@ -177,7 +209,7 @@ }, { "unit_id": "crossing_spear_south", - "name": "Crossing Spear Guard", + "name": "도하 창병", "class_id": "infantry", "team": "enemy", "level": 33, @@ -200,7 +232,7 @@ "once": true, "when": { "type": "battle_start" }, "actions": [ - { "type": "log", "text": "Cao Cao advances on the Wei River crossing as the western alliance struggles to keep one voice." } + { "type": "log", "text": "조조군이 위수 도하점으로 전진하자, 서량 연합은 한 목소리를 지키려 흔들린다." } ] }, { @@ -211,9 +243,9 @@ { "type": "dialogue", "lines": [ - { "speaker": "Xiahou Yuan", "text": "The crossing is narrow. Their horsemen cannot all strike at once, but neither can we advance carelessly." }, - { "speaker": "Guo Jia", "text": "A crossing is a promise: either we keep it, or the river takes interest." }, - { "speaker": "Cao Cao", "text": "Then make the promise with steel." } + { "speaker": "Xiahou Yuan", "text": "도하점은 좁습니다. 적 기병이 한꺼번에 들이치지는 못하나, 우리도 함부로 나아갈 수 없습니다." }, + { "speaker": "Guo Jia", "text": "도하는 약속과 같습니다. 지키지 못하면 강물이 이자를 받아 가지요." }, + { "speaker": "Cao Cao", "text": "그럼 쇠붙이로 약속을 봉하라." } ] } ] @@ -226,8 +258,8 @@ { "type": "dialogue", "lines": [ - { "speaker": "Cao Ren", "text": "The prepared ford is marked. The front can cross before Ma Chao's riders fully close." }, - { "speaker": "Cao Cao", "text": "Then turn preparation into distance." } + { "speaker": "Cao Ren", "text": "준비해 둔 여울에 표식을 세웠습니다. 마초의 기병이 완전히 조이기 전에 선봉이 건널 수 있습니다." }, + { "speaker": "Cao Cao", "text": "그럼 준비를 거리로 바꾸어라." } ] } ] @@ -240,15 +272,15 @@ { "type": "dialogue", "lines": [ - { "speaker": "Han Sui River Captain", "text": "Ma Chao wants the crossing sealed. Han Sui wants the reserves held. Which order reaches the front first?" }, - { "speaker": "Guo Jia", "text": "There. Doubt has begun to command." } + { "speaker": "한수 강안 대장", "text": "마초는 도하점을 막으라 하고, 한수는 예비대를 아끼라 한다. 어느 명령이 먼저 전선에 닿는가?" }, + { "speaker": "Guo Jia", "text": "보십시오. 의심이 명령하기 시작했습니다." } ] }, { "type": "spawn_deployment", "deployment": { "unit_id": "delayed_alliance_riders", - "name": "Delayed Alliance Riders", + "name": "지연된 연합 기병", "class_id": "cavalry", "team": "enemy", "level": 33, @@ -266,8 +298,8 @@ { "type": "dialogue", "lines": [ - { "speaker": "Ma Chao Crossing Guard", "text": "If Cao Cao takes the crossing, Guanzhong opens behind us. Hold the riverbank!" }, - { "speaker": "Xiahou Yuan", "text": "He knows the crossing matters. That means we chose the right place." } + { "speaker": "마초 도하 수비장", "text": "조조가 도하점을 잡으면 우리 뒤의 관중이 열린다. 강둑을 사수하라!" }, + { "speaker": "Xiahou Yuan", "text": "저들도 이곳의 무게를 압니다. 우리가 맞는 자리를 골랐다는 뜻입니다." } ] } ] @@ -279,14 +311,14 @@ "actions": [ { "type": "set_objective", - "victory": "The Wei River crossing is seized. Defeat the western alliance defenders.", - "defeat": "Cao Cao is defeated or the battle reaches Turn 18." + "victory": "위수 도하점을 장악했다. 서량 연합 수비대를 격파하라.", + "defeat": "조조가 퇴각하거나 18턴이 시작된다." }, { "type": "dialogue", "lines": [ - { "speaker": "Cao Cao", "text": "The crossing is ours. Now break the defenders before they can bind the alliance back together." }, - { "speaker": "Ma Chao Crossing Guard", "text": "You have the bank, not the west. Come farther if you dare." } + { "speaker": "Cao Cao", "text": "도하점은 우리 것이다. 연합이 다시 묶이기 전에 수비대를 꺾어라." }, + { "speaker": "마초 도하 수비장", "text": "네가 얻은 것은 강둑이지 서량이 아니다. 더 들어와 보아라." } ] }, { @@ -294,7 +326,7 @@ "deployments": [ { "unit_id": "crossing_halberd_guard", - "name": "Crossing Halberd Guard", + "name": "도하 장극병", "class_id": "guard_captain", "team": "enemy", "level": 33, @@ -303,7 +335,7 @@ }, { "unit_id": "far_bank_arrow_screen", - "name": "Far Bank Arrow Screen", + "name": "맞은편 강둑 궁병", "class_id": "archer", "team": "enemy", "level": 33, @@ -322,8 +354,8 @@ { "type": "dialogue", "lines": [ - { "speaker": "Zhang He", "text": "The far bank is opening. Their line cannot decide whether to charge or withdraw." }, - { "speaker": "Cao Cao", "text": "An army that cannot decide has already given us a road." } + { "speaker": "Zhang He", "text": "맞은편 강둑이 열리고 있습니다. 적 전열은 돌격할지 물러설지 결정하지 못합니다." }, + { "speaker": "Cao Cao", "text": "결정하지 못하는 군대는 이미 우리에게 길을 내준 것이다." } ] } ] @@ -334,23 +366,23 @@ "items": ["bean", "wine", "imperial_seal"] }, "post_battle_dialogue": [ - { "speaker": "Guo Jia", "text": "The crossing is secure. Ma Chao still has courage, but the alliance no longer speaks cleanly." }, - { "speaker": "Cao Ren", "text": "We can build a Guanzhong foothold from this bank, or force the western captains to choose between Ma Chao and Han Sui." }, - { "speaker": "Cao Cao", "text": "A foothold conquers ground. A split conquers decisions. Choose." } + { "speaker": "Guo Jia", "text": "도하점은 굳었습니다. 마초의 용기는 남았지만, 서량 연합의 명령은 이제 한 목소리가 아닙니다." }, + { "speaker": "Cao Ren", "text": "이 강둑을 교두보로 삼을 수도 있고, 서량 장수들에게 마초와 한수 중 누구를 따를지 고르게 만들 수도 있습니다." }, + { "speaker": "Cao Cao", "text": "교두보는 땅을 얻고, 균열은 결정을 얻는다. 어느 쪽을 먼저 봉할지 정하라." } ], "post_battle_choices": [ { "id": "secure_guanzhong_foothold", - "label": "Secure Foothold", - "description": "Cao Cao builds a firm Guanzhong foothold from the seized Wei River crossing.", + "label": "교두보 굳히기", + "description": "조조가 위수 도하점에서 관중 교두보를 단단히 세운다.", "set_flags": { "secured_guanzhong_foothold": true, "split_western_alliance": false }, "gold": 1050, "items": ["imperial_seal"] }, { "id": "split_western_alliance", - "label": "Split Alliance", - "description": "Cao Cao exploits the crossing victory to split Han Sui's captains away from Ma Chao.", + "label": "연합 이간", + "description": "조조가 도하 승리를 이용해 한수의 장수들을 마초에게서 떼어 낸다.", "set_flags": { "secured_guanzhong_foothold": false, "split_western_alliance": true }, "gold": 850, "items": ["war_drum"] diff --git a/data/scenarios/037_guanzhong_foothold.json b/data/scenarios/037_guanzhong_foothold.json index fb0460d..7b34f32 100644 --- a/data/scenarios/037_guanzhong_foothold.json +++ b/data/scenarios/037_guanzhong_foothold.json @@ -1,9 +1,9 @@ { "id": "037_guanzhong_foothold", - "name": "Guanzhong Foothold", + "name": "관중 교두보전", "objectives": { - "victory": "Reach the Guanzhong foothold with Cao Cao, then defeat the western alliance rearguard.", - "defeat": "Cao Cao is defeated or the battle reaches Turn 18." + "victory": "조조가 관중 교두보에 닿은 뒤 서량 연합 후위를 격파하라.", + "defeat": "조조가 퇴각하거나 18턴이 시작된다." }, "conditions": { "victory": { "type": "all_units_defeated", "team": "enemy", "after_event": "guanzhong_foothold_reached" }, @@ -13,23 +13,48 @@ ] }, "briefing": { - "title": "Guanzhong Foothold", - "location": "Guanzhong Plain, 211 CE", + "title": "관중 교두보전", + "location": "관중 평야, 건안 16년", "lines": [ - "The Wei River crossing gives Cao Cao a road into Guanzhong, but a road is not yet a province.", - "Ma Chao's rearguard and Han Sui's uncertain captains gather near the first foothold, where the western campaign can either settle or scatter." + "위수 도하점은 관중으로 들어가는 길을 열었지만, 길 하나가 곧 주군의 땅이 되는 것은 아니다.", + "마초의 후위와 한수의 흔들리는 장수들이 첫 교두보 앞에 모이며, 서방 원정은 굳어지거나 흩어질 갈림길에 선다." ], "conditional_lines": [ { "campaign_flags": { "secured_guanzhong_foothold": true }, "lines": [ - "The secured crossing has become a real foothold, giving Cao Cao a firm base for the next push across Guanzhong." + "단단히 붙잡은 도하점은 진짜 교두보가 되어, 조조군이 관중을 가로지를 발판을 마련했다." ] }, { "campaign_flags": { "split_western_alliance": true }, "lines": [ - "The western alliance is split enough that every Ma clan order must first pass through suspicion." + "서량 연합은 갈라져 마씨의 명령마다 의심의 검문을 먼저 지나야 한다." + ] + } + ], + "camp_conversations": [ + { + "id": "guanzhong_foothold_council", + "group": "topic", + "label": "교두보 군의", + "speaker": "Cao Ren", + "summary": "새로 얻은 강둑을 관중 진입의 말뚝으로 삼는다.", + "lines": [ + { "speaker": "Cao Ren", "side": "left", "text": "도하점 뒤의 길은 아직 좁습니다. 교두보가 흔들리면 관중의 모든 흙길이 적의 길이 됩니다." }, + { "speaker": "Cao Cao", "side": "right", "text": "그러면 말뚝을 깊이 박아라. 오늘 세운 땅이 내일의 군량길이다." } + ] + }, + { + "id": "guanzhong_zhang_he_rearguard", + "group": "officer", + "officer_id": "zhang_he", + "label": "장합 - 후위의 결", + "speaker": "Zhang He", + "summary": "마초 후위가 어느 지점에서 반격할지 헤아린다.", + "lines": [ + { "speaker": "Zhang He", "side": "left", "text": "후위는 물러나는 척하다가 길목에서 등을 돌릴 것입니다. 그들이 멈추는 곳이 바로 우리가 찔러야 할 곳입니다." }, + { "speaker": "Xiahou Yuan", "side": "right", "text": "좋다. 물러나는 적이 멈추기 전에 우리가 먼저 멈추게 만들자." } ] } ] @@ -55,7 +80,14 @@ "campaign_flags": { "split_western_alliance": true }, "items": ["war_drum"] } - ] + ], + "merchant": { + "name": "관중 교두보 야상", + "lines": [ + "새로 박은 말뚝 곁에서는 물건값도 흔들립니다. 오늘 값은 내일보다 정직할 겁니다.", + "창고가 우리 편이 되기 전까지는 이 수레가 작은 창고 노릇을 하지요." + ] + } }, "roster": { "max_units": 7, @@ -131,7 +163,7 @@ }, { "unit_id": "ma_chao_rearguard", - "name": "Ma Chao Rearguard", + "name": "마초 후위장", "class_id": "elite_cavalry", "team": "enemy", "level": 35, @@ -140,7 +172,7 @@ }, { "unit_id": "han_sui_divided_captain", - "name": "Han Sui Divided Captain", + "name": "한수 분열 대장", "class_id": "commander", "team": "enemy", "level": 34, @@ -149,7 +181,7 @@ }, { "unit_id": "guanzhong_gate_captain", - "name": "Guanzhong Gate Captain", + "name": "관중 관문장", "class_id": "guard_captain", "team": "enemy", "level": 34, @@ -158,7 +190,7 @@ }, { "unit_id": "foothold_tactic_advisor", - "name": "Foothold Tactic Advisor", + "name": "교두보 군사", "class_id": "military_advisor", "team": "enemy", "level": 34, @@ -168,7 +200,7 @@ }, { "unit_id": "guanzhong_spear_north", - "name": "Guanzhong Spear Guard", + "name": "관중 창병", "class_id": "infantry", "team": "enemy", "level": 34, @@ -177,7 +209,7 @@ }, { "unit_id": "guanzhong_spear_south", - "name": "Guanzhong Spear Guard", + "name": "관중 창병", "class_id": "infantry", "team": "enemy", "level": 34, @@ -186,7 +218,7 @@ }, { "unit_id": "guanzhong_marksman", - "name": "Guanzhong Marksman", + "name": "관중 궁병", "class_id": "marksman", "team": "enemy", "level": 34, @@ -200,7 +232,7 @@ "once": true, "when": { "type": "battle_start" }, "actions": [ - { "type": "log", "text": "Cao Cao pushes from the Wei River crossing toward a Guanzhong foothold as the western alliance strains." } + { "type": "log", "text": "조조군이 위수 도하점에서 관중 교두보로 밀고 나아가자 서량 연합의 끈이 팽팽히 당겨진다." } ] }, { @@ -211,9 +243,9 @@ { "type": "dialogue", "lines": [ - { "speaker": "Cao Ren", "text": "The crossing behind us is firm. The foothold ahead is where the west begins to answer." }, - { "speaker": "Guo Jia", "text": "A foothold is not just earth. It is the moment the enemy starts measuring loss." }, - { "speaker": "Cao Cao", "text": "Then give them something worth measuring." } + { "speaker": "Cao Ren", "text": "뒤의 도하점은 굳었습니다. 앞의 교두보에서 서쪽이 처음으로 답하게 될 것입니다." }, + { "speaker": "Guo Jia", "text": "교두보는 단순한 흙이 아닙니다. 적이 손실을 재기 시작하는 순간이지요." }, + { "speaker": "Cao Cao", "text": "그렇다면 잴 만한 것을 내어 주어라." } ] } ] @@ -226,8 +258,8 @@ { "type": "dialogue", "lines": [ - { "speaker": "Cao Ren", "text": "Supply is moving from the crossing into the foothold. The line can hold if Ma Chao turns back." }, - { "speaker": "Cao Cao", "text": "A held line invites the next decision." } + { "speaker": "Cao Ren", "text": "도하점의 보급이 교두보로 들어오고 있습니다. 마초가 되돌아와도 전열은 버틸 수 있습니다." }, + { "speaker": "Cao Cao", "text": "버티는 전열은 다음 결정을 부른다." } ] } ] @@ -240,15 +272,15 @@ { "type": "dialogue", "lines": [ - { "speaker": "Han Sui Divided Captain", "text": "Ma Chao demands we cover his withdrawal, but Han Sui's seals say to preserve our own wing." }, - { "speaker": "Guo Jia", "text": "When two orders arrive together, neither arrives first." } + { "speaker": "한수 분열 대장", "text": "마초는 퇴각을 엄호하라 하고, 한수의 인장은 우리 날개를 보존하라 한다." }, + { "speaker": "Guo Jia", "text": "두 명령이 함께 오면 어느 것도 먼저 도착하지 못합니다." } ] }, { "type": "spawn_deployment", "deployment": { "unit_id": "fractured_alliance_riders", - "name": "Fractured Alliance Riders", + "name": "갈라진 연합 기병", "class_id": "cavalry", "team": "enemy", "level": 34, @@ -266,8 +298,8 @@ { "type": "dialogue", "lines": [ - { "speaker": "Ma Chao Rearguard", "text": "If Cao Cao plants himself in Guanzhong, the west will have to fight on his road. Cut the foothold now!" }, - { "speaker": "Xiahou Yuan", "text": "He sees the same ground we do. Good." } + { "speaker": "마초 후위장", "text": "조조가 관중에 뿌리내리면 서쪽은 그의 길 위에서 싸워야 한다. 지금 교두보를 끊어라!" }, + { "speaker": "Xiahou Yuan", "text": "저도 우리가 보는 땅을 보고 있습니다. 좋군요." } ] } ] @@ -279,14 +311,14 @@ "actions": [ { "type": "set_objective", - "victory": "The Guanzhong foothold is reached. Defeat the western alliance rearguard.", - "defeat": "Cao Cao is defeated or the battle reaches Turn 18." + "victory": "관중 교두보에 닿았다. 서량 연합 후위를 격파하라.", + "defeat": "조조가 퇴각하거나 18턴이 시작된다." }, { "type": "dialogue", "lines": [ - { "speaker": "Cao Cao", "text": "This foothold is where Guanzhong begins to change hands. Break the rearguard." }, - { "speaker": "Ma Chao Rearguard", "text": "You have crossed a river, not conquered a people." } + { "speaker": "Cao Cao", "text": "이 교두보에서 관중의 주인이 바뀌기 시작한다. 후위를 깨뜨려라." }, + { "speaker": "마초 후위장", "text": "강 하나를 건넜을 뿐, 사람의 마음까지 정복한 것은 아니다." } ] }, { @@ -294,7 +326,7 @@ "deployments": [ { "unit_id": "guanzhong_halberd_guard", - "name": "Guanzhong Halberd Guard", + "name": "관중 장극병", "class_id": "guard_captain", "team": "enemy", "level": 34, @@ -303,7 +335,7 @@ }, { "unit_id": "foothold_arrow_screen", - "name": "Foothold Arrow Screen", + "name": "교두보 궁병", "class_id": "archer", "team": "enemy", "level": 34, @@ -322,8 +354,8 @@ { "type": "dialogue", "lines": [ - { "speaker": "Zhang He", "text": "The foothold is taking shape. Their rearguard is fighting over yesterday's road." }, - { "speaker": "Cao Cao", "text": "Then make tomorrow's road ours." } + { "speaker": "Zhang He", "text": "교두보가 모양을 갖추고 있습니다. 적 후위는 어제의 길을 두고 싸우는 셈입니다." }, + { "speaker": "Cao Cao", "text": "그럼 내일의 길은 우리 것으로 만들어라." } ] } ] @@ -334,23 +366,23 @@ "items": ["bean", "wine", "war_drum"] }, "post_battle_dialogue": [ - { "speaker": "Guo Jia", "text": "The Guanzhong foothold stands. Ma Chao can still flee west, but the alliance now leaves tracks in different directions." }, - { "speaker": "Xiahou Yuan", "text": "We can secure the commandery and pull its stores into our line, or press Ma Chao before he rebuilds pride into another charge." }, - { "speaker": "Cao Cao", "text": "A province is held by grain or pursuit. Choose the first hand we close." } + { "speaker": "Guo Jia", "text": "관중 교두보가 섰습니다. 마초는 아직 서쪽으로 달릴 수 있으나, 연합의 발자국은 이미 서로 다른 방향을 향합니다." }, + { "speaker": "Xiahou Yuan", "text": "군현 창고를 장악해 군량선을 세울 수도 있고, 마초가 다시 자존심을 기병으로 묶기 전에 몰아칠 수도 있습니다." }, + { "speaker": "Cao Cao", "text": "주는 군량으로도 잡고 추격으로도 잡는다. 먼저 움켜쥘 손을 정하라." } ], "post_battle_choices": [ { "id": "secure_guanzhong_commandery", - "label": "Secure Commandery", - "description": "Cao Cao secures Guanzhong stores and commandery offices before the next advance.", + "label": "군현 장악", + "description": "조조가 다음 진격에 앞서 관중의 창고와 군현 관청을 확보한다.", "set_flags": { "secured_guanzhong_commandery": true, "pressed_ma_chao_retreat": false }, "gold": 1100, "items": ["imperial_seal"] }, { "id": "press_ma_chao_retreat", - "label": "Press Retreat", - "description": "Cao Cao presses Ma Chao's retreat before the western riders can rally.", + "label": "퇴각 압박", + "description": "조조가 서량 기병이 다시 모이기 전에 마초의 퇴로를 압박한다.", "set_flags": { "secured_guanzhong_commandery": false, "pressed_ma_chao_retreat": true }, "gold": 900, "items": ["war_drum"] diff --git a/data/scenarios/038_ma_chao_retreat.json b/data/scenarios/038_ma_chao_retreat.json index 71e8811..6d5fe3a 100644 --- a/data/scenarios/038_ma_chao_retreat.json +++ b/data/scenarios/038_ma_chao_retreat.json @@ -1,9 +1,9 @@ { "id": "038_ma_chao_retreat", - "name": "Ma Chao Retreat", + "name": "마초 퇴각전", "objectives": { - "victory": "Reach Ma Chao's retreat road with Cao Cao, then defeat the western rearguard.", - "defeat": "Cao Cao is defeated or the battle reaches Turn 18." + "victory": "조조가 마초의 퇴각로에 닿은 뒤 서량 후위를 격파하라.", + "defeat": "조조가 퇴각하거나 18턴이 시작된다." }, "conditions": { "victory": { "type": "all_units_defeated", "team": "enemy", "after_event": "retreat_road_reached" }, @@ -13,23 +13,48 @@ ] }, "briefing": { - "title": "Ma Chao Retreat", - "location": "Western Guanzhong, 211 CE", + "title": "마초 퇴각전", + "location": "관중 서부, 건안 16년", "lines": [ - "The Guanzhong foothold holds, and Ma Chao's riders begin to give ground toward the western roads.", - "Cao Cao must decide whether the retreat becomes a clean pursuit or a wider pacification before Hanzhong draws the next line." + "관중 교두보가 버티자 마초의 기병은 서쪽 길로 물러서기 시작한다.", + "한중이 다음 경계를 긋기 전에, 조조는 이 퇴각을 빠른 추격으로 끝낼지 넓은 평정으로 돌릴지 정해야 한다." ], "conditional_lines": [ { "campaign_flags": { "secured_guanzhong_commandery": true }, "lines": [ - "Secured commandery stores give Cao Cao a steadier pursuit column and enough grain to keep pressure on the retreat." + "장악한 군현 창고 덕분에 조조군의 추격 대열은 흐트러지지 않고, 퇴각로를 누를 군량도 충분하다." ] }, { "campaign_flags": { "pressed_ma_chao_retreat": true }, "lines": [ - "The hard pursuit keeps Ma Chao's riders from fully reforming, but it stretches Cao Cao's front toward rougher western roads." + "거센 추격은 마초의 기병이 다시 진형을 갖추지 못하게 하지만, 조조의 전선도 험한 서쪽 길로 길게 늘어난다." + ] + } + ], + "camp_conversations": [ + { + "id": "ma_chao_retreat_council", + "group": "topic", + "label": "추격 군의", + "speaker": "Xiahou Yuan", + "summary": "마초의 퇴각이 도주가 되기 전에 후위를 끊는다.", + "lines": [ + { "speaker": "Xiahou Yuan", "side": "left", "text": "마초는 물러서도 칼끝을 뒤로 돌립니다. 퇴각이라 하여 느슨히 쫓으면 오히려 우리가 물립니다." }, + { "speaker": "Cao Cao", "side": "right", "text": "그럼 물러서는 적에게 쉴 시간을 주지 마라. 말이 숨을 고르기 전에 길을 빼앗는다." } + ] + }, + { + "id": "ma_chao_guo_jia_hanzhong_shadow", + "group": "officer", + "officer_id": "guo_jia", + "label": "곽가 - 한중의 그림자", + "speaker": "Guo Jia", + "summary": "마초 추격 너머의 한중 전선을 헤아린다.", + "lines": [ + { "speaker": "Guo Jia", "side": "left", "text": "서쪽 길 끝에는 마초만 있는 것이 아닙니다. 한중의 관문은 우리가 지친 틈을 기다릴 것입니다." }, + { "speaker": "Cao Cao", "side": "right", "text": "그래서 이 추격은 끝이 아니라 다음 문을 여는 자물쇠다." } ] } ] @@ -55,7 +80,14 @@ "campaign_flags": { "pressed_ma_chao_retreat": true }, "items": ["war_drum"] } - ] + ], + "merchant": { + "name": "서량 퇴로 야상", + "lines": [ + "쫓는 군대는 언제나 급하고, 쫓기는 군대는 언제나 비쌉니다. 저는 급한 쪽에 팝니다.", + "서쪽 길은 먼지와 거짓말이 많으니, 술과 콩은 봉인을 보고 사십시오." + ] + } }, "roster": { "max_units": 7, @@ -131,7 +163,7 @@ }, { "unit_id": "ma_chao_retreat_guard", - "name": "Ma Chao Retreat Guard", + "name": "마초 퇴각 수비장", "class_id": "elite_cavalry", "team": "enemy", "level": 36, @@ -140,7 +172,7 @@ }, { "unit_id": "pang_de_rear_column", - "name": "Pang De Rear Column", + "name": "방덕 후위대", "class_id": "champion", "team": "enemy", "level": 35, @@ -149,7 +181,7 @@ }, { "unit_id": "western_road_captain", - "name": "Western Road Captain", + "name": "서로 대장", "class_id": "guard_captain", "team": "enemy", "level": 35, @@ -158,7 +190,7 @@ }, { "unit_id": "retreat_tactic_advisor", - "name": "Retreat Tactic Advisor", + "name": "퇴각 군사", "class_id": "military_advisor", "team": "enemy", "level": 35, @@ -168,7 +200,7 @@ }, { "unit_id": "retreat_spear_north", - "name": "Retreat Spear Guard", + "name": "퇴각 창병", "class_id": "infantry", "team": "enemy", "level": 35, @@ -177,7 +209,7 @@ }, { "unit_id": "retreat_spear_south", - "name": "Retreat Spear Guard", + "name": "퇴각 창병", "class_id": "infantry", "team": "enemy", "level": 35, @@ -186,7 +218,7 @@ }, { "unit_id": "western_road_marksman", - "name": "Western Road Marksman", + "name": "서로 궁병", "class_id": "marksman", "team": "enemy", "level": 35, @@ -200,7 +232,7 @@ "once": true, "when": { "type": "battle_start" }, "actions": [ - { "type": "log", "text": "Cao Cao presses the western road as Ma Chao's retreat guard tries to keep Guanzhong from closing behind them." } + { "type": "log", "text": "조조군이 서쪽 길을 압박하자, 마초의 후위는 관중이 등 뒤에서 닫히지 않도록 버틴다." } ] }, { @@ -211,9 +243,9 @@ { "type": "dialogue", "lines": [ - { "speaker": "Xiahou Yuan", "text": "Ma Chao is falling back, but not broken. His rear guard still turns like a blade." }, - { "speaker": "Guo Jia", "text": "A retreat that chooses where to stop is still a plan." }, - { "speaker": "Cao Cao", "text": "Then take the choice away." } + { "speaker": "Xiahou Yuan", "text": "마초는 물러서지만 아직 꺾이지 않았습니다. 후위는 여전히 칼날처럼 돌아섭니다." }, + { "speaker": "Guo Jia", "text": "멈출 자리를 고르는 퇴각은 아직 계책입니다." }, + { "speaker": "Cao Cao", "text": "그렇다면 그 선택을 빼앗아라." } ] } ] @@ -226,8 +258,8 @@ { "type": "dialogue", "lines": [ - { "speaker": "Cao Ren", "text": "Guanzhong stores are feeding the column. The pursuit can stay ordered." }, - { "speaker": "Cao Cao", "text": "Order is how pursuit becomes conquest." } + { "speaker": "Cao Ren", "text": "관중 창고가 대열을 먹이고 있습니다. 추격은 흐트러지지 않을 수 있습니다." }, + { "speaker": "Cao Cao", "text": "질서가 있어야 추격이 정복이 된다." } ] } ] @@ -240,15 +272,15 @@ { "type": "dialogue", "lines": [ - { "speaker": "Ma Chao Retreat Guard", "text": "Cao Cao is too close. Turn the rear column and buy the west one more road." }, - { "speaker": "Zhang He", "text": "The pursuit has touched their spine. Expect the rearguard to snap back." } + { "speaker": "마초 퇴각 수비장", "text": "조조가 너무 가깝다. 후열을 돌려 서쪽에 길 하나를 더 벌어라." }, + { "speaker": "Zhang He", "text": "추격이 적의 등뼈에 닿았습니다. 후위가 되물어 올 것입니다." } ] }, { "type": "spawn_deployment", "deployment": { "unit_id": "ma_clan_rear_riders", - "name": "Ma Clan Rear Riders", + "name": "마씨 후위 기병", "class_id": "cavalry", "team": "enemy", "level": 35, @@ -266,8 +298,8 @@ { "type": "dialogue", "lines": [ - { "speaker": "Pang De Rear Column", "text": "The road narrows ahead. Hold them here or the retreat becomes a rout." }, - { "speaker": "Xiahou Yuan", "text": "He knows the road better than we do. That makes speed matter." } + { "speaker": "방덕 후위대", "text": "앞길이 좁아진다. 여기서 막지 못하면 퇴각은 패주가 된다." }, + { "speaker": "Xiahou Yuan", "text": "저들은 우리보다 길을 잘 압니다. 그래서 속도가 더 중요합니다." } ] } ] @@ -279,14 +311,14 @@ "actions": [ { "type": "set_objective", - "victory": "Ma Chao's retreat road is reached. Defeat the western rearguard.", - "defeat": "Cao Cao is defeated or the battle reaches Turn 18." + "victory": "마초의 퇴각로에 닿았다. 서량 후위를 격파하라.", + "defeat": "조조가 퇴각하거나 18턴이 시작된다." }, { "type": "dialogue", "lines": [ - { "speaker": "Cao Cao", "text": "This road decides whether Ma Chao retreats or escapes. Break the rearguard." }, - { "speaker": "Ma Chao Retreat Guard", "text": "The west is not yours while one horse still turns." } + { "speaker": "Cao Cao", "text": "이 길이 마초가 퇴각하는지 도망치는지 정한다. 후위를 무너뜨려라." }, + { "speaker": "마초 퇴각 수비장", "text": "말 한 필이라도 돌아서는 한 서쪽은 네 것이 아니다." } ] }, { @@ -294,7 +326,7 @@ "deployments": [ { "unit_id": "retreat_halberd_guard", - "name": "Retreat Halberd Guard", + "name": "퇴각 장극병", "class_id": "guard_captain", "team": "enemy", "level": 35, @@ -303,7 +335,7 @@ }, { "unit_id": "western_rear_arrow_screen", - "name": "Western Rear Arrow Screen", + "name": "서량 후위 궁병", "class_id": "archer", "team": "enemy", "level": 35, @@ -322,8 +354,8 @@ { "type": "dialogue", "lines": [ - { "speaker": "Zhang He", "text": "Their retreat is losing its rhythm." }, - { "speaker": "Cao Cao", "text": "Then strike before rhythm becomes distance." } + { "speaker": "Zhang He", "text": "적의 퇴각 박자가 무너지고 있습니다." }, + { "speaker": "Cao Cao", "text": "그럼 박자가 거리가 되기 전에 쳐라." } ] } ] @@ -334,23 +366,23 @@ "items": ["bean", "wine", "imperial_seal"] }, "post_battle_dialogue": [ - { "speaker": "Guo Jia", "text": "Ma Chao's retreat guard is broken. Guanzhong can be settled, or Hanzhong can be watched before Zhang Lu makes his own terms." }, - { "speaker": "Xiahou Yuan", "text": "Pacifying the west will quiet the roads. Preparing Hanzhong will keep the next gate from closing." }, - { "speaker": "Cao Cao", "text": "The west is never silent for long. Choose where our next silence is made." } + { "speaker": "Guo Jia", "text": "마초의 후위는 꺾였습니다. 관중을 평정할 수도 있고, 장로가 제 조건을 세우기 전에 한중을 살필 수도 있습니다." }, + { "speaker": "Xiahou Yuan", "text": "서쪽을 평정하면 길이 조용해지고, 한중을 준비하면 다음 관문이 닫히기 전에 닿을 수 있습니다." }, + { "speaker": "Cao Cao", "text": "서쪽은 오래 조용하지 않다. 다음 침묵을 어디에 만들지 정하라." } ], "post_battle_choices": [ { "id": "pacify_guanzhong", - "label": "Pacify Guanzhong", - "description": "Cao Cao pacifies Guanzhong's commanderies before looking toward Hanzhong.", + "label": "관중 평정", + "description": "조조가 한중을 바라보기 전에 관중 군현을 평정한다.", "set_flags": { "pacified_guanzhong": true, "prepared_hanzhong_front": false }, "gold": 1150, "items": ["imperial_seal"] }, { "id": "prepare_hanzhong_front", - "label": "Prepare Hanzhong", - "description": "Cao Cao prepares the Hanzhong front before Zhang Lu can harden the passes.", + "label": "한중 준비", + "description": "조조가 장로가 관문을 굳히기 전에 한중 전선을 준비한다.", "set_flags": { "pacified_guanzhong": false, "prepared_hanzhong_front": true }, "gold": 950, "items": ["war_drum"] diff --git a/data/scenarios/039_hanzhong_approach.json b/data/scenarios/039_hanzhong_approach.json index 90df50e..b101431 100644 --- a/data/scenarios/039_hanzhong_approach.json +++ b/data/scenarios/039_hanzhong_approach.json @@ -1,9 +1,9 @@ { "id": "039_hanzhong_approach", - "name": "Hanzhong Approach", + "name": "한중 접근전", "objectives": { - "victory": "Reach the Hanzhong approach with Cao Cao, then defeat Zhang Lu's border guard.", - "defeat": "Cao Cao is defeated or the battle reaches Turn 18." + "victory": "조조가 한중 입구에 닿은 뒤 장로의 국경 수비대를 격파하라.", + "defeat": "조조가 퇴각하거나 18턴이 시작된다." }, "conditions": { "victory": { "type": "all_units_defeated", "team": "enemy", "after_event": "hanzhong_approach_reached" }, @@ -13,23 +13,48 @@ ] }, "briefing": { - "title": "Hanzhong Approach", - "location": "Hanzhong Approach, Qinling Passes, 215 CE", + "title": "한중 접근전", + "location": "진령 한중 입구, 건안 20년", "lines": [ - "With Ma Chao's retreat broken, Cao Cao turns from Guanzhong's roads toward Hanzhong's mountain gates.", - "Zhang Lu's border guard watches the passes, where supply, faith, and narrow stone roads can slow even a victorious army." + "마초의 퇴로를 끊은 조조는 관중의 길을 접고 한중 산문을 향해 군을 돌린다.", + "장로의 국경 수비대는 보급과 신앙, 좁은 돌길이 승전군의 걸음도 늦출 수 있는 고개를 지키고 있다." ], "conditional_lines": [ { "campaign_flags": { "pacified_guanzhong": true }, "lines": [ - "Pacified Guanzhong gives Cao Cao a quiet rear and fuller supply trains before the mountain approach." + "평정된 관중은 조조에게 조용한 후방과 가득 찬 보급 수레를 내어 주었다." ] }, { "campaign_flags": { "prepared_hanzhong_front": true }, "lines": [ - "Preparations for Hanzhong put Cao Cao's vanguard in motion early, but Zhang Lu's border scouts have already lit the pass beacons." + "한중 준비 덕분에 선봉은 일찍 움직였지만, 장로의 척후도 이미 고개의 봉화를 올렸다." + ] + } + ], + "camp_conversations": [ + { + "id": "hanzhong_approach_council", + "group": "topic", + "label": "산문 군의", + "speaker": "Xiahou Yuan", + "summary": "한중 산길에서 느려지는 보급과 진군 속도를 맞춘다.", + "lines": [ + { "speaker": "Xiahou Yuan", "side": "left", "text": "관중의 평지는 끝났습니다. 여기서부터는 한 걸음마다 산이 군령을 시험합니다." }, + { "speaker": "Cao Cao", "side": "right", "text": "그렇다면 산보다 먼저 움직인다. 고개가 닫히기 전에 장로에게 우리가 왔음을 알리라." } + ] + }, + { + "id": "hanzhong_guo_jia_pass_faith", + "group": "officer", + "officer_id": "guo_jia", + "label": "곽가 - 고개의 신앙", + "speaker": "Guo Jia", + "summary": "장로군이 산과 신앙을 방패로 삼는 법을 읽는다.", + "lines": [ + { "speaker": "Guo Jia", "side": "left", "text": "장로의 병사는 성벽보다 믿음을 먼저 세웁니다. 믿음이 흔들리면 관문도 사람 손의 나무가 됩니다." }, + { "speaker": "Zhang He", "side": "right", "text": "그럼 깃발보다 전령을 먼저 끊겠습니다. 산길의 말은 느리니 소문도 느려질 겁니다." } ] } ] @@ -55,7 +80,14 @@ "campaign_flags": { "prepared_hanzhong_front": true }, "items": ["war_drum"] } - ] + ], + "merchant": { + "name": "한중 산문 야상", + "lines": [ + "산길에서는 금보다 마른 장작과 콩이 먼저 길을 엽니다. 저는 둘 다 조금씩 숨겨 두었습니다.", + "장로의 봉화가 더 오르기 전에 사십시오. 봉화가 많아지면 짐꾼의 다리값도 오릅니다." + ] + } }, "roster": { "max_units": 7, @@ -131,7 +163,7 @@ }, { "unit_id": "zhang_lu_border_guard", - "name": "Zhang Lu Border Guard", + "name": "장로 국경 수비장", "class_id": "commander", "team": "enemy", "level": 36, @@ -140,7 +172,7 @@ }, { "unit_id": "hanzhong_pass_champion", - "name": "Hanzhong Pass Champion", + "name": "한중 관문 용장", "class_id": "champion", "team": "enemy", "level": 36, @@ -149,7 +181,7 @@ }, { "unit_id": "mountain_gate_captain", - "name": "Mountain Gate Captain", + "name": "산문 대장", "class_id": "guard_captain", "team": "enemy", "level": 36, @@ -158,7 +190,7 @@ }, { "unit_id": "hanzhong_ritual_advisor", - "name": "Hanzhong Ritual Advisor", + "name": "한중 의례 군사", "class_id": "military_advisor", "team": "enemy", "level": 36, @@ -168,7 +200,7 @@ }, { "unit_id": "hanzhong_spear_north", - "name": "Hanzhong Spear Guard", + "name": "한중 창병", "class_id": "infantry", "team": "enemy", "level": 36, @@ -177,7 +209,7 @@ }, { "unit_id": "hanzhong_spear_south", - "name": "Hanzhong Spear Guard", + "name": "한중 창병", "class_id": "infantry", "team": "enemy", "level": 36, @@ -186,7 +218,7 @@ }, { "unit_id": "hanzhong_pass_marksman", - "name": "Hanzhong Pass Marksman", + "name": "한중 관문 궁병", "class_id": "marksman", "team": "enemy", "level": 36, @@ -200,7 +232,7 @@ "once": true, "when": { "type": "battle_start" }, "actions": [ - { "type": "log", "text": "Cao Cao's army approaches Hanzhong's mountain gates as Zhang Lu's border guard blocks the pass road." } + { "type": "log", "text": "조조군이 한중 산문에 다가서자 장로의 국경 수비대가 고갯길을 막아선다." } ] }, { @@ -211,9 +243,9 @@ { "type": "dialogue", "lines": [ - { "speaker": "Xiahou Yuan", "text": "The road climbs quickly. Hanzhong will not fight like Guanzhong." }, - { "speaker": "Guo Jia", "text": "Mountains make small armies feel large and large armies feel slow." }, - { "speaker": "Cao Cao", "text": "Then we move before the mountain teaches them confidence." } + { "speaker": "Xiahou Yuan", "text": "길이 빠르게 올라갑니다. 한중은 관중처럼 싸우지 않을 것입니다." }, + { "speaker": "Guo Jia", "text": "산은 작은 군대를 크게 보이게 하고, 큰 군대를 느리게 만듭니다." }, + { "speaker": "Cao Cao", "text": "그럼 산이 저들에게 자신감을 가르치기 전에 움직인다." } ] } ] @@ -226,8 +258,8 @@ { "type": "dialogue", "lines": [ - { "speaker": "Cao Ren", "text": "Guanzhong is quiet enough to keep the pass column supplied." }, - { "speaker": "Cao Cao", "text": "A quiet rear lets a narrow road feel wider." } + { "speaker": "Cao Ren", "text": "관중이 조용해 고개로 오르는 대열에 보급을 댈 수 있습니다." }, + { "speaker": "Cao Cao", "text": "후방이 조용하면 좁은 길도 넓게 느껴진다." } ] } ] @@ -240,15 +272,15 @@ { "type": "dialogue", "lines": [ - { "speaker": "Zhang Lu Border Guard", "text": "Cao Cao prepared for Hanzhong early. Light every pass beacon and make speed cost him." }, - { "speaker": "Zhang He", "text": "The pass is awake. We will have to cut through before it gathers." } + { "speaker": "장로 국경 수비장", "text": "조조가 한중을 일찍 준비했다. 모든 고개에 봉화를 올려 그 속도의 값을 치르게 하라." }, + { "speaker": "Zhang He", "text": "고개가 깨어났습니다. 모이기 전에 베고 들어가야 합니다." } ] }, { "type": "spawn_deployment", "deployment": { "unit_id": "hanzhong_beacon_riders", - "name": "Hanzhong Beacon Riders", + "name": "한중 봉화 기병", "class_id": "cavalry", "team": "enemy", "level": 36, @@ -266,8 +298,8 @@ { "type": "dialogue", "lines": [ - { "speaker": "Hanzhong Ritual Advisor", "text": "Hold the gates. Let the invaders learn how slowly a mountain opens." }, - { "speaker": "Guo Jia", "text": "They want delay to become belief. We cannot give them time." } + { "speaker": "한중 의례 군사", "text": "관문을 지켜라. 침입자들에게 산이 얼마나 천천히 열리는지 가르쳐라." }, + { "speaker": "Guo Jia", "text": "저들은 지연을 믿음으로 바꾸려 합니다. 시간을 주어서는 안 됩니다." } ] } ] @@ -279,14 +311,14 @@ "actions": [ { "type": "set_objective", - "victory": "The Hanzhong approach is reached. Defeat Zhang Lu's border guard.", - "defeat": "Cao Cao is defeated or the battle reaches Turn 18." + "victory": "한중 입구에 닿았다. 장로의 국경 수비대를 격파하라.", + "defeat": "조조가 퇴각하거나 18턴이 시작된다." }, { "type": "dialogue", "lines": [ - { "speaker": "Cao Cao", "text": "This is the approach. Break the border guard before Hanzhong closes its gates." }, - { "speaker": "Zhang Lu Border Guard", "text": "The gate is not yours because you can see it." } + { "speaker": "Cao Cao", "text": "여기가 한중 입구다. 관문이 닫히기 전에 국경 수비대를 깨뜨려라." }, + { "speaker": "장로 국경 수비장", "text": "눈에 보인다고 문이 네 것이 되는 것은 아니다." } ] }, { @@ -294,7 +326,7 @@ "deployments": [ { "unit_id": "hanzhong_gate_halberd", - "name": "Hanzhong Gate Halberd", + "name": "한중 관문 장극병", "class_id": "guard_captain", "team": "enemy", "level": 36, @@ -303,7 +335,7 @@ }, { "unit_id": "hanzhong_gate_archer", - "name": "Hanzhong Gate Archer", + "name": "한중 관문 궁병", "class_id": "archer", "team": "enemy", "level": 36, @@ -322,8 +354,8 @@ { "type": "dialogue", "lines": [ - { "speaker": "Xiahou Yuan", "text": "The gate road is in sight. Their border guard is running out of pass to hide behind." }, - { "speaker": "Cao Cao", "text": "Then make Hanzhong hear us before we knock." } + { "speaker": "Xiahou Yuan", "text": "관문 길이 보입니다. 적 국경 수비대가 숨을 고개도 줄어들고 있습니다." }, + { "speaker": "Cao Cao", "text": "그럼 문을 두드리기 전에 한중이 우리 소리를 듣게 하라." } ] } ] @@ -334,23 +366,23 @@ "items": ["bean", "wine", "war_drum"] }, "post_battle_dialogue": [ - { "speaker": "Guo Jia", "text": "The Hanzhong approach is open. Zhang Lu must now decide whether his gates are walls or bargaining tables." }, - { "speaker": "Xiahou Yuan", "text": "We can secure the approach and bring up supplies, or press the gate before Zhang Lu's priests steady the defenders." }, - { "speaker": "Cao Cao", "text": "Hanzhong can be opened by patience or shock. Choose the first argument." } + { "speaker": "Guo Jia", "text": "한중 입구가 열렸습니다. 장로는 이제 관문을 성벽으로 삼을지, 교섭의 책상으로 삼을지 정해야 합니다." }, + { "speaker": "Xiahou Yuan", "text": "입구를 굳히고 보급을 끌어올릴 수도 있고, 장로의 도사들이 수비대를 다독이기 전에 관문을 압박할 수도 있습니다." }, + { "speaker": "Cao Cao", "text": "한중은 인내로도 열리고 충격으로도 열린다. 첫 주장을 정하라." } ], "post_battle_choices": [ { "id": "secure_hanzhong_approach", - "label": "Secure Approach", - "description": "Cao Cao secures the Hanzhong approach so the mountain column can advance safely.", + "label": "입구 확보", + "description": "조조가 산악 부대가 안전하게 전진하도록 한중 입구를 굳힌다.", "set_flags": { "secured_hanzhong_approach": true, "pressed_zhang_lu_gate": false }, "gold": 1200, "items": ["imperial_seal"] }, { "id": "press_zhang_lu_gate", - "label": "Press Gate", - "description": "Cao Cao presses Zhang Lu's gate before the Hanzhong defense can settle.", + "label": "관문 압박", + "description": "조조가 한중 수비가 자리 잡기 전에 장로의 관문을 압박한다.", "set_flags": { "secured_hanzhong_approach": false, "pressed_zhang_lu_gate": true }, "gold": 1000, "items": ["war_drum"] diff --git a/data/scenarios/040_hanzhong_gate.json b/data/scenarios/040_hanzhong_gate.json index 69ad5ab..d80db70 100644 --- a/data/scenarios/040_hanzhong_gate.json +++ b/data/scenarios/040_hanzhong_gate.json @@ -1,9 +1,9 @@ { "id": "040_hanzhong_gate", - "name": "Hanzhong Gate", + "name": "한중 관문전", "objectives": { - "victory": "Reach Zhang Lu's gate with Cao Cao, then defeat the Hanzhong gate guard.", - "defeat": "Cao Cao is defeated or the battle reaches Turn 18." + "victory": "조조가 장로의 관문에 닿은 뒤 한중 관문 수비대를 격파하라.", + "defeat": "조조가 퇴각하거나 18턴이 시작된다." }, "conditions": { "victory": { "type": "all_units_defeated", "team": "enemy", "after_event": "hanzhong_gate_reached" }, @@ -13,23 +13,48 @@ ] }, "briefing": { - "title": "Hanzhong Gate", - "location": "Hanzhong Gate, Qinling Passes, 215 CE", + "title": "한중 관문전", + "location": "진령 한중 관문, 건안 20년", "lines": [ - "The Hanzhong approach is open, but Zhang Lu's gate still controls the mountain road into the basin.", - "Cao Cao's army must decide whether Hanzhong opens through measured siege lines or a blow fast enough to unsettle Zhang Lu's priests." + "한중 입구는 열렸지만, 장로의 관문은 여전히 분지로 들어가는 산길을 틀어쥐고 있다.", + "조조군은 차분한 공성선으로 문을 열지, 장로의 도사들이 마음을 추스르기 전에 빠른 일격을 넣을지 정해야 한다." ], "conditional_lines": [ { "campaign_flags": { "secured_hanzhong_approach": true }, "lines": [ - "Securing the approach gives Cao Cao room to bring up ladders, stores, and patient pressure before the gate battle." + "입구를 확보한 덕분에 조조는 사다리와 군량, 느긋한 압박을 관문 앞까지 끌어올릴 여유를 얻었다." ] }, { "campaign_flags": { "pressed_zhang_lu_gate": true }, "lines": [ - "Pressing Zhang Lu's gate keeps the defenders off balance, but Hanzhong's beacon guards are already scrambling to answer." + "장로의 관문을 서둘러 압박해 수비대는 흔들리지만, 한중의 봉화병도 이미 정신없이 응답하고 있다." + ] + } + ], + "camp_conversations": [ + { + "id": "hanzhong_gate_council", + "group": "topic", + "label": "관문 군의", + "speaker": "Cao Ren", + "summary": "사다리와 방패수레를 어디에 붙일지 정한다.", + "lines": [ + { "speaker": "Cao Ren", "side": "left", "text": "관문은 절벽처럼 서 있습니다. 정면만 두드리면 병사보다 사다리가 먼저 지칠 겁니다." }, + { "speaker": "Cao Cao", "side": "right", "text": "절벽도 사람이 지킨다. 사람의 마음이 흔들리는 곳에 첫 사다리를 걸어라." } + ] + }, + { + "id": "hanzhong_xiahou_yuan_beacon", + "group": "officer", + "officer_id": "xiahou_yuan", + "label": "하후연 - 봉화의 박자", + "speaker": "Xiahou Yuan", + "summary": "봉화가 모이기 전에 관문 수비의 호흡을 끊는다.", + "lines": [ + { "speaker": "Xiahou Yuan", "side": "left", "text": "봉화가 셋 더 오르면 산길의 작은 초소까지 모두 관문으로 모일 것입니다." }, + { "speaker": "Guo Jia", "side": "right", "text": "그 전에 소리를 크게 내십시오. 두려움은 봉화보다 빨리 번집니다." } ] } ] @@ -55,7 +80,14 @@ "campaign_flags": { "pressed_zhang_lu_gate": true }, "items": ["war_drum"] } - ] + ], + "merchant": { + "name": "한중 관문 야상", + "lines": [ + "관문 앞에서는 사다리보다 먼저 배를 채워야 합니다. 빈 배로는 성벽도 더 높아 보이지요.", + "도사들은 부적을 팔고, 저는 술과 갑옷을 팝니다. 오늘은 제 물건이 더 오래 버틸 겁니다." + ] + } }, "roster": { "max_units": 7, @@ -131,7 +163,7 @@ }, { "unit_id": "zhang_lu_gate_guard", - "name": "Zhang Lu Gate Guard", + "name": "장로 관문 수비장", "class_id": "commander", "team": "enemy", "level": 37, @@ -140,7 +172,7 @@ }, { "unit_id": "yangping_pass_captain", - "name": "Yangping Pass Captain", + "name": "양평관 대장", "class_id": "guard_captain", "team": "enemy", "level": 37, @@ -149,7 +181,7 @@ }, { "unit_id": "hanzhong_gate_champion", - "name": "Hanzhong Gate Champion", + "name": "한중 관문 용장", "class_id": "champion", "team": "enemy", "level": 37, @@ -158,7 +190,7 @@ }, { "unit_id": "gate_ritual_advisor", - "name": "Gate Ritual Advisor", + "name": "관문 의례 군사", "class_id": "military_advisor", "team": "enemy", "level": 37, @@ -168,7 +200,7 @@ }, { "unit_id": "hanzhong_gate_spear_north", - "name": "Hanzhong Gate Spear", + "name": "한중 관문 창병", "class_id": "infantry", "team": "enemy", "level": 37, @@ -177,7 +209,7 @@ }, { "unit_id": "hanzhong_gate_spear_south", - "name": "Hanzhong Gate Spear", + "name": "한중 관문 창병", "class_id": "infantry", "team": "enemy", "level": 37, @@ -186,7 +218,7 @@ }, { "unit_id": "hanzhong_gate_marksman", - "name": "Hanzhong Gate Marksman", + "name": "한중 관문 궁병", "class_id": "marksman", "team": "enemy", "level": 37, @@ -200,7 +232,7 @@ "once": true, "when": { "type": "battle_start" }, "actions": [ - { "type": "log", "text": "Cao Cao's army reaches Zhang Lu's mountain gate, where Hanzhong's defenders gather beneath the pass beacons." } + { "type": "log", "text": "조조군이 장로의 산문에 닿자, 한중 수비대가 고개 봉화 아래로 모여든다." } ] }, { @@ -211,9 +243,9 @@ { "type": "dialogue", "lines": [ - { "speaker": "Xiahou Yuan", "text": "That gate is less a wall than a cliff with banners." }, - { "speaker": "Guo Jia", "text": "Then do not argue with the cliff. Find the men holding it up." }, - { "speaker": "Cao Cao", "text": "The gate opens when their certainty breaks." } + { "speaker": "Xiahou Yuan", "text": "저 관문은 성벽이라기보다 깃발을 단 절벽 같습니다." }, + { "speaker": "Guo Jia", "text": "그럼 절벽과 다투지 마십시오. 그것을 떠받치는 사람을 찾으면 됩니다." }, + { "speaker": "Cao Cao", "text": "저들의 확신이 꺾일 때 관문은 열린다." } ] } ] @@ -226,8 +258,8 @@ { "type": "dialogue", "lines": [ - { "speaker": "Cao Ren", "text": "The secured approach has brought ladders and shield carts into position." }, - { "speaker": "Cao Cao", "text": "Good. Preparation makes even stone nervous." } + { "speaker": "Cao Ren", "text": "확보한 입구 덕분에 사다리와 방패수레가 자리를 잡았습니다." }, + { "speaker": "Cao Cao", "text": "좋다. 준비된 압박은 돌도 불안하게 만든다." } ] } ] @@ -240,15 +272,15 @@ { "type": "dialogue", "lines": [ - { "speaker": "Zhang Lu Gate Guard", "text": "Cao Cao presses before the rites are complete. Call every beacon guard to the gate." }, - { "speaker": "Zhang He", "text": "Their haste answers ours. The gate will be crowded with fear." } + { "speaker": "장로 관문 수비장", "text": "의식이 끝나기 전에 조조가 몰아친다. 모든 봉화 수비대를 관문으로 불러라." }, + { "speaker": "Zhang He", "text": "저들의 다급함이 우리의 속도에 답했습니다. 관문에는 두려움이 붐빌 것입니다." } ] }, { "type": "spawn_deployment", "deployment": { "unit_id": "beacon_gate_riders", - "name": "Beacon Gate Riders", + "name": "봉화 관문 기병", "class_id": "cavalry", "team": "enemy", "level": 37, @@ -266,8 +298,8 @@ { "type": "dialogue", "lines": [ - { "speaker": "Gate Ritual Advisor", "text": "The mountain tests the unworthy. Hold until their confidence thins." }, - { "speaker": "Guo Jia", "text": "They dress delay as faith. Cut the delay and the robes follow." } + { "speaker": "관문 의례 군사", "text": "산은 자격 없는 자를 시험한다. 저들의 자신감이 엷어질 때까지 버텨라." }, + { "speaker": "Guo Jia", "text": "저들은 지연을 신앙처럼 꾸밉니다. 지연을 끊으면 예복도 따라 찢어집니다." } ] } ] @@ -279,14 +311,14 @@ "actions": [ { "type": "set_objective", - "victory": "Zhang Lu's gate is reached. Defeat the Hanzhong gate guard.", - "defeat": "Cao Cao is defeated or the battle reaches Turn 18." + "victory": "장로의 관문에 닿았다. 한중 관문 수비대를 격파하라.", + "defeat": "조조가 퇴각하거나 18턴이 시작된다." }, { "type": "dialogue", "lines": [ - { "speaker": "Cao Cao", "text": "This is the gate. Break its guard and Hanzhong must speak plainly." }, - { "speaker": "Zhang Lu Gate Guard", "text": "Hanzhong speaks through the pass, and the pass says no." } + { "speaker": "Cao Cao", "text": "이곳이 관문이다. 수비대를 깨면 한중도 더는 돌려 말하지 못한다." }, + { "speaker": "장로 관문 수비장", "text": "한중은 고개로 말하고, 고개는 허락하지 않는다." } ] }, { @@ -294,7 +326,7 @@ "deployments": [ { "unit_id": "gate_halberd_guard", - "name": "Gate Halberd Guard", + "name": "관문 장극병", "class_id": "guard_captain", "team": "enemy", "level": 37, @@ -303,7 +335,7 @@ }, { "unit_id": "gate_arrow_screen", - "name": "Gate Arrow Screen", + "name": "관문 궁병", "class_id": "archer", "team": "enemy", "level": 37, @@ -322,8 +354,8 @@ { "type": "dialogue", "lines": [ - { "speaker": "Xiahou Yuan", "text": "The gate line is shaking. Their priests are shouting louder than their captains." }, - { "speaker": "Cao Cao", "text": "Then the captains can no longer hear victory. Finish it." } + { "speaker": "Xiahou Yuan", "text": "관문 전열이 흔들립니다. 도사들의 외침이 장수들의 명령보다 커졌습니다." }, + { "speaker": "Cao Cao", "text": "그럼 장수들은 더는 승리를 듣지 못한다. 끝내라." } ] } ] @@ -334,23 +366,23 @@ "items": ["bean", "wine", "imperial_seal"] }, "post_battle_dialogue": [ - { "speaker": "Guo Jia", "text": "The Hanzhong gate is broken. Zhang Lu can still bargain, but he can no longer pretend the mountain alone decides." }, - { "speaker": "Xiahou Yuan", "text": "Zhang Lu can submit now, or force us to pacify Hanzhong pass by pass." }, - { "speaker": "Cao Cao", "text": "A surrender accepted quickly becomes a road. A province pacified slowly becomes a lesson." } + { "speaker": "Guo Jia", "text": "한중 관문은 무너졌습니다. 장로가 아직 교섭할 수는 있어도, 산만으로 전세를 정한다고 말할 수는 없습니다." }, + { "speaker": "Xiahou Yuan", "text": "장로는 지금 항복할 수도 있고, 우리가 고개마다 한중을 평정하게 만들 수도 있습니다." }, + { "speaker": "Cao Cao", "text": "빨리 받아낸 항복은 길이 되고, 늦게 얻은 평정은 교훈이 된다." } ], "post_battle_choices": [ { "id": "accept_zhang_lu_submission", - "label": "Accept Submission", - "description": "Cao Cao accepts Zhang Lu's submission before Hanzhong can rally around another defense.", + "label": "항복 접수", + "description": "조조가 한중이 다시 방어선을 모으기 전에 장로의 항복을 받아들인다.", "set_flags": { "accepted_zhang_lu_submission": true, "pacified_hanzhong": false }, "gold": 1250, "items": ["imperial_seal"] }, { "id": "pacify_hanzhong", - "label": "Pacify Hanzhong", - "description": "Cao Cao pacifies Hanzhong by force so no mountain faction can reopen the pass war.", + "label": "한중 평정", + "description": "조조가 산중 세력이 관문 전쟁을 다시 열지 못하도록 힘으로 한중을 평정한다.", "set_flags": { "accepted_zhang_lu_submission": false, "pacified_hanzhong": true }, "gold": 1050, "items": ["war_drum"] diff --git a/data/scenarios/041_hanzhong_settlement.json b/data/scenarios/041_hanzhong_settlement.json index 400cd34..f44eebd 100644 --- a/data/scenarios/041_hanzhong_settlement.json +++ b/data/scenarios/041_hanzhong_settlement.json @@ -1,9 +1,9 @@ { "id": "041_hanzhong_settlement", - "name": "Hanzhong Settlement", + "name": "한중 평정전", "objectives": { - "victory": "Reach the Hanzhong storehouse with Cao Cao, then defeat the settlement holdouts.", - "defeat": "Cao Cao is defeated or the battle reaches Turn 18." + "victory": "조조가 한중 창고에 닿은 뒤 잔존 수비대를 격파하라.", + "defeat": "조조가 퇴각하거나 18턴이 시작된다." }, "conditions": { "victory": { "type": "all_units_defeated", "team": "enemy", "after_event": "hanzhong_storehouse_secured" }, @@ -13,23 +13,48 @@ ] }, "briefing": { - "title": "Hanzhong Settlement", - "location": "Hanzhong Basin, Qinling Passes, 215 CE", + "title": "한중 평정전", + "location": "진령 한중 분지, 건안 20년", "lines": [ - "Zhang Lu's gate has fallen, but Hanzhong is not settled until its storehouses, passes, and local captains accept Cao Cao's order.", - "Cao Cao's army moves into the basin to decide whether the mountain province becomes a road east or a fortress held in the west." + "장로의 관문은 무너졌지만, 창고와 고개와 토착 장수들이 조조의 군령을 받아야 한중은 비로소 평정된다.", + "조조군은 분지로 들어가 이 산중의 땅을 동쪽으로 향하는 길로 삼을지, 서쪽을 지키는 성채로 삼을지 정하려 한다." ], "conditional_lines": [ { "campaign_flags": { "accepted_zhang_lu_submission": true }, "lines": [ - "Accepting Zhang Lu's submission gives Cao Cao clerks, registers, and surrendered grain stores before the settlement fight begins." + "장로의 항복을 받아들인 덕분에 조조는 평정전이 시작되기 전에 서리와 장부, 항복한 곡창을 얻었다." ] }, { "campaign_flags": { "pacified_hanzhong": true }, "lines": [ - "Pacifying Hanzhong by force breaks open the gates, but scattered mountain captains have sworn to make every storehouse expensive." + "힘으로 한중을 평정하며 관문은 열렸지만, 흩어진 산중 장수들은 모든 창고마다 피값을 치르게 하겠다고 맹세했다." + ] + } + ], + "camp_conversations": [ + { + "id": "hanzhong_settlement_council", + "group": "topic", + "label": "평정 군의", + "speaker": "Guo Jia", + "summary": "창고와 장부를 먼저 잡아 한중의 마음을 묶는다.", + "lines": [ + { "speaker": "Guo Jia", "side": "left", "text": "관문은 칼로 열었지만, 한중은 장부와 곡식으로 닫아야 합니다. 창고가 굽히면 고을도 따라옵니다." }, + { "speaker": "Cao Cao", "side": "right", "text": "좋다. 창고를 군령의 첫 봉인으로 삼아라. 굶주린 땅은 오래 충성하지 못한다." } + ] + }, + { + "id": "hanzhong_zhang_he_holdouts", + "group": "officer", + "officer_id": "zhang_he", + "label": "장합 - 잔병의 길", + "speaker": "Zhang He", + "summary": "산중 잔병이 창고 주변에서 다시 모일 길목을 살핀다.", + "lines": [ + { "speaker": "Zhang He", "side": "left", "text": "잔병은 산으로 흩어졌지만, 굶주리면 결국 창고로 돌아옵니다. 길목을 잡으면 산도 병사를 숨기지 못합니다." }, + { "speaker": "Xiahou Yuan", "side": "right", "text": "그 길목에 창과 활을 세우겠다. 한중이 우리 군량을 시험하기 전에 우리가 먼저 시험하지." } ] } ] @@ -55,7 +80,14 @@ "campaign_flags": { "pacified_hanzhong": true }, "items": ["war_drum"] } - ] + ], + "merchant": { + "name": "한중 창고 야상", + "lines": [ + "창고 문이 어느 인장에 열릴지 모두가 눈치만 봅니다. 저는 눈치보다 은전이 빠르다고 믿습니다.", + "평정이 끝나면 값이 내려가겠지만, 끝나기 전에는 살아남은 물건이 곧 좋은 물건이지요." + ] + } }, "roster": { "max_units": 7, @@ -131,7 +163,7 @@ }, { "unit_id": "ba_river_holdout_captain", - "name": "Ba River Holdout Captain", + "name": "파수 잔존 대장", "class_id": "commander", "team": "enemy", "level": 38, @@ -140,7 +172,7 @@ }, { "unit_id": "hanzhong_storehouse_guard", - "name": "Hanzhong Storehouse Guard", + "name": "한중 창고 수비장", "class_id": "guard_captain", "team": "enemy", "level": 38, @@ -149,7 +181,7 @@ }, { "unit_id": "five_peck_champion", - "name": "Five-Peck Champion", + "name": "오두미 용장", "class_id": "champion", "team": "enemy", "level": 38, @@ -158,7 +190,7 @@ }, { "unit_id": "settlement_ritual_advisor", - "name": "Settlement Ritual Advisor", + "name": "평정 의례 군사", "class_id": "military_advisor", "team": "enemy", "level": 38, @@ -168,7 +200,7 @@ }, { "unit_id": "ba_river_spear_north", - "name": "Ba River Spear Guard", + "name": "파수 창병", "class_id": "infantry", "team": "enemy", "level": 38, @@ -177,7 +209,7 @@ }, { "unit_id": "ba_river_spear_south", - "name": "Ba River Spear Guard", + "name": "파수 창병", "class_id": "infantry", "team": "enemy", "level": 38, @@ -186,7 +218,7 @@ }, { "unit_id": "hanzhong_basin_marksman", - "name": "Hanzhong Basin Marksman", + "name": "한중 분지 궁병", "class_id": "marksman", "team": "enemy", "level": 38, @@ -200,7 +232,7 @@ "once": true, "when": { "type": "battle_start" }, "actions": [ - { "type": "log", "text": "Cao Cao's army enters the Hanzhong basin to settle storehouses, captains, and pass roads after Zhang Lu's gate falls." } + { "type": "log", "text": "장로의 관문이 무너진 뒤, 조조군은 창고와 장수와 고갯길을 평정하러 한중 분지로 들어간다." } ] }, { @@ -211,9 +243,9 @@ { "type": "dialogue", "lines": [ - { "speaker": "Xiahou Yuan", "text": "The gate is behind us, but every granary ahead has men deciding who they fear more." }, - { "speaker": "Guo Jia", "text": "Then let them choose order before hunger chooses for them." }, - { "speaker": "Cao Cao", "text": "Hanzhong is won when the road feeds us instead of fighting us." } + { "speaker": "Xiahou Yuan", "text": "관문은 등 뒤에 있지만, 앞의 모든 곡창에는 누구를 더 두려워할지 고르는 자들이 있습니다." }, + { "speaker": "Guo Jia", "text": "그럼 굶주림이 대신 고르기 전에 질서를 택하게 해야 합니다." }, + { "speaker": "Cao Cao", "text": "한중은 길이 우리를 먹일 때 비로소 얻은 것이다." } ] } ] @@ -226,8 +258,8 @@ { "type": "dialogue", "lines": [ - { "speaker": "Guo Jia", "text": "Zhang Lu's clerks have brought the grain registers. The storehouse guards know which way the seal now points." }, - { "speaker": "Cao Cao", "text": "Good. A province that writes its own surrender is already half governed." } + { "speaker": "Guo Jia", "text": "장로의 서리들이 곡식 장부를 가져왔습니다. 창고 수비대도 이제 인장이 어느 쪽을 가리키는지 압니다." }, + { "speaker": "Cao Cao", "text": "좋다. 스스로 항복을 적는 땅은 이미 반쯤 다스려진 것이다." } ] } ] @@ -240,15 +272,15 @@ { "type": "dialogue", "lines": [ - { "speaker": "Ba River Holdout Captain", "text": "Cao Cao pacified the gate by force. The basin will answer by force." }, - { "speaker": "Zhang He", "text": "They mistake stubbornness for terrain. We will flatten both." } + { "speaker": "파수 잔존 대장", "text": "조조가 힘으로 관문을 평정했다면, 분지도 힘으로 답하겠다." }, + { "speaker": "Zhang He", "text": "저들은 고집을 지형으로 착각합니다. 둘 다 평평하게 만들겠습니다." } ] }, { "type": "spawn_deployment", "deployment": { "unit_id": "hanzhong_holdout_riders", - "name": "Hanzhong Holdout Riders", + "name": "한중 잔존 기병", "class_id": "cavalry", "team": "enemy", "level": 38, @@ -266,8 +298,8 @@ { "type": "dialogue", "lines": [ - { "speaker": "Settlement Ritual Advisor", "text": "If the grain stays shut, Cao Cao's road through Hanzhong stays hungry." }, - { "speaker": "Guo Jia", "text": "They understand supply. That makes this storehouse more important than the banners around it." } + { "speaker": "평정 의례 군사", "text": "곡식이 닫혀 있으면 조조의 한중 길도 굶주린다." }, + { "speaker": "Guo Jia", "text": "저들도 보급을 압니다. 그래서 이 창고가 주변 깃발보다 중요합니다." } ] } ] @@ -279,14 +311,14 @@ "actions": [ { "type": "set_objective", - "victory": "The Hanzhong storehouse is secured. Defeat the settlement holdout captain.", - "defeat": "Cao Cao is defeated or the battle reaches Turn 18." + "victory": "한중 창고를 확보했다. 잔존 수비대장을 격파하라.", + "defeat": "조조가 퇴각하거나 18턴이 시작된다." }, { "type": "dialogue", "lines": [ - { "speaker": "Cao Cao", "text": "This storehouse opens the basin. Hold it, and Hanzhong becomes a road." }, - { "speaker": "Ba River Holdout Captain", "text": "Then the road must be paid for in men." } + { "speaker": "Cao Cao", "text": "이 창고가 분지를 연다. 붙잡으면 한중은 길이 된다." }, + { "speaker": "파수 잔존 대장", "text": "그렇다면 그 길값은 사람으로 치르게 하겠다." } ] }, { @@ -294,7 +326,7 @@ "deployments": [ { "unit_id": "storehouse_halberd_guard", - "name": "Storehouse Halberd Guard", + "name": "창고 장극병", "class_id": "guard_captain", "team": "enemy", "level": 38, @@ -303,7 +335,7 @@ }, { "unit_id": "storehouse_arrow_screen", - "name": "Storehouse Arrow Screen", + "name": "창고 궁병", "class_id": "archer", "team": "enemy", "level": 38, @@ -322,8 +354,8 @@ { "type": "dialogue", "lines": [ - { "speaker": "Xiahou Yuan", "text": "The basin is quieting. Even the holdouts are watching the storehouse more than their captain." }, - { "speaker": "Cao Cao", "text": "Then make the storehouse the argument they cannot answer." } + { "speaker": "Xiahou Yuan", "text": "분지가 조용해지고 있습니다. 잔병들조차 대장보다 창고를 더 보고 있습니다." }, + { "speaker": "Cao Cao", "text": "그럼 그들이 답할 수 없는 논거로 창고를 삼아라." } ] } ] @@ -334,23 +366,23 @@ "items": ["bean", "wine", "war_drum"] }, "post_battle_dialogue": [ - { "speaker": "Guo Jia", "text": "Hanzhong's storehouses answer to Cao Cao now. The west can be held, or its roads can feed a turn back toward the east." }, - { "speaker": "Xiahou Yuan", "text": "Leave me a strong garrison and Hanzhong will watch the mountain roads. Pull the army east and Ruxu will hear us sooner." }, - { "speaker": "Cao Cao", "text": "A settled province is useful only if we decide what it is for." } + { "speaker": "Guo Jia", "text": "한중의 창고가 이제 조조의 군령에 답합니다. 서쪽을 지킬 수도 있고, 그 길로 동쪽 행군을 먹일 수도 있습니다." }, + { "speaker": "Xiahou Yuan", "text": "강한 주둔군을 남기면 한중이 산길을 감시할 것입니다. 군을 동쪽으로 돌리면 유수 전선이 더 빨리 들을 것입니다." }, + { "speaker": "Cao Cao", "text": "평정한 땅은 쓰임을 정할 때 비로소 내 땅이 된다." } ], "post_battle_choices": [ { "id": "garrison_hanzhong", - "label": "Garrison Hanzhong", - "description": "Cao Cao leaves a strong Hanzhong garrison to anchor the western mountain roads.", + "label": "한중 주둔", + "description": "조조가 서쪽 산길을 붙들 강한 한중 주둔군을 남긴다.", "set_flags": { "garrisoned_hanzhong": true, "pivoted_to_ruxu": false }, "gold": 1300, "items": ["imperial_seal"] }, { "id": "pivot_to_ruxu", - "label": "Pivot to Ruxu", - "description": "Cao Cao turns the settled Hanzhong roads into supply for an eastern campaign toward Ruxu.", + "label": "유수 전환", + "description": "조조가 평정한 한중의 길을 유수 동정의 보급로로 돌린다.", "set_flags": { "garrisoned_hanzhong": false, "pivoted_to_ruxu": true }, "gold": 1100, "items": ["war_drum"] diff --git a/tools/smoke_visual_assets.gd b/tools/smoke_visual_assets.gd index b5af1bb..c39c70d 100644 --- a/tools/smoke_visual_assets.gd +++ b/tools/smoke_visual_assets.gd @@ -2514,6 +2514,77 @@ func _check_battle_visual_data(failures: Array[String]) -> void: ).is_empty(): failures.append("035 old Counterstroke setup flags should not expose doubt rations") + var western_hanzhong_expectations := [ + { + "path": "res://data/scenarios/036_weishui_crossing.json", + "label": "036 Weishui crossing", + "merchant": "위수 도하 야상", + "conversations": [ + ["weishui_crossing_council", "topic", ""], + ["weishui_guo_jia_alliance_rift", "officer", "guo_jia"] + ], + "imperial_flag": {"secured_weishui_crossing": true}, + "war_drum_flag": {"deepened_han_sui_rift": true} + }, + { + "path": "res://data/scenarios/037_guanzhong_foothold.json", + "label": "037 Guanzhong foothold", + "merchant": "관중 교두보 야상", + "conversations": [ + ["guanzhong_foothold_council", "topic", ""], + ["guanzhong_zhang_he_rearguard", "officer", "zhang_he"] + ], + "imperial_flag": {"secured_guanzhong_foothold": true}, + "war_drum_flag": {"split_western_alliance": true} + }, + { + "path": "res://data/scenarios/038_ma_chao_retreat.json", + "label": "038 Ma Chao retreat", + "merchant": "서량 퇴로 야상", + "conversations": [ + ["ma_chao_retreat_council", "topic", ""], + ["ma_chao_guo_jia_hanzhong_shadow", "officer", "guo_jia"] + ], + "imperial_flag": {"secured_guanzhong_commandery": true}, + "war_drum_flag": {"pressed_ma_chao_retreat": true} + }, + { + "path": "res://data/scenarios/039_hanzhong_approach.json", + "label": "039 Hanzhong approach", + "merchant": "한중 산문 야상", + "conversations": [ + ["hanzhong_approach_council", "topic", ""], + ["hanzhong_guo_jia_pass_faith", "officer", "guo_jia"] + ], + "imperial_flag": {"pacified_guanzhong": true}, + "war_drum_flag": {"prepared_hanzhong_front": true} + }, + { + "path": "res://data/scenarios/040_hanzhong_gate.json", + "label": "040 Hanzhong gate", + "merchant": "한중 관문 야상", + "conversations": [ + ["hanzhong_gate_council", "topic", ""], + ["hanzhong_xiahou_yuan_beacon", "officer", "xiahou_yuan"] + ], + "imperial_flag": {"secured_hanzhong_approach": true}, + "war_drum_flag": {"pressed_zhang_lu_gate": true} + }, + { + "path": "res://data/scenarios/041_hanzhong_settlement.json", + "label": "041 Hanzhong settlement", + "merchant": "한중 창고 야상", + "conversations": [ + ["hanzhong_settlement_council", "topic", ""], + ["hanzhong_zhang_he_holdouts", "officer", "zhang_he"] + ], + "imperial_flag": {"accepted_zhang_lu_submission": true}, + "war_drum_flag": {"pacified_hanzhong": true} + } + ] + for expectation in western_hanzhong_expectations: + _check_western_hanzhong_campaign_entry(failures, expectation) + for item_id in ["bronze_sword", "training_spear", "short_bow", "hand_axe", "iron_armor", "war_drum", "imperial_seal", "panacea"]: var item := state.get_item_def(item_id) if item.is_empty(): @@ -3391,6 +3462,64 @@ func _find_camp_conversation(conversations: Array, conversation_id: String) -> D return {} +func _check_western_hanzhong_campaign_entry(failures: Array[String], expectation: Dictionary) -> void: + var path := str(expectation.get("path", "")) + var label := str(expectation.get("label", path)) + var state = BattleStateScript.new() + if not state.load_battle(path, {}, {}, {}, ["zhang_he"]): + failures.append("could not load %s data" % label) + return + _check_shop_items_unique(failures, state, "%s base" % label) + var conversations: Array = state.get_briefing().get("camp_conversations", []) + var expected_conversations: Array = expectation.get("conversations", []) + if conversations.size() != expected_conversations.size(): + failures.append("%s briefing should expose exactly %d camp conversations" % [label, expected_conversations.size()]) + for expected_variant in expected_conversations: + if typeof(expected_variant) != TYPE_ARRAY: + failures.append("%s conversation expectation should be an array" % label) + continue + var expected: Array = expected_variant + if expected.size() < 3: + failures.append("%s conversation expectation should include id, group, and officer id" % label) + continue + var expected_id := str(expected[0]) + var expected_group := str(expected[1]) + var expected_officer_id := str(expected[2]) + _check_camp_conversation( + failures, + _find_camp_conversation(conversations, expected_id), + expected_id, + expected_group, + expected_officer_id + ) + var merchant: Dictionary = state.get_shop_merchant() + if str(merchant.get("name", "")) != str(expectation.get("merchant", "")): + failures.append("%s shop merchant name should be present" % label) + var merchant_lines: Array = merchant.get("lines", []) + if merchant_lines.size() < 2: + failures.append("%s shop should expose merchant flavor lines" % label) + _check_shop_item_visibility(failures, state, "imperial_seal", false, "%s base" % label) + _check_shop_item_visibility(failures, state, "war_drum", false, "%s base" % label) + + var imperial_state = BattleStateScript.new() + var imperial_flags: Dictionary = expectation.get("imperial_flag", {}) + if not imperial_state.load_battle(path, {}, {}, imperial_flags, ["zhang_he"]): + failures.append("could not load %s imperial branch data" % label) + else: + _check_shop_items_unique(failures, imperial_state, "%s imperial branch" % label) + _check_shop_item_visibility(failures, imperial_state, "imperial_seal", true, "%s imperial branch" % label) + _check_shop_item_visibility(failures, imperial_state, "war_drum", false, "%s imperial branch" % label) + + var drum_state = BattleStateScript.new() + var drum_flags: Dictionary = expectation.get("war_drum_flag", {}) + if not drum_state.load_battle(path, {}, {}, drum_flags, ["zhang_he"]): + failures.append("could not load %s war drum branch data" % label) + else: + _check_shop_items_unique(failures, drum_state, "%s war drum branch" % label) + _check_shop_item_visibility(failures, drum_state, "war_drum", true, "%s war drum branch" % label) + _check_shop_item_visibility(failures, drum_state, "imperial_seal", false, "%s war drum branch" % label) + + func _check_shop_item_visibility(failures: Array[String], state, item_id: String, expected_visible: bool, context: String) -> void: var visible: bool = state.get_shop_item_ids().has(item_id) if visible != expected_visible: