Antique Wan escape scenario

This commit is contained in:
2026-06-19 07:44:36 +09:00
parent 2543a02f3a
commit de075fc6fe
5 changed files with 83 additions and 72 deletions

View File

@@ -91,7 +91,7 @@
},
{
"id": "008_wan_castle_escape",
"title": "Wan Castle Escape",
"title": "완성 탈출전",
"path": "res://data/scenarios/008_wan_castle_escape.json"
},
{

View File

@@ -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"]

View File

@@ -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()

View File

@@ -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:

View File

@@ -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")