From de075fc6fee67cceba97dba40fd171368dfc4b41 Mon Sep 17 00:00:00 2001 From: Wickedness Date: Fri, 19 Jun 2026 07:44:36 +0900 Subject: [PATCH] Antique Wan escape scenario --- data/campaign/campaign.json | 2 +- data/scenarios/008_wan_castle_escape.json | 136 +++++++++++----------- scripts/scenes/battle_scene.gd | 13 ++- tools/smoke_camp_conversation_rewards.gd | 2 +- tools/smoke_visual_assets.gd | 2 +- 5 files changed, 83 insertions(+), 72 deletions(-) diff --git a/data/campaign/campaign.json b/data/campaign/campaign.json index a90bf93..d81071e 100644 --- a/data/campaign/campaign.json +++ b/data/campaign/campaign.json @@ -91,7 +91,7 @@ }, { "id": "008_wan_castle_escape", - "title": "Wan Castle Escape", + "title": "완성 탈출전", "path": "res://data/scenarios/008_wan_castle_escape.json" }, { diff --git a/data/scenarios/008_wan_castle_escape.json b/data/scenarios/008_wan_castle_escape.json index f8d8e16..cd66304 100644 --- a/data/scenarios/008_wan_castle_escape.json +++ b/data/scenarios/008_wan_castle_escape.json @@ -1,9 +1,9 @@ { "id": "008_wan_castle_escape", - "name": "Wan Castle Escape", + "name": "완성 탈출전", "objectives": { - "victory": "Move Cao Cao to the western road marker.", - "defeat": "Cao Cao or Cao Ang is defeated, or the battle reaches Turn 12." + "victory": "조조를 서쪽 행로 표식까지 이동시켜라.", + "defeat": "조조 또는 조앙이 퇴각하거나 제12군령에 이르면 패한다." }, "conditions": { "victory": { @@ -19,23 +19,23 @@ ] }, "briefing": { - "title": "Wan Castle Escape", - "location": "Wancheng, 197 CE", + "title": "완성 탈출전", + "location": "완성, 건안 이년", "lines": [ - "Zhang Xiu welcomes Cao Cao into Wan Castle, but Jia Xu's counsel turns the banquet into a trap.", - "The eastern gate is collapsing behind the army. Escort Cao Ang and move Cao Cao to the western road marker before the ambush closes." + "장수가 조조를 완성으로 맞아들였으나, 가후의 계책은 잔치를 함정으로 바꾸었다.", + "동문이 등 뒤에서 닫히고 있다. 매복이 조여 오기 전에 조앙을 지키며 조조를 서쪽 행로 표식까지 이끌어라." ], "conditional_lines": [ { "campaign_flags": { "secured_imperial_court": true }, "lines": [ - "The imperial court's seal has opened a few guarded roads, giving Cao Cao one narrow escape lane through the west." + "천자의 조정에서 받은 인장이 몇몇 수문장을 움직여, 서쪽으로 빠질 좁은 길 하나를 열어 준다." ] }, { "campaign_flags": { "pursued_li_jue_remnants": true }, "lines": [ - "The army's hard pursuit after the imperial escort keeps the vanguard sharp, but Zhang Xiu's scouts know Cao Cao's marching habits." + "천자 호송 뒤 이어진 강한 추격으로 선봉은 예리하지만, 장수의 척후도 조조군의 행군 버릇을 꿰뚫고 있다." ] } ], @@ -44,19 +44,19 @@ "id": "wan_escape_route_council", "group": "officer", "officer_id": "cao_cao", - "label": "Cao Cao - Escape Route", + "label": "조조 - 탈출로", "speaker": "Cao Cao", - "summary": "Mark the western road before Wan Castle closes around the column.", + "summary": "완성의 문이 닫히기 전 서쪽 길을 찍어 둔다.", "lines": [ { "speaker": "Cao Cao", "side": "left", - "text": "A banquet that falls silent has already drawn its blade. If Zhang Xiu closes the east, we leave by the west." + "text": "소리가 너무 고요해진 잔치는 이미 칼을 뽑은 것이다. 장수가 동쪽을 닫으면 우리는 서쪽으로 나간다." }, { "speaker": "Cao Ang", "side": "right", - "text": "Then I will keep the road beside you clear. Wan Castle will not take our banner in a hallway." + "text": "그렇다면 곁길은 제가 열겠습니다. 완성의 좁은 회랑에 우리 군기를 내주지 않겠습니다." } ] }, @@ -64,19 +64,19 @@ "id": "wan_dian_wei_rear_guard", "group": "officer", "officer_id": "dian_wei", - "label": "Dian Wei - Rear Guard", + "label": "전위 - 후미 방어", "speaker": "Dian Wei", - "summary": "Assign Dian Wei to hold the rear while Cao Cao and Cao Ang cut west.", + "summary": "조조와 조앙이 서쪽을 뚫는 동안 전위가 후미를 막는다.", "lines": [ { "speaker": "Dian Wei", "side": "right", - "text": "Gates are honest things. They either open or they break. I can work with both." + "text": "문이라는 것은 솔직합니다. 열리거나, 부서지거나 둘 중 하나입니다. 저는 어느 쪽이든 다룰 수 있습니다." }, { "speaker": "Cao Cao", "side": "left", - "text": "Hold the rear only long enough to keep Cao Ang moving. A brave death is still a cost I will not pay lightly." + "text": "조앙이 움직일 만큼만 후미를 붙들어라. 용맹한 죽음이라 해도 쉽게 치를 값은 아니다." } ] }, @@ -84,18 +84,18 @@ "id": "wan_court_seal_postern", "campaign_flags": { "secured_imperial_court": true }, "group": "topic", - "label": "Court Seal Postern", - "summary": "Use imperial authority to open a narrow support route.", + "label": "조정 인장 협문", + "summary": "천자의 권위로 좁은 협문 보급로를 연다.", "lines": [ { "speaker": "Escort Road Sutler", "side": "right", - "text": "The court seal still opens doors, even in a castle that wants them shut. I can move one food bundle through the west postern." + "text": "닫히려는 성 안에서도 조정의 인장은 아직 문을 엽니다. 서쪽 협문으로 식량 꾸러미 하나는 들일 수 있습니다." }, { "speaker": "Cao Ren", "side": "left", - "text": "One bundle is enough if it reaches the men cutting the road." + "text": "길을 뚫는 병사에게 닿기만 한다면 한 꾸러미도 충분하다." } ], "effects": [ @@ -103,7 +103,7 @@ "type": "grant_item", "item_id": "bean", "count": 1, - "text": "The court seal postern adds a Bean to the field supplies." + "text": "조정 인장 협문에서 콩 한 꾸러미를 군수에 보탰다." } ] }, @@ -111,18 +111,18 @@ "id": "wan_hard_pursuit_drums", "campaign_flags": { "pursued_li_jue_remnants": true }, "group": "topic", - "label": "Hard Pursuit Drums", - "summary": "Issue wine to the vanguard whose pace is known by enemy scouts.", + "label": "추격 선봉 술병", + "summary": "적 척후가 행군 속도를 읽은 선봉에게 술을 나눈다.", "lines": [ { "speaker": "Xiahou Yuan", "side": "right", - "text": "Zhang Xiu's scouts know our old marching path because we used it hard after Li Jue. They will expect speed." + "text": "이각의 잔당을 몰 때 쓴 길을 너무 깊이 밟았습니다. 장수의 척후는 우리가 빠를 줄 알고 기다릴 것입니다." }, { "speaker": "Dian Wei", "side": "left", - "text": "Then give the vanguard wine and change the rhythm. Let them chase the sound they expected." + "text": "그럼 선봉에게 술을 주고 박자를 바꾸어라. 저들이 기다린 발소리만 쫓게 만들자." } ], "effects": [ @@ -130,7 +130,7 @@ "type": "grant_item", "item_id": "wine", "count": 1, - "text": "The hard pursuit drums add Wine to the field supplies." + "text": "추격 선봉 술병에서 술 한 병을 군수에 보탰다." } ] } @@ -159,10 +159,10 @@ } ], "merchant": { - "name": "Wan Castle Sutler", + "name": "완성 야상", "lines": [ - "Buy quietly. The walls have learned to listen since the banquet began.", - "If the west road opens, carry only what keeps men moving: beans, wine, and blades already in hand." + "조용히 사십시오. 잔치가 시작된 뒤로 성벽도 귀를 가진 듯합니다.", + "서쪽 길이 열리면 병사를 걷게 하는 것만 챙기십시오. 콩, 술, 그리고 이미 손에 익은 칼이면 됩니다." ] } }, @@ -200,7 +200,7 @@ }, { "unit_id": "cao_ang_ch8", - "name": "Cao Ang", + "name": "조앙", "class_id": "cavalry", "team": "player", "level": 4, @@ -239,7 +239,7 @@ }, { "unit_id": "zhang_xiu_vanguard", - "name": "Zhang Xiu Vanguard", + "name": "장수 선봉기", "class_id": "cavalry", "team": "enemy", "level": 8, @@ -248,7 +248,7 @@ }, { "unit_id": "wan_castle_guard_north", - "name": "Wan Castle Guard", + "name": "완성 수비병", "class_id": "infantry", "team": "enemy", "level": 8, @@ -257,7 +257,7 @@ }, { "unit_id": "wan_castle_guard_south", - "name": "Wan Castle Guard", + "name": "완성 수비병", "class_id": "infantry", "team": "enemy", "level": 8, @@ -266,7 +266,7 @@ }, { "unit_id": "jia_xu_strategist", - "name": "Jia Xu Strategist", + "name": "가후 책사", "class_id": "strategist", "team": "enemy", "level": 8, @@ -276,7 +276,7 @@ }, { "unit_id": "wan_castle_archer", - "name": "Wan Castle Archer", + "name": "완성 궁병", "class_id": "archer", "team": "enemy", "level": 8, @@ -285,7 +285,7 @@ }, { "unit_id": "southern_ambusher", - "name": "Southern Ambusher", + "name": "남쪽 복병", "class_id": "bandit", "team": "enemy", "level": 8, @@ -299,7 +299,7 @@ "once": true, "when": { "type": "battle_start" }, "actions": [ - { "type": "log", "text": "Wan Castle's gates close behind Cao Cao's column." } + { "type": "log", "text": "완성의 문이 조조군 뒤에서 닫힌다." } ] }, { @@ -310,9 +310,9 @@ { "type": "dialogue", "lines": [ - { "speaker": "Cao Cao", "text": "The music stopped too cleanly. This is Jia Xu's work." }, - { "speaker": "Dian Wei", "text": "Then I hold the gate while you cut west." }, - { "speaker": "Cao Ang", "text": "Father, the road is narrow. I will stay close." } + { "speaker": "Cao Cao", "text": "악사가 너무 깨끗하게 멈추었다. 가후의 솜씨로군." }, + { "speaker": "Dian Wei", "text": "그렇다면 주공께서 서쪽을 뚫는 동안 제가 문을 막겠습니다." }, + { "speaker": "Cao Ang", "text": "아버지, 길이 좁습니다. 제가 곁을 지키겠습니다." } ] } ] @@ -325,27 +325,27 @@ { "type": "dialogue", "lines": [ - { "speaker": "Zhang Xiu", "text": "Close the eastern gate. Cao Cao leaves Wan Castle only through our blades." }, - { "speaker": "Jia Xu", "text": "Do not chase the guards. Strike the road and separate him from his son." } + { "speaker": "Zhang Xiu", "text": "동문을 닫아라. 조조는 우리의 칼날을 지나서만 완성을 나갈 수 있다." }, + { "speaker": "Jia Xu", "text": "호위를 쫓지 마십시오. 길을 치고, 부자를 갈라놓으십시오." } ] }, { "type": "set_objective", - "victory": "Break through the western road and move Cao Cao to the escape marker.", - "defeat": "Cao Cao or Cao Ang is defeated, or the battle reaches Turn 12." + "victory": "서쪽 길을 뚫고 조조를 탈출 표식까지 이동시켜라.", + "defeat": "조조 또는 조앙이 퇴각하거나 제12군령에 이르면 패한다." }, { "type": "set_ai_target_priority", "unit_id": "cao_ang_ch8", "priority": 10, - "text": "Cao Ang is exposed as the ambush closes." + "text": "매복이 좁혀 오며 조앙이 노출되었다." }, { "type": "spawn_deployments", "deployments": [ { "unit_id": "east_gate_rider_north", - "name": "East Gate Rider", + "name": "동문 기병", "class_id": "cavalry", "team": "enemy", "level": 8, @@ -354,7 +354,7 @@ }, { "unit_id": "east_gate_rider_south", - "name": "East Gate Rider", + "name": "동문 기병", "class_id": "cavalry", "team": "enemy", "level": 8, @@ -373,15 +373,15 @@ { "type": "dialogue", "lines": [ - { "speaker": "Imperial Guard", "text": "The court seal opens the west postern. We can delay their riders for a moment." }, - { "speaker": "Cao Cao", "text": "Then one moment is enough. Keep the road open." } + { "speaker": "Imperial Guard", "text": "조정 인장이 서쪽 협문을 열었습니다. 저들의 기병을 잠시 늦출 수 있습니다." }, + { "speaker": "Cao Cao", "text": "그 잠시면 충분하다. 길을 열어 두어라." } ] }, { "type": "spawn_deployment", "deployment": { "unit_id": "imperial_guard_support_ch8", - "name": "Imperial Guard", + "name": "천자 금위", "class_id": "infantry", "team": "player", "level": 6, @@ -401,8 +401,8 @@ { "type": "dialogue", "lines": [ - { "speaker": "Wan Scout", "text": "That is the same vanguard that chased Li Jue's remnants. Cut off their old marching path." }, - { "speaker": "Xiahou Dun", "text": "They know our pace. Then we change it by force." } + { "speaker": "Wan Scout", "text": "저 선봉은 이각 잔당을 쫓던 바로 그 군세다. 익숙한 행군로를 끊어라." }, + { "speaker": "Xiahou Dun", "text": "저들이 우리의 속도를 안다면, 힘으로 박자를 바꾸면 된다." } ] }, { @@ -410,7 +410,7 @@ "deployments": [ { "unit_id": "remnant_scout_rider", - "name": "Remnant Scout Rider", + "name": "잔당 척후 기병", "class_id": "cavalry", "team": "enemy", "level": 8, @@ -419,7 +419,7 @@ }, { "unit_id": "remnant_scout_archer", - "name": "Remnant Scout Archer", + "name": "잔당 척후 궁병", "class_id": "archer", "team": "enemy", "level": 8, @@ -438,8 +438,8 @@ { "type": "dialogue", "lines": [ - { "speaker": "Cao Ang", "text": "Archers in the trees!" }, - { "speaker": "Dian Wei", "text": "Stay behind the shields. I will make them aim at me." } + { "speaker": "Cao Ang", "text": "숲 속에 궁병입니다!" }, + { "speaker": "Dian Wei", "text": "방패 뒤에 계십시오. 저들의 눈을 제 쪽으로 돌리겠습니다." } ] }, { @@ -447,7 +447,7 @@ "deployments": [ { "unit_id": "midroad_wan_archer_north", - "name": "Wan Ambush Archer", + "name": "완성 매복 궁병", "class_id": "archer", "team": "enemy", "level": 8, @@ -456,7 +456,7 @@ }, { "unit_id": "midroad_wan_archer_south", - "name": "Wan Ambush Archer", + "name": "완성 매복 궁병", "class_id": "archer", "team": "enemy", "level": 8, @@ -475,8 +475,8 @@ { "type": "dialogue", "lines": [ - { "speaker": "Cao Cao", "text": "The western road is close. Do not spend lives chasing revenge inside these walls." }, - { "speaker": "Dian Wei", "text": "Then I spend steel instead. Move." } + { "speaker": "Cao Cao", "text": "서쪽 길이 가깝다. 성 안에서 복수를 쫓느라 목숨을 쓰지 마라." }, + { "speaker": "Dian Wei", "text": "그렇다면 목숨 대신 쇠를 쓰겠습니다. 움직이십시오." } ] } ] @@ -487,23 +487,23 @@ "items": ["bean", "wine", "iron_sword"] }, "post_battle_dialogue": [ - { "speaker": "Cao Ang", "text": "The road is clear. I thought Wan Castle would swallow us." }, - { "speaker": "Dian Wei", "text": "It tried. Its teeth broke first." }, - { "speaker": "Cao Cao", "text": "A trap survived is still a lesson. We will remember Jia Xu." } + { "speaker": "Cao Ang", "text": "길이 열렸습니다. 완성이 우리를 삼킬 줄 알았습니다." }, + { "speaker": "Dian Wei", "text": "삼키려 했지요. 먼저 이빨이 부러졌을 뿐입니다." }, + { "speaker": "Cao Cao", "text": "살아 나온 함정도 교훈이다. 가후의 이름을 기억하겠다." } ], "post_battle_choices": [ { "id": "hold_wan_gate", - "label": "Hold the Gate", - "description": "Dian Wei holds the rear long enough to recover armor and baggage.", + "label": "문을 사수", + "description": "전위가 후미를 더 오래 붙들어 갑옷과 짐수레 일부를 되찾는다.", "set_flags": { "held_wan_gate": true, "swift_wan_escape": false }, "gold": 100, "items": ["iron_armor"] }, { "id": "swift_wan_withdrawal", - "label": "Swift Withdrawal", - "description": "Cao Cao leaves the baggage behind to keep the army intact.", + "label": "신속 철수", + "description": "조조가 짐수레를 버리고 군세 보존을 우선한다.", "set_flags": { "held_wan_gate": false, "swift_wan_escape": true }, "gold": 250, "items": ["bean", "wine", "short_bow"] diff --git a/scripts/scenes/battle_scene.gd b/scripts/scenes/battle_scene.gd index 2a5dd4a..d2c6e79 100644 --- a/scripts/scenes/battle_scene.gd +++ b/scripts/scenes/battle_scene.gd @@ -113,12 +113,18 @@ const SPEAKER_DISPLAY_NAMES := { "Guo Jia": "곽가", "Zhang He": "장합", "Zhang Liao": "장료", + "Zhang Xiu": "장수", + "Jia Xu": "가후", + "Cao Ang": "조앙", "Gao Shun": "고순", "Lu Bu": "여포", "Puyang Night Trader": "복양 야상", "Dingtao Field Sutler": "정도 야상", "Escort Road Sutler": "호송 야상", + "Wan Castle Sutler": "완성 야상", "Imperial Envoy": "천자 사자", + "Imperial Guard": "천자 금위", + "Wan Scout": "완성 척후", "Coalition Merchant": "군막 상인", "Coalition Quartermaster": "연합 군수관", "Camp Merchant": "군막 상인", @@ -133,8 +139,13 @@ const SPEAKER_CANONICAL_NAMES := { "곽가": "Guo Jia", "장합": "Zhang He", "장료": "Zhang Liao", + "장수": "Zhang Xiu", + "가후": "Jia Xu", + "조앙": "Cao Ang", "고순": "Gao Shun", - "여포": "Lu Bu" + "여포": "Lu Bu", + "천자 금위": "Imperial Guard", + "완성 척후": "Wan Scout" } var state: BattleState = BattleStateScript.new() diff --git a/tools/smoke_camp_conversation_rewards.gd b/tools/smoke_camp_conversation_rewards.gd index 4ba7aea..3a95685 100644 --- a/tools/smoke_camp_conversation_rewards.gd +++ b/tools/smoke_camp_conversation_rewards.gd @@ -582,7 +582,7 @@ func _check_wan_branch_camp_conversations(failures: Array[String]) -> void: if not base_scene._camp_conversation_by_id(WAN_PURSUIT_CONVERSATION_ID).is_empty(): failures.append("Wan hard pursuit supplies should be hidden without pursuit flag") var merchant: Dictionary = base_scene.state.get_shop_merchant() - if str(merchant.get("name", "")) != "Wan Castle Sutler": + if str(merchant.get("name", "")) != "완성 야상": failures.append("Wan Castle shop merchant name should be present") var merchant_lines: Array = merchant.get("lines", []) if merchant_lines.size() < 2: diff --git a/tools/smoke_visual_assets.gd b/tools/smoke_visual_assets.gd index fb391e0..a4381cf 100644 --- a/tools/smoke_visual_assets.gd +++ b/tools/smoke_visual_assets.gd @@ -396,7 +396,7 @@ func _check_battle_visual_data(failures: Array[String]) -> void: _check_camp_conversation(failures, wan_conversations[0], "wan_escape_route_council", "officer", "cao_cao") _check_camp_conversation(failures, wan_conversations[1], "wan_dian_wei_rear_guard", "officer", "dian_wei") var wan_merchant := wan_state.get_shop_merchant() - if str(wan_merchant.get("name", "")) != "Wan Castle Sutler": + if str(wan_merchant.get("name", "")) != "완성 야상": failures.append("008 shop should expose Wan Castle merchant name") if (wan_merchant.get("lines", []) as Array).size() < 2: failures.append("008 shop should expose merchant flavor lines")