export type PortraitKey = 'liuBei' | 'guanYu' | 'zhangFei'; export type StoryPage = { id: string; chapter: string; background: string; speaker?: string; portrait?: PortraitKey; bgm?: string; text: string; }; export type UnitData = { id: string; name: string; faction: 'ally' | 'enemy'; className: string; hp: number; maxHp: number; attack: number; move: number; stats: UnitStats; x: number; y: number; }; export type UnitStats = { might: number; intelligence: number; leadership: number; agility: number; luck: number; }; export type TerrainType = 'plain' | 'forest' | 'hill' | 'fort'; export type BattleMap = { width: number; height: number; terrain: TerrainType[][]; }; export const prologuePages: StoryPage[] = [ { id: 'yellow-turban-chaos', bgm: 'story-dark', chapter: '난세의 시작', background: 'story-chaos', text: '중평 원년, 황건의 깃발이 각지에서 일어났다. 관군은 흩어지고, 마을마다 피난 행렬이 이어졌다.' }, { id: 'liu-bei-resolve', bgm: 'story-dark', chapter: '탁현의 방', background: 'story-liu-bei', speaker: '유비', portrait: 'liuBei', text: '한실의 백성이 이토록 고통받는데, 어찌 초가집 그늘에 숨어 있을 수 있겠는가.' }, { id: 'zhang-fei-joins', bgm: 'story-dark', chapter: '뜻이 모이다', background: 'story-three-heroes', speaker: '장비', portrait: 'zhangFei', text: '좋소! 나라를 바로잡고 백성을 구한다면, 내 재산도 이 목숨도 아깝지 않소.' }, { id: 'guan-yu-joins', bgm: 'story-dark', chapter: '뜻이 모이다', background: 'story-three-heroes', speaker: '관우', portrait: 'guanYu', text: '의로운 뜻을 품은 이와 길을 함께한다면, 천 리라도 멀다 하지 않겠습니다.' }, { id: 'oath-narration', bgm: 'oath-theme', chapter: '도원결의', background: 'title-taoyuan', text: '복숭아꽃이 흩날리는 동산에서 세 사람은 하늘과 땅에 고했다.' }, { id: 'oath-liu-bei', bgm: 'oath-theme', chapter: '도원결의', background: 'title-taoyuan', speaker: '유비', portrait: 'liuBei', text: '우리는 태어난 날은 달라도, 오늘부터 뜻을 함께한다. 백성을 구하고 한실을 돕는 길에서 물러서지 않겠다.' }, { id: 'oath-brothers', bgm: 'oath-theme', chapter: '도원결의', background: 'title-taoyuan', speaker: '관우', portrait: 'guanYu', text: '의를 저버리지 않고, 형제를 저버리지 않겠습니다.' }, { id: 'militia-rises', bgm: 'militia-theme', chapter: '의용군 모집', background: 'story-militia', speaker: '장비', portrait: 'zhangFei', text: '창을 들 사람은 앞으로 나오시오! 오늘 모인 이름 없는 무리가 내일의 방패가 될 것이오!' }, { id: 'first-sortie', bgm: 'battle-prep', chapter: '첫 출진', background: 'story-sortie', speaker: '유비', portrait: 'liuBei', text: '우리는 아직 작다. 그러나 오늘 한 마을을 지켜낸다면, 그 뜻은 천하로 번져갈 것이다.' }, { id: 'battle-briefing', bgm: 'battle-prep', chapter: '황건적 토벌', background: 'story-sortie', text: '의용군은 마을 어귀로 향했다. 첫 싸움은 곧 시작된다.' } ]; export const firstBattleMap: BattleMap = { width: 12, height: 12, terrain: [ ['plain', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'hill', 'hill', 'plain', 'plain', 'plain'], ['plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'plain', 'plain', 'hill', 'plain', 'plain', 'plain'], ['plain', 'forest', 'plain', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'plain', 'plain'], ['plain', 'plain', 'plain', 'hill', 'hill', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'plain'], ['plain', 'plain', 'plain', 'hill', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'plain'], ['plain', 'plain', 'plain', 'plain', 'plain', 'fort', 'plain', 'plain', 'plain', 'plain', 'forest', 'forest'], ['plain', 'plain', 'plain', 'plain', 'plain', 'plain', 'plain', 'plain', 'plain', 'plain', 'forest', 'plain'], ['forest', 'forest', 'plain', 'plain', 'plain', 'plain', 'plain', 'hill', 'hill', 'plain', 'plain', 'plain'], ['forest', 'plain', 'plain', 'plain', 'plain', 'plain', 'plain', 'hill', 'plain', 'plain', 'plain', 'plain'], ['plain', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'plain', 'plain', 'plain', 'plain'], ['plain', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'plain', 'forest', 'forest', 'plain'], ['plain', 'plain', 'plain', 'plain', 'plain', 'plain', 'plain', 'plain', 'plain', 'plain', 'forest', 'plain'] ] }; export const firstBattleUnits: UnitData[] = [ { id: 'liu-bei', name: '유비', faction: 'ally', className: '의병장', hp: 32, maxHp: 32, attack: 9, move: 4, stats: { might: 76, intelligence: 78, leadership: 84, agility: 70, luck: 88 }, x: 1, y: 9 }, { id: 'guan-yu', name: '관우', faction: 'ally', className: '보병', hp: 30, maxHp: 30, attack: 10, move: 3, stats: { might: 96, intelligence: 74, leadership: 91, agility: 72, luck: 68 }, x: 2, y: 10 }, { id: 'zhang-fei', name: '장비', faction: 'ally', className: '창병', hp: 30, maxHp: 30, attack: 10, move: 3, stats: { might: 95, intelligence: 42, leadership: 83, agility: 67, luck: 61 }, x: 1, y: 10 }, { id: 'rebel-a', name: '황건병', faction: 'enemy', className: '도적', hp: 20, maxHp: 20, attack: 6, move: 3, stats: { might: 49, intelligence: 34, leadership: 38, agility: 45, luck: 40 }, x: 8, y: 2 }, { id: 'rebel-b', name: '황건병', faction: 'enemy', className: '도적', hp: 20, maxHp: 20, attack: 6, move: 3, stats: { might: 47, intelligence: 32, leadership: 36, agility: 48, luck: 38 }, x: 9, y: 3 }, { id: 'rebel-c', name: '황건궁병', faction: 'enemy', className: '궁병', hp: 18, maxHp: 18, attack: 7, move: 3, stats: { might: 52, intelligence: 40, leadership: 43, agility: 56, luck: 42 }, x: 10, y: 2 }, { id: 'rebel-leader', name: '두령 한석', faction: 'enemy', className: '두령', hp: 30, maxHp: 30, attack: 9, move: 3, stats: { might: 64, intelligence: 46, leadership: 61, agility: 52, luck: 50 }, x: 10, y: 4 } ];