Add cinematic prologue story

This commit is contained in:
2026-06-21 23:36:21 +09:00
parent 34611bc633
commit 591141c492
11 changed files with 217 additions and 71 deletions

View File

@@ -1,6 +1,11 @@
export type StoryLine = {
speaker: string;
portrait: 'lord' | 'strategist' | 'captain';
export type PortraitKey = 'liuBei' | 'guanYu' | 'zhangFei';
export type StoryPage = {
id: string;
chapter: string;
background: string;
speaker?: string;
portrait?: PortraitKey;
text: string;
};
@@ -25,26 +30,80 @@ export type BattleMap = {
terrain: TerrainType[][];
};
export const prologueLines: StoryLine[] = [
export const prologuePages: StoryPage[] = [
{
speaker: '유현',
portrait: 'lord',
text: '황건의 깃발이 마을 어귀까지 내려왔다. 오늘 물러서면 내일은 지킬 집도 없다.'
id: 'yellow-turban-chaos',
chapter: '난세의 시작',
background: 'story-chaos',
text: '중평 원년, 황건의 깃발이 각지에서 일어났다. 관군은 흩어지고, 마을마다 피난 행렬이 이어졌다.'
},
{
speaker: '서윤',
portrait: 'strategist',
text: '적은 많지만 대열은 흐트러져 있습니다. 숲길을 잡으면 첫 싸움은 해볼 만합니다.'
id: 'liu-bei-resolve',
chapter: '탁현의 방',
background: 'story-liu-bei',
speaker: '유비',
portrait: 'liuBei',
text: '한실의 백성이 이토록 고통받는데, 어찌 초가집 그늘에 숨어 있을 수 있겠는가.'
},
{
speaker: '장무',
portrait: 'captain',
text: '명만 내려주십시오. 창병 둘과 기병 하나라면 길목은 막아낼 수 있습니다.'
id: 'zhang-fei-joins',
chapter: '뜻이 모이다',
background: 'story-three-heroes',
speaker: '장비',
portrait: 'zhangFei',
text: '좋소! 나라를 바로잡고 백성을 구한다면, 내 재산도 이 목숨도 아깝지 않소.'
},
{
speaker: '유현',
portrait: 'lord',
text: '좋다. 백성을 뒤로 물리고, 우리는 앞에서 시간을 벌겠다.'
id: 'guan-yu-joins',
chapter: '뜻이 모이다',
background: 'story-three-heroes',
speaker: '관우',
portrait: 'guanYu',
text: '의로운 뜻을 품은 이와 길을 함께한다면, 천 리라도 멀다 하지 않겠습니다.'
},
{
id: 'oath-narration',
chapter: '도원결의',
background: 'title-taoyuan',
text: '복숭아꽃이 흩날리는 동산에서 세 사람은 하늘과 땅에 고했다.'
},
{
id: 'oath-liu-bei',
chapter: '도원결의',
background: 'title-taoyuan',
speaker: '유비',
portrait: 'liuBei',
text: '우리는 태어난 날은 달라도, 오늘부터 뜻을 함께한다. 백성을 구하고 한실을 돕는 길에서 물러서지 않겠다.'
},
{
id: 'oath-brothers',
chapter: '도원결의',
background: 'title-taoyuan',
speaker: '관우',
portrait: 'guanYu',
text: '의를 저버리지 않고, 형제를 저버리지 않겠습니다.'
},
{
id: 'militia-rises',
chapter: '의용군 모집',
background: 'story-militia',
speaker: '장비',
portrait: 'zhangFei',
text: '창을 들 사람은 앞으로 나오시오! 오늘 모인 이름 없는 무리가 내일의 방패가 될 것이오!'
},
{
id: 'first-sortie',
chapter: '첫 출진',
background: 'story-sortie',
speaker: '유비',
portrait: 'liuBei',
text: '우리는 아직 작다. 그러나 오늘 한 마을을 지켜낸다면, 그 뜻은 천하로 번져갈 것이다.'
},
{
id: 'battle-briefing',
chapter: '황건적 토벌',
background: 'story-sortie',
text: '의용군은 마을 어귀로 향했다. 첫 싸움은 곧 시작된다.'
}
];
@@ -68,9 +127,9 @@ export const firstBattleMap: BattleMap = {
};
export const firstBattleUnits: UnitData[] = [
{ id: 'you-hyun', name: '유', faction: 'ally', className: '의병장', hp: 32, maxHp: 32, attack: 9, move: 4, x: 1, y: 9 },
{ id: 'jang-mu', name: '장무', faction: 'ally', className: '병', hp: 28, maxHp: 28, attack: 8, move: 3, x: 2, y: 10 },
{ id: 'seo-yun', name: '서윤', faction: 'ally', className: '책사', hp: 24, maxHp: 24, attack: 6, move: 3, x: 1, y: 10 },
{ id: 'liu-bei', name: '유', faction: 'ally', className: '의병장', hp: 32, maxHp: 32, attack: 9, move: 4, x: 1, y: 9 },
{ id: 'guan-yu', name: '관우', faction: 'ally', className: '병', hp: 30, maxHp: 30, attack: 10, move: 3, x: 2, y: 10 },
{ id: 'zhang-fei', name: '장비', faction: 'ally', className: '창병', hp: 30, maxHp: 30, attack: 10, move: 3, x: 1, y: 10 },
{ id: 'rebel-a', name: '황건병', faction: 'enemy', className: '도적', hp: 20, maxHp: 20, attack: 6, move: 3, x: 8, y: 2 },
{ id: 'rebel-b', name: '황건병', faction: 'enemy', className: '도적', hp: 20, maxHp: 20, attack: 6, move: 3, x: 9, y: 3 },
{ id: 'rebel-c', name: '황건궁병', faction: 'enemy', className: '궁병', hp: 18, maxHp: 18, attack: 7, move: 3, x: 10, y: 2 },