Add Cao Cao refuge road chapter
This commit is contained in:
@@ -704,6 +704,61 @@ export const tenthBattleVictoryPages: StoryPage[] = [
|
||||
}
|
||||
];
|
||||
|
||||
export const eleventhBattleIntroPages: StoryPage[] = [
|
||||
{
|
||||
id: 'eleventh-arrive-cao-cao-camp',
|
||||
bgm: 'story-dark',
|
||||
chapter: '조조의 장막',
|
||||
background: 'story-liu-bei',
|
||||
text: '서주를 잃은 유비군은 허도로 향했다. 조조는 웃으며 맞이했지만, 그 웃음 뒤에는 사람을 재는 날카로운 눈빛이 숨어 있었다.'
|
||||
},
|
||||
{
|
||||
id: 'eleventh-cao-cao-test',
|
||||
bgm: 'militia-theme',
|
||||
chapter: '의탁의 대가',
|
||||
background: 'story-militia',
|
||||
speaker: '간옹',
|
||||
text: '현덕, 조조는 우리에게 머물 곳을 주겠지만 공짜로 주지는 않을 걸세. 허도 입성로에 남은 원술 잔군을 치라는 명은 환대이자 시험이지.'
|
||||
},
|
||||
{
|
||||
id: 'eleventh-brothers-under-watch',
|
||||
bgm: 'story-dark',
|
||||
chapter: '감시 속의 출진',
|
||||
background: 'story-three-heroes',
|
||||
speaker: '관우',
|
||||
portrait: 'guanYu',
|
||||
text: '형님, 조조의 깃발 아래 싸우더라도 우리의 칼끝은 백성을 향하지 않습니다. 명을 따르되 뜻은 잃지 않겠습니다.'
|
||||
},
|
||||
{
|
||||
id: 'eleventh-xudu-road-sortie',
|
||||
bgm: 'battle-prep',
|
||||
chapter: '허도 입성로',
|
||||
background: 'story-sortie',
|
||||
speaker: '유비',
|
||||
portrait: 'liuBei',
|
||||
text: '지금은 몸을 낮추어야 할 때다. 그러나 낮춘 몸 안에서도 마음까지 굽힐 수는 없다. 길을 열고, 살아남아 다시 일어서자.'
|
||||
}
|
||||
];
|
||||
|
||||
export const eleventhBattleVictoryPages: StoryPage[] = [
|
||||
{
|
||||
id: 'eleventh-victory-road-cleared',
|
||||
bgm: 'militia-theme',
|
||||
chapter: '열린 허도 길',
|
||||
background: 'story-militia',
|
||||
text: '원술 잔군은 물러났고 허도로 향하는 길이 열렸다. 조조군의 감시병들은 유비군의 전열과 군율을 조용히 기록했다.'
|
||||
},
|
||||
{
|
||||
id: 'eleventh-cao-cao-accepts',
|
||||
bgm: 'story-dark',
|
||||
chapter: '웃음 속의 칼',
|
||||
background: 'story-liu-bei',
|
||||
speaker: '유비',
|
||||
portrait: 'liuBei',
|
||||
text: '조조의 장막은 비바람을 피하게 해 주지만, 그 안의 공기는 오래 머물수록 무겁다. 나는 살아남기 위해 들어가되, 나올 날을 잊지 않겠다.'
|
||||
}
|
||||
];
|
||||
|
||||
export const firstBattleMap: BattleMap = {
|
||||
width: 20,
|
||||
height: 18,
|
||||
@@ -909,6 +964,12 @@ export const tenthBattleMap: BattleMap = {
|
||||
terrain: createTenthBattleTerrain()
|
||||
};
|
||||
|
||||
export const eleventhBattleMap: BattleMap = {
|
||||
width: 28,
|
||||
height: 22,
|
||||
terrain: createEleventhBattleTerrain()
|
||||
};
|
||||
|
||||
export const firstBattleUnits: UnitData[] = [
|
||||
{
|
||||
id: 'liu-bei',
|
||||
@@ -3507,6 +3568,272 @@ export const tenthBattleUnits: UnitData[] = [
|
||||
}
|
||||
];
|
||||
|
||||
const eleventhBattleAllyPositions: Record<string, { x: number; y: number }> = {
|
||||
'liu-bei': { x: 3, y: 15 },
|
||||
'guan-yu': { x: 4, y: 14 },
|
||||
'zhang-fei': { x: 4, y: 16 },
|
||||
'jian-yong': { x: 5, y: 17 },
|
||||
'mi-zhu': { x: 3, y: 18 }
|
||||
};
|
||||
|
||||
export const eleventhBattleUnits: UnitData[] = [
|
||||
...[...firstBattleUnits.filter((unit) => unit.faction === 'ally'), ...xuzhouRecruitUnits].map((unit) =>
|
||||
placeScenarioUnit(unit, eleventhBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })
|
||||
),
|
||||
{
|
||||
id: 'xudu-road-raider-a',
|
||||
name: '원술군 잔병',
|
||||
faction: 'enemy',
|
||||
className: '원술군 보병',
|
||||
classKey: 'yellowTurban',
|
||||
level: 11,
|
||||
exp: 68,
|
||||
hp: 50,
|
||||
maxHp: 50,
|
||||
attack: 16,
|
||||
move: 3,
|
||||
stats: { might: 84, intelligence: 54, leadership: 70, agility: 64, luck: 56 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 42 },
|
||||
armor: { itemId: 'lamellar-armor', level: 2, exp: 20 },
|
||||
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
|
||||
},
|
||||
x: 11,
|
||||
y: 12
|
||||
},
|
||||
{
|
||||
id: 'xudu-road-raider-b',
|
||||
name: '원술군 잔병',
|
||||
faction: 'enemy',
|
||||
className: '원술군 보병',
|
||||
classKey: 'yellowTurban',
|
||||
level: 11,
|
||||
exp: 70,
|
||||
hp: 51,
|
||||
maxHp: 51,
|
||||
attack: 16,
|
||||
move: 3,
|
||||
stats: { might: 85, intelligence: 55, leadership: 71, agility: 65, luck: 56 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 44 },
|
||||
armor: { itemId: 'lamellar-armor', level: 2, exp: 20 },
|
||||
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
|
||||
},
|
||||
x: 13,
|
||||
y: 16
|
||||
},
|
||||
{
|
||||
id: 'xudu-road-raider-c',
|
||||
name: '원술군 잔병',
|
||||
faction: 'enemy',
|
||||
className: '원술군 보병',
|
||||
classKey: 'yellowTurban',
|
||||
level: 11,
|
||||
exp: 70,
|
||||
hp: 51,
|
||||
maxHp: 51,
|
||||
attack: 16,
|
||||
move: 3,
|
||||
stats: { might: 85, intelligence: 55, leadership: 71, agility: 65, luck: 56 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 44 },
|
||||
armor: { itemId: 'lamellar-armor', level: 2, exp: 20 },
|
||||
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
|
||||
},
|
||||
x: 17,
|
||||
y: 11
|
||||
},
|
||||
{
|
||||
id: 'xudu-road-bandit-a',
|
||||
name: '군량 약탈병',
|
||||
faction: 'enemy',
|
||||
className: '원술군 약탈병',
|
||||
classKey: 'bandit',
|
||||
level: 11,
|
||||
exp: 68,
|
||||
hp: 45,
|
||||
maxHp: 45,
|
||||
attack: 17,
|
||||
move: 4,
|
||||
stats: { might: 86, intelligence: 53, leadership: 62, agility: 78, luck: 56 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 42 },
|
||||
armor: { itemId: 'rebel-vest', level: 2, exp: 20 },
|
||||
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
|
||||
},
|
||||
x: 8,
|
||||
y: 8
|
||||
},
|
||||
{
|
||||
id: 'xudu-road-bandit-b',
|
||||
name: '군량 약탈병',
|
||||
faction: 'enemy',
|
||||
className: '원술군 약탈병',
|
||||
classKey: 'bandit',
|
||||
level: 11,
|
||||
exp: 70,
|
||||
hp: 46,
|
||||
maxHp: 46,
|
||||
attack: 17,
|
||||
move: 4,
|
||||
stats: { might: 87, intelligence: 53, leadership: 63, agility: 79, luck: 56 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 44 },
|
||||
armor: { itemId: 'rebel-vest', level: 2, exp: 20 },
|
||||
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
|
||||
},
|
||||
x: 9,
|
||||
y: 18
|
||||
},
|
||||
{
|
||||
id: 'xudu-road-archer-a',
|
||||
name: '원술군 궁병',
|
||||
faction: 'enemy',
|
||||
className: '원술군 궁병',
|
||||
classKey: 'archer',
|
||||
level: 11,
|
||||
exp: 68,
|
||||
hp: 40,
|
||||
maxHp: 40,
|
||||
attack: 17,
|
||||
move: 3,
|
||||
stats: { might: 76, intelligence: 66, leadership: 64, agility: 76, luck: 57 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'short-bow', level: 2, exp: 42 },
|
||||
armor: { itemId: 'cloth-armor', level: 2, exp: 18 },
|
||||
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
|
||||
},
|
||||
x: 16,
|
||||
y: 6
|
||||
},
|
||||
{
|
||||
id: 'xudu-road-archer-b',
|
||||
name: '원술군 궁병',
|
||||
faction: 'enemy',
|
||||
className: '원술군 궁병',
|
||||
classKey: 'archer',
|
||||
level: 11,
|
||||
exp: 70,
|
||||
hp: 41,
|
||||
maxHp: 41,
|
||||
attack: 17,
|
||||
move: 3,
|
||||
stats: { might: 77, intelligence: 67, leadership: 65, agility: 77, luck: 57 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'short-bow', level: 2, exp: 44 },
|
||||
armor: { itemId: 'cloth-armor', level: 2, exp: 18 },
|
||||
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
|
||||
},
|
||||
x: 20,
|
||||
y: 15
|
||||
},
|
||||
{
|
||||
id: 'xudu-road-cavalry-a',
|
||||
name: '원술군 기병',
|
||||
faction: 'enemy',
|
||||
className: '원술군 기병',
|
||||
classKey: 'cavalry',
|
||||
level: 12,
|
||||
exp: 72,
|
||||
hp: 55,
|
||||
maxHp: 55,
|
||||
attack: 19,
|
||||
move: 5,
|
||||
stats: { might: 93, intelligence: 54, leadership: 72, agility: 94, luck: 59 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 48 },
|
||||
armor: { itemId: 'rebel-vest', level: 2, exp: 22 },
|
||||
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
|
||||
},
|
||||
x: 21,
|
||||
y: 8
|
||||
},
|
||||
{
|
||||
id: 'xudu-road-cavalry-b',
|
||||
name: '원술군 기병',
|
||||
faction: 'enemy',
|
||||
className: '원술군 기병',
|
||||
classKey: 'cavalry',
|
||||
level: 12,
|
||||
exp: 74,
|
||||
hp: 56,
|
||||
maxHp: 56,
|
||||
attack: 19,
|
||||
move: 5,
|
||||
stats: { might: 94, intelligence: 54, leadership: 72, agility: 95, luck: 59 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 50 },
|
||||
armor: { itemId: 'rebel-vest', level: 2, exp: 22 },
|
||||
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
|
||||
},
|
||||
x: 22,
|
||||
y: 17
|
||||
},
|
||||
{
|
||||
id: 'xudu-road-guard-a',
|
||||
name: '원술군 친위병',
|
||||
faction: 'enemy',
|
||||
className: '원술군 창병',
|
||||
classKey: 'spearman',
|
||||
level: 12,
|
||||
exp: 72,
|
||||
hp: 54,
|
||||
maxHp: 54,
|
||||
attack: 18,
|
||||
move: 3,
|
||||
stats: { might: 90, intelligence: 56, leadership: 76, agility: 68, luck: 58 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 48 },
|
||||
armor: { itemId: 'lamellar-armor', level: 2, exp: 22 },
|
||||
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
|
||||
},
|
||||
x: 23,
|
||||
y: 11
|
||||
},
|
||||
{
|
||||
id: 'xudu-road-guard-b',
|
||||
name: '원술군 친위병',
|
||||
faction: 'enemy',
|
||||
className: '원술군 창병',
|
||||
classKey: 'spearman',
|
||||
level: 12,
|
||||
exp: 74,
|
||||
hp: 55,
|
||||
maxHp: 55,
|
||||
attack: 18,
|
||||
move: 3,
|
||||
stats: { might: 91, intelligence: 56, leadership: 76, agility: 69, luck: 58 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 50 },
|
||||
armor: { itemId: 'lamellar-armor', level: 2, exp: 22 },
|
||||
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
|
||||
},
|
||||
x: 24,
|
||||
y: 13
|
||||
},
|
||||
{
|
||||
id: 'xudu-road-leader-ji-ling',
|
||||
name: '기령',
|
||||
faction: 'enemy',
|
||||
className: '원술군 대장',
|
||||
classKey: 'rebelLeader',
|
||||
level: 13,
|
||||
exp: 80,
|
||||
hp: 74,
|
||||
maxHp: 74,
|
||||
attack: 20,
|
||||
move: 4,
|
||||
stats: { might: 94, intelligence: 64, leadership: 88, agility: 74, luck: 60 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'leader-axe', level: 2, exp: 52 },
|
||||
armor: { itemId: 'reinforced-lamellar', level: 2, exp: 24 },
|
||||
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
|
||||
},
|
||||
x: 24,
|
||||
y: 10
|
||||
}
|
||||
];
|
||||
|
||||
export const firstBattleBonds: BattleBond[] = [
|
||||
{
|
||||
id: 'liu-bei__guan-yu',
|
||||
@@ -3562,6 +3889,7 @@ export const seventhBattleBonds: BattleBond[] = firstBattleBonds.map(cloneBattle
|
||||
export const eighthBattleBonds: BattleBond[] = [...firstBattleBonds, ...xuzhouRecruitBonds].map(cloneBattleBondForScenario);
|
||||
export const ninthBattleBonds: BattleBond[] = eighthBattleBonds.map(cloneBattleBondForScenario);
|
||||
export const tenthBattleBonds: BattleBond[] = ninthBattleBonds.map(cloneBattleBondForScenario);
|
||||
export const eleventhBattleBonds: BattleBond[] = tenthBattleBonds.map(cloneBattleBondForScenario);
|
||||
|
||||
function createEighthBattleTerrain(): TerrainType[][] {
|
||||
return Array.from({ length: 22 }, (_, y) =>
|
||||
@@ -3671,6 +3999,53 @@ function createTenthBattleTerrain(): TerrainType[][] {
|
||||
);
|
||||
}
|
||||
|
||||
function createEleventhBattleTerrain(): TerrainType[][] {
|
||||
return Array.from({ length: 22 }, (_, y) =>
|
||||
Array.from({ length: 28 }, (_, x): TerrainType => {
|
||||
if ((x <= 4 && y >= 14 && y <= 20) || (x >= 5 && x <= 7 && y >= 16 && y <= 20)) {
|
||||
return 'camp';
|
||||
}
|
||||
if ((x >= 22 && x <= 26 && y >= 8 && y <= 13) || (x >= 19 && x <= 21 && y >= 5 && y <= 8)) {
|
||||
return 'fort';
|
||||
}
|
||||
if ((x >= 8 && x <= 10 && y >= 10 && y <= 12) || (x >= 14 && x <= 16 && y >= 15 && y <= 17)) {
|
||||
return 'village';
|
||||
}
|
||||
if ((x === 17 || x === 18) && y >= 0 && y <= 19) {
|
||||
return 'river';
|
||||
}
|
||||
if (
|
||||
(y === 15 && x >= 2 && x <= 25) ||
|
||||
(x === 8 && y >= 6 && y <= 20) ||
|
||||
(x === 22 && y >= 4 && y <= 17) ||
|
||||
(x + y === 28 && x >= 9 && x <= 21)
|
||||
) {
|
||||
return 'road';
|
||||
}
|
||||
if (
|
||||
(x <= 5 && y <= 5) ||
|
||||
(x >= 6 && x <= 13 && y >= 2 && y <= 7) ||
|
||||
(x >= 3 && x <= 8 && y >= 8 && y <= 13) ||
|
||||
(x >= 9 && x <= 14 && y >= 18 && y <= 21)
|
||||
) {
|
||||
return 'forest';
|
||||
}
|
||||
if (
|
||||
(x >= 21 && y <= 3) ||
|
||||
(x >= 24 && y >= 16) ||
|
||||
(x >= 11 && x <= 14 && y >= 11 && y <= 14) ||
|
||||
(x <= 4 && y >= 6 && y <= 10)
|
||||
) {
|
||||
return 'hill';
|
||||
}
|
||||
if ((x >= 25 && y >= 4 && y <= 7) || (x >= 19 && x <= 21 && y <= 2)) {
|
||||
return 'cliff';
|
||||
}
|
||||
return 'plain';
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
function placeScenarioUnit(unit: UnitData, position: { x: number; y: number }): UnitData {
|
||||
return {
|
||||
...cloneUnitForScenario(unit),
|
||||
|
||||
Reference in New Issue
Block a user