Add Yi Province relief road chapter

This commit is contained in:
2026-06-23 08:55:39 +09:00
parent 2402e1c38f
commit 17cbaab55d
11 changed files with 1251 additions and 49 deletions

View File

@@ -63,6 +63,10 @@ import {
twentySixthBattleMap,
twentySixthBattleUnits,
twentySixthBattleVictoryPages,
twentySeventhBattleBonds,
twentySeventhBattleMap,
twentySeventhBattleUnits,
twentySeventhBattleVictoryPages,
twentiethBattleBonds,
twentiethBattleMap,
twentiethBattleUnits,
@@ -135,7 +139,8 @@ export type BattleScenarioId =
| 'twenty-third-battle-jingzhou-south-entry'
| 'twenty-fourth-battle-guiyang-persuasion'
| 'twenty-fifth-battle-wuling-mountain-road'
| 'twenty-sixth-battle-changsha-veteran';
| 'twenty-sixth-battle-changsha-veteran'
| 'twenty-seventh-battle-yizhou-relief-road';
export type BattleObjectiveKind = 'defeat-leader' | 'keep-unit-alive' | 'secure-terrain' | 'quick-victory';
@@ -1633,6 +1638,69 @@ export const twentySixthBattleScenario: BattleScenarioDefinition = {
nextCampScene: 'CampScene'
};
export const twentySeventhBattleScenario: BattleScenarioDefinition = {
id: 'twenty-seventh-battle-yizhou-relief-road',
title: '익주 원군로',
victoryConditionLabel: '양회 퇴각',
defeatConditionLabel: '유비 또는 제갈량 퇴각',
openingObjectiveLines: [
'장사까지 안정시킨 유비군은 유장의 원군 요청을 따라 익주로 향합니다. 원군로에는 양회의 전초 병력이 관문과 마을을 함께 틀어쥐고 있습니다.',
'이번 전투는 길목의 마을을 지키면서 관문 전열을 무너뜨려야 합니다. 황충과 위연까지 합류한 큰 로스터에서 산길, 돌파, 책략 역할을 직접 골라 출전하십시오.',
'유비와 제갈량을 지키며 양회를 물러나게 하면 봉추 방통이 군영에 합류합니다.'
],
map: twentySeventhBattleMap,
units: twentySeventhBattleUnits,
bonds: twentySeventhBattleBonds,
mapTextureKey: 'battle-map-twenty-seventh',
leaderUnitId: 'yizhou-leader-yang-huai',
quickVictoryTurnLimit: 36,
baseVictoryGold: 3760,
objectives: [
{
id: 'leader',
kind: 'defeat-leader',
label: '양회 퇴각',
rewardGold: 2420,
unitId: 'yizhou-leader-yang-huai'
},
{
id: 'liu-bei',
kind: 'keep-unit-alive',
label: '유비 생존',
rewardGold: 700,
unitId: 'liu-bei'
},
{
id: 'zhuge-liang',
kind: 'keep-unit-alive',
label: '제갈량 생존',
rewardGold: 980,
unitId: 'zhuge-liang'
},
{
id: 'yizhou-village',
kind: 'secure-terrain',
label: '익주 마을 안정',
rewardGold: 1160,
terrain: 'village'
},
{
id: 'quick',
kind: 'quick-victory',
label: '36턴 이내 승리',
rewardGold: 920,
maxTurn: 36
}
],
defeatConditions: [
{ kind: 'unit-defeated', unitId: 'liu-bei' },
{ kind: 'unit-defeated', unitId: 'zhuge-liang' }
],
itemRewards: ['콩 12', '상처약 9', '탁주 5', '익주 길목 지도 +1', '방통 합류'],
victoryPages: twentySeventhBattleVictoryPages,
nextCampScene: 'CampScene'
};
export const defaultBattleScenarioId: BattleScenarioId = firstBattleScenario.id;
export const battleScenarios: Record<BattleScenarioId, BattleScenarioDefinition> = {
@@ -1661,7 +1729,8 @@ export const battleScenarios: Record<BattleScenarioId, BattleScenarioDefinition>
'twenty-third-battle-jingzhou-south-entry': twentyThirdBattleScenario,
'twenty-fourth-battle-guiyang-persuasion': twentyFourthBattleScenario,
'twenty-fifth-battle-wuling-mountain-road': twentyFifthBattleScenario,
'twenty-sixth-battle-changsha-veteran': twentySixthBattleScenario
'twenty-sixth-battle-changsha-veteran': twentySixthBattleScenario,
'twenty-seventh-battle-yizhou-relief-road': twentySeventhBattleScenario
};
export const defaultBattleScenario = battleScenarios[defaultBattleScenarioId];

View File

@@ -23,6 +23,7 @@ import {
twentyFifthBattleScenario,
twentyFourthBattleScenario,
twentySixthBattleScenario,
twentySeventhBattleScenario,
twentiethBattleScenario,
twelfthBattleScenario,
thirdBattleScenario,
@@ -74,6 +75,8 @@ import {
twentyFourthBattleVictoryPages,
twentySixthBattleIntroPages,
twentySixthBattleVictoryPages,
twentySeventhBattleIntroPages,
twentySeventhBattleVictoryPages,
twentiethBattleIntroPages,
twentiethBattleVictoryPages,
twelfthBattleIntroPages,
@@ -361,13 +364,24 @@ const sortieFlows: Record<string, SortieFlow> = {
},
[twentySixthBattleScenario.id]: {
afterBattleId: twentySixthBattleScenario.id,
eyebrow: '다음 장 준비',
title: '익주 진입 준비',
eyebrow: '다음 장',
title: twentySeventhBattleScenario.title,
description:
'장사까지 열리며 형주 남부의 뿌리가 단단해졌습니다. 다음은 익주로 향하는 더 긴 정치와 전장의 길을 준비해야 합니다.',
rewardHint: '다음 장: 익주 진입 준비 중',
pages: twentySixthBattleVictoryPages,
unavailableNotice: '익주 진입 장은 다음 작업에서 이어집니다. 군영에서 황충과 위연을 살피고 다음 대장정의 출전 후보를 정비하십시오.'
'장사까지 열리며 형주 남부의 뿌리가 단단해졌습니다. 이제 유장의 원군 요청을 명분으로 익주 원군로를 열고, 봉추 방통의 마음까지 얻어야 합니다.',
rewardHint: `예상 보상: ${twentySeventhBattleScenario.title} 개방 / 방통 합류`,
nextBattleId: twentySeventhBattleScenario.id,
campaignStep: 'twenty-seventh-battle',
pages: [...twentySixthBattleVictoryPages, ...twentySeventhBattleIntroPages]
},
[twentySeventhBattleScenario.id]: {
afterBattleId: twentySeventhBattleScenario.id,
eyebrow: '다음 장 준비',
title: '부수관 진입 준비',
description:
'익주 원군로가 열리고 방통이 합류했습니다. 이제 유비군은 촉의 깊은 산문과 부수관으로 들어가기 전, 와룡과 봉추의 계책을 함께 다듬어야 합니다.',
rewardHint: '다음 장: 부수관 진입 준비 중',
pages: twentySeventhBattleVictoryPages,
unavailableNotice: '부수관 이후 익주 심부 장은 다음 작업에서 이어집니다. 군영에서 방통과 기존 무장들의 공명도를 올리고 다음 대장정의 출전 후보를 정비하십시오.'
}
};

View File

@@ -1704,6 +1704,68 @@ export const twentySixthBattleVictoryPages: StoryPage[] = [
}
];
export const twentySeventhBattleIntroPages: StoryPage[] = [
{
id: 'twenty-seventh-yizhou-request',
bgm: 'story-dark',
chapter: '익주에서 온 요청',
background: 'story-three-heroes',
speaker: '손건',
text: '익주의 유장이 한중 장로의 압박을 두려워하여 원군을 청했습니다. 형주 남부를 안정시킨 지금, 이 요청은 촉으로 향하는 첫 문이 될 수 있습니다.'
},
{
id: 'twenty-seventh-pang-tong-rumor',
bgm: 'battle-prep',
chapter: '봉추의 그림자',
background: 'story-liu-bei',
speaker: '제갈량',
text: '익주로 들어가는 길목에는 봉추라 불리는 방통이 머문다는 소문이 있습니다. 그가 뜻을 함께한다면, 산과 관문으로 막힌 촉의 길도 달리 보일 것입니다.'
},
{
id: 'twenty-seventh-gate-warning',
bgm: 'story-dark',
chapter: '원군로의 관문',
background: 'story-militia',
speaker: '마량',
text: '양회가 이끄는 전초 병력이 원군로를 막고 있습니다. 길목의 마을을 지켜 명분을 잃지 않고, 산길의 척후를 먼저 끊어야 합니다.'
},
{
id: 'twenty-seventh-yizhou-sortie',
bgm: 'battle-prep',
chapter: '익주 원군로',
background: 'story-sortie',
speaker: '유비',
portrait: 'liuBei',
text: '우리는 익주를 빼앗으러 가는 것이 아니라, 백성을 지키라는 부름에 응하는 것이오. 군율을 세우고 길을 열어 봉추의 마음까지 얻어 봅시다.'
}
];
export const twentySeventhBattleVictoryPages: StoryPage[] = [
{
id: 'twenty-seventh-victory-road-open',
bgm: 'militia-theme',
chapter: '익주의 길이 열리다',
background: 'story-sortie',
text: '양회의 전초 병력이 물러나고 익주 원군로가 열렸습니다. 유비군은 마을의 창고를 건드리지 않고 길목을 안정시켜, 원군이라는 명분을 분명히 세웠습니다.'
},
{
id: 'twenty-seventh-pang-tong-joins',
bgm: 'battle-prep',
chapter: '방통의 합류',
background: 'story-liu-bei',
speaker: '방통',
text: '인의를 말로만 내세우는 군은 많으나, 길목의 작은 마을까지 지키며 움직이는 군은 드뭅니다. 이 방통, 촉으로 향하는 험한 길을 함께 보겠습니다.'
},
{
id: 'twenty-seventh-next-fu-pass',
bgm: 'story-dark',
chapter: '부수관을 바라보다',
background: 'story-three-heroes',
speaker: '제갈량',
text: '봉추가 합류하니 익주의 지세와 사람의 마음을 함께 읽을 수 있게 되었습니다. 다음 길은 부수관과 낙성으로 이어지는 더 깊은 산문입니다.'
}
];
export const firstBattleMap: BattleMap = {
width: 20,
height: 18,
@@ -2005,6 +2067,12 @@ export const twentySixthBattleMap: BattleMap = {
terrain: createTwentySixthBattleTerrain()
};
export const twentySeventhBattleMap: BattleMap = {
width: 54,
height: 36,
terrain: createTwentySeventhBattleTerrain()
};
export const firstBattleUnits: UnitData[] = [
{
id: 'liu-bei',
@@ -4078,6 +4146,30 @@ export const changshaRecruitUnits: UnitData[] = [
}
];
export const yizhouRecruitUnits: UnitData[] = [
{
id: 'pang-tong',
name: '방통',
faction: 'ally',
className: '봉추 책사',
classKey: 'strategist',
level: 16,
exp: 0,
hp: 36,
maxHp: 36,
attack: 9,
move: 4,
stats: { might: 44, intelligence: 96, leadership: 88, agility: 72, luck: 82 },
equipment: {
weapon: { itemId: 'white-feather-fan', level: 2, exp: 16 },
armor: { itemId: 'cloth-armor', level: 2, exp: 12 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 8,
y: 24
}
];
const eighthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 2, y: 17 },
'guan-yu': { x: 3, y: 17 },
@@ -10584,6 +10676,435 @@ export const twentySixthBattleUnits: UnitData[] = [
}
];
const twentySeventhBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 4, y: 30 },
'guan-yu': { x: 6, y: 29 },
'zhang-fei': { x: 5, y: 32 },
'jian-yong': { x: 3, y: 33 },
'mi-zhu': { x: 4, y: 34 },
'sun-qian': { x: 7, y: 33 },
'zhao-yun': { x: 8, y: 30 },
'zhuge-liang': { x: 5, y: 30 },
'ma-liang': { x: 8, y: 34 },
'yi-ji': { x: 9, y: 32 },
'gong-zhi': { x: 10, y: 34 },
'huang-zhong': { x: 7, y: 31 },
'wei-yan': { x: 9, y: 29 }
};
export const twentySeventhBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits
].map((unit) => placeScenarioUnit(unit, twentySeventhBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
{
id: 'yizhou-scout-a',
name: '익주 척후',
faction: 'enemy',
className: '산길 척후',
classKey: 'bandit',
level: 41,
exp: 62,
hp: 106,
maxHp: 106,
attack: 40,
move: 4,
stats: { might: 128, intelligence: 92, leadership: 104, agility: 120, luck: 84 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 42 },
armor: { itemId: 'rebel-vest', level: 4, exp: 28 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 16,
y: 30
},
{
id: 'yizhou-scout-b',
name: '익주 척후',
faction: 'enemy',
className: '관문 척후',
classKey: 'bandit',
level: 41,
exp: 62,
hp: 106,
maxHp: 106,
attack: 40,
move: 4,
stats: { might: 128, intelligence: 92, leadership: 104, agility: 120, luck: 84 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 42 },
armor: { itemId: 'rebel-vest', level: 4, exp: 28 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 20,
y: 28
},
{
id: 'yizhou-infantry-a',
name: '익주 보병',
faction: 'enemy',
className: '원군로 보병',
classKey: 'yellowTurban',
level: 42,
exp: 64,
hp: 140,
maxHp: 140,
attack: 44,
move: 3,
stats: { might: 142, intelligence: 92, leadership: 120, agility: 100, luck: 84 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 58 },
armor: { itemId: 'lamellar-armor', level: 4, exp: 42 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 24,
y: 27
},
{
id: 'yizhou-infantry-b',
name: '익주 보병',
faction: 'enemy',
className: '고개 보병',
classKey: 'yellowTurban',
level: 42,
exp: 64,
hp: 140,
maxHp: 140,
attack: 44,
move: 3,
stats: { might: 142, intelligence: 92, leadership: 120, agility: 100, luck: 84 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 58 },
armor: { itemId: 'lamellar-armor', level: 4, exp: 42 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 28,
y: 24
},
{
id: 'yizhou-infantry-c',
name: '익주 보병',
faction: 'enemy',
className: '관문 보병',
classKey: 'yellowTurban',
level: 43,
exp: 66,
hp: 148,
maxHp: 148,
attack: 46,
move: 3,
stats: { might: 146, intelligence: 94, leadership: 124, agility: 102, luck: 84 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 8 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 48 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 35,
y: 21
},
{
id: 'yizhou-infantry-d',
name: '익주 보병',
faction: 'enemy',
className: '성문 보병',
classKey: 'yellowTurban',
level: 43,
exp: 66,
hp: 148,
maxHp: 148,
attack: 46,
move: 3,
stats: { might: 146, intelligence: 94, leadership: 124, agility: 102, luck: 84 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 8 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 48 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 40,
y: 17
},
{
id: 'yizhou-archer-a',
name: '익주 궁병',
faction: 'enemy',
className: '산비탈 궁병',
classKey: 'archer',
level: 42,
exp: 64,
hp: 104,
maxHp: 104,
attack: 42,
move: 3,
stats: { might: 102, intelligence: 102, leadership: 108, agility: 116, luck: 86 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 54 },
armor: { itemId: 'cloth-armor', level: 4, exp: 34 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 30,
y: 21
},
{
id: 'yizhou-archer-b',
name: '익주 궁병',
faction: 'enemy',
className: '관문 궁병',
classKey: 'archer',
level: 43,
exp: 66,
hp: 108,
maxHp: 108,
attack: 43,
move: 3,
stats: { might: 104, intelligence: 104, leadership: 110, agility: 118, luck: 86 },
equipment: {
weapon: { itemId: 'short-bow', level: 5, exp: 4 },
armor: { itemId: 'cloth-armor', level: 4, exp: 38 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 42,
y: 15
},
{
id: 'yizhou-archer-c',
name: '익주 궁병',
faction: 'enemy',
className: '성루 궁병',
classKey: 'archer',
level: 43,
exp: 66,
hp: 108,
maxHp: 108,
attack: 43,
move: 3,
stats: { might: 104, intelligence: 104, leadership: 110, agility: 118, luck: 86 },
equipment: {
weapon: { itemId: 'short-bow', level: 5, exp: 4 },
armor: { itemId: 'cloth-armor', level: 4, exp: 38 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 47,
y: 19
},
{
id: 'yizhou-cavalry-a',
name: '익주 기병',
faction: 'enemy',
className: '원군로 기병',
classKey: 'cavalry',
level: 43,
exp: 66,
hp: 148,
maxHp: 148,
attack: 47,
move: 5,
stats: { might: 146, intelligence: 92, leadership: 120, agility: 120, luck: 86 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 10 },
armor: { itemId: 'lamellar-armor', level: 4, exp: 44 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 22,
y: 31
},
{
id: 'yizhou-cavalry-b',
name: '익주 기병',
faction: 'enemy',
className: '산문 기병',
classKey: 'cavalry',
level: 43,
exp: 66,
hp: 148,
maxHp: 148,
attack: 47,
move: 5,
stats: { might: 146, intelligence: 92, leadership: 120, agility: 120, luck: 86 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 10 },
armor: { itemId: 'lamellar-armor', level: 4, exp: 44 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 37,
y: 28
},
{
id: 'yizhou-cavalry-c',
name: '익주 기병',
faction: 'enemy',
className: '성문 기병',
classKey: 'cavalry',
level: 44,
exp: 68,
hp: 154,
maxHp: 154,
attack: 49,
move: 5,
stats: { might: 150, intelligence: 94, leadership: 124, agility: 122, luck: 86 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 18 },
armor: { itemId: 'lamellar-armor', level: 5, exp: 4 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 45,
y: 25
},
{
id: 'yizhou-guard-a',
name: '양회 친위대',
faction: 'enemy',
className: '관문 친위대',
classKey: 'yellowTurban',
level: 44,
exp: 68,
hp: 158,
maxHp: 158,
attack: 49,
move: 3,
stats: { might: 152, intelligence: 96, leadership: 128, agility: 104, luck: 86 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 20 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 8 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 46,
y: 15
},
{
id: 'yizhou-guard-b',
name: '양회 친위대',
faction: 'enemy',
className: '성문 친위대',
classKey: 'yellowTurban',
level: 44,
exp: 68,
hp: 158,
maxHp: 158,
attack: 49,
move: 3,
stats: { might: 152, intelligence: 96, leadership: 128, agility: 104, luck: 86 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 20 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 8 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 49,
y: 17
},
{
id: 'yizhou-strategist-a',
name: '익주 책사',
faction: 'enemy',
className: '관문 책사',
classKey: 'archer',
level: 43,
exp: 66,
hp: 108,
maxHp: 108,
attack: 43,
move: 3,
stats: { might: 92, intelligence: 120, leadership: 112, agility: 98, luck: 86 },
equipment: {
weapon: { itemId: 'short-bow', level: 5, exp: 4 },
armor: { itemId: 'cloth-armor', level: 4, exp: 38 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 41,
y: 13
},
{
id: 'yizhou-strategist-b',
name: '익주 책사',
faction: 'enemy',
className: '성문 책사',
classKey: 'archer',
level: 43,
exp: 66,
hp: 108,
maxHp: 108,
attack: 43,
move: 3,
stats: { might: 92, intelligence: 120, leadership: 112, agility: 98, luck: 86 },
equipment: {
weapon: { itemId: 'short-bow', level: 5, exp: 4 },
armor: { itemId: 'cloth-armor', level: 4, exp: 38 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 48,
y: 21
},
{
id: 'yizhou-ambusher-a',
name: '복병',
faction: 'enemy',
className: '숲길 복병',
classKey: 'bandit',
level: 42,
exp: 64,
hp: 112,
maxHp: 112,
attack: 42,
move: 4,
stats: { might: 132, intelligence: 94, leadership: 106, agility: 124, luck: 84 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 48 },
armor: { itemId: 'rebel-vest', level: 4, exp: 32 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 31,
y: 30
},
{
id: 'yizhou-ambusher-b',
name: '복병',
faction: 'enemy',
className: '고개 복병',
classKey: 'bandit',
level: 42,
exp: 64,
hp: 112,
maxHp: 112,
attack: 42,
move: 4,
stats: { might: 132, intelligence: 94, leadership: 106, agility: 124, luck: 84 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 48 },
armor: { itemId: 'rebel-vest', level: 4, exp: 32 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 36,
y: 8
},
{
id: 'yizhou-leader-yang-huai',
name: '양회',
faction: 'enemy',
className: '익주 관문장',
classKey: 'rebelLeader',
level: 45,
exp: 72,
hp: 204,
maxHp: 204,
attack: 50,
move: 4,
stats: { might: 150, intelligence: 112, leadership: 136, agility: 106, luck: 88 },
equipment: {
weapon: { itemId: 'leader-axe', level: 5, exp: 20 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 16 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 50,
y: 16
}
];
export const firstBattleBonds: BattleBond[] = [
{
id: 'liu-bei__guan-yu',
@@ -10827,6 +11348,33 @@ export const changshaRecruitBonds: BattleBond[] = [
}
];
export const yizhouRecruitBonds: BattleBond[] = [
{
id: 'liu-bei__pang-tong',
unitIds: ['liu-bei', 'pang-tong'],
title: '봉추가 보는 인의',
level: 36,
exp: 0,
description: '유비의 인의와 방통의 날카로운 지략이 만나, 익주의 산문을 명분과 속도로 함께 열어 갑니다.'
},
{
id: 'zhuge-liang__pang-tong',
unitIds: ['zhuge-liang', 'pang-tong'],
title: '와룡과 봉추',
level: 34,
exp: 0,
description: '제갈량의 큰 판과 방통의 과감한 계책이 맞물려, 어려운 지형에서도 새로운 돌파구를 찾아냅니다.'
},
{
id: 'huang-zhong__pang-tong',
unitIds: ['huang-zhong', 'pang-tong'],
title: '노궁과 기책',
level: 30,
exp: 0,
description: '황충의 침착한 활과 방통의 기책이 이어져, 멀리 버틴 적의 전열을 흔드는 선택지가 늘어납니다.'
}
];
export const secondBattleBonds: BattleBond[] = firstBattleBonds.map(cloneBattleBondForScenario);
export const thirdBattleBonds: BattleBond[] = firstBattleBonds.map(cloneBattleBondForScenario);
export const fourthBattleBonds: BattleBond[] = firstBattleBonds.map(cloneBattleBondForScenario);
@@ -10858,6 +11406,7 @@ export const twentyThirdBattleBonds: BattleBond[] = [...twentySecondBattleBonds]
export const twentyFourthBattleBonds: BattleBond[] = [...twentyThirdBattleBonds, ...jingzhouRecruitBonds].map(cloneBattleBondForScenario);
export const twentyFifthBattleBonds: BattleBond[] = [...twentyFourthBattleBonds, ...guiyangRecruitBonds].map(cloneBattleBondForScenario);
export const twentySixthBattleBonds: BattleBond[] = [...twentyFifthBattleBonds, ...wulingRecruitBonds].map(cloneBattleBondForScenario);
export const twentySeventhBattleBonds: BattleBond[] = [...twentySixthBattleBonds, ...changshaRecruitBonds].map(cloneBattleBondForScenario);
function createEighthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 22 }, (_, y) =>
@@ -11823,6 +12372,62 @@ function createTwentySixthBattleTerrain(): TerrainType[][] {
);
}
function createTwentySeventhBattleTerrain(): TerrainType[][] {
return Array.from({ length: 36 }, (_, y) =>
Array.from({ length: 54 }, (_, x): TerrainType => {
if (x <= 4 && y >= 29) {
return 'camp';
}
if ((x >= 45 && x <= 52 && y >= 12 && y <= 20) || (x >= 41 && x <= 47 && y >= 9 && y <= 14)) {
return 'fort';
}
if ((x >= 18 && x <= 20 && y >= 27 && y <= 29) || (x >= 32 && x <= 34 && y >= 22 && y <= 24) || (x >= 38 && x <= 40 && y >= 16 && y <= 18)) {
return 'village';
}
if (
(y >= 31 && x >= 4 && x <= 15) ||
(x >= 14 && x <= 24 && y >= 27 && y <= 31) ||
(x >= 23 && x <= 33 && y >= 23 && y <= 27) ||
(x >= 32 && x <= 40 && y >= 18 && y <= 23) ||
(x >= 39 && x <= 48 && y >= 14 && y <= 18) ||
(x >= 47 && x <= 51 && y >= 15 && y <= 17)
) {
return 'road';
}
if ((x === 12 || x === 13) && y >= 0 && y <= 25) {
return 'river';
}
if ((x === 29 || x === 30) && y >= 4 && y <= 21) {
return 'river';
}
if ((x === 36 || x === 37) && y >= 25 && y <= 35) {
return 'river';
}
if (
(x >= 4 && x <= 16 && y >= 8 && y <= 20) ||
(x >= 17 && x <= 28 && y >= 10 && y <= 21) ||
(x >= 31 && x <= 42 && y >= 25 && y <= 35) ||
(x >= 41 && x <= 53 && y >= 22 && y <= 33)
) {
return 'forest';
}
if (
(x >= 0 && x <= 10 && y <= 11) ||
(x >= 20 && x <= 28 && y <= 9) ||
(x >= 31 && x <= 43 && y >= 4 && y <= 12) ||
(x >= 47 && x <= 53 && y <= 11) ||
(x >= 22 && x <= 31 && y >= 29 && y <= 35)
) {
return 'hill';
}
if ((x <= 2 && y <= 28) || (x >= 52 && y >= 20) || (x >= 43 && x <= 45 && y <= 8)) {
return 'cliff';
}
return 'plain';
})
);
}
function placeScenarioUnit(unit: UnitData, position: { x: number; y: number }): UnitData {
return {
...cloneUnitForScenario(unit),