Add Cao break chapter and Sun Qian sortie
This commit is contained in:
@@ -4,7 +4,16 @@ import { equipmentExpToNext, equipmentSlotLabels, equipmentSlots, getItem, type
|
||||
import { getUnitClass, terrainRules, type TerrainType } from '../data/battleRules';
|
||||
import { defaultBattleScenario, getBattleScenario, type BattleScenarioDefinition, type BattleScenarioId } from '../data/battles';
|
||||
import { getSortieFlow } from '../data/campaignFlow';
|
||||
import { firstBattleBonds, firstBattleUnits, xuzhouRecruitBonds, xuzhouRecruitUnits, type PortraitKey, type UnitData } from '../data/scenario';
|
||||
import {
|
||||
caoBreakRecruitBonds,
|
||||
caoBreakRecruitUnits,
|
||||
firstBattleBonds,
|
||||
firstBattleUnits,
|
||||
xuzhouRecruitBonds,
|
||||
xuzhouRecruitUnits,
|
||||
type PortraitKey,
|
||||
type UnitData
|
||||
} from '../data/scenario';
|
||||
import {
|
||||
applyCampBondExp,
|
||||
ensureCampaignRosterUnits,
|
||||
@@ -183,7 +192,8 @@ const campBattleIds = {
|
||||
tenth: 'tenth-battle-xuzhou-breakout',
|
||||
eleventh: 'eleventh-battle-xudu-refuge-road',
|
||||
twelfth: 'twelfth-battle-xiapi-outer-siege',
|
||||
thirteenth: 'thirteenth-battle-xiapi-final'
|
||||
thirteenth: 'thirteenth-battle-xiapi-final',
|
||||
fourteenth: 'fourteenth-battle-cao-break'
|
||||
} as const;
|
||||
|
||||
const requiredSortieUnitIds = new Set(['liu-bei']);
|
||||
@@ -316,6 +326,17 @@ const sortieRulesByBattleId: Partial<Record<BattleScenarioId, SortieRuleDefiniti
|
||||
{ unitId: 'jian-yong', reason: '여포 처분과 조조의 시선을 둘러싼 명분 조율에 필요합니다.' }
|
||||
],
|
||||
note: '하비 결전은 전열과 돌파가 강해야 하지만, 전후 조조와의 긴장을 생각하면 책사 한 명을 챙기는 편성이 좋습니다.'
|
||||
},
|
||||
'fourteenth-battle-cao-break': {
|
||||
maxUnits: 6,
|
||||
recommended: [
|
||||
{ unitId: 'liu-bei', reason: '조조 휘하를 벗어나는 명분과 생존 조건의 중심입니다.' },
|
||||
{ unitId: 'guan-yu', reason: '관문 수비병을 정면에서 밀어낼 전열 핵심입니다.' },
|
||||
{ unitId: 'zhang-fei', reason: '길목으로 돌진하는 조조군 기병을 받아치는 역할입니다.' },
|
||||
{ unitId: 'sun-qian', reason: '문서와 민심을 정리해 서주 관문 확보 목표에 힘을 보탭니다.' },
|
||||
{ unitId: 'mi-zhu', reason: '보급과 회복 도구 운용으로 장기전을 안정시킵니다.' }
|
||||
],
|
||||
note: '차주의 관문은 길과 강이 겹쳐 전열, 기동, 책사, 보급이 모두 필요합니다. 새로 합류한 손건도 출전 후보로 살펴보십시오.'
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1426,6 +1447,87 @@ const campDialogues: CampDialogue[] = [
|
||||
rewardExp: 8
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'liu-sun-after-cao-break',
|
||||
title: '명분의 문서',
|
||||
availableAfterBattleIds: [campBattleIds.fourteenth],
|
||||
unitIds: ['liu-bei', 'sun-qian'],
|
||||
bondId: 'liu-bei__sun-qian',
|
||||
rewardExp: 22,
|
||||
lines: [
|
||||
'손건: 주공, 차주의 관문은 열렸으나 조조의 눈은 더 날카로워질 것입니다. 이제부터는 말 한마디와 문서 한 장이 모두 칼날입니다.',
|
||||
'유비: 힘으로만 길을 뚫는다면 백성의 마음을 잃겠지. 그대의 글이 우리 군의 숨길을 열어 주었소.',
|
||||
'손건: 그렇다면 다음 길목에서는 싸움보다 먼저 명분을 세우겠습니다. 원소에게 가는 길도 그냥 피난이 되어서는 안 됩니다.'
|
||||
],
|
||||
choices: [
|
||||
{
|
||||
id: 'write-for-people',
|
||||
label: '백성을 앞세운 격문을 쓴다',
|
||||
response: '손건은 유비군이 조조를 떠나는 이유를 백성의 안위와 서주의 책임으로 정리해 각 진영에 보낼 문안을 준비했다.',
|
||||
rewardExp: 10
|
||||
},
|
||||
{
|
||||
id: 'write-for-alliance',
|
||||
label: '원소에게 보낼 명분을 다듬는다',
|
||||
response: '손건은 북상하는 길의 위험과 원소 진영에서 필요한 예법을 정리하며 유비가 다음 의탁을 준비하도록 도왔다.',
|
||||
rewardExp: 9
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'jian-sun-after-cao-break',
|
||||
title: '말과 글의 길',
|
||||
availableAfterBattleIds: [campBattleIds.fourteenth],
|
||||
unitIds: ['jian-yong', 'sun-qian'],
|
||||
bondId: 'jian-yong__sun-qian',
|
||||
rewardExp: 20,
|
||||
lines: [
|
||||
'간옹: 손 선생, 글은 곧지만 세상은 구부러져 있소. 너무 반듯하게 쓰면 칼보다 먼저 부러질 때도 있지.',
|
||||
'손건: 그렇기에 간옹 님의 말이 필요합니다. 글이 문을 두드리면, 말은 그 문을 열게 만들 수 있으니까요.',
|
||||
'간옹: 좋소. 그럼 나는 웃으며 시간을 벌 테니, 선생은 그 틈에 빠져나갈 길을 문서로 만들구려.'
|
||||
],
|
||||
choices: [
|
||||
{
|
||||
id: 'soften-message',
|
||||
label: '문장을 부드럽게 고친다',
|
||||
response: '간옹은 손건의 문서에 숨 쉴 틈을 더했고, 손건은 그 말투 속에서도 뜻이 흐려지지 않게 문장을 다시 세웠다.',
|
||||
rewardExp: 9
|
||||
},
|
||||
{
|
||||
id: 'prepare-messenger-route',
|
||||
label: '사자 동선을 짠다',
|
||||
response: '두 사람은 관문과 역참을 피해 갈 사자 동선을 나누어 적의 감시망을 늦게 흔들 계획을 세웠다.',
|
||||
rewardExp: 8
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'liu-mi-after-cao-break',
|
||||
title: '떠나는 군량',
|
||||
availableAfterBattleIds: [campBattleIds.fourteenth],
|
||||
unitIds: ['liu-bei', 'mi-zhu'],
|
||||
bondId: 'liu-bei__mi-zhu',
|
||||
rewardExp: 18,
|
||||
lines: [
|
||||
'미축: 주공, 북쪽 길은 멀고 조조군의 추격은 빠릅니다. 군량을 아끼면 병사가 지치고, 풀어 쓰면 다음 진영에 닿기 전 바닥날 수 있습니다.',
|
||||
'유비: 백성에게서 억지로 거둘 수는 없소. 우리가 떠나는 길 또한 의로워야 하오.',
|
||||
'미축: 그래서 서주의 상단을 나누어 보내겠습니다. 병사에게는 당장의 밥을, 백성에게는 우리가 돌아올 이유를 남기겠습니다.'
|
||||
],
|
||||
choices: [
|
||||
{
|
||||
id: 'protect-refugee-supplies',
|
||||
label: '피난민 몫을 남긴다',
|
||||
response: '미축은 유비군의 짐을 줄이는 대신 피난민에게 남길 곡식을 따로 묶어, 떠나는 길의 민심을 보존했다.',
|
||||
rewardExp: 8
|
||||
},
|
||||
{
|
||||
id: 'stock-northern-road',
|
||||
label: '북상 보급을 숨겨 둔다',
|
||||
response: '미축은 상단의 표식을 숨긴 짐수레를 북쪽 길에 먼저 보내, 추격을 피해 움직일 여지를 만들었다.',
|
||||
rewardExp: 8
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
@@ -1504,15 +1606,26 @@ export class CampScene extends Phaser.Scene {
|
||||
|
||||
private ensureCurrentCampRecruitment() {
|
||||
const battleId = this.currentCampBattleId();
|
||||
if (!this.campaign) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (battleId === campBattleIds.thirteenth || battleId === campBattleIds.fourteenth) {
|
||||
this.campaign = ensureCampaignRosterUnits(
|
||||
[...xuzhouRecruitUnits, ...caoBreakRecruitUnits],
|
||||
[...xuzhouRecruitBonds, ...caoBreakRecruitBonds]
|
||||
);
|
||||
this.report = this.campaign.firstBattleReport ?? this.report;
|
||||
return;
|
||||
}
|
||||
|
||||
if (
|
||||
(battleId !== campBattleIds.seventh &&
|
||||
battleId !== campBattleIds.eighth &&
|
||||
battleId !== campBattleIds.ninth &&
|
||||
battleId !== campBattleIds.tenth &&
|
||||
battleId !== campBattleIds.eleventh &&
|
||||
battleId !== campBattleIds.twelfth &&
|
||||
battleId !== campBattleIds.thirteenth) ||
|
||||
!this.campaign
|
||||
battleId !== campBattleIds.twelfth)
|
||||
) {
|
||||
return;
|
||||
}
|
||||
@@ -1533,6 +1646,9 @@ export class CampScene extends Phaser.Scene {
|
||||
|
||||
private currentCampTitle() {
|
||||
const battleId = this.currentCampBattleId();
|
||||
if (battleId === campBattleIds.fourteenth) {
|
||||
return '서주 재기 후 군영';
|
||||
}
|
||||
if (battleId === campBattleIds.thirteenth) {
|
||||
return '하비 결전 후 군영';
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user