Add Sishui vanguard campaign battle
This commit is contained in:
@@ -3,6 +3,10 @@ import {
|
||||
firstBattleMap,
|
||||
firstBattleUnits,
|
||||
firstBattleVictoryPages,
|
||||
fifthBattleBonds,
|
||||
fifthBattleMap,
|
||||
fifthBattleUnits,
|
||||
fifthBattleVictoryPages,
|
||||
secondBattleBonds,
|
||||
secondBattleMap,
|
||||
secondBattleUnits,
|
||||
@@ -25,7 +29,8 @@ export type BattleScenarioId =
|
||||
| 'first-battle-zhuo-commandery'
|
||||
| 'second-battle-yellow-turban-pursuit'
|
||||
| 'third-battle-guangzong-road'
|
||||
| 'fourth-battle-guangzong-camp';
|
||||
| 'fourth-battle-guangzong-camp'
|
||||
| 'fifth-battle-sishui-vanguard';
|
||||
|
||||
export type BattleObjectiveKind = 'defeat-leader' | 'keep-unit-alive' | 'secure-terrain' | 'quick-victory';
|
||||
|
||||
@@ -276,13 +281,67 @@ export const fourthBattleScenario: BattleScenarioDefinition = {
|
||||
nextCampScene: 'CampScene'
|
||||
};
|
||||
|
||||
export const fifthBattleScenario: BattleScenarioDefinition = {
|
||||
id: 'fifth-battle-sishui-vanguard',
|
||||
title: '사수관 전초전',
|
||||
victoryConditionLabel: '호진 격파',
|
||||
defeatConditionLabel: '유비 퇴각',
|
||||
openingObjectiveLines: [
|
||||
'반동탁 연합으로 향하는 길목을 동탁군 장수 호진이 막고 있습니다. 호진을 격파하면 사수관 앞 전초 진지가 흔들립니다.',
|
||||
'중앙 길은 빠르지만 궁병과 기병의 반격을 받기 쉽습니다. 숲길 척후를 처리하고 요새 주변을 차근히 압박하십시오.',
|
||||
'14턴 이내에 승리하면 공손찬 진영에서 세 형제의 무공이 더 크게 알려집니다.'
|
||||
],
|
||||
map: fifthBattleMap,
|
||||
units: fifthBattleUnits,
|
||||
bonds: fifthBattleBonds,
|
||||
mapTextureKey: 'battle-map-fifth',
|
||||
leaderUnitId: 'sishui-leader-hu-zhen',
|
||||
quickVictoryTurnLimit: 14,
|
||||
baseVictoryGold: 760,
|
||||
objectives: [
|
||||
{
|
||||
id: 'leader',
|
||||
kind: 'defeat-leader',
|
||||
label: '호진 격파',
|
||||
rewardGold: 460,
|
||||
unitId: 'sishui-leader-hu-zhen'
|
||||
},
|
||||
{
|
||||
id: 'liu-bei',
|
||||
kind: 'keep-unit-alive',
|
||||
label: '유비 생존',
|
||||
rewardGold: 190,
|
||||
unitId: 'liu-bei'
|
||||
},
|
||||
{
|
||||
id: 'fort',
|
||||
kind: 'secure-terrain',
|
||||
label: '사수관 전초 요새 확보',
|
||||
rewardGold: 280,
|
||||
terrain: 'fort'
|
||||
},
|
||||
{
|
||||
id: 'quick',
|
||||
kind: 'quick-victory',
|
||||
label: '14턴 이내 승리',
|
||||
rewardGold: 230,
|
||||
maxTurn: 14
|
||||
}
|
||||
],
|
||||
defeatConditions: [{ kind: 'unit-defeated', unitId: 'liu-bei' }],
|
||||
itemRewards: ['콩 2', '상처약 1', '탁주 1', '반동탁 공적 +1'],
|
||||
victoryPages: fifthBattleVictoryPages,
|
||||
nextCampScene: 'CampScene'
|
||||
};
|
||||
|
||||
export const defaultBattleScenarioId: BattleScenarioId = firstBattleScenario.id;
|
||||
|
||||
export const battleScenarios: Record<BattleScenarioId, BattleScenarioDefinition> = {
|
||||
'first-battle-zhuo-commandery': firstBattleScenario,
|
||||
'second-battle-yellow-turban-pursuit': secondBattleScenario,
|
||||
'third-battle-guangzong-road': thirdBattleScenario,
|
||||
'fourth-battle-guangzong-camp': fourthBattleScenario
|
||||
'fourth-battle-guangzong-camp': fourthBattleScenario,
|
||||
'fifth-battle-sishui-vanguard': fifthBattleScenario
|
||||
};
|
||||
|
||||
export const defaultBattleScenario = battleScenarios[defaultBattleScenarioId];
|
||||
|
||||
@@ -1,6 +1,15 @@
|
||||
import type { CampaignStep } from '../state/campaignState';
|
||||
import { defaultBattleScenario, fourthBattleScenario, secondBattleScenario, thirdBattleScenario, type BattleScenarioId } from './battles';
|
||||
import {
|
||||
defaultBattleScenario,
|
||||
fifthBattleScenario,
|
||||
fourthBattleScenario,
|
||||
secondBattleScenario,
|
||||
thirdBattleScenario,
|
||||
type BattleScenarioId
|
||||
} from './battles';
|
||||
import {
|
||||
fifthBattleIntroPages,
|
||||
fifthBattleVictoryPages,
|
||||
firstBattleVictoryPages,
|
||||
fourthBattleIntroPages,
|
||||
fourthBattleVictoryPages,
|
||||
@@ -56,12 +65,22 @@ const sortieFlows: Record<string, SortieFlow> = {
|
||||
},
|
||||
[fourthBattleScenario.id]: {
|
||||
afterBattleId: fourthBattleScenario.id,
|
||||
eyebrow: '다음 전장',
|
||||
title: fifthBattleScenario.title,
|
||||
description: '황건적 토벌로 이름을 알린 세 형제는 반동탁 연합의 흐름에 몸을 싣습니다. 공손찬의 진영으로 향하는 길목에서 사수관 전초 병력을 상대해야 합니다.',
|
||||
rewardHint: `예상 보상: ${fifthBattleScenario.title} 개방`,
|
||||
nextBattleId: fifthBattleScenario.id,
|
||||
campaignStep: 'fifth-battle',
|
||||
pages: [...fourthBattleVictoryPages, ...fifthBattleIntroPages]
|
||||
},
|
||||
[fifthBattleScenario.id]: {
|
||||
afterBattleId: fifthBattleScenario.id,
|
||||
eyebrow: '다음 장 준비',
|
||||
title: '반동탁의 흐름',
|
||||
description: '황건적 토벌로 이름을 알린 세 형제 앞에 조정의 새로운 혼란이 다가옵니다. 다음 큰 줄기는 반동탁 흐름으로 이어집니다.',
|
||||
rewardHint: '다음 장: 반동탁 흐름 준비 중',
|
||||
pages: [],
|
||||
unavailableNotice: '반동탁 흐름은 다음 장으로 이어집니다. 군영에서 성장 상태를 정비하세요.'
|
||||
title: '공손찬 의탁',
|
||||
description: '사수관 앞 전초전을 넘긴 유비군은 공손찬 진영에서 연합군의 큰 흐름을 살피게 됩니다. 다음 줄기는 공손찬 의탁과 그 뒤의 서주로 이어집니다.',
|
||||
rewardHint: '다음 장: 공손찬 의탁 준비 중',
|
||||
pages: fifthBattleVictoryPages,
|
||||
unavailableNotice: '공손찬 의탁 흐름은 다음 장으로 이어집니다. 군영에서 성장 상태를 정비하세요.'
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -374,6 +374,60 @@ export const fourthBattleVictoryPages: StoryPage[] = [
|
||||
}
|
||||
];
|
||||
|
||||
export const fifthBattleIntroPages: StoryPage[] = [
|
||||
{
|
||||
id: 'fifth-coalition-rumor',
|
||||
bgm: 'militia-theme',
|
||||
chapter: '반동탁의 격문',
|
||||
background: 'story-militia',
|
||||
text: '황건의 불길이 잦아들자 조정에는 또 다른 폭풍이 일었다. 동탁이 낙양을 장악했다는 소식과 함께, 각지의 제후들이 반동탁의 격문에 응하기 시작했다.'
|
||||
},
|
||||
{
|
||||
id: 'fifth-liu-bei-choice',
|
||||
bgm: 'battle-prep',
|
||||
chapter: '새로운 대의',
|
||||
background: 'story-liu-bei',
|
||||
speaker: '유비',
|
||||
portrait: 'liuBei',
|
||||
text: '백성을 괴롭히는 난을 막았다 하나, 조정이 어지러우면 천하는 다시 피를 흘린다. 우리는 더 큰 흐름 속으로 들어가야 한다.'
|
||||
},
|
||||
{
|
||||
id: 'fifth-gongsun-zan',
|
||||
bgm: 'battle-prep',
|
||||
chapter: '공손찬의 진영',
|
||||
background: 'story-three-heroes',
|
||||
speaker: '관우',
|
||||
portrait: 'guanYu',
|
||||
text: '공손찬의 군영에 합류하면 연합군의 움직임을 가까이서 볼 수 있습니다. 그러나 동탁군도 사수관 앞길을 막고 있습니다.'
|
||||
},
|
||||
{
|
||||
id: 'fifth-sishui-sortie',
|
||||
bgm: 'battle-prep',
|
||||
chapter: '사수관 전초전',
|
||||
background: 'story-sortie',
|
||||
speaker: '장비',
|
||||
portrait: 'zhangFei',
|
||||
text: '동탁군이든 황건적이든 백성을 짓밟는 놈들은 똑같소. 사수관 앞길부터 뚫어 봅시다!'
|
||||
}
|
||||
];
|
||||
|
||||
export const fifthBattleVictoryPages: StoryPage[] = [
|
||||
{
|
||||
id: 'fifth-victory-sishui',
|
||||
bgm: 'militia-theme',
|
||||
chapter: '사수관의 문턱',
|
||||
background: 'story-sortie',
|
||||
text: '동탁군의 전초 부대가 물러서자 연합군 진영에 세 형제의 이름이 다시 한 번 전해졌다.'
|
||||
},
|
||||
{
|
||||
id: 'fifth-victory-next',
|
||||
bgm: 'battle-prep',
|
||||
chapter: '공손찬 의탁',
|
||||
background: 'story-militia',
|
||||
text: '사수관 앞 전초전은 끝났지만, 반동탁의 싸움은 이제 막 시작되었다. 유비는 공손찬의 군영에서 다음 기회를 기다린다.'
|
||||
}
|
||||
];
|
||||
|
||||
export const firstBattleMap: BattleMap = {
|
||||
width: 20,
|
||||
height: 18,
|
||||
@@ -480,6 +534,33 @@ export const fourthBattleMap: BattleMap = {
|
||||
]
|
||||
};
|
||||
|
||||
export const fifthBattleMap: BattleMap = {
|
||||
width: 24,
|
||||
height: 20,
|
||||
terrain: [
|
||||
['hill', 'hill', 'forest', 'plain', 'plain', 'road', 'road', 'plain', 'hill', 'hill', 'forest', 'plain', 'plain', 'fort', 'fort', 'plain', 'hill', 'hill', 'forest', 'forest', 'plain', 'plain', 'hill', 'hill'],
|
||||
['hill', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'hill', 'plain', 'plain', 'plain', 'road', 'fort', 'fort', 'road', 'plain', 'hill', 'forest', 'plain', 'plain', 'plain', 'plain', 'hill'],
|
||||
['plain', 'plain', 'forest', 'plain', 'road', 'plain', 'plain', 'forest', 'plain', 'plain', 'hill', 'plain', 'road', 'road', 'road', 'road', 'plain', 'plain', 'plain', 'forest', 'plain', 'hill', 'plain', 'plain'],
|
||||
['plain', 'forest', 'forest', 'plain', 'road', 'plain', 'hill', 'forest', 'plain', 'plain', 'hill', 'plain', 'plain', 'road', 'plain', 'road', 'plain', 'hill', 'plain', 'forest', 'plain', 'plain', 'plain', 'plain'],
|
||||
['plain', 'plain', 'forest', 'road', 'road', 'plain', 'hill', 'plain', 'plain', 'forest', 'plain', 'plain', 'river', 'river', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain', 'hill'],
|
||||
['plain', 'plain', 'plain', 'road', 'plain', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'road', 'plain', 'village', 'plain', 'forest', 'forest', 'plain', 'hill'],
|
||||
['forest', 'plain', 'plain', 'road', 'plain', 'hill', 'hill', 'plain', 'forest', 'plain', 'plain', 'plain', 'plain', 'river', 'river', 'plain', 'road', 'plain', 'village', 'plain', 'plain', 'forest', 'plain', 'plain'],
|
||||
['forest', 'plain', 'road', 'road', 'plain', 'plain', 'hill', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain', 'river', 'river', 'plain', 'road', 'road', 'plain', 'plain', 'hill', 'plain', 'plain', 'plain'],
|
||||
['plain', 'plain', 'road', 'plain', 'plain', 'forest', 'plain', 'plain', 'hill', 'plain', 'forest', 'plain', 'plain', 'plain', 'river', 'river', 'plain', 'road', 'plain', 'plain', 'hill', 'plain', 'forest', 'plain'],
|
||||
['plain', 'road', 'road', 'plain', 'forest', 'forest', 'plain', 'plain', 'hill', 'plain', 'plain', 'road', 'plain', 'plain', 'plain', 'river', 'river', 'road', 'road', 'plain', 'plain', 'plain', 'forest', 'plain'],
|
||||
['road', 'road', 'plain', 'plain', 'forest', 'plain', 'plain', 'hill', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'river', 'river', 'road', 'plain', 'plain', 'hill', 'plain', 'plain'],
|
||||
['plain', 'road', 'plain', 'forest', 'plain', 'plain', 'hill', 'plain', 'plain', 'forest', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'hill', 'plain', 'plain'],
|
||||
['plain', 'road', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'hill', 'plain', 'forest', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'plain', 'plain'],
|
||||
['plain', 'road', 'plain', 'plain', 'plain', 'hill', 'plain', 'forest', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'river', 'river', 'plain', 'hill', 'plain'],
|
||||
['camp', 'road', 'road', 'plain', 'plain', 'hill', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'hill', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'river', 'river', 'plain', 'plain'],
|
||||
['camp', 'camp', 'road', 'plain', 'forest', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain', 'hill', 'plain', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'river', 'river', 'plain'],
|
||||
['plain', 'camp', 'road', 'road', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'hill', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'river', 'plain'],
|
||||
['plain', 'plain', 'camp', 'road', 'plain', 'forest', 'plain', 'plain', 'plain', 'hill', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'plain'],
|
||||
['plain', 'plain', 'plain', 'road', 'road', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'hill', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain'],
|
||||
['plain', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'hill', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain']
|
||||
]
|
||||
};
|
||||
|
||||
export const firstBattleUnits: UnitData[] = [
|
||||
{
|
||||
id: 'liu-bei',
|
||||
@@ -1548,6 +1629,249 @@ export const fourthBattleUnits: UnitData[] = [
|
||||
}
|
||||
];
|
||||
|
||||
const fifthBattleAllyPositions: Record<string, { x: number; y: number }> = {
|
||||
'liu-bei': { x: 2, y: 16 },
|
||||
'guan-yu': { x: 3, y: 16 },
|
||||
'zhang-fei': { x: 2, y: 17 }
|
||||
};
|
||||
|
||||
export const fifthBattleUnits: UnitData[] = [
|
||||
...firstBattleUnits
|
||||
.filter((unit) => unit.faction === 'ally')
|
||||
.map((unit) => placeScenarioUnit(unit, fifthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
|
||||
{
|
||||
id: 'sishui-vanguard-a',
|
||||
name: '서량 선봉',
|
||||
faction: 'enemy',
|
||||
className: '동탁 보병',
|
||||
classKey: 'yellowTurban',
|
||||
level: 5,
|
||||
exp: 30,
|
||||
hp: 32,
|
||||
maxHp: 32,
|
||||
attack: 10,
|
||||
move: 3,
|
||||
stats: { might: 68, intelligence: 38, leadership: 52, agility: 55, luck: 44 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 4 },
|
||||
armor: { itemId: 'rebel-vest', level: 1, exp: 16 },
|
||||
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
|
||||
},
|
||||
x: 6,
|
||||
y: 14
|
||||
},
|
||||
{
|
||||
id: 'sishui-vanguard-b',
|
||||
name: '서량 선봉',
|
||||
faction: 'enemy',
|
||||
className: '동탁 보병',
|
||||
classKey: 'yellowTurban',
|
||||
level: 5,
|
||||
exp: 30,
|
||||
hp: 32,
|
||||
maxHp: 32,
|
||||
attack: 10,
|
||||
move: 3,
|
||||
stats: { might: 68, intelligence: 37, leadership: 52, agility: 54, luck: 44 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 4 },
|
||||
armor: { itemId: 'rebel-vest', level: 1, exp: 16 },
|
||||
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
|
||||
},
|
||||
x: 8,
|
||||
y: 12
|
||||
},
|
||||
{
|
||||
id: 'sishui-raider-a',
|
||||
name: '산길 척후',
|
||||
faction: 'enemy',
|
||||
className: '척후병',
|
||||
classKey: 'bandit',
|
||||
level: 5,
|
||||
exp: 32,
|
||||
hp: 30,
|
||||
maxHp: 30,
|
||||
attack: 11,
|
||||
move: 4,
|
||||
stats: { might: 70, intelligence: 42, leadership: 48, agility: 66, luck: 52 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 8 },
|
||||
armor: { itemId: 'rebel-vest', level: 1, exp: 16 },
|
||||
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
|
||||
},
|
||||
x: 5,
|
||||
y: 9
|
||||
},
|
||||
{
|
||||
id: 'sishui-archer-a',
|
||||
name: '사수관 궁병',
|
||||
faction: 'enemy',
|
||||
className: '서량 궁병',
|
||||
classKey: 'archer',
|
||||
level: 5,
|
||||
exp: 32,
|
||||
hp: 27,
|
||||
maxHp: 27,
|
||||
attack: 11,
|
||||
move: 3,
|
||||
stats: { might: 63, intelligence: 50, leadership: 51, agility: 64, luck: 49 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'short-bow', level: 2, exp: 8 },
|
||||
armor: { itemId: 'cloth-armor', level: 1, exp: 16 },
|
||||
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
|
||||
},
|
||||
x: 10,
|
||||
y: 10
|
||||
},
|
||||
{
|
||||
id: 'sishui-cavalry-a',
|
||||
name: '서량 기병',
|
||||
faction: 'enemy',
|
||||
className: '서량 경기병',
|
||||
classKey: 'cavalry',
|
||||
level: 6,
|
||||
exp: 34,
|
||||
hp: 36,
|
||||
maxHp: 36,
|
||||
attack: 12,
|
||||
move: 5,
|
||||
stats: { might: 74, intelligence: 38, leadership: 54, agility: 76, luck: 50 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 10 },
|
||||
armor: { itemId: 'rebel-vest', level: 2, exp: 2 },
|
||||
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
|
||||
},
|
||||
x: 12,
|
||||
y: 9
|
||||
},
|
||||
{
|
||||
id: 'sishui-guard-a',
|
||||
name: '관문 수비병',
|
||||
faction: 'enemy',
|
||||
className: '동탁 보병',
|
||||
classKey: 'yellowTurban',
|
||||
level: 6,
|
||||
exp: 34,
|
||||
hp: 35,
|
||||
maxHp: 35,
|
||||
attack: 11,
|
||||
move: 3,
|
||||
stats: { might: 72, intelligence: 40, leadership: 56, agility: 56, luck: 48 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 12 },
|
||||
armor: { itemId: 'rebel-vest', level: 2, exp: 2 },
|
||||
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
|
||||
},
|
||||
x: 14,
|
||||
y: 7
|
||||
},
|
||||
{
|
||||
id: 'sishui-archer-b',
|
||||
name: '관문 궁병',
|
||||
faction: 'enemy',
|
||||
className: '서량 궁병',
|
||||
classKey: 'archer',
|
||||
level: 6,
|
||||
exp: 36,
|
||||
hp: 28,
|
||||
maxHp: 28,
|
||||
attack: 12,
|
||||
move: 3,
|
||||
stats: { might: 65, intelligence: 52, leadership: 53, agility: 65, luck: 50 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'short-bow', level: 2, exp: 12 },
|
||||
armor: { itemId: 'cloth-armor', level: 1, exp: 18 },
|
||||
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
|
||||
},
|
||||
x: 16,
|
||||
y: 6
|
||||
},
|
||||
{
|
||||
id: 'sishui-cavalry-b',
|
||||
name: '서량 기병',
|
||||
faction: 'enemy',
|
||||
className: '서량 경기병',
|
||||
classKey: 'cavalry',
|
||||
level: 6,
|
||||
exp: 36,
|
||||
hp: 37,
|
||||
maxHp: 37,
|
||||
attack: 12,
|
||||
move: 5,
|
||||
stats: { might: 75, intelligence: 39, leadership: 55, agility: 77, luck: 51 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 12 },
|
||||
armor: { itemId: 'rebel-vest', level: 2, exp: 4 },
|
||||
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
|
||||
},
|
||||
x: 18,
|
||||
y: 10
|
||||
},
|
||||
{
|
||||
id: 'sishui-guard-b',
|
||||
name: '관문 수비병',
|
||||
faction: 'enemy',
|
||||
className: '동탁 보병',
|
||||
classKey: 'yellowTurban',
|
||||
level: 6,
|
||||
exp: 36,
|
||||
hp: 36,
|
||||
maxHp: 36,
|
||||
attack: 11,
|
||||
move: 3,
|
||||
stats: { might: 73, intelligence: 40, leadership: 57, agility: 56, luck: 49 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 14 },
|
||||
armor: { itemId: 'rebel-vest', level: 2, exp: 4 },
|
||||
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
|
||||
},
|
||||
x: 16,
|
||||
y: 3
|
||||
},
|
||||
{
|
||||
id: 'sishui-gate-guard',
|
||||
name: '관문 친위병',
|
||||
faction: 'enemy',
|
||||
className: '동탁 보병',
|
||||
classKey: 'yellowTurban',
|
||||
level: 6,
|
||||
exp: 38,
|
||||
hp: 38,
|
||||
maxHp: 38,
|
||||
attack: 12,
|
||||
move: 3,
|
||||
stats: { might: 76, intelligence: 42, leadership: 60, agility: 57, luck: 50 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 18 },
|
||||
armor: { itemId: 'lamellar-armor', level: 2, exp: 8 },
|
||||
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
|
||||
},
|
||||
x: 14,
|
||||
y: 1
|
||||
},
|
||||
{
|
||||
id: 'sishui-leader-hu-zhen',
|
||||
name: '호진',
|
||||
faction: 'enemy',
|
||||
className: '동탁 장수',
|
||||
classKey: 'rebelLeader',
|
||||
level: 7,
|
||||
exp: 44,
|
||||
hp: 50,
|
||||
maxHp: 50,
|
||||
attack: 14,
|
||||
move: 3,
|
||||
stats: { might: 80, intelligence: 55, leadership: 72, agility: 60, luck: 54 },
|
||||
equipment: {
|
||||
weapon: { itemId: 'leader-axe', level: 2, exp: 20 },
|
||||
armor: { itemId: 'lamellar-armor', level: 2, exp: 10 },
|
||||
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
|
||||
},
|
||||
x: 15,
|
||||
y: 1
|
||||
}
|
||||
];
|
||||
|
||||
export const firstBattleBonds: BattleBond[] = [
|
||||
{
|
||||
id: 'liu-bei__guan-yu',
|
||||
@@ -1578,6 +1902,7 @@ export const firstBattleBonds: BattleBond[] = [
|
||||
export const secondBattleBonds: BattleBond[] = firstBattleBonds.map(cloneBattleBondForScenario);
|
||||
export const thirdBattleBonds: BattleBond[] = firstBattleBonds.map(cloneBattleBondForScenario);
|
||||
export const fourthBattleBonds: BattleBond[] = firstBattleBonds.map(cloneBattleBondForScenario);
|
||||
export const fifthBattleBonds: BattleBond[] = firstBattleBonds.map(cloneBattleBondForScenario);
|
||||
|
||||
function placeScenarioUnit(unit: UnitData, position: { x: number; y: number }): UnitData {
|
||||
return {
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import Phaser from 'phaser';
|
||||
import fifthBattleMapUrl from '../../assets/images/battle/fifth-battle-map.svg';
|
||||
import firstBattleMapUrl from '../../assets/images/battle/first-battle-map.png';
|
||||
import fourthBattleMapUrl from '../../assets/images/battle/fourth-battle-map.svg';
|
||||
import secondBattleMapUrl from '../../assets/images/battle/second-battle-map.svg';
|
||||
@@ -66,6 +67,7 @@ export class BootScene extends Phaser.Scene {
|
||||
this.load.image('battle-map-second', secondBattleMapUrl);
|
||||
this.load.image('battle-map-third', thirdBattleMapUrl);
|
||||
this.load.image('battle-map-fourth', fourthBattleMapUrl);
|
||||
this.load.image('battle-map-fifth', fifthBattleMapUrl);
|
||||
this.load.image('portrait-liu-bei', liuBeiPortraitUrl);
|
||||
this.load.image('portrait-guan-yu', guanYuPortraitUrl);
|
||||
this.load.image('portrait-zhang-fei', zhangFeiPortraitUrl);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import Phaser from 'phaser';
|
||||
import { soundDirector } from '../audio/SoundDirector';
|
||||
import { firstBattleVictoryPages } from '../data/scenario';
|
||||
import { fourthBattleScenario, secondBattleScenario, thirdBattleScenario } from '../data/battles';
|
||||
import { fifthBattleScenario, fourthBattleScenario, secondBattleScenario, thirdBattleScenario } from '../data/battles';
|
||||
import { hasCampaignSave, loadCampaignState, startNewCampaign } from '../state/campaignState';
|
||||
import { palette } from '../ui/palette';
|
||||
|
||||
@@ -299,7 +299,13 @@ export class TitleScene extends Phaser.Scene {
|
||||
soundDirector.playSelect();
|
||||
|
||||
const campaign = loadCampaignState();
|
||||
if (campaign.step === 'first-camp' || campaign.step === 'second-camp' || campaign.step === 'third-camp' || campaign.step === 'fourth-camp') {
|
||||
if (
|
||||
campaign.step === 'first-camp' ||
|
||||
campaign.step === 'second-camp' ||
|
||||
campaign.step === 'third-camp' ||
|
||||
campaign.step === 'fourth-camp' ||
|
||||
campaign.step === 'fifth-camp'
|
||||
) {
|
||||
this.scene.start('CampScene');
|
||||
return;
|
||||
}
|
||||
@@ -324,6 +330,11 @@ export class TitleScene extends Phaser.Scene {
|
||||
return;
|
||||
}
|
||||
|
||||
if (campaign.step === 'fifth-battle') {
|
||||
this.scene.start('BattleScene', { battleId: fifthBattleScenario.id });
|
||||
return;
|
||||
}
|
||||
|
||||
if (campaign.step === 'first-victory-story') {
|
||||
this.scene.start('StoryScene', { pages: firstBattleVictoryPages, nextScene: 'TitleScene' });
|
||||
return;
|
||||
|
||||
@@ -47,7 +47,9 @@ export type CampaignStep =
|
||||
| 'third-battle'
|
||||
| 'third-camp'
|
||||
| 'fourth-battle'
|
||||
| 'fourth-camp';
|
||||
| 'fourth-camp'
|
||||
| 'fifth-battle'
|
||||
| 'fifth-camp';
|
||||
|
||||
export type CampaignUnitProgressSnapshot = {
|
||||
unitId: string;
|
||||
@@ -101,7 +103,8 @@ const campaignBattleSteps: Record<string, { victory: CampaignStep; retry: Campai
|
||||
'first-battle-zhuo-commandery': { victory: 'first-camp', retry: 'first-battle' },
|
||||
'second-battle-yellow-turban-pursuit': { victory: 'second-camp', retry: 'second-battle' },
|
||||
'third-battle-guangzong-road': { victory: 'third-camp', retry: 'third-battle' },
|
||||
'fourth-battle-guangzong-camp': { victory: 'fourth-camp', retry: 'fourth-battle' }
|
||||
'fourth-battle-guangzong-camp': { victory: 'fourth-camp', retry: 'fourth-battle' },
|
||||
'fifth-battle-sishui-vanguard': { victory: 'fifth-camp', retry: 'fifth-battle' }
|
||||
};
|
||||
|
||||
export type CampaignSaveSlotSummary = {
|
||||
|
||||
Reference in New Issue
Block a user