fix: align audiovisual and narrative feedback

This commit is contained in:
2026-07-23 23:20:50 +09:00
parent 8cf0886d7d
commit e06b15ce7a
27 changed files with 1368 additions and 142 deletions

View File

@@ -1030,9 +1030,9 @@ const campaignTimelineChapters: CampaignTimelineChapter[] = [
},
{
id: 'northern-campaign',
title: '북벌 준비',
period: '출사표를 향해',
description: '남중 평정으로 뒤를 안정시킨 뒤, 한중 창고와 출전 무장 편성을 정비해 첫 북벌을 준비하는 장입니다.',
title: '북벌과 오장원의 계승',
period: '기산에서 오장원까지',
description: '남중 평정 뒤 첫 북벌에 나서 기산·천수·가정·진창·위수 전선을 지나고, 오장원에서 제갈량의 뜻과 귀환 장부를 다음 세대에 잇는 장입니다.',
battleIds: [
'fifty-fifth-battle-northern-qishan-road',
'fifty-sixth-battle-tianshui-advance',
@@ -2669,21 +2669,20 @@ const sortieRulesByBattleId: Partial<Record<BattleScenarioId, SortieRuleDefiniti
note: '위수 북안 압박전은 추천 무장이 9명입니다. 낮은 길 판단, 측면 견제, 장부와 수레, 돌파와 회수 중 둘을 군영에 남겨야 합니다.'
},
'sixty-sixth-battle-wuzhang-final': {
maxUnits: 7,
maxUnits: 8,
requiredUnitIds: ['zhuge-liang'],
excludedUnitIds: ['liu-bei'],
recommended: [
{ unitId: 'zhuge-liang', reason: '오장원 본영과 귀환 장부를 동시에 지휘해야 하는 최종전의 중심입니다.' },
{ unitId: 'jiang-wei', reason: '제갈량의 작전도를 이어 받아 다음 길을 세우는 계승 축입니다.' },
{ unitId: 'wang-ping', reason: '퇴로 질서와 후위 방어를 맡겨 장합의 마지막 추격을 흔들 수 있습니다.' },
{ unitId: 'ma-dai', reason: '측면 기병을 끊고 곽회의 봉화로 이어지는 우회로를 견제합니다.' },
{ unitId: 'huang-quan', reason: '귀환 장부와 군량 계산을 안정시켜 긴 전투 후에도 부대가 흩어지지 않게 합니다.' },
{ unitId: 'li-yan', reason: '보급선과 예비 수레를 붙들어 오장원 본영의 지속력을 높입니다.' },
{ unitId: 'wei-yan', reason: '사마의 본대의 지연선을 흔드는 돌파 역할에 강합니다.' },
{ unitId: 'zhao-yun', reason: '흩어진 전선을 다시 묶는 안정적인 기동 예비대입니다.' },
{ unitId: 'ma-liang', reason: '마을 안심과 군문 고시문을 정리해 귀환로의 혼란을 줄입니다.' }
{ unitId: 'ma-dai', reason: '측면 기병을 끊고 곽회의 봉화로 이어지는 우회로를 견제합니다.' },
{ unitId: 'ma-chao', reason: '적 측면 기병을 빠르게 눌러 본영으로 향하는 압박을 줄입니다.' },
{ unitId: 'huang-quan', reason: '귀환 장부와 군량 계산을 안정시켜 긴 전투 후에도 부대가 흩어지지 않게 합니다.' },
{ unitId: 'li-yan', reason: '보급선과 예비 수레를 붙들어 오장원 본영의 지속력을 높입니다.' }
],
note: '오장원 최종전은 추천 무장 9명 중 7명을 고르는 마지막 편성입니다. 본영 방어, 퇴로 유지, 장부 계승을 함께 고려하십시오.'
note: '오장원 최종전은 8명이 본영 방어, 퇴로 유지, 장부 계승을 나누는 마지막 편성입니다.'
}
};
@@ -4621,15 +4620,15 @@ const campDialogues: CampDialogue[] = [
},
{
id: 'guan-zhuge-after-red-cliffs-fire',
title: '불길을 지킨 전열',
title: '불길 뒤의 전열 논의',
availableAfterBattleIds: [campBattleIds.twentySecond],
unitIds: ['guan-yu', 'zhuge-liang'],
bondId: 'guan-yu__zhuge-liang',
rewardExp: 26,
lines: [
'관우: 불길이 번질 때 병사들이 흔들렸으나, 전열을 무너뜨리지는 않았습니다.',
'제갈량: 운장 장군의 침착함이 있었기에 화선의 길이 끊기지 않았습니다. 계책도 그것을 지킬 칼이 있어야 완성됩니다.',
'관우: 다음 땅을 얻는 싸움에서도, 계책이 가리키는 곳을 제 칼로 지키겠습니다.'
'관우: 전투 보고를 보니 불길이 번질 때마다 좁은 전열이 크게 흔들렸습니다. 다음에는 제가 그 길목을 맡겠습니다.',
'제갈량: 좋습니다. 계책도 그것을 지킬 칼이 있어야 완성됩니다. 다음 도하에서는 운장 장군의 전열을 먼저 계산하겠습니다.',
'관우: 계책이 가리키는 곳을 제 칼로 지키되, 병사들이 물러날 길도 함께 남기겠습니다.'
],
choices: [
{
@@ -4654,8 +4653,8 @@ const campDialogues: CampDialogue[] = [
bondId: 'liu-bei__mi-zhu',
rewardExp: 24,
lines: [
'미축: 불길이 번지는 전장 칼보다 물과 약이 먼저 필요했습니다. 젖은 약품을 버리고 마른 꾸러미부터 살렸습니다.',
'유비: 전공이 커도 병사가 쓰러지면 다음 걸음은 없소. 그대가 붙잡 보급로가 곧 우리의 근본이오.',
'미축: 후방 보급소에서도 불길이 번지는 전장에는 칼보다 물과 약이 먼저 필요하다는 보고를 받았습니다. 다음에는 마른 꾸러미를 더 빨리 보내겠습니다.',
'유비: 전공이 커도 병사가 쓰러지면 다음 걸음은 없소. 전선과 후방이 함께 붙잡 보급로가 곧 우리의 근본이오.',
'미축: 다음부터는 빠른 말과 마른 약품을 한 묶음으로 준비하겠습니다. 전장도 이제 더 넓어질 테니까요.'
],
choices: [
@@ -8467,7 +8466,7 @@ const campVisits: CampVisitDefinition[] = [
label: '와룡의 서책을 정리한다',
response: '손상되기 쉬운 서책을 군영으로 옮기며 제갈량의 계책을 병사들도 이해할 수 있는 말로 옮기기 시작했다.',
bondExp: 20,
itemRewards: ['와룡 1']
itemRewards: ['와룡 서책 목록 1']
}
]
},
@@ -8526,7 +8525,7 @@ const campVisits: CampVisitDefinition[] = [
label: '매복 기록을 정리한다',
response: '박망파의 매복 순서를 다시 기록하자, 다음 전장에서 책략 명령을 더 빨리 전달할 근거가 마련되었다.',
bondExp: 20,
itemRewards: ['와룡의 서찰 1']
itemRewards: ['박망파 매복 기록 1']
}
]
},
@@ -8638,7 +8637,7 @@ const campVisits: CampVisitDefinition[] = [
label: '조조군 규모를 정리한다',
response: '손건은 추격대의 규모와 조조군의 남하 속도를 정리했고, 강동 회담의 위기감이 분명해졌다.',
bondExp: 20,
itemRewards: ['강동 사절 문서 1']
itemRewards: ['강동 사절 문서 초고 1']
},
{
id: 'write-liu-bei-cause',
@@ -8728,7 +8727,7 @@ const campVisits: CampVisitDefinition[] = [
label: '합동 지휘 요지를 적는다',
response: '손건은 유비군의 전선 유지와 강동군의 화공 준비를 함께 적어 동맹의 균형을 분명히 했다.',
bondExp: 22,
itemRewards: ['동맹 군의 기록 1']
itemRewards: ['합동 지휘 요지 초안 1']
},
{
id: 'clarify-zhou-yu-requests',
@@ -9388,7 +9387,7 @@ const campVisits: CampVisitDefinition[] = [
label: '항복 조건을 부드럽게 쓴다',
response: '권고문은 위협보다 보전과 질서를 앞세웠고, 성도 안쪽으로 들어갈 여지가 넓어졌습니다.',
bondExp: 28,
itemRewards: ['성도 항복 권고문 1']
itemRewards: ['성도 항복 조건 초안 1']
},
{
id: 'prepare-city-officer-list',
@@ -9958,7 +9957,7 @@ const campVisits: CampVisitDefinition[] = [
label: '상선 표식을 대조한다',
response: '상선 표식이 정리되어 강동 척후가 같은 길로 다시 숨어들기 어려워졌습니다.',
bondExp: 36,
itemRewards: ['강릉 창고 장부 1']
itemRewards: ['강릉 창고 대조표 1']
},
{
id: 'seal-night-storehouses',
@@ -9988,7 +9987,7 @@ const campVisits: CampVisitDefinition[] = [
label: '소문의 길을 표시한다',
response: '마량은 소문이 퍼지는 길을 지도에 적었고, 강동의 다음 침투 후보지가 조금 더 선명해졌습니다.',
bondExp: 36,
itemRewards: ['강동 정찰 기록 1']
itemRewards: ['강동 소문 경로 기록 1']
},
{
id: 'reassure-river-elders',
@@ -10018,7 +10017,7 @@ const campVisits: CampVisitDefinition[] = [
label: '성문 군령을 추적한다',
response: '성문 군령의 경로가 정리되어 공안 병사들이 강동의 거짓 명령에 흔들릴 가능성이 줄었습니다.',
bondExp: 38,
itemRewards: ['공안 성문 기록 1']
itemRewards: ['공안 성문 군령 대조표 1']
},
{
id: 'protect-witnesses',
@@ -10078,7 +10077,7 @@ const campVisits: CampVisitDefinition[] = [
label: '북문 표식을 세운다',
response: '맥성 북문 밖 집결 표식이 세워져, 포위망을 빠져나온 병사들이 다시 모일 길을 알게 되었습니다.',
bondExp: 40,
itemRewards: ['맥성 북문 지도 1']
itemRewards: ['맥성 북문 집결 표식 1']
},
{
id: 'brace-dry-moat-line',
@@ -10116,7 +10115,7 @@ const campVisits: CampVisitDefinition[] = [
response: '마대는 위군 기병이 말머리를 돌릴 길을 미리 끊었고, 조운은 빠져나갈 좁은 길을 표시했습니다.',
bondExp: 36,
gold: 1080,
itemRewards: ['갈대 물목 표식 1']
itemRewards: ['갈대 물목 우회 표식 1']
}
]
},
@@ -10168,7 +10167,7 @@ const campVisits: CampVisitDefinition[] = [
label: '기병 신호를 남긴다',
response: '동진로의 숲길마다 작은 기병 신호가 남아, 촉한 선봉이 깊이 들어가도 서로의 위치를 더 쉽게 확인하게 되었습니다.',
bondExp: 38,
itemRewards: ['이릉 동진 지도 1']
itemRewards: ['이릉 동진 기병 표식 1']
},
{
id: 'test-empty-forest-road',
@@ -10198,7 +10197,7 @@ const campVisits: CampVisitDefinition[] = [
label: '방화선 간격을 새긴다',
response: '방화선 간격 표식이 정리되어, 다음 군영 배치에서 화공 대비가 더 분명해졌습니다.',
bondExp: 40,
itemRewards: ['화공 방화선 표식 1']
itemRewards: ['방화선 점검 기록 1']
},
{
id: 'recover-camp-records',
@@ -10228,7 +10227,7 @@ const campVisits: CampVisitDefinition[] = [
label: '백제성 표식을 남긴다',
response: '백제성으로 향하는 물길에 표식이 남아, 흩어진 병사들이 서쪽으로 모일 가능성이 높아졌습니다.',
bondExp: 39,
itemRewards: ['백제성 퇴로 지도 1']
itemRewards: ['백제성 퇴로 표식 1']
},
{
id: 'delay-wu-pursuit',
@@ -10351,7 +10350,7 @@ const campVisits: CampVisitDefinition[] = [
response: '황권은 촉한군이 쓸 군량과 마을에 돌려줄 곡식을 나누어, 병사들의 약탈을 막을 기준을 세웠습니다.',
bondExp: 42,
gold: 1360,
itemRewards: ['남중 산길 지도 1']
itemRewards: ['남중 보급 배분표 1']
},
{
id: 'mark-amnesty-targets',
@@ -10439,7 +10438,7 @@ const campVisits: CampVisitDefinition[] = [
label: '장부를 공개한다',
response: '황권은 포로 명부를 공개했고, 제갈량은 석방과 처벌의 기준이 군령에 따른 것임을 알렸습니다.',
bondExp: 46,
itemRewards: ['포로 안심 장부 1']
itemRewards: ['포로 석방 명부 사본 1']
},
{
id: 'ration-returnees',
@@ -10506,7 +10505,7 @@ const campVisits: CampVisitDefinition[] = [
response: '제갈량은 끝까지 선동하는 호족과 달랠 수 있는 호족을 나누었고, 마량은 다음 회의의 질문 목록을 적었습니다.',
bondExp: 46,
gold: 1520,
itemRewards: ['세 번째 회유 장부 1']
itemRewards: ['호족 회유 질문 초안 1']
}
]
},
@@ -10557,7 +10556,7 @@ const campVisits: CampVisitDefinition[] = [
label: '호족 보증을 봉한다',
response: '황권은 보증 장부를 봉했고, 왕평은 퇴로 표식을 각 길목에 나누어 보냈습니다.',
bondExp: 50,
itemRewards: ['호족 보증 장부 1']
itemRewards: ['호족 보증문 대조표 1']
},
{
id: 'mark-returning-families',
@@ -10565,7 +10564,7 @@ const campVisits: CampVisitDefinition[] = [
response: '왕평은 귀환한 가족들의 마을을 표시했고, 황권은 병사들이 그 마을을 징발하지 못하게 했습니다.',
bondExp: 48,
gold: 1680,
itemRewards: ['회유 퇴로 표식 1']
itemRewards: ['귀환 마을 현장 표식 1']
}
]
},
@@ -10616,7 +10615,7 @@ const campVisits: CampVisitDefinition[] = [
label: '강경파 명부를 봉한다',
response: '황권은 강경파 명부를 따로 봉했고, 제갈량은 남은 호족에게 다시 석방의 조건을 알렸습니다.',
bondExp: 52,
itemRewards: ['강경파 분리 장부 1']
itemRewards: ['강경파 명부 사본 1']
},
{
id: 'protect-amnesty-witnesses',
@@ -10675,7 +10674,7 @@ const campVisits: CampVisitDefinition[] = [
label: '신뢰 장부를 봉한다',
response: '황권은 신뢰 장부를 봉했고, 왕평은 같은 표식을 계곡 길목마다 나누어 세웠습니다.',
bondExp: 54,
itemRewards: ['남중 신뢰 장부 1']
itemRewards: ['촌장 신뢰 서약 사본 1']
},
{
id: 'send-ledger-witnesses',
@@ -10683,7 +10682,7 @@ const campVisits: CampVisitDefinition[] = [
response: '왕평은 길을 아는 병사를 붙였고, 황권은 촌장들이 직접 확인할 수 있도록 증인을 보냈습니다.',
bondExp: 52,
gold: 1840,
itemRewards: ['계곡 회유 표식 1']
itemRewards: ['계곡 회유 현장 표식 1']
}
]
},
@@ -10734,7 +10733,7 @@ const campVisits: CampVisitDefinition[] = [
label: '평정 장부를 봉한다',
response: '황권은 평정 장부를 봉했고, 제갈량은 남중 마을 징발 금지 군령을 함께 낭독하게 했습니다.',
bondExp: 58,
itemRewards: ['남중 평정 장부 1']
itemRewards: ['남중 군령 사본 1']
},
{
id: 'send-council-copies',
@@ -10764,7 +10763,7 @@ const campVisits: CampVisitDefinition[] = [
label: '맹획 서약을 적는다',
response: '마량은 맹획의 항복 서약을 짧게 다시 적었고, 왕평은 마을 사람들이 볼 길목에 같은 표식을 세웠습니다.',
bondExp: 56,
itemRewards: ['맹획 항복 서약 1']
itemRewards: ['남중 길표식 1']
},
{
id: 'open-market-road',
@@ -10855,7 +10854,7 @@ const campVisits: CampVisitDefinition[] = [
label: '출진 장부를 봉한다',
response: '황권은 장부의 수량을 확인했고, 마량은 마지막 장에 마을별 약속을 다시 적어 봉했습니다.',
bondExp: 60,
itemRewards: ['기산 출진 장부 1']
itemRewards: ['기산 출진 장부 사본 1']
},
{
id: 'send-ledger-copies',
@@ -10885,7 +10884,7 @@ const campVisits: CampVisitDefinition[] = [
label: '보급 표식을 새로 세운다',
response: '조운은 갈림목마다 깃발을 세웠고, 제갈량은 표식마다 행군 순서와 회군로를 함께 적었습니다.',
bondExp: 60,
itemRewards: ['한중 보급 표식 1']
itemRewards: ['한중 보급로 현장 표식 1']
},
{
id: 'train-marker-runners',
@@ -11065,7 +11064,7 @@ const campVisits: CampVisitDefinition[] = [
label: '공성 장부를 봉한다',
response: '황권은 진창 공성 장부를 봉했고, 마량은 병사들이 낙담하지 않도록 재정비 고시문을 붙였습니다.',
bondExp: 72,
itemRewards: ['진창 공성 장부 1']
itemRewards: ['진창 공성 보완 기록 1']
},
{
id: 'assign-chencang-regroup-route',
@@ -11095,7 +11094,7 @@ const campVisits: CampVisitDefinition[] = [
label: '두 고을 장부를 봉한다',
response: '왕평은 고개 표식을 확인했고, 황권은 두 고을 군량 장부를 봉해 다음 북벌 보급의 기준으로 남겼습니다.',
bondExp: 74,
itemRewards: ['무도·음평 장부 1']
itemRewards: ['무도·음평 군량 대조표 1']
},
{
id: 'assign-commandery-reassurance',
@@ -11125,7 +11124,7 @@ const campVisits: CampVisitDefinition[] = [
label: '한중 우로 장부를 봉한다',
response: '황권은 한중 창고의 남은 군량을 봉했고, 이엄은 빗길 지연 기록을 붙여 다음 출정의 실제 기준으로 남겼습니다.',
bondExp: 78,
itemRewards: ['한중 우로 장부 1']
itemRewards: ['한중 우로 지연 기록 1']
},
{
id: 'assign-commandery-relay-carts',
@@ -11155,7 +11154,7 @@ const campVisits: CampVisitDefinition[] = [
label: '기산 재출정 장부를 봉한다',
response: '황권은 노성 앞에서 쓴 군량과 남은 수레를 봉했고, 마량은 그 장부를 다음 고시문 기준으로 삼았습니다.',
bondExp: 82,
itemRewards: ['기산 재출정 장부 1']
itemRewards: ['기산 재출정 장부 사본 1']
},
{
id: 'reserve-front-village-grain',
@@ -11185,7 +11184,7 @@ const campVisits: CampVisitDefinition[] = [
label: '노성 추격 장부를 봉한다',
response: '황권은 노성 추격 장부를 봉했고, 이엄은 다음 출정의 수레 속도를 장부 첫 줄에 적었습니다.',
bondExp: 86,
itemRewards: ['노성 추격 장부 1']
itemRewards: ['노성 추격 보완 기록 1']
},
{
id: 'reserve-return-road-supplies',
@@ -11215,7 +11214,7 @@ const campVisits: CampVisitDefinition[] = [
label: '위수 진영 장부를 봉한다',
response: '황권은 위수 진영 장부를 봉했고, 제갈량은 다음 북방 명령의 폭을 그 장부에 맞춰 줄였습니다.',
bondExp: 90,
itemRewards: ['위수 진영 장부 1']
itemRewards: ['위수 진영 운용 사본 1']
},
{
id: 'store-riverbank-supplies',
@@ -11245,7 +11244,7 @@ const campVisits: CampVisitDefinition[] = [
label: '북안 전진 장부를 봉한다',
response: '황권은 북안 전진 장부를 봉했고, 왕평은 각 진영의 정지선에 같은 문양의 깃발을 세웠습니다.',
bondExp: 94,
itemRewards: ['북안 전진 장부 1']
itemRewards: ['북안 전진 정지선 표식 1']
},
{
id: 'store-northbank-village-supplies',
@@ -11275,7 +11274,7 @@ const campVisits: CampVisitDefinition[] = [
label: '귀환 장부를 봉한다',
response: '장부의 마지막 줄에 오장원 귀환 장부라는 제목이 적혔고, 병사들은 자신의 부대가 돌아갈 차례를 확인했습니다.',
bondExp: 96,
itemRewards: ['오장원 귀환 장부 1']
itemRewards: ['오장원 귀환 장부 사본 1']
},
{
id: 'store-final-camp-supplies',