import { firstBattleBonds, eighthBattleBonds, eighthBattleMap, eighthBattleUnits, eighthBattleVictoryPages, firstBattleMap, firstBattleUnits, firstBattleVictoryPages, ninthBattleBonds, ninthBattleMap, ninthBattleUnits, ninthBattleVictoryPages, fifthBattleBonds, fifthBattleMap, fifthBattleUnits, fifthBattleVictoryPages, secondBattleBonds, secondBattleMap, secondBattleUnits, secondBattleVictoryPages, seventhBattleBonds, seventhBattleMap, seventhBattleUnits, seventhBattleVictoryPages, sixthBattleBonds, sixthBattleMap, sixthBattleUnits, sixthBattleVictoryPages, thirdBattleBonds, fourthBattleBonds, fourthBattleMap, fourthBattleUnits, fourthBattleVictoryPages, thirdBattleMap, thirdBattleUnits, thirdBattleVictoryPages, type BattleBond, type BattleMap, type StoryPage, type UnitData } from './scenario'; export type BattleScenarioId = | 'first-battle-zhuo-commandery' | 'second-battle-yellow-turban-pursuit' | 'third-battle-guangzong-road' | 'fourth-battle-guangzong-camp' | 'fifth-battle-sishui-vanguard' | 'sixth-battle-jieqiao-relief' | 'seventh-battle-xuzhou-rescue' | 'eighth-battle-xiaopei-supply-road' | 'ninth-battle-xuzhou-gate-night-raid'; export type BattleObjectiveKind = 'defeat-leader' | 'keep-unit-alive' | 'secure-terrain' | 'quick-victory'; export type BattleObjectiveDefinition = { id: string; kind: BattleObjectiveKind; label: string; rewardGold: number; unitId?: string; terrain?: string; maxTurn?: number; }; export type BattleDefeatConditionDefinition = { kind: 'unit-defeated'; unitId: string; }; export type BattleScenarioDefinition = { id: BattleScenarioId; title: string; victoryConditionLabel: string; defeatConditionLabel: string; openingObjectiveLines: string[]; map: BattleMap; units: UnitData[]; bonds: BattleBond[]; mapTextureKey: string; leaderUnitId: string; quickVictoryTurnLimit: number; baseVictoryGold: number; objectives: BattleObjectiveDefinition[]; defeatConditions: BattleDefeatConditionDefinition[]; itemRewards: string[]; victoryPages: StoryPage[]; nextCampScene: string; }; export const firstBattleScenario: BattleScenarioDefinition = { id: 'first-battle-zhuo-commandery', title: '탁현의 전투', victoryConditionLabel: '두령 한석 격파', defeatConditionLabel: '유비 퇴각', openingObjectiveLines: [ '두령 한석을 격파하면 황건적의 전열이 무너집니다.', '유비가 퇴각하면 의용군은 전투를 지속할 수 없습니다.', '마을을 확보하고 8턴 안에 승리하면 추가 보상이 붙습니다.' ], map: firstBattleMap, units: firstBattleUnits, bonds: firstBattleBonds, mapTextureKey: 'battle-map-first', leaderUnitId: 'rebel-leader', quickVictoryTurnLimit: 8, baseVictoryGold: 300, objectives: [ { id: 'leader', kind: 'defeat-leader', label: '황건 두령 격파', rewardGold: 200, unitId: 'rebel-leader' }, { id: 'liu-bei', kind: 'keep-unit-alive', label: '유비 생존', rewardGold: 100, unitId: 'liu-bei' }, { id: 'village', kind: 'secure-terrain', label: '마을 확보', rewardGold: 150, terrain: 'village' }, { id: 'quick', kind: 'quick-victory', label: '8턴 안에 승리', rewardGold: 120, maxTurn: 8 } ], defeatConditions: [{ kind: 'unit-defeated', unitId: 'liu-bei' }], itemRewards: ['콩 1', '탁주 1', '의용군 명성 +1'], victoryPages: firstBattleVictoryPages, nextCampScene: 'CampScene' }; export const secondBattleScenario: BattleScenarioDefinition = { id: 'second-battle-yellow-turban-pursuit', title: '황건 잔당 추격', victoryConditionLabel: '두령 한석 격파', defeatConditionLabel: '유비 퇴각', openingObjectiveLines: [ '황건 잔당이 북쪽 마을로 달아났습니다. 두령 한석을 격파하면 적의 퇴로가 무너집니다.', '마을 주변에 적 위협이 남아 있으면 보상이 줄어듭니다. 길목의 습격조를 먼저 정리하십시오.', '12턴 이내에 승리하면 의용군의 추격전 명성이 오릅니다.' ], map: secondBattleMap, units: secondBattleUnits, bonds: secondBattleBonds, mapTextureKey: 'battle-map-second', leaderUnitId: 'pursuit-leader-han-seok', quickVictoryTurnLimit: 12, baseVictoryGold: 420, objectives: [ { id: 'leader', kind: 'defeat-leader', label: '두령 한석 격파', rewardGold: 260, unitId: 'pursuit-leader-han-seok' }, { id: 'liu-bei', kind: 'keep-unit-alive', label: '유비 생존', rewardGold: 120, unitId: 'liu-bei' }, { id: 'village', kind: 'secure-terrain', label: '북쪽 마을 확보', rewardGold: 180, terrain: 'village' }, { id: 'quick', kind: 'quick-victory', label: '12턴 이내 승리', rewardGold: 150, maxTurn: 12 } ], defeatConditions: [{ kind: 'unit-defeated', unitId: 'liu-bei' }], itemRewards: ['콩 2', '탁주 1', '의용군 명성 +2'], victoryPages: secondBattleVictoryPages, nextCampScene: 'CampScene' }; export const thirdBattleScenario: BattleScenarioDefinition = { id: 'third-battle-guangzong-road', title: '광종 구원로', victoryConditionLabel: '전령 마원 격파', defeatConditionLabel: '유비 퇴각', openingObjectiveLines: [ '황건 전령 마원이 광종 본대로 향하고 있습니다. 마원을 격파하면 적의 연락망이 끊어집니다.', '강가 길목과 요새 주변의 궁병을 방치하면 전선이 오래 묶입니다. 지형 보정을 살펴 진군하십시오.', '14턴 이내에 승리하면 광종 구원로 확보 명성이 오릅니다.' ], map: thirdBattleMap, units: thirdBattleUnits, bonds: thirdBattleBonds, mapTextureKey: 'battle-map-third', leaderUnitId: 'guangzong-leader-ma-yuan', quickVictoryTurnLimit: 14, baseVictoryGold: 520, objectives: [ { id: 'leader', kind: 'defeat-leader', label: '전령 마원 격파', rewardGold: 320, unitId: 'guangzong-leader-ma-yuan' }, { id: 'liu-bei', kind: 'keep-unit-alive', label: '유비 생존', rewardGold: 140, unitId: 'liu-bei' }, { id: 'fort', kind: 'secure-terrain', label: '강가 요새 확보', rewardGold: 220, terrain: 'fort' }, { id: 'quick', kind: 'quick-victory', label: '14턴 이내 승리', rewardGold: 180, maxTurn: 14 } ], defeatConditions: [{ kind: 'unit-defeated', unitId: 'liu-bei' }], itemRewards: ['콩 2', '상처약 1', '의용군 명성 +3'], victoryPages: thirdBattleVictoryPages, nextCampScene: 'CampScene' }; export const fourthBattleScenario: BattleScenarioDefinition = { id: 'fourth-battle-guangzong-camp', title: '광종 본영전', victoryConditionLabel: '장각 격파', defeatConditionLabel: '유비 퇴각', openingObjectiveLines: [ '황건 본영의 중심에는 장각이 있습니다. 장각을 격파하면 광종의 황건 세력은 무너집니다.', '요새와 숲의 궁병이 진입로를 막고 있습니다. 측면의 기병과 중앙 수비병을 나누어 상대하십시오.', '16턴 이내에 승리하면 황건적 토벌의 공적이 크게 오릅니다.' ], map: fourthBattleMap, units: fourthBattleUnits, bonds: fourthBattleBonds, mapTextureKey: 'battle-map-fourth', leaderUnitId: 'guangzong-main-leader-zhang-jue', quickVictoryTurnLimit: 16, baseVictoryGold: 700, objectives: [ { id: 'leader', kind: 'defeat-leader', label: '장각 격파', rewardGold: 420, unitId: 'guangzong-main-leader-zhang-jue' }, { id: 'liu-bei', kind: 'keep-unit-alive', label: '유비 생존', rewardGold: 180, unitId: 'liu-bei' }, { id: 'fort', kind: 'secure-terrain', label: '광종 본영 확보', rewardGold: 260, terrain: 'fort' }, { id: 'quick', kind: 'quick-victory', label: '16턴 이내 승리', rewardGold: 220, maxTurn: 16 } ], defeatConditions: [{ kind: 'unit-defeated', unitId: 'liu-bei' }], itemRewards: ['콩 2', '상처약 1', '탁주 1', '황건 토벌 공적 +1'], victoryPages: fourthBattleVictoryPages, 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 sixthBattleScenario: BattleScenarioDefinition = { id: 'sixth-battle-jieqiao-relief', title: '계교 원군로', victoryConditionLabel: '곡의 격파', defeatConditionLabel: '유비 퇴각', openingObjectiveLines: [ '공손찬의 보급로를 원소군 교위 곡의가 끊으려 합니다. 곡의를 격파하면 계교로 향하는 길을 다시 열 수 있습니다.', '강가의 궁병과 측면 기병이 동시에 압박합니다. 숲길 척후를 먼저 밀어내고 중앙 길을 확보하십시오.', '15턴 이내에 승리하면 공손찬 진영에서 세 형제의 신뢰가 커집니다.' ], map: sixthBattleMap, units: sixthBattleUnits, bonds: sixthBattleBonds, mapTextureKey: 'battle-map-sixth', leaderUnitId: 'jieqiao-leader-qu-yi', quickVictoryTurnLimit: 15, baseVictoryGold: 860, objectives: [ { id: 'leader', kind: 'defeat-leader', label: '곡의 격파', rewardGold: 520, unitId: 'jieqiao-leader-qu-yi' }, { id: 'liu-bei', kind: 'keep-unit-alive', label: '유비 생존', rewardGold: 210, unitId: 'liu-bei' }, { id: 'village', kind: 'secure-terrain', label: '계교 보급촌 확보', rewardGold: 300, terrain: 'village' }, { id: 'quick', kind: 'quick-victory', label: '15턴 이내 승리', rewardGold: 250, maxTurn: 15 } ], defeatConditions: [{ kind: 'unit-defeated', unitId: 'liu-bei' }], itemRewards: ['콩 2', '상처약 2', '탁주 1', '공손찬 신뢰 +1'], victoryPages: sixthBattleVictoryPages, nextCampScene: 'CampScene' }; export const seventhBattleScenario: BattleScenarioDefinition = { id: 'seventh-battle-xuzhou-rescue', title: '서주 구원전', victoryConditionLabel: '하후돈 격파', defeatConditionLabel: '유비 퇴각', openingObjectiveLines: [ '조조군 선봉 하후돈이 서주 피난로와 마을을 압박하고 있습니다. 하후돈을 격파하면 서주 성문까지 길을 열 수 있습니다.', '강가 궁병은 자리를 지키고, 기병은 길을 따라 빠르게 추격합니다. 마을을 확보하며 선봉을 단계적으로 끊어 내십시오.', '16턴 이내에 승리하면 도겸과 서주 백성의 신뢰가 크게 오릅니다.' ], map: seventhBattleMap, units: seventhBattleUnits, bonds: seventhBattleBonds, mapTextureKey: 'battle-map-seventh', leaderUnitId: 'xuzhou-leader-xiahou-dun', quickVictoryTurnLimit: 16, baseVictoryGold: 960, objectives: [ { id: 'leader', kind: 'defeat-leader', label: '하후돈 격파', rewardGold: 580, unitId: 'xuzhou-leader-xiahou-dun' }, { id: 'liu-bei', kind: 'keep-unit-alive', label: '유비 생존', rewardGold: 230, unitId: 'liu-bei' }, { id: 'village', kind: 'secure-terrain', label: '서주 피난촌 확보', rewardGold: 330, terrain: 'village' }, { id: 'quick', kind: 'quick-victory', label: '16턴 이내 승리', rewardGold: 270, maxTurn: 16 } ], defeatConditions: [{ kind: 'unit-defeated', unitId: 'liu-bei' }], itemRewards: ['콩 2', '상처약 2', '탁주 1', '서주 민심 +1'], victoryPages: seventhBattleVictoryPages, nextCampScene: 'CampScene' }; export const eighthBattleScenario: BattleScenarioDefinition = { id: 'eighth-battle-xiaopei-supply-road', title: '소패 보급로 방위전', victoryConditionLabel: '고순 격파', defeatConditionLabel: '유비 퇴각', openingObjectiveLines: [ '여포군의 척후와 습격병이 소패 보급로를 흔들고 있습니다. 고순을 격파하면 서주의 첫 방위선을 지킬 수 있습니다.', '기병은 길을 타고 빠르게 파고들고, 궁병은 강 건너와 언덕에서 사거리를 잡습니다. 마을과 창고 지형을 이용해 버티십시오.', '18턴 이내 승리하면 서주 보급망과 새 합류 무장의 명성이 크게 오릅니다.' ], map: eighthBattleMap, units: eighthBattleUnits, bonds: eighthBattleBonds, mapTextureKey: 'battle-map-eighth', leaderUnitId: 'xiaopei-leader-gao-shun', quickVictoryTurnLimit: 18, baseVictoryGold: 1080, objectives: [ { id: 'leader', kind: 'defeat-leader', label: '고순 격파', rewardGold: 640, unitId: 'xiaopei-leader-gao-shun' }, { id: 'liu-bei', kind: 'keep-unit-alive', label: '유비 생존', rewardGold: 250, unitId: 'liu-bei' }, { id: 'village', kind: 'secure-terrain', label: '소패 보급촌 확보', rewardGold: 360, terrain: 'village' }, { id: 'quick', kind: 'quick-victory', label: '18턴 이내 승리', rewardGold: 300, maxTurn: 18 } ], defeatConditions: [{ kind: 'unit-defeated', unitId: 'liu-bei' }], itemRewards: ['콩 3', '상처약 2', '탁주 1', '서주 보급망 +1'], victoryPages: eighthBattleVictoryPages, nextCampScene: 'CampScene' }; export const ninthBattleScenario: BattleScenarioDefinition = { id: 'ninth-battle-xuzhou-gate-night-raid', title: '서주 성문 야습', victoryConditionLabel: '조표 격파', defeatConditionLabel: '유비 퇴각', openingObjectiveLines: [ '조표가 성문 수비병을 움직이고 여포군 기병이 밤길을 타고 접근합니다. 조표를 격파하면 성문을 다시 장악할 수 있습니다.', '성벽 궁병은 높은 곳을 지키고, 여포군 기병은 길을 따라 빠르게 파고듭니다. 마을과 성문 지형을 이용해 전열을 끊어야 합니다.', '18턴 이내 성문을 안정시키면 서주 내부 불안을 잠시나마 눌러 둘 수 있습니다.' ], map: ninthBattleMap, units: ninthBattleUnits, bonds: ninthBattleBonds, mapTextureKey: 'battle-map-ninth', leaderUnitId: 'xuzhou-leader-cao-bao', quickVictoryTurnLimit: 18, baseVictoryGold: 1160, objectives: [ { id: 'leader', kind: 'defeat-leader', label: '조표 격파', rewardGold: 700, unitId: 'xuzhou-leader-cao-bao' }, { id: 'liu-bei', kind: 'keep-unit-alive', label: '유비 생존', rewardGold: 280, unitId: 'liu-bei' }, { id: 'fort', kind: 'secure-terrain', label: '서주 성문 확보', rewardGold: 400, terrain: 'fort' }, { id: 'quick', kind: 'quick-victory', label: '18턴 이내 승리', rewardGold: 320, maxTurn: 18 } ], defeatConditions: [{ kind: 'unit-defeated', unitId: 'liu-bei' }], itemRewards: ['콩 3', '상처약 2', '탁주 1', '서주 성문 수비 +1'], victoryPages: ninthBattleVictoryPages, nextCampScene: 'CampScene' }; export const defaultBattleScenarioId: BattleScenarioId = firstBattleScenario.id; export const battleScenarios: Record = { 'first-battle-zhuo-commandery': firstBattleScenario, 'second-battle-yellow-turban-pursuit': secondBattleScenario, 'third-battle-guangzong-road': thirdBattleScenario, 'fourth-battle-guangzong-camp': fourthBattleScenario, 'fifth-battle-sishui-vanguard': fifthBattleScenario, 'sixth-battle-jieqiao-relief': sixthBattleScenario, 'seventh-battle-xuzhou-rescue': seventhBattleScenario, 'eighth-battle-xiaopei-supply-road': eighthBattleScenario, 'ninth-battle-xuzhou-gate-night-raid': ninthBattleScenario }; export const defaultBattleScenario = battleScenarios[defaultBattleScenarioId]; export function getBattleScenario(id: string | undefined) { if (id && id in battleScenarios) { return battleScenarios[id as BattleScenarioId]; } return defaultBattleScenario; }