Add Jiangdong envoy sortie chapter
This commit is contained in:
@@ -39,6 +39,10 @@ import {
|
||||
thirteenthBattleMap,
|
||||
thirteenthBattleUnits,
|
||||
thirteenthBattleVictoryPages,
|
||||
twentiethBattleBonds,
|
||||
twentiethBattleMap,
|
||||
twentiethBattleUnits,
|
||||
twentiethBattleVictoryPages,
|
||||
twelfthBattleBonds,
|
||||
twelfthBattleMap,
|
||||
twelfthBattleUnits,
|
||||
@@ -100,7 +104,8 @@ export type BattleScenarioId =
|
||||
| 'sixteenth-battle-liu-biao-refuge'
|
||||
| 'seventeenth-battle-wolong-visit-road'
|
||||
| 'eighteenth-battle-bowang-ambush'
|
||||
| 'nineteenth-battle-changban-refuge';
|
||||
| 'nineteenth-battle-changban-refuge'
|
||||
| 'twentieth-battle-jiangdong-envoy';
|
||||
|
||||
export type BattleObjectiveKind = 'defeat-leader' | 'keep-unit-alive' | 'secure-terrain' | 'quick-victory';
|
||||
|
||||
@@ -1156,6 +1161,70 @@ export const nineteenthBattleScenario: BattleScenarioDefinition = {
|
||||
nextCampScene: 'CampScene'
|
||||
};
|
||||
|
||||
export const twentiethBattleScenario: BattleScenarioDefinition = {
|
||||
id: 'twentieth-battle-jiangdong-envoy',
|
||||
title: '강동 사절로',
|
||||
victoryConditionLabel: '문빙 퇴각',
|
||||
defeatConditionLabel: '유비, 제갈량 또는 손건 퇴각',
|
||||
openingObjectiveLines: [
|
||||
'장판파를 벗어난 유비군은 강동과 손잡을 사절을 보내야 합니다. 문빙의 추격대가 강나루를 닫기 전에 길을 열어야 합니다.',
|
||||
'이번 전투는 제갈량과 손건을 지키는 것이 핵심입니다. 전열이 다리목을 붙들고, 기동 장수가 추격 기병을 끊어야 사절 문서가 강동으로 향할 수 있습니다.',
|
||||
'문빙을 퇴각시키고 강나루를 확보하십시오. 제갈량과 손건이 살아남으면 적벽대전으로 향할 외교 명분이 완성됩니다.'
|
||||
],
|
||||
map: twentiethBattleMap,
|
||||
units: twentiethBattleUnits,
|
||||
bonds: twentiethBattleBonds,
|
||||
mapTextureKey: 'battle-map-twentieth',
|
||||
leaderUnitId: 'envoy-road-leader-wen-pin',
|
||||
quickVictoryTurnLimit: 29,
|
||||
baseVictoryGold: 2380,
|
||||
objectives: [
|
||||
{
|
||||
id: 'leader',
|
||||
kind: 'defeat-leader',
|
||||
label: '문빙 퇴각',
|
||||
rewardGold: 1540,
|
||||
unitId: 'envoy-road-leader-wen-pin'
|
||||
},
|
||||
{
|
||||
id: 'zhuge-liang',
|
||||
kind: 'keep-unit-alive',
|
||||
label: '제갈량 생존',
|
||||
rewardGold: 760,
|
||||
unitId: 'zhuge-liang'
|
||||
},
|
||||
{
|
||||
id: 'sun-qian',
|
||||
kind: 'keep-unit-alive',
|
||||
label: '손건 생존',
|
||||
rewardGold: 620,
|
||||
unitId: 'sun-qian'
|
||||
},
|
||||
{
|
||||
id: 'river-port',
|
||||
kind: 'secure-terrain',
|
||||
label: '강나루 확보',
|
||||
rewardGold: 860,
|
||||
terrain: 'fort'
|
||||
},
|
||||
{
|
||||
id: 'quick',
|
||||
kind: 'quick-victory',
|
||||
label: '29턴 이내 승리',
|
||||
rewardGold: 640,
|
||||
maxTurn: 29
|
||||
}
|
||||
],
|
||||
defeatConditions: [
|
||||
{ kind: 'unit-defeated', unitId: 'liu-bei' },
|
||||
{ kind: 'unit-defeated', unitId: 'zhuge-liang' },
|
||||
{ kind: 'unit-defeated', unitId: 'sun-qian' }
|
||||
],
|
||||
itemRewards: ['콩 8', '상처약 5', '탁주 3', '강동 사절 문서 +1', '화공 논의 +1'],
|
||||
victoryPages: twentiethBattleVictoryPages,
|
||||
nextCampScene: 'CampScene'
|
||||
};
|
||||
|
||||
export const defaultBattleScenarioId: BattleScenarioId = firstBattleScenario.id;
|
||||
|
||||
export const battleScenarios: Record<BattleScenarioId, BattleScenarioDefinition> = {
|
||||
@@ -1177,7 +1246,8 @@ export const battleScenarios: Record<BattleScenarioId, BattleScenarioDefinition>
|
||||
'sixteenth-battle-liu-biao-refuge': sixteenthBattleScenario,
|
||||
'seventeenth-battle-wolong-visit-road': seventeenthBattleScenario,
|
||||
'eighteenth-battle-bowang-ambush': eighteenthBattleScenario,
|
||||
'nineteenth-battle-changban-refuge': nineteenthBattleScenario
|
||||
'nineteenth-battle-changban-refuge': nineteenthBattleScenario,
|
||||
'twentieth-battle-jiangdong-envoy': twentiethBattleScenario
|
||||
};
|
||||
|
||||
export const defaultBattleScenario = battleScenarios[defaultBattleScenarioId];
|
||||
|
||||
@@ -17,6 +17,7 @@ import {
|
||||
seventeenthBattleScenario,
|
||||
tenthBattleScenario,
|
||||
thirteenthBattleScenario,
|
||||
twentiethBattleScenario,
|
||||
twelfthBattleScenario,
|
||||
thirdBattleScenario,
|
||||
type BattleScenarioId
|
||||
@@ -55,6 +56,8 @@ import {
|
||||
tenthBattleVictoryPages,
|
||||
thirteenthBattleIntroPages,
|
||||
thirteenthBattleVictoryPages,
|
||||
twentiethBattleIntroPages,
|
||||
twentiethBattleVictoryPages,
|
||||
twelfthBattleIntroPages,
|
||||
twelfthBattleVictoryPages,
|
||||
thirdBattleIntroPages,
|
||||
@@ -263,13 +266,24 @@ const sortieFlows: Record<string, SortieFlow> = {
|
||||
},
|
||||
[nineteenthBattleScenario.id]: {
|
||||
afterBattleId: nineteenthBattleScenario.id,
|
||||
eyebrow: '다음 장 준비',
|
||||
title: '강동 사절 준비',
|
||||
eyebrow: '다음 전장',
|
||||
title: twentiethBattleScenario.title,
|
||||
description:
|
||||
'장판파에서 피난로를 열어 백성과 군을 다시 모았습니다. 이제 제갈량과 손건은 강동으로 보낼 말과 증거를 정리하고, 손권과 마주할 준비를 해야 합니다.',
|
||||
rewardHint: '다음 장: 강동 사절과 적벽대전 준비 중',
|
||||
pages: nineteenthBattleVictoryPages,
|
||||
unavailableNotice: '강동 사절과 적벽대전 장은 다음 작업에서 이어집니다. 군영에서 출전 후보, 공명, 보급을 정비하십시오.'
|
||||
'장판파에서 피난로를 열어 백성과 군을 다시 모았습니다. 이제 제갈량과 손건을 강나루까지 보내 강동 사절의 길을 열어야 합니다.',
|
||||
rewardHint: `예상 보상: ${twentiethBattleScenario.title} 개방 / 강동 사절 문서 확보`,
|
||||
nextBattleId: twentiethBattleScenario.id,
|
||||
campaignStep: 'twentieth-battle',
|
||||
pages: [...nineteenthBattleVictoryPages, ...twentiethBattleIntroPages]
|
||||
},
|
||||
[twentiethBattleScenario.id]: {
|
||||
afterBattleId: twentiethBattleScenario.id,
|
||||
eyebrow: '다음 장 준비',
|
||||
title: '적벽 첫 전투 준비',
|
||||
description:
|
||||
'강동으로 향하는 길이 열렸습니다. 이제 제갈량과 손건은 손권과 주유를 설득해야 하고, 유비군은 장강에서 조조의 대군을 맞을 준비를 시작합니다.',
|
||||
rewardHint: '다음 장: 강동 회담과 적벽대전 첫 전투 준비 중',
|
||||
pages: twentiethBattleVictoryPages,
|
||||
unavailableNotice: '강동 회담과 적벽대전 첫 전투는 다음 작업에서 이어집니다. 군영에서 사절 문서, 화공 준비, 출전 후보를 정비하십시오.'
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -1260,6 +1260,69 @@ export const nineteenthBattleVictoryPages: StoryPage[] = [
|
||||
}
|
||||
];
|
||||
|
||||
export const twentiethBattleIntroPages: StoryPage[] = [
|
||||
{
|
||||
id: 'twentieth-envoy-road-opens',
|
||||
bgm: 'story-dark',
|
||||
chapter: '강동으로 가는 길',
|
||||
background: 'story-militia',
|
||||
speaker: '손건',
|
||||
text: '장판파의 피난로를 지나 유비군은 하구로 향합니다. 강동에 사절을 보내려면 조조군 추격대가 강나루를 닫기 전에 길을 열어야 합니다.'
|
||||
},
|
||||
{
|
||||
id: 'twentieth-zhuge-envoy-plan',
|
||||
bgm: 'battle-prep',
|
||||
chapter: '사절의 문서',
|
||||
background: 'story-liu-bei',
|
||||
speaker: '제갈량',
|
||||
text: '강동은 조조를 두려워하지만, 싸울 계산이 서야 움직입니다. 손건의 문서와 장판파의 기록을 나루까지 지켜야 합니다.'
|
||||
},
|
||||
{
|
||||
id: 'twentieth-generals-protect-envoy',
|
||||
bgm: 'battle-prep',
|
||||
chapter: '호위와 돌파',
|
||||
background: 'story-three-heroes',
|
||||
speaker: '관우',
|
||||
portrait: 'guanYu',
|
||||
text: '이번 길은 적을 많이 베는 것보다 사절을 온전히 보내는 일이 먼저입니다. 전열과 기동, 보급을 골고루 세우는 편성이 필요하겠습니다.'
|
||||
},
|
||||
{
|
||||
id: 'twentieth-jiangdong-envoy-sortie',
|
||||
bgm: 'battle-prep',
|
||||
chapter: '강동 사절로',
|
||||
background: 'story-sortie',
|
||||
speaker: '유비',
|
||||
portrait: 'liuBei',
|
||||
text: '선생과 손건이 강동에 닿아야 조조의 큰 군세를 막을 길이 열리오. 오늘은 칼끝만이 아니라 말과 문서를 지키는 싸움이오.'
|
||||
}
|
||||
];
|
||||
|
||||
export const twentiethBattleVictoryPages: StoryPage[] = [
|
||||
{
|
||||
id: 'twentieth-victory-river-port',
|
||||
bgm: 'militia-theme',
|
||||
chapter: '나루가 열리다',
|
||||
background: 'story-sortie',
|
||||
text: '문빙의 추격대가 물러서자 강나루의 문이 열렸습니다. 유비군은 피난 행렬을 뒤에 두고, 강동으로 향할 작은 배와 사절 문서를 지켜냈습니다.'
|
||||
},
|
||||
{
|
||||
id: 'twentieth-sun-qian-letter-ready',
|
||||
bgm: 'battle-prep',
|
||||
chapter: '손권에게 보낼 말',
|
||||
background: 'story-militia',
|
||||
speaker: '손건',
|
||||
text: '강동에 전할 말은 이제 분명합니다. 조조의 남하, 장판파의 피난로, 그리고 주공께서 백성을 버리지 않았다는 사실을 함께 적겠습니다.'
|
||||
},
|
||||
{
|
||||
id: 'twentieth-red-cliffs-near',
|
||||
bgm: 'story-dark',
|
||||
chapter: '적벽으로 부는 바람',
|
||||
background: 'story-three-heroes',
|
||||
speaker: '제갈량',
|
||||
text: '이제 강동의 마음을 움직일 차례입니다. 손권과 주유가 계산을 마치면, 조조의 대군은 장강 위에서 처음으로 멈춰 서게 될 것입니다.'
|
||||
}
|
||||
];
|
||||
|
||||
export const firstBattleMap: BattleMap = {
|
||||
width: 20,
|
||||
height: 18,
|
||||
@@ -1519,6 +1582,12 @@ export const nineteenthBattleMap: BattleMap = {
|
||||
terrain: createNineteenthBattleTerrain()
|
||||
};
|
||||
|
||||
export const twentiethBattleMap: BattleMap = {
|
||||
width: 40,
|
||||
height: 28,
|
||||
terrain: createTwentiethBattleTerrain()
|
||||
};
|
||||
|
||||
export const firstBattleUnits: UnitData[] = [
|
||||
{
|
||||
id: 'liu-bei',
|
||||
@@ -7239,6 +7308,384 @@ export const nineteenthBattleUnits: UnitData[] = [
|
||||
}
|
||||
];
|
||||
|
||||
const twentiethBattleAllyPositions: Record<string, { x: number; y: number }> = {
|
||||
'liu-bei': { x: 4, y: 22 },
|
||||
'guan-yu': { x: 5, y: 20 },
|
||||
'zhang-fei': { x: 6, y: 23 },
|
||||
'jian-yong': { x: 3, y: 24 },
|
||||
'mi-zhu': { x: 5, y: 25 },
|
||||
'sun-qian': { x: 7, y: 22 },
|
||||
'zhao-yun': { x: 8, y: 20 },
|
||||
'zhuge-liang': { x: 6, y: 21 }
|
||||
};
|
||||
|
||||
export const twentiethBattleUnits: UnitData[] = [
|
||||
...[
|
||||
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
|
||||
...xuzhouRecruitUnits,
|
||||
...caoBreakRecruitUnits,
|
||||
...liuBiaoRecruitUnits,
|
||||
...zhugeRecruitUnits
|
||||
].map((unit) => placeScenarioUnit(unit, twentiethBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
|
||||
{
|
||||
id: 'envoy-road-scout-a',
|
||||
name: '조조군 척후',
|
||||
faction: 'enemy',
|
||||
className: '나루 척후',
|
||||
classKey: 'bandit',
|
||||
level: 24,
|
||||
exp: 34,
|
||||
hp: 70,
|
||||
maxHp: 70,
|
||||
attack: 27,
|
||||
move: 4,
|
||||
stats: { might: 102, intelligence: 74, leadership: 80, agility: 100, luck: 70 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'yellow-turban-saber', level: 3, exp: 36 },
|
||||
armor: { itemId: 'rebel-vest', level: 3, exp: 4 },
|
||||
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
|
||||
},
|
||||
x: 13,
|
||||
y: 21
|
||||
},
|
||||
{
|
||||
id: 'envoy-road-scout-b',
|
||||
name: '조조군 척후',
|
||||
faction: 'enemy',
|
||||
className: '강변 척후',
|
||||
classKey: 'bandit',
|
||||
level: 24,
|
||||
exp: 34,
|
||||
hp: 70,
|
||||
maxHp: 70,
|
||||
attack: 27,
|
||||
move: 4,
|
||||
stats: { might: 102, intelligence: 74, leadership: 80, agility: 100, luck: 70 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'yellow-turban-saber', level: 3, exp: 36 },
|
||||
armor: { itemId: 'rebel-vest', level: 3, exp: 4 },
|
||||
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
|
||||
},
|
||||
x: 14,
|
||||
y: 24
|
||||
},
|
||||
{
|
||||
id: 'envoy-road-cavalry-a',
|
||||
name: '조조 추격기',
|
||||
faction: 'enemy',
|
||||
className: '추격 기병',
|
||||
classKey: 'cavalry',
|
||||
level: 25,
|
||||
exp: 36,
|
||||
hp: 94,
|
||||
maxHp: 94,
|
||||
attack: 32,
|
||||
move: 5,
|
||||
stats: { might: 116, intelligence: 74, leadership: 92, agility: 110, luck: 72 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'iron-spear', level: 3, exp: 44 },
|
||||
armor: { itemId: 'lamellar-armor', level: 3, exp: 18 },
|
||||
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
|
||||
},
|
||||
x: 17,
|
||||
y: 19
|
||||
},
|
||||
{
|
||||
id: 'envoy-road-cavalry-b',
|
||||
name: '조조 추격기',
|
||||
faction: 'enemy',
|
||||
className: '추격 기병',
|
||||
classKey: 'cavalry',
|
||||
level: 25,
|
||||
exp: 36,
|
||||
hp: 94,
|
||||
maxHp: 94,
|
||||
attack: 32,
|
||||
move: 5,
|
||||
stats: { might: 116, intelligence: 74, leadership: 92, agility: 110, luck: 72 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'iron-spear', level: 3, exp: 44 },
|
||||
armor: { itemId: 'lamellar-armor', level: 3, exp: 18 },
|
||||
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
|
||||
},
|
||||
x: 18,
|
||||
y: 23
|
||||
},
|
||||
{
|
||||
id: 'envoy-road-cavalry-c',
|
||||
name: '문빙 기병',
|
||||
faction: 'enemy',
|
||||
className: '나루 기병',
|
||||
classKey: 'cavalry',
|
||||
level: 26,
|
||||
exp: 38,
|
||||
hp: 98,
|
||||
maxHp: 98,
|
||||
attack: 33,
|
||||
move: 5,
|
||||
stats: { might: 118, intelligence: 76, leadership: 94, agility: 112, luck: 72 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'iron-spear', level: 3, exp: 50 },
|
||||
armor: { itemId: 'reinforced-lamellar', level: 3, exp: 26 },
|
||||
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
|
||||
},
|
||||
x: 25,
|
||||
y: 18
|
||||
},
|
||||
{
|
||||
id: 'envoy-road-cavalry-d',
|
||||
name: '문빙 기병',
|
||||
faction: 'enemy',
|
||||
className: '나루 기병',
|
||||
classKey: 'cavalry',
|
||||
level: 26,
|
||||
exp: 38,
|
||||
hp: 98,
|
||||
maxHp: 98,
|
||||
attack: 33,
|
||||
move: 5,
|
||||
stats: { might: 118, intelligence: 76, leadership: 94, agility: 112, luck: 72 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'iron-spear', level: 3, exp: 50 },
|
||||
armor: { itemId: 'reinforced-lamellar', level: 3, exp: 26 },
|
||||
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
|
||||
},
|
||||
x: 28,
|
||||
y: 21
|
||||
},
|
||||
{
|
||||
id: 'envoy-road-infantry-a',
|
||||
name: '나루 보병',
|
||||
faction: 'enemy',
|
||||
className: '강나루 보병',
|
||||
classKey: 'yellowTurban',
|
||||
level: 24,
|
||||
exp: 34,
|
||||
hp: 88,
|
||||
maxHp: 88,
|
||||
attack: 29,
|
||||
move: 3,
|
||||
stats: { might: 110, intelligence: 76, leadership: 94, agility: 82, luck: 70 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'iron-spear', level: 3, exp: 40 },
|
||||
armor: { itemId: 'lamellar-armor', level: 3, exp: 14 },
|
||||
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
|
||||
},
|
||||
x: 21,
|
||||
y: 19
|
||||
},
|
||||
{
|
||||
id: 'envoy-road-infantry-b',
|
||||
name: '나루 보병',
|
||||
faction: 'enemy',
|
||||
className: '강나루 보병',
|
||||
classKey: 'yellowTurban',
|
||||
level: 24,
|
||||
exp: 34,
|
||||
hp: 88,
|
||||
maxHp: 88,
|
||||
attack: 29,
|
||||
move: 3,
|
||||
stats: { might: 110, intelligence: 76, leadership: 94, agility: 82, luck: 70 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'iron-spear', level: 3, exp: 40 },
|
||||
armor: { itemId: 'lamellar-armor', level: 3, exp: 14 },
|
||||
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
|
||||
},
|
||||
x: 23,
|
||||
y: 21
|
||||
},
|
||||
{
|
||||
id: 'envoy-road-infantry-c',
|
||||
name: '문빙 보병',
|
||||
faction: 'enemy',
|
||||
className: '포구 보병',
|
||||
classKey: 'yellowTurban',
|
||||
level: 25,
|
||||
exp: 36,
|
||||
hp: 92,
|
||||
maxHp: 92,
|
||||
attack: 30,
|
||||
move: 3,
|
||||
stats: { might: 112, intelligence: 78, leadership: 96, agility: 84, luck: 71 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'iron-spear', level: 3, exp: 46 },
|
||||
armor: { itemId: 'reinforced-lamellar', level: 3, exp: 22 },
|
||||
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
|
||||
},
|
||||
x: 31,
|
||||
y: 16
|
||||
},
|
||||
{
|
||||
id: 'envoy-road-infantry-d',
|
||||
name: '문빙 보병',
|
||||
faction: 'enemy',
|
||||
className: '포구 보병',
|
||||
classKey: 'yellowTurban',
|
||||
level: 25,
|
||||
exp: 36,
|
||||
hp: 92,
|
||||
maxHp: 92,
|
||||
attack: 30,
|
||||
move: 3,
|
||||
stats: { might: 112, intelligence: 78, leadership: 96, agility: 84, luck: 71 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'iron-spear', level: 3, exp: 46 },
|
||||
armor: { itemId: 'reinforced-lamellar', level: 3, exp: 22 },
|
||||
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
|
||||
},
|
||||
x: 33,
|
||||
y: 19
|
||||
},
|
||||
{
|
||||
id: 'envoy-road-archer-a',
|
||||
name: '강변 궁병',
|
||||
faction: 'enemy',
|
||||
className: '강변 궁병',
|
||||
classKey: 'archer',
|
||||
level: 24,
|
||||
exp: 34,
|
||||
hp: 68,
|
||||
maxHp: 68,
|
||||
attack: 29,
|
||||
move: 3,
|
||||
stats: { might: 98, intelligence: 88, leadership: 86, agility: 96, luck: 72 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'short-bow', level: 3, exp: 42 },
|
||||
armor: { itemId: 'cloth-armor', level: 3, exp: 16 },
|
||||
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
|
||||
},
|
||||
x: 20,
|
||||
y: 15
|
||||
},
|
||||
{
|
||||
id: 'envoy-road-archer-b',
|
||||
name: '강변 궁병',
|
||||
faction: 'enemy',
|
||||
className: '언덕 궁병',
|
||||
classKey: 'archer',
|
||||
level: 24,
|
||||
exp: 34,
|
||||
hp: 68,
|
||||
maxHp: 68,
|
||||
attack: 29,
|
||||
move: 3,
|
||||
stats: { might: 98, intelligence: 88, leadership: 86, agility: 96, luck: 72 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'short-bow', level: 3, exp: 42 },
|
||||
armor: { itemId: 'cloth-armor', level: 3, exp: 16 },
|
||||
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
|
||||
},
|
||||
x: 27,
|
||||
y: 14
|
||||
},
|
||||
{
|
||||
id: 'envoy-road-archer-c',
|
||||
name: '포구 궁병',
|
||||
faction: 'enemy',
|
||||
className: '포구 궁병',
|
||||
classKey: 'archer',
|
||||
level: 25,
|
||||
exp: 36,
|
||||
hp: 70,
|
||||
maxHp: 70,
|
||||
attack: 30,
|
||||
move: 3,
|
||||
stats: { might: 100, intelligence: 90, leadership: 88, agility: 98, luck: 72 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'short-bow', level: 3, exp: 48 },
|
||||
armor: { itemId: 'cloth-armor', level: 3, exp: 20 },
|
||||
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
|
||||
},
|
||||
x: 35,
|
||||
y: 15
|
||||
},
|
||||
{
|
||||
id: 'envoy-road-guard-a',
|
||||
name: '포구 수비대',
|
||||
faction: 'enemy',
|
||||
className: '포구 수비대',
|
||||
classKey: 'yellowTurban',
|
||||
level: 26,
|
||||
exp: 38,
|
||||
hp: 100,
|
||||
maxHp: 100,
|
||||
attack: 32,
|
||||
move: 3,
|
||||
stats: { might: 118, intelligence: 80, leadership: 104, agility: 86, luck: 72 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'iron-spear', level: 3, exp: 52 },
|
||||
armor: { itemId: 'reinforced-lamellar', level: 3, exp: 28 },
|
||||
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
|
||||
},
|
||||
x: 35,
|
||||
y: 18
|
||||
},
|
||||
{
|
||||
id: 'envoy-road-guard-b',
|
||||
name: '포구 수비대',
|
||||
faction: 'enemy',
|
||||
className: '포구 수비대',
|
||||
classKey: 'yellowTurban',
|
||||
level: 26,
|
||||
exp: 38,
|
||||
hp: 100,
|
||||
maxHp: 100,
|
||||
attack: 32,
|
||||
move: 3,
|
||||
stats: { might: 118, intelligence: 80, leadership: 104, agility: 86, luck: 72 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'iron-spear', level: 3, exp: 52 },
|
||||
armor: { itemId: 'reinforced-lamellar', level: 3, exp: 28 },
|
||||
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
|
||||
},
|
||||
x: 36,
|
||||
y: 20
|
||||
},
|
||||
{
|
||||
id: 'envoy-road-strategist-a',
|
||||
name: '조조군 군리',
|
||||
faction: 'enemy',
|
||||
className: '군리',
|
||||
classKey: 'archer',
|
||||
level: 25,
|
||||
exp: 36,
|
||||
hp: 72,
|
||||
maxHp: 72,
|
||||
attack: 29,
|
||||
move: 3,
|
||||
stats: { might: 78, intelligence: 98, leadership: 90, agility: 86, luck: 74 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'short-bow', level: 3, exp: 50 },
|
||||
armor: { itemId: 'cloth-armor', level: 3, exp: 22 },
|
||||
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
|
||||
},
|
||||
x: 34,
|
||||
y: 14
|
||||
},
|
||||
{
|
||||
id: 'envoy-road-leader-wen-pin',
|
||||
name: '문빙',
|
||||
faction: 'enemy',
|
||||
className: '조조군 추격장',
|
||||
classKey: 'rebelLeader',
|
||||
level: 27,
|
||||
exp: 42,
|
||||
hp: 132,
|
||||
maxHp: 132,
|
||||
attack: 34,
|
||||
move: 4,
|
||||
stats: { might: 120, intelligence: 86, leadership: 112, agility: 90, luck: 76 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'leader-axe', level: 4, exp: 4 },
|
||||
armor: { itemId: 'reinforced-lamellar', level: 3, exp: 36 },
|
||||
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
|
||||
},
|
||||
x: 37,
|
||||
y: 17
|
||||
}
|
||||
];
|
||||
|
||||
export const firstBattleBonds: BattleBond[] = [
|
||||
{
|
||||
id: 'liu-bei__guan-yu',
|
||||
@@ -7390,6 +7837,7 @@ export const eighteenthBattleBonds: BattleBond[] = [...sixteenthBattleBonds, ...
|
||||
cloneBattleBondForScenario
|
||||
);
|
||||
export const nineteenthBattleBonds: BattleBond[] = [...eighteenthBattleBonds].map(cloneBattleBondForScenario);
|
||||
export const twentiethBattleBonds: BattleBond[] = [...nineteenthBattleBonds].map(cloneBattleBondForScenario);
|
||||
|
||||
function createEighthBattleTerrain(): TerrainType[][] {
|
||||
return Array.from({ length: 22 }, (_, y) =>
|
||||
@@ -7954,6 +8402,62 @@ function createNineteenthBattleTerrain(): TerrainType[][] {
|
||||
);
|
||||
}
|
||||
|
||||
function createTwentiethBattleTerrain(): TerrainType[][] {
|
||||
return Array.from({ length: 28 }, (_, y) =>
|
||||
Array.from({ length: 40 }, (_, x): TerrainType => {
|
||||
if ((x <= 3 && y >= 21 && y <= 26) || (x >= 4 && x <= 7 && y >= 23 && y <= 26)) {
|
||||
return 'camp';
|
||||
}
|
||||
if ((x >= 34 && x <= 39 && y >= 14 && y <= 21) || (x >= 31 && x <= 34 && y >= 15 && y <= 18)) {
|
||||
return 'fort';
|
||||
}
|
||||
if ((x >= 13 && x <= 16 && y >= 18 && y <= 20) || (x >= 29 && x <= 31 && y >= 15 && y <= 17)) {
|
||||
return 'village';
|
||||
}
|
||||
if (
|
||||
(y === 22 && x >= 3 && x <= 15) ||
|
||||
(y === 20 && x >= 14 && x <= 26) ||
|
||||
(y === 17 && x >= 26 && x <= 36) ||
|
||||
(x === 34 && y >= 14 && y <= 22)
|
||||
) {
|
||||
return 'road';
|
||||
}
|
||||
if (
|
||||
(x >= 6 && x <= 16 && y === 24 - Math.floor(x / 2)) ||
|
||||
(x >= 16 && x <= 31 && y === Math.floor(x / 2) + 8) ||
|
||||
(x >= 5 && x <= 12 && y === 23)
|
||||
) {
|
||||
return 'road';
|
||||
}
|
||||
if ((x === 22 || x === 23) && y >= 0 && y <= 27) {
|
||||
return 'river';
|
||||
}
|
||||
if ((x === 28 || x === 29) && y >= 0 && y <= 14) {
|
||||
return 'river';
|
||||
}
|
||||
if (
|
||||
(x >= 5 && x <= 15 && y >= 8 && y <= 17) ||
|
||||
(x >= 16 && x <= 21 && y >= 21 && y <= 27) ||
|
||||
(x <= 9 && y <= 8) ||
|
||||
(x >= 29 && x <= 38 && y <= 9)
|
||||
) {
|
||||
return 'forest';
|
||||
}
|
||||
if (
|
||||
(x >= 10 && x <= 17 && y >= 2 && y <= 6) ||
|
||||
(x >= 25 && x <= 33 && y >= 22 && y <= 27) ||
|
||||
(x >= 31 && x <= 39 && y >= 3 && y <= 7)
|
||||
) {
|
||||
return 'hill';
|
||||
}
|
||||
if ((x <= 1 && y <= 13) || (x >= 38 && y <= 11) || (x >= 38 && y >= 23)) {
|
||||
return 'cliff';
|
||||
}
|
||||
return 'plain';
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
function placeScenarioUnit(unit: UnitData, position: { x: number; y: number }): UnitData {
|
||||
return {
|
||||
...cloneUnitForScenario(unit),
|
||||
|
||||
Reference in New Issue
Block a user