Files
heros_web/src/game/data/scenario.ts

242 lines
6.7 KiB
TypeScript

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
}
];