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

24489 lines
918 KiB
TypeScript

import type { TerrainType, UnitClassKey } from './battleRules';
import type { EquipmentSet } from './battleItems';
import type { StoryCutscene } from './storyCutscenes';
export type PortraitKey = string;
export type StoryPage = {
id: string;
chapter: string;
background: string;
speaker?: string;
portrait?: PortraitKey;
bgm?: string;
text: string;
cutscene?: StoryCutscene;
};
export type UnitData = {
id: string;
name: string;
faction: 'ally' | 'enemy';
className: string;
classKey: UnitClassKey;
level: number;
exp: number;
hp: number;
maxHp: number;
attack: number;
move: number;
stats: UnitStats;
equipment: EquipmentSet;
x: number;
y: number;
};
export type UnitStats = {
might: number;
intelligence: number;
leadership: number;
agility: number;
luck: number;
};
export type BattleBond = {
id: string;
unitIds: [string, string];
title: string;
level: number;
exp: number;
description: string;
};
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: 'yellow-turban-nearby',
bgm: 'battle-prep',
chapter: '가까운 불씨',
background: 'story-sortie',
speaker: '관우',
portrait: 'guanYu',
text: '방금 돌아온 마을 사람이 말했습니다. 황건 잔당 일부가 북쪽 숲길에 남아 진을 치고 있습니다. 그냥 지나치면 다시 마을을 덮칠 것입니다.'
},
{
id: 'first-battle-plan-talk',
bgm: 'battle-prep',
chapter: '진형을 읽다',
background: 'story-sortie',
speaker: '장비',
portrait: 'zhangFei',
text: '좋소. 앞줄을 막은 놈들은 내가 흔들겠소. 관우 형님이 길목을 열고, 형님은 뒤에서 백성과 우리 전열을 살펴 주시오.'
},
{
id: 'battle-briefing',
bgm: 'battle-prep',
chapter: '황건적 토벌',
background: 'story-sortie',
text: '의용군은 마을 어귀로 향했다. 첫 싸움은 곧 시작된다.'
}
];
export const firstBattleVictoryPages: StoryPage[] = [
{
id: 'first-victory-village',
bgm: 'militia-theme',
chapter: '첫 승리',
background: 'story-yellow-pursuit',
text: '황건적의 깃발이 쓰러지자, 숨어 있던 백성들이 하나둘 마을 어귀로 돌아왔다.'
},
{
id: 'first-victory-liu-bei',
bgm: 'militia-theme',
chapter: '첫 승리',
background: 'story-yellow-pursuit',
speaker: '유비',
portrait: 'liuBei',
text: '오늘의 승리는 작다. 그러나 백성 한 사람을 지키는 일에서 천하를 바로잡는 뜻이 시작된다.'
},
{
id: 'first-victory-guan-yu',
bgm: 'militia-theme',
chapter: '의용군의 이름',
background: 'story-yellow-pursuit',
speaker: '관우',
portrait: 'guanYu',
text: '형님의 뜻을 보고 사람들이 모일 것입니다. 다음 싸움은 오늘보다 더 큰 책임을 요구하겠지요.'
},
{
id: 'first-victory-zhang-fei',
bgm: 'militia-theme',
chapter: '의용군의 이름',
background: 'story-yellow-pursuit',
speaker: '장비',
portrait: 'zhangFei',
text: '하하! 그럼 더 크게 외쳐야겠소. 창을 들 자는 모여라! 우리 의용군은 물러서지 않는다!'
},
{
id: 'first-victory-next',
bgm: 'battle-prep',
chapter: '다음 길',
background: 'story-yellow-pursuit',
text: '세 형제의 이름은 탁현 일대에 퍼지기 시작했다. 이제 더 넓은 전장과 더 많은 인연이 그들을 기다린다.'
}
];
const firstBattleStoryOverrides: Record<string, Partial<StoryPage>> = {
'militia-rises': {
chapter: '탁현 의용군',
speaker: '장비',
text: '창을 들 사람은 앞으로 나오시오. 오늘 모인 이름 없는 무리가 마을의 방패가 될 것이오.',
cutscene: {
kind: 'muster',
title: '탁현 의용군 집결',
subtitle: '세 형제와 마을 사람들이 첫 출전을 준비합니다.',
actors: [
{ unitId: 'liu-bei', x: 0.34, y: 0.53, size: 122, direction: 'east', label: '군주' },
{ unitId: 'guan-yu', x: 0.49, y: 0.52, size: 132, direction: 'east', label: '선봉' },
{ unitId: 'zhang-fei', x: 0.64, y: 0.53, size: 132, direction: 'west', label: '돌파' }
],
briefing: {
title: '출전 준비',
lines: ['유비는 중앙에서 전열을 잡습니다.', '관우는 앞길을 열고, 장비는 측면을 찌릅니다.']
},
rewards: [
{ label: '아군: 유비 · 관우 · 장비', tone: 'bond' },
{ label: '목표: 마을 방어', tone: 'next' }
]
}
},
'first-sortie': {
chapter: '첫 출전',
speaker: '유비',
text: '마을 사람들을 먼저 들여보내자. 황건 잔당이 근처에 남아 있다면, 오늘 여기서 물리쳐 다시는 이 길을 넘보지 못하게 해야 한다.',
cutscene: {
kind: 'muster',
title: '황건 잔당을 향해',
subtitle: '마을 북쪽 길목에 남은 황건 무리를 치기 위해 세 형제가 움직입니다.',
actors: [
{ unitId: 'liu-bei', x: 0.32, y: 0.53, size: 136, direction: 'east', label: '유비' },
{ unitId: 'guan-yu', x: 0.5, y: 0.51, size: 144, direction: 'east', label: '관우' },
{ unitId: 'zhang-fei', x: 0.68, y: 0.53, size: 144, direction: 'west', label: '장비' }
],
briefing: {
title: '출전 방침',
lines: ['마을 사람을 뒤로 물린다.', '황건 잔당의 진형을 확인한다.', '세 형제가 함께 길목을 연다.']
},
rewards: [
{ label: '패배 조건: 유비 퇴각 금지', tone: 'next' },
{ label: '공명: 세 형제 인접 운용', tone: 'bond' }
]
}
},
'battle-briefing': {
chapter: '탁현 작전판',
speaker: '관우',
portrait: 'guanYu',
text: '작전판으로 보시지요. 황건 잔당은 보병을 앞세워 길목을 막고, 뒤쪽 궁병으로 엄호하며, 두령은 북동쪽 높은 길에 머물고 있습니다.',
cutscene: {
kind: 'operation',
title: '황건 잔당 진형',
subtitle: '보병 전열을 걷어 내고, 궁병 엄호를 피한 뒤 두령을 포위하십시오.',
actors: [
{ unitId: 'liu-bei', x: 0.24, y: 0.56, size: 104, direction: 'east', label: '지휘' },
{ unitId: 'guan-yu', x: 0.34, y: 0.54, size: 108, direction: 'east', label: '정면' },
{ unitId: 'zhang-fei', x: 0.44, y: 0.6, size: 108, direction: 'east', label: '측면' },
{ unitId: 'rebel-leader', x: 0.78, y: 0.43, size: 108, direction: 'west', label: '두령' }
],
markers: [
{ x: 0.2, y: 0.74, label: '아군 시작', side: 'ally' },
{ x: 0.42, y: 0.55, label: '보병 전열', side: 'enemy' },
{ x: 0.57, y: 0.43, label: '궁병 엄호', side: 'enemy' },
{ x: 0.74, y: 0.28, label: '황건 두령', side: 'enemy' },
{ x: 0.35, y: 0.64, label: '마을 입구', side: 'objective' }
],
briefing: {
title: '공략 방침',
lines: ['장비가 측면에서 앞줄을 흔든다.', '관우가 길목 보병을 정면 돌파한다.', '유비는 후방에서 생존과 회복을 맡는다.', '궁병 엄호를 피한 뒤 두령을 함께 포위한다.']
},
rewards: [
{ label: '보상: 보급품 · 연습검 · 의용군 명성', tone: 'reward' }
]
}
},
'first-victory-village': {
chapter: '첫 승리',
speaker: '전황',
text: '황건의 깃발이 꺾이고, 흩어졌던 백성들이 마을로 돌아오기 시작했다.',
cutscene: {
kind: 'victory',
title: '탁현 방어 성공',
subtitle: '전투에서 싸운 세 유닛이 그대로 승리 장면에 남습니다.',
actors: [
{ unitId: 'liu-bei', x: 0.36, y: 0.53, size: 132, direction: 'east', label: '유비' },
{ unitId: 'guan-yu', x: 0.52, y: 0.52, size: 142, direction: 'west', label: '관우' },
{ unitId: 'zhang-fei', x: 0.67, y: 0.53, size: 142, direction: 'west', label: '장비' }
],
rewards: [
{ label: '승리 조건 달성', tone: 'reward' },
{ label: '마을 방어', tone: 'bond' },
{ label: '다음: 황건 잔당 추격', tone: 'next' }
]
}
},
'first-victory-liu-bei': {
chapter: '첫 승리',
speaker: '유비',
text: '오늘의 승리는 작다. 하지만 백성을 지키는 길은 여기서 시작된다.',
cutscene: {
kind: 'victory',
title: '전투 후 정비',
subtitle: '획득 보상은 다음 출전 준비와 장비 화면으로 이어집니다.',
actors: [
{ unitId: 'liu-bei', x: 0.44, y: 0.52, size: 146, direction: 'south', label: '유비' },
{ unitId: 'guan-yu', x: 0.58, y: 0.53, size: 130, direction: 'west', label: '관우' },
{ unitId: 'zhang-fei', x: 0.7, y: 0.54, size: 130, direction: 'west', label: '장비' }
],
rewards: [
{ label: '보급품: 콩 · 탁주', tone: 'reward' },
{ label: '장비: 연습검', tone: 'reward' },
{ label: '명성: 의용군 +1', tone: 'bond' }
]
}
},
'first-victory-guan-yu': {
chapter: '의용군의 이름',
speaker: '관우',
text: '형님의 뜻을 보고 사람들이 모일 것입니다. 다음 싸움은 오늘보다 무거운 책임을 요구하겠지요.',
cutscene: {
kind: 'victory',
title: '관우의 다짐',
subtitle: '선봉의 장병기가 다음 전투의 전열을 맡습니다.',
actors: [
{ unitId: 'guan-yu', x: 0.45, y: 0.52, size: 152, direction: 'east', label: '선봉' },
{ unitId: 'liu-bei', x: 0.31, y: 0.54, size: 122, direction: 'east', label: '지휘' },
{ unitId: 'zhang-fei', x: 0.64, y: 0.54, size: 128, direction: 'west', label: '돌파' }
],
rewards: [
{ label: '출전 가능: 관우', tone: 'bond' },
{ label: '역할 추천: 전면', tone: 'next' }
]
}
},
'first-victory-zhang-fei': {
chapter: '의용군의 이름',
speaker: '장비',
text: '좋다! 다음에는 더 크게 몰아치자. 창을 드는 자들은 우리 의용군을 따라올 것이다.',
cutscene: {
kind: 'victory',
title: '장비의 기세',
subtitle: '측면 돌파와 압박이 다음 전장의 선택지가 됩니다.',
actors: [
{ unitId: 'zhang-fei', x: 0.48, y: 0.52, size: 154, direction: 'east', label: '돌파' },
{ unitId: 'liu-bei', x: 0.34, y: 0.54, size: 122, direction: 'east', label: '지휘' },
{ unitId: 'guan-yu', x: 0.64, y: 0.53, size: 130, direction: 'west', label: '선봉' }
],
rewards: [
{ label: '출전 가능: 장비', tone: 'bond' },
{ label: '역할 추천: 측면', tone: 'next' }
]
}
},
'first-victory-next': {
chapter: '다음 길',
speaker: '전황',
text: '세 형제의 이름은 탁현 일대에 퍼지기 시작했다. 이제 황건 잔당의 퇴로를 끊어야 한다.',
cutscene: {
kind: 'operation',
title: '다음 전투 해금',
subtitle: '황건 잔당 추격으로 이어집니다.',
actors: [
{ unitId: 'liu-bei', x: 0.25, y: 0.54, size: 108, direction: 'east', label: '유비' },
{ unitId: 'guan-yu', x: 0.34, y: 0.53, size: 112, direction: 'east', label: '관우' },
{ unitId: 'zhang-fei', x: 0.43, y: 0.54, size: 112, direction: 'east', label: '장비' }
],
markers: [
{ x: 0.24, y: 0.68, label: '탁현', side: 'ally' },
{ x: 0.58, y: 0.46, label: '북쪽 길목', side: 'objective' },
{ x: 0.76, y: 0.32, label: '황건 잔당', side: 'enemy' }
],
briefing: {
title: '정비 후 출전',
lines: ['보급품 배정', '장비 교체', '출전 무장 선택']
},
rewards: [
{ label: '군영에서 보상 확인', tone: 'reward' },
{ label: '다음: 황건 잔당 추격', tone: 'next' }
]
}
}
};
function applyStoryPageOverrides(pages: StoryPage[]) {
pages.forEach((page) => {
const override = firstBattleStoryOverrides[page.id];
if (override) {
Object.assign(page, override);
}
});
}
applyStoryPageOverrides(prologuePages);
applyStoryPageOverrides(firstBattleVictoryPages);
export const secondBattleIntroPages: StoryPage[] = [
{
id: 'second-pursuit-rumor',
bgm: 'militia-theme',
chapter: '잔당의 그림자',
background: 'story-yellow-pursuit',
text: '첫 승리의 기쁨이 채 가시기도 전에, 황건 잔당이 북쪽 길목의 마을을 습격하고 있다는 급보가 도착했다.'
},
{
id: 'second-liu-bei-command',
bgm: 'battle-prep',
chapter: '추격 명령',
background: 'story-yellow-pursuit',
speaker: '유비',
portrait: 'liuBei',
text: '백성이 다시 칼끝에 몰렸다면 우리가 쉬어 갈 곳은 없다. 길을 따라 추격하되, 마을을 먼저 지켜야 한다.'
},
{
id: 'second-guan-yu-vow',
bgm: 'battle-prep',
chapter: '좁은 길목',
background: 'story-yellow-pursuit',
speaker: '관우',
portrait: 'guanYu',
text: '적은 숲과 강을 끼고 물러설 것입니다. 제가 앞길을 열겠습니다. 형님께서는 백성을 살피십시오.'
},
{
id: 'second-zhang-fei-charge',
bgm: 'battle-prep',
chapter: '의용군 출진',
background: 'story-yellow-pursuit',
speaker: '장비',
portrait: 'zhangFei',
text: '좋다! 숨어 있는 놈들도 모조리 끌어내 주마. 이번에는 도망칠 틈도 주지 않겠다!',
cutscene: {
kind: 'operation',
title: '북쪽 나루 추격 작전',
subtitle: '첫 승리 직후 달아난 잔당을 나루와 마을 사이에서 끊어냅니다.',
actors: [
{ unitId: 'liu-bei', x: 0.25, y: 0.58, size: 104, direction: 'east', label: '후방 지휘' },
{ unitId: 'guan-yu', x: 0.35, y: 0.55, size: 112, direction: 'east', label: '나루 전열' },
{ unitId: 'zhang-fei', x: 0.42, y: 0.64, size: 112, direction: 'east', label: '남쪽 돌파' },
{ unitId: 'rebel-leader', x: 0.76, y: 0.42, size: 104, direction: 'west', label: '잔당 두령' }
],
markers: [
{ x: 0.23, y: 0.72, label: '아군 시작', side: 'ally' },
{ x: 0.44, y: 0.56, label: '나루 길목', side: 'objective' },
{ x: 0.58, y: 0.48, label: '궁병 엄호', side: 'enemy' },
{ x: 0.73, y: 0.3, label: '북쪽 마을', side: 'objective' }
],
briefing: {
title: '전열 의도',
lines: ['관우가 나루 앞 전열을 잡는다.', '장비가 남쪽에서 잔당과 궁병을 압박한다.', '유비는 뒤에서 생존과 마을 확보를 맡는다.']
},
rewards: [
{ label: '목표: 두령 격파 · 북쪽 마을 확보', tone: 'next' },
{ label: '보상: 상처약 · 황건 부적', tone: 'reward' }
]
}
}
];
export const secondBattleVictoryPages: StoryPage[] = [
{
id: 'second-victory-village',
bgm: 'militia-theme',
chapter: '마을의 안도',
background: 'story-yellow-pursuit',
text: '잔당의 불길은 꺼지고, 피난하던 백성들이 하나둘 마을로 돌아왔다. 의용군의 이름은 이제 길목의 장터마다 오르내렸다.'
},
{
id: 'second-victory-liu-bei',
bgm: 'militia-theme',
chapter: '다음 책임',
background: 'story-yellow-pursuit',
speaker: '유비',
portrait: 'liuBei',
text: '우리가 이긴 것은 힘만으로 된 일이 아니다. 백성을 지키겠다는 뜻을 잊지 않는다면, 더 큰 전장도 견딜 수 있을 것이다.'
},
{
id: 'second-victory-next',
bgm: 'battle-prep',
chapter: '넓어지는 전장',
background: 'story-yellow-pursuit',
text: '탁현 인근의 소란은 잦아들었지만, 황건의 난은 아직 천하 곳곳에서 타오르고 있었다. 세 형제의 길은 이제 더 멀리 이어진다.',
cutscene: {
kind: 'victory',
title: '추격전 정리',
subtitle: '나루를 확보했지만 광종으로 향하는 전령의 움직임이 포착됩니다.',
actors: [
{ unitId: 'liu-bei', x: 0.31, y: 0.54, size: 120, direction: 'east', label: '유비' },
{ unitId: 'guan-yu', x: 0.43, y: 0.53, size: 126, direction: 'east', label: '관우' },
{ unitId: 'zhang-fei', x: 0.55, y: 0.55, size: 126, direction: 'west', label: '장비' }
],
markers: [
{ x: 0.28, y: 0.68, label: '북쪽 마을', side: 'ally' },
{ x: 0.55, y: 0.48, label: '강가 요새', side: 'objective' },
{ x: 0.76, y: 0.34, label: '광종 본대', side: 'enemy' }
],
briefing: {
title: '다음 정비',
lines: ['획득 보급을 다음 출전에 배정한다.', '황건 부적과 장비 상태를 확인한다.', '강가 요새의 좁은 길을 대비한다.']
},
rewards: [
{ label: '다음: 광종 구원로', tone: 'next' },
{ label: '정비: 보급 · 장비 확인', tone: 'reward' }
]
}
}
];
export const thirdBattleIntroPages: StoryPage[] = [
{
id: 'third-guangzong-report',
bgm: 'militia-theme',
chapter: '광종의 급보',
background: 'story-yellow-pursuit',
text: '탁현 북쪽의 소란을 잠재우자, 장터에는 더 큰 소식이 밀려왔다. 광종 방면에서 황건 본대가 관군을 압박하고 있다는 전갈이었다.'
},
{
id: 'third-liu-bei-decision',
bgm: 'battle-prep',
chapter: '넓어지는 길',
background: 'story-yellow-pursuit',
speaker: '유비',
portrait: 'liuBei',
text: '작은 마을만 지키고 물러선다면 난세는 끝나지 않는다. 광종으로 향하는 길을 열어, 더 많은 백성이 버틸 시간을 만들어야 한다.'
},
{
id: 'third-guan-yu-bridge',
bgm: 'battle-prep',
chapter: '강가의 길목',
background: 'story-yellow-pursuit',
speaker: '관우',
portrait: 'guanYu',
text: '적 전령이 강가 요새를 거쳐 본대로 향한다면, 그 길을 끊어야 합니다. 좁은 다리와 숲길을 먼저 장악하겠습니다.'
},
{
id: 'third-zhang-fei-vanguard',
bgm: 'battle-prep',
chapter: '전초전',
background: 'story-yellow-pursuit',
speaker: '장비',
portrait: 'zhangFei',
text: '전령이든 두령이든 내 앞길에 서면 다 똑같소! 형님, 명만 내리시오. 길목을 시원하게 열어 버리겠소!',
cutscene: {
kind: 'operation',
title: '광종 구원로 차단 작전',
subtitle: '황건 전령이 강가 요새를 지나 본영으로 향하기 전에 길목을 끊습니다.',
actors: [
{ unitId: 'liu-bei', x: 0.24, y: 0.58, size: 104, direction: 'east', label: '후방 지휘' },
{ unitId: 'guan-yu', x: 0.36, y: 0.55, size: 112, direction: 'east', label: '강가 전열' },
{ unitId: 'zhang-fei', x: 0.43, y: 0.65, size: 112, direction: 'east', label: '추격 출발' },
{ unitId: 'rebel-leader', x: 0.77, y: 0.38, size: 104, direction: 'west', label: '전령 마원' }
],
markers: [
{ x: 0.22, y: 0.74, label: '아군 시작', side: 'ally' },
{ x: 0.46, y: 0.6, label: '강가 길목', side: 'objective' },
{ x: 0.6, y: 0.44, label: '요새 궁병', side: 'enemy' },
{ x: 0.77, y: 0.27, label: '전령 퇴로', side: 'enemy' }
],
briefing: {
title: '공략 방침',
lines: ['관우가 요새 앞 견제를 받아낸다.', '장비가 좁은 길을 빠르게 압박한다.', '유비는 뒤에서 전열 붕괴와 퇴각 위험을 막는다.']
},
rewards: [
{ label: '목표: 전령 마원 격파', tone: 'next' },
{ label: '보상: 단궁 · 의용군 명성', tone: 'reward' }
]
}
}
];
export const thirdBattleVictoryPages: StoryPage[] = [
{
id: 'third-victory-road',
bgm: 'militia-theme',
chapter: '열린 길목',
background: 'story-yellow-pursuit',
text: '황건 전령의 깃발이 꺾이자 광종으로 향하는 길목에 잠시 숨통이 트였다. 흩어진 백성들은 의용군의 이름을 기억하기 시작했다.'
},
{
id: 'third-victory-liu-bei',
bgm: 'militia-theme',
chapter: '큰 싸움의 그림자',
background: 'story-yellow-pursuit',
speaker: '유비',
portrait: 'liuBei',
text: '우리가 막은 것은 작은 전갈 하나일 뿐이다. 그러나 작은 길 하나가 열리면, 다음 전장에서도 백성을 구할 길이 생긴다.'
},
{
id: 'third-victory-next',
bgm: 'battle-prep',
chapter: '광종으로',
background: 'story-yellow-pursuit',
text: '세 형제는 병사를 추스르고 광종 방면으로 눈을 돌렸다. 황건의 큰 물결은 아직 꺾이지 않았다.',
cutscene: {
kind: 'victory',
title: '구원로 확보',
subtitle: '전령의 길은 끊겼고, 다음 목표는 광종 본영의 중심입니다.',
actors: [
{ unitId: 'liu-bei', x: 0.29, y: 0.55, size: 118, direction: 'east', label: '지휘' },
{ unitId: 'guan-yu', x: 0.42, y: 0.54, size: 126, direction: 'east', label: '전열' },
{ unitId: 'zhang-fei', x: 0.55, y: 0.56, size: 126, direction: 'west', label: '돌파' }
],
markers: [
{ x: 0.31, y: 0.68, label: '구원로', side: 'ally' },
{ x: 0.58, y: 0.47, label: '광종 외곽', side: 'objective' },
{ x: 0.76, y: 0.32, label: '황건 본영', side: 'enemy' }
],
briefing: {
title: '다음 정비',
lines: ['획득한 단궁과 보급품을 확인한다.', '본영전은 장기전이 될 수 있어 회복 수단을 배정한다.', '세 형제의 역할을 유지하되 시작 전열을 다시 확인한다.']
},
rewards: [
{ label: '다음: 광종 본영전', tone: 'next' },
{ label: '정비: 단궁 · 보급품 확인', tone: 'reward' }
]
}
}
];
export const fourthBattleIntroPages: StoryPage[] = [
{
id: 'fourth-guangzong-camp',
bgm: 'militia-theme',
chapter: '광종 본영',
background: 'story-yellow-pursuit',
text: '전령의 길이 끊기자 황건 본대는 광종 들판에 진을 굳혔다. 노란 깃발이 겹겹이 서고, 장각의 이름이 병사들 사이에 낮게 울렸다.'
},
{
id: 'fourth-liu-bei-resolve',
bgm: 'battle-prep',
chapter: '의용군의 결의',
background: 'story-yellow-pursuit',
speaker: '유비',
portrait: 'liuBei',
text: '장각을 치는 일은 한 사람을 꺾는 일이 아니다. 두려움에 몰린 백성들이 다시 길을 찾게 하는 일이다.'
},
{
id: 'fourth-guan-yu-line',
bgm: 'battle-prep',
chapter: '본영 돌파',
background: 'story-yellow-pursuit',
speaker: '관우',
portrait: 'guanYu',
text: '적은 요새와 숲 사이에 궁병을 숨겼습니다. 전열을 흐트러뜨리지 않고 본영의 깃발까지 밀고 들어가야 합니다.'
},
{
id: 'fourth-zhang-fei-roar',
bgm: 'battle-prep',
chapter: '황건적 토벌',
background: 'story-yellow-pursuit',
speaker: '장비',
portrait: 'zhangFei',
text: '좋소! 광종의 누런 깃발을 오늘 모두 뽑아 버립시다. 뒤돌아볼 틈 없이 밀고 들어가겠소!'
}
];
export const fourthBattleVictoryPages: StoryPage[] = [
{
id: 'fourth-victory-yellow-flags-fall',
bgm: 'militia-theme',
chapter: '황건적 토벌',
background: 'story-yellow-pursuit',
text: '광종의 들판에서 황건의 본영이 무너졌다. 피난민들은 오래 닫았던 문을 열고, 쓰러진 깃발 너머로 관군과 의용군을 바라보았다.'
},
{
id: 'fourth-victory-liu-bei',
bgm: 'militia-theme',
chapter: '이름이 퍼지다',
background: 'story-yellow-pursuit',
speaker: '유비',
portrait: 'liuBei',
text: '난은 잠시 가라앉았지만, 천하가 바로 선 것은 아니다. 오늘의 공이 교만이 되지 않도록 마음을 다잡자.'
},
{
id: 'fourth-victory-next-era',
bgm: 'battle-prep',
chapter: '새로운 혼란',
background: 'story-yellow-pursuit',
text: '황건의 불길이 잦아들 무렵, 조정 안에서는 또 다른 그림자가 자라났다. 세 형제의 길은 이제 반동탁의 흐름으로 이어진다.'
}
];
export const fifthBattleIntroPages: StoryPage[] = [
{
id: 'fifth-coalition-rumor',
bgm: 'militia-theme',
chapter: '반동탁의 격문',
background: 'story-anti-dong',
text: '황건의 불길이 잦아들자 조정에는 또 다른 폭풍이 일었다. 동탁이 낙양을 장악했다는 소식과 함께, 각지의 제후들이 반동탁의 격문에 응하기 시작했다.'
},
{
id: 'fifth-liu-bei-choice',
bgm: 'battle-prep',
chapter: '새로운 대의',
background: 'story-anti-dong',
speaker: '유비',
portrait: 'liuBei',
text: '백성을 괴롭히는 난을 막았다 하나, 조정이 어지러우면 천하는 다시 피를 흘린다. 우리는 더 큰 흐름 속으로 들어가야 한다.'
},
{
id: 'fifth-gongsun-zan',
bgm: 'battle-prep',
chapter: '공손찬의 진영',
background: 'story-anti-dong',
speaker: '관우',
portrait: 'guanYu',
text: '공손찬의 군영에 합류하면 연합군의 움직임을 가까이서 볼 수 있습니다. 그러나 동탁군도 사수관 앞길을 막고 있습니다.'
},
{
id: 'fifth-sishui-sortie',
bgm: 'battle-prep',
chapter: '사수관 전초전',
background: 'story-anti-dong',
speaker: '장비',
portrait: 'zhangFei',
text: '동탁군이든 황건적이든 백성을 짓밟는 놈들은 똑같소. 사수관 앞길부터 뚫어 봅시다!'
}
];
export const fifthBattleVictoryPages: StoryPage[] = [
{
id: 'fifth-victory-sishui',
bgm: 'militia-theme',
chapter: '사수관의 문턱',
background: 'story-anti-dong',
text: '동탁군의 전초 부대가 물러서자 연합군 진영에 세 형제의 이름이 다시 한 번 전해졌다.'
},
{
id: 'fifth-victory-next',
bgm: 'battle-prep',
chapter: '공손찬 의탁',
background: 'story-anti-dong',
text: '사수관 앞 전초전은 끝났지만, 반동탁의 싸움은 이제 막 시작되었다. 유비는 공손찬의 군영에서 다음 기회를 기다린다.'
}
];
export const sixthBattleIntroPages: StoryPage[] = [
{
id: 'sixth-gongsun-zan-order',
bgm: 'militia-theme',
chapter: '공손찬의 명',
background: 'story-anti-dong',
text: '사수관 전초전 뒤, 유비군은 공손찬의 군영에 머물며 북방의 정세를 살폈다. 원소군의 별동대가 계교로 향하는 보급로를 위협하자, 공손찬은 세 형제에게 길목을 맡겼다.'
},
{
id: 'sixth-liu-bei-service',
bgm: 'battle-prep',
chapter: '의탁의 무게',
background: 'story-anti-dong',
speaker: '유비',
portrait: 'liuBei',
text: '남의 깃발 아래에 서더라도 백성을 지키는 뜻은 변하지 않는다. 공손찬 장군의 군영에 머무는 동안에도 우리의 길을 분명히 하자.'
},
{
id: 'sixth-guan-yu-road',
bgm: 'battle-prep',
chapter: '계교 원군로',
background: 'story-anti-dong',
speaker: '관우',
portrait: 'guanYu',
text: '계교로 향하는 길은 강과 숲이 얽혀 있습니다. 원소군의 궁병과 기병을 나누어 상대해야 길을 열 수 있습니다.'
},
{
id: 'sixth-zhang-fei-sortie',
bgm: 'battle-prep',
chapter: '북방의 먼지',
background: 'story-anti-dong',
speaker: '장비',
portrait: 'zhangFei',
text: '원소군이든 누구든 길을 막는 놈은 비켜서게 만들면 됩니다. 형님, 이번엔 제가 먼저 먼지를 일으키겠습니다!'
}
];
export const sixthBattleVictoryPages: StoryPage[] = [
{
id: 'sixth-victory-jieqiao',
bgm: 'militia-theme',
chapter: '계교의 길',
background: 'story-anti-dong',
text: '계교로 향하는 보급로가 열리자 공손찬의 군영에도 한숨 돌릴 여유가 생겼다. 그러나 북방의 전공은 세 형제의 마음을 오래 붙잡아 두지 못했다.'
},
{
id: 'sixth-xuzhou-envoy',
bgm: 'battle-prep',
chapter: '서주의 사신',
background: 'story-anti-dong',
speaker: '유비',
portrait: 'liuBei',
text: '도겸 공이 서주에서 원군을 청한다면, 백성의 고통을 외면할 수 없소. 공손찬 장군께 허락을 구하고 서주로 향할 준비를 하자.'
}
];
export const seventhBattleIntroPages: StoryPage[] = [
{
id: 'seventh-xuzhou-envoy-arrives',
bgm: 'militia-theme',
chapter: '도겸의 사신',
background: 'story-xuzhou',
text: '서주의 도겸이 조조군의 압박을 견디지 못하고 원군을 청했다. 공손찬의 허락을 받은 유비는 세 형제와 의용군을 이끌고 남쪽 길로 향했다.'
},
{
id: 'seventh-liu-bei-xuzhou',
bgm: 'battle-prep',
chapter: '서주로 가는 길',
background: 'story-xuzhou',
speaker: '유비',
portrait: 'liuBei',
text: '서주 백성이 위태롭다는데 어찌 머뭇거리겠는가. 도겸 공을 돕고, 백성들이 피난길에서 더 쓰러지지 않게 길을 열자.'
},
{
id: 'seventh-guan-yu-field',
bgm: 'battle-prep',
chapter: '조조군 선봉',
background: 'story-xuzhou',
speaker: '관우',
portrait: 'guanYu',
text: '조조군 선봉은 길과 촌락을 함께 누르고 있습니다. 기병은 길을 따라 빠르게 내려오고, 궁병은 강가와 마을 뒤에서 전열을 끊을 것입니다.'
},
{
id: 'seventh-zhang-fei-charge',
bgm: 'battle-prep',
chapter: '서주 구원전',
background: 'story-xuzhou',
speaker: '장비',
portrait: 'zhangFei',
text: '서주 백성을 울리는 놈들이라면 이름이 누구든 상관없습니다. 형님, 조조군 선봉부터 박살내고 길을 열어 봅시다!'
}
];
export const seventhBattleVictoryPages: StoryPage[] = [
{
id: 'seventh-victory-xuzhou-road',
bgm: 'militia-theme',
chapter: '서주의 문',
background: 'story-xuzhou',
text: '조조군 선봉이 물러서자 서주 성문 앞 피난민들의 숨통이 트였다. 도겸은 유비의 군기를 맞이하며 깊이 고개를 숙였다.'
},
{
id: 'seventh-tao-qian-entrusts',
bgm: 'battle-prep',
chapter: '도겸의 부탁',
background: 'story-xuzhou',
speaker: '유비',
portrait: 'liuBei',
text: '서주를 맡아 달라는 도겸 공의 청은 너무 무거운 일이다. 그러나 백성이 의지할 곳이 없다면, 외면하는 것도 의가 아니다.'
}
];
export const eighthBattleIntroPages: StoryPage[] = [
{
id: 'eighth-xuzhou-handover',
bgm: 'militia-theme',
chapter: '서주의 새 군영',
background: 'story-xuzhou',
text: '도겸은 병든 몸을 일으켜 서주의 장부와 군량 창고를 유비에게 넘겼다. 간옹과 미축은 백성의 청원과 보급로를 정리하며 새 군영의 기초를 세웠다.'
},
{
id: 'eighth-lu-bu-shadow',
bgm: 'battle-prep',
chapter: '여포의 그림자',
background: 'story-xuzhou',
speaker: '유비',
portrait: 'liuBei',
text: '여포가 떠돌고 있다는 소식은 가볍지 않다. 그 이름 하나만으로도 여러 군세가 흔들린다. 그러나 지금은 서주의 길과 백성을 먼저 지켜야 한다.'
},
{
id: 'eighth-xiaopei-road',
bgm: 'battle-prep',
chapter: '소패 보급로',
background: 'story-xuzhou',
speaker: '미축',
text: '소패로 이어지는 창고 길목이 습격받고 있습니다. 군량이 끊기면 서주를 안정시킬 수 없습니다. 보급로와 마을을 동시에 지켜야 합니다.'
},
{
id: 'eighth-sortie-choice',
bgm: 'battle-prep',
chapter: '첫 방위전',
background: 'story-xuzhou',
speaker: '간옹',
text: '현덕, 이제 함께 갈 장수를 고르는 일도 전술이 되었네. 칼이 필요한 곳과 말이 필요한 곳, 그리고 말보다 장부가 필요한 곳을 구분해야 하네.'
}
];
export const eighthBattleVictoryPages: StoryPage[] = [
{
id: 'eighth-victory-supply-road',
bgm: 'militia-theme',
chapter: '지켜낸 보급로',
background: 'story-xuzhou',
text: '소패의 보급로가 다시 열리자 서주의 창고와 마을은 겨우 숨을 돌렸다. 새로 합류한 장수들은 각자의 방식으로 유비군의 빈틈을 메웠다.'
},
{
id: 'eighth-lu-bu-arrival',
bgm: 'battle-prep',
chapter: '뜻밖의 손님',
background: 'story-xuzhou',
speaker: '유비',
portrait: 'liuBei',
text: '전투가 끝난 뒤, 여포가 몸을 의탁할 곳을 구한다는 전갈이 왔다. 그를 받아들이는 일은 의로울 수 있으나, 서주에 또 다른 불씨를 들이는 일이기도 했다.'
}
];
export const ninthBattleIntroPages: StoryPage[] = [
{
id: 'ninth-lu-bu-refuge',
bgm: 'militia-theme',
chapter: '여포의 의탁',
background: 'story-xuzhou',
speaker: '유비',
portrait: 'liuBei',
text: '여포가 몸을 의탁하겠다 청했다. 난세에 갈 곳 없는 이를 내치는 것은 쉽지 않으나, 서주 백성의 불안을 모른 척할 수도 없다.'
},
{
id: 'ninth-zhang-fei-suspicion',
bgm: 'battle-prep',
chapter: '성문 안의 불씨',
background: 'story-xuzhou',
speaker: '장비',
portrait: 'zhangFei',
text: '여포 같은 자를 성 안에 들이면 반드시 화근이 됩니다. 도겸의 옛 무장들까지 술렁이니, 성문부터 단단히 지켜야 합니다.'
},
{
id: 'ninth-cao-bao-mutiny',
bgm: 'battle-prep',
chapter: '조표의 야습',
background: 'story-xuzhou',
speaker: '미축',
text: '소패에서 돌린 보급 수레를 성문 안쪽으로 옮기겠습니다. 불빛이 세 번 흔들리면 바깥과 안쪽이 맞춘 신호일 수 있으니, 회복품은 뒤에 두고 전열은 성문 앞으로 붙이십시오.'
},
{
id: 'ninth-xuzhou-gate',
bgm: 'battle-prep',
chapter: '서주 성문 방위',
background: 'story-xuzhou',
speaker: '간옹',
text: '현덕, 조표의 수비병은 성문 중앙을 잡고 궁병은 성벽에 남아 있네. 관우는 정면, 장비는 남쪽 길, 나는 화계와 격려로 기병 돌입을 늦추겠네.'
}
];
export const ninthBattleVictoryPages: StoryPage[] = [
{
id: 'ninth-victory-gate-held',
bgm: 'militia-theme',
chapter: '지켜낸 밤',
background: 'story-xuzhou',
text: '조표의 야습은 물러났고 성문은 다시 닫혔다. 그러나 성 안의 의심과 두려움은 이미 선명한 금이 되어 남았다.'
},
{
id: 'ninth-lu-bu-pretext',
bgm: 'battle-prep',
chapter: '더 깊어진 그림자',
background: 'story-xuzhou',
speaker: '유비',
portrait: 'liuBei',
text: '여포는 서주의 혼란을 핑계 삼아 더 깊이 발을 들이려 했다. 오늘 밤 성문은 지켰으나, 서주를 잃을 싸움은 이제 시작되고 있었다.'
}
];
export const tenthBattleIntroPages: StoryPage[] = [
{
id: 'tenth-zhang-fei-fault',
bgm: 'story-dark',
chapter: '술잔이 부른 균열',
background: 'story-wandering',
speaker: '장비',
portrait: 'zhangFei',
text: '조표의 잔당을 다그치던 장비는 분노를 이기지 못했다. 말 한마디, 술 한잔, 그리고 성 안의 오래된 원한이 한밤중에 다시 타올랐다.'
},
{
id: 'tenth-lu-bu-takes-xuzhou',
bgm: 'story-dark',
chapter: '빼앗긴 서주',
background: 'story-wandering',
text: '여포는 성문이 흔들린 틈을 놓치지 않았다. 서주 곳곳의 수비대가 갈라졌고, 피난민과 보급 수레는 성 밖 길목에 묶인 채 흩어지기 시작했다.'
},
{
id: 'tenth-brothers-regroup',
bgm: 'militia-theme',
chapter: '무너진 성 앞에서',
background: 'story-wandering',
speaker: '관우',
portrait: 'guanYu',
text: '형님, 지금 성을 되찾으려 들면 백성과 군졸을 모두 잃습니다. 미축의 수레는 남쪽 마을 길에 있고, 제가 뒤를 막는 동안 익덕이 퇴로를 열어야 합니다.'
},
{
id: 'tenth-xuzhou-escape',
bgm: 'battle-prep',
chapter: '서주 탈출',
background: 'story-wandering',
speaker: '유비',
portrait: 'liuBei',
text: '서주는 오늘 내 손에서 떠났다. 그러나 백성과 형제와 뜻까지 잃을 수는 없다. 피난 마을을 거쳐 포위망을 뚫고, 살아서 다음 길을 찾자.'
}
];
export const tenthBattleVictoryPages: StoryPage[] = [
{
id: 'tenth-victory-breakout',
bgm: 'militia-theme',
chapter: '잃고도 남은 것',
background: 'story-wandering',
text: '유비군은 피난 마을의 보급 수레를 거두고 여포군 선봉을 뚫어 서주 외곽으로 물러났다. 성은 빼앗겼으나, 백성과 장수들의 전열은 아직 흩어지지 않았다.'
},
{
id: 'tenth-cao-cao-shadow',
bgm: 'story-dark',
chapter: '허도로 향하는 그림자',
background: 'story-wandering',
speaker: '간옹',
text: '현덕, 병력과 보급은 가까스로 지켰네. 조조의 휘하로 들어가는 일은 마음에 걸리지만, 살아남아 다시 뜻을 세우려면 그 길을 지나야 할 걸세.'
}
];
export const eleventhBattleIntroPages: StoryPage[] = [
{
id: 'eleventh-arrive-cao-cao-camp',
bgm: 'story-dark',
chapter: '조조의 장막',
background: 'story-wandering',
text: '서주를 잃은 유비군은 허도로 향했다. 조조는 웃으며 맞이했지만, 그 웃음 뒤에는 사람을 재는 날카로운 눈빛이 숨어 있었다.'
},
{
id: 'eleventh-cao-cao-test',
bgm: 'militia-theme',
chapter: '의탁의 대가',
background: 'story-wandering',
speaker: '간옹',
text: '현덕, 조조는 머물 곳을 주겠지만 공짜로 주지는 않을 걸세. 허도 입성로의 원술 잔군이 마을 보급로를 흔들고 있다네. 그들을 치라는 명은 환대이자 시험이지.'
},
{
id: 'eleventh-brothers-under-watch',
bgm: 'story-dark',
chapter: '감시 속의 출진',
background: 'story-wandering',
speaker: '관우',
portrait: 'guanYu',
text: '형님, 조조의 감시병이 뒤에서 보더라도 우리의 칼끝은 백성을 향하지 않습니다. 마을을 지키며 기령을 베면, 명을 따르되 뜻은 잃지 않았다는 증거가 될 것입니다.'
},
{
id: 'eleventh-xudu-road-sortie',
bgm: 'battle-prep',
chapter: '허도 입성로',
background: 'story-wandering',
speaker: '유비',
portrait: 'liuBei',
text: '먼저 길목 마을을 안정시키고, 관우는 중앙에서 기령의 본대를 막아라. 장비는 남쪽 약탈병을 끊는다. 몸은 낮추되, 백성을 지키는 마음까지 굽히지는 말자.'
}
];
export const eleventhBattleVictoryPages: StoryPage[] = [
{
id: 'eleventh-victory-road-cleared',
bgm: 'militia-theme',
chapter: '열린 허도 길',
background: 'story-wandering',
text: '원술 잔군은 물러났고 길목 마을의 보급로도 다시 이어졌다. 조조군의 감시병들은 유비군이 백성을 해치지 않고 길을 연 사실을 조용히 기록했다.'
},
{
id: 'eleventh-cao-cao-accepts',
bgm: 'story-dark',
chapter: '웃음 속의 칼',
background: 'story-wandering',
speaker: '유비',
portrait: 'liuBei',
text: '조조의 장막은 비바람을 피하게 해 주지만, 그 안의 공기는 오래 머물수록 무겁다. 이제 하비의 포위망으로 가게 될 것이다. 들어가되, 나올 날을 잊지 않겠다.'
}
];
export const twelfthBattleIntroPages: StoryPage[] = [
{
id: 'twelfth-cao-cao-order',
bgm: 'story-dark',
chapter: '조조의 명',
background: 'story-wandering',
text: '허도 입성로에서 군율을 보인 뒤, 조조는 곧장 유비군을 하비 포위전에 불렀다. 여포를 치는 명령은 서주를 잃은 한을 풀 기회이자, 조조의 칼끝이 어디를 향하는지 가늠하는 두 번째 시험이었다.'
},
{
id: 'twelfth-xiapi-shadow',
bgm: 'militia-theme',
chapter: '하비의 물길',
background: 'story-wandering',
speaker: '미축',
text: '하비 외곽은 강과 진흙이 얽혀 있습니다. 중앙의 둑길 보급 진영을 잡지 못하면, 여포군 기병이 포위망의 빈틈을 찢고 조조군 장부에는 우리 실책만 남을 것입니다.'
},
{
id: 'twelfth-brothers-before-lubu',
bgm: 'story-dark',
chapter: '다시 마주한 여포',
background: 'story-wandering',
speaker: '장비',
portrait: 'zhangFei',
text: '형님, 여포의 이름만 들어도 창끝이 뜨겁습니다. 허나 이번엔 서두르지 않겠습니다. 남쪽 둑길을 끊어 기병이 날뛰는 길부터 막겠습니다.'
},
{
id: 'twelfth-xiapi-sortie',
bgm: 'battle-prep',
chapter: '하비 외곽전',
background: 'story-wandering',
speaker: '유비',
portrait: 'liuBei',
text: '관우는 중앙 둑길을 지키고, 장비는 기병을 막아라. 간옹과 미축은 보급 진영을 놓치지 마라. 조조의 명을 따르되, 서주 백성이 다시 짓밟히지 않게 하는 일은 우리의 뜻이다.'
}
];
export const twelfthBattleVictoryPages: StoryPage[] = [
{
id: 'twelfth-victory-outer-camp',
bgm: 'militia-theme',
chapter: '무너진 외곽 진영',
background: 'story-wandering',
text: '유비군은 하비 외곽의 둑길 보급 진영을 장악했고, 장료의 선봉은 성 안으로 물러났다. 조조군은 포위망을 성문과 수문 가까이까지 좁혔다.'
},
{
id: 'twelfth-cao-cao-watches',
bgm: 'story-dark',
chapter: '칭찬과 감시',
background: 'story-wandering',
speaker: '간옹',
text: '현덕, 조조는 오늘의 공을 칭찬하겠지만 동시에 더 깊이 살필 걸세. 다음은 하비 성문과 수문일 테니, 여포를 치는 동안에도 우리가 조조의 손안에만 있지 않다는 것을 잊지 말아야 하네.'
}
];
export const thirteenthBattleIntroPages: StoryPage[] = [
{
id: 'thirteenth-cao-cao-final-order',
bgm: 'story-dark',
chapter: '하비 결전의 명',
background: 'story-wandering',
text: '하비 외곽의 둑길이 무너지자 조조는 마지막 총공세를 명했다. 성 안의 여포는 성문 뒤에 기병을 모았고, 진궁은 수문 둑길과 성루 궁병을 엮어 돌파로를 남겨 두었다.'
},
{
id: 'thirteenth-brothers-before-final',
bgm: 'militia-theme',
chapter: '성문과 수문',
background: 'story-wandering',
speaker: '관우',
portrait: 'guanYu',
text: '형님, 성문을 곧장 치면 여포의 기병이 수문 길로 빠져나옵니다. 제가 성문 전열을 누르겠습니다. 장비가 남쪽 둑길을 막으면 여포는 안에서 돌 길밖에 없습니다.'
},
{
id: 'thirteenth-liu-bei-resolve',
bgm: 'story-dark',
chapter: '조조의 그늘',
background: 'story-wandering',
speaker: '유비',
portrait: 'liuBei',
text: '조조의 명으로 싸우되, 오늘의 칼은 백성의 원망을 덜기 위한 칼이어야 한다. 성문과 수문을 함께 닫아 피해를 줄이고, 여포의 끝을 보더라도 우리의 뜻까지 맡기지는 말자.'
},
{
id: 'thirteenth-xiapi-final-sortie',
bgm: 'battle-prep',
chapter: '하비 결전',
background: 'story-wandering',
speaker: '장비',
portrait: 'zhangFei',
text: '좋습니다, 형님. 관우 형님이 성문을 붙들면 저는 수문 둑길을 막겠습니다. 간옹은 진궁의 수를 보게 하고, 미축은 회복품을 챙기게 하십시오. 준비되면 여포의 깃발까지 밀고 들어가겠습니다.'
}
];
export const thirteenthBattleVictoryPages: StoryPage[] = [
{
id: 'thirteenth-victory-lubu-falls',
bgm: 'militia-theme',
chapter: '무너진 여포',
background: 'story-wandering',
text: '성문 전열이 무너지고 수문 둑길이 막히자 여포의 마지막 기병도 흩어졌다. 하비 성내의 저항은 꺾였고, 뛰어난 무용도 믿음을 잃으면 성 하나를 지키지 못한다는 소문이 병사들 사이에 퍼졌다.'
},
{
id: 'thirteenth-cao-cao-weighs-liu-bei',
bgm: 'story-dark',
chapter: '칭찬과 경계',
background: 'story-wandering',
speaker: '간옹',
text: '조조는 형님의 말을 들은 뒤 오래 웃지 않았네. 여포의 운명은 끝났지만, 성문과 수문을 함께 닫은 전공도 조조 눈에는 또 다른 칼로 보일 걸세.'
},
{
id: 'thirteenth-road-to-cao-break',
bgm: 'story-dark',
chapter: '떠날 때를 헤아리다',
background: 'story-wandering',
speaker: '유비',
portrait: 'liuBei',
text: '오늘 싸움으로 빚도 공도 쌓였다. 손건이 서주 길목의 문서를 준비한다 하니, 떠날 때가 오면 망설이지 않도록 마음을 단단히 하자. 의로 시작한 길을 남의 장부 속 숫자로 끝낼 수는 없다.'
}
];
export const fourteenthBattleIntroPages: StoryPage[] = [
{
id: 'fourteenth-secret-edict-shadow',
bgm: 'story-dark',
chapter: '조조의 그늘',
background: 'story-wandering',
speaker: '유비',
portrait: 'liuBei',
text: '하비의 공은 컸지만 조조의 시선은 더욱 무거워졌다. 허도의 잔치와 칭찬 사이에서, 유비는 황실의 명분과 자신의 뜻이 더는 같은 장막 안에 머물 수 없음을 느꼈다.'
},
{
id: 'fourteenth-sun-qian-arrives',
bgm: 'militia-theme',
chapter: '손건의 길',
background: 'story-wandering',
speaker: '손건',
text: '현덕공, 차주는 서주 관문과 역참을 함께 잡고 있습니다. 역참 문서가 조조에게 넘어가면 어느 마을이 주공을 도왔는지까지 드러납니다. 먼저 문서를 거두고 관문을 열어야 합니다.'
},
{
id: 'fourteenth-brothers-break-from-cao',
bgm: 'battle-prep',
chapter: '서주로 나아가다',
background: 'story-wandering',
speaker: '장비',
portrait: 'zhangFei',
text: '조조의 눈치를 보느라 칼집만 만지고 있을 순 없습니다. 관우 형님이 관문을 누르면 제가 남쪽 길로 도는 기병을 막겠습니다. 형님은 뒤에서 길을 잃지 않게만 해 주십시오.'
},
{
id: 'fourteenth-xuzhou-gate-sortie',
bgm: 'battle-prep',
chapter: '서주 재기',
background: 'story-wandering',
speaker: '간옹',
text: '작전은 단순합니다. 손건이 역참 문서를 확보하고, 관우가 동쪽 관문을 밀고, 장비가 추격 기병을 끊습니다. 차주를 꺾으면 조조의 장막 밖으로 나갈 첫 명분이 생깁니다.'
}
];
export const fourteenthBattleVictoryPages: StoryPage[] = [
{
id: 'fourteenth-victory-xuzhou-gate-opens',
bgm: 'militia-theme',
chapter: '다시 열린 서주 길',
background: 'story-wandering',
text: '역참의 문서가 유비군 손에 들어오고 차주의 감시대가 흩어지자, 서주로 향하는 관문이 열렸다. 백성들은 유비군의 깃발을 알아보았고, 조조의 이름보다 현덕의 이름을 먼저 속삭이기 시작했다.'
},
{
id: 'fourteenth-cao-cao-anger',
bgm: 'story-dark',
chapter: '돌이킬 수 없는 길',
background: 'story-wandering',
speaker: '손건',
text: '역참 보고선은 끊었지만 오래 숨길 수는 없습니다. 이 승리는 조조에게 반역의 조짐으로 보일 것입니다. 허도로 돌아갈 길은 사실상 끊겼고, 다음으로 기대야 할 큰 세력은 원소입니다.'
},
{
id: 'fourteenth-road-to-yuan-shao',
bgm: 'battle-prep',
chapter: '원소를 향하여',
background: 'story-wandering',
speaker: '유비',
portrait: 'liuBei',
text: '조조를 떠난 이상, 더 큰 파도 속으로 들어가야 한다. 손건이 남긴 통행 문서와 백성의 말이 우리를 북쪽으로 이끌 것이다. 원소의 진영이 또 다른 시험이라 해도, 뜻을 이어 가려면 그 길을 지나야 한다.'
}
];
export const fifteenthBattleIntroPages: StoryPage[] = [
{
id: 'fifteenth-yuan-envoy-rumor',
bgm: 'story-dark',
chapter: '북쪽의 초대',
background: 'story-wandering',
speaker: '손건',
text: '원소 진영에서 사자가 내려왔습니다. 북동쪽 요새 앞에서 접선하자 하나, 채양의 추격대가 강가 길목과 고갯길을 나누어 막고 있습니다.'
},
{
id: 'fifteenth-liu-bei-under-yuan-shadow',
bgm: 'battle-prep',
chapter: '원소 의탁',
background: 'story-wandering',
speaker: '유비',
portrait: 'liuBei',
text: '원소의 깃발 아래로 들어가는 일은 뜻을 접는 일이 아니다. 조조의 칼끝을 피하고 백성을 지킬 시간을 얻기 위해, 오늘은 의탁할 길을 열어야 한다.'
},
{
id: 'fifteenth-guan-yu-pursuit-road',
bgm: 'battle-prep',
chapter: '추격로',
background: 'story-wandering',
speaker: '관우',
portrait: 'guanYu',
text: '채양 본진의 봉화대를 그냥 두면 후방 기병이 계속 따라붙습니다. 제가 고갯길을 밀겠습니다. 장비가 남쪽 추격로를 끊으면 접선지 앞 수비선이 흔들릴 것입니다.'
},
{
id: 'fifteenth-yuan-road-sortie',
bgm: 'battle-prep',
chapter: '북상 전투',
background: 'story-wandering',
speaker: '장비',
portrait: 'zhangFei',
text: '좋습니다. 저는 남쪽 길에서 달려드는 놈들을 받아치겠습니다. 손건은 문서를 챙기고, 간옹은 적 전열을 흔드시오. 형님은 뒤에서 접선 명분을 지켜 주십시오!'
}
];
export const fifteenthBattleVictoryPages: StoryPage[] = [
{
id: 'fifteenth-victory-pursuit-breaks',
bgm: 'militia-theme',
chapter: '추격을 끊다',
background: 'story-wandering',
text: '채양 본진 봉화대와 북동쪽 접선지가 차례로 열리자 추격대는 더는 유비군의 뒤를 물지 못했다. 원소의 사자는 손건의 문서를 확인하고 군막 안으로 길을 내주었다.'
},
{
id: 'fifteenth-yuan-camp-opens',
bgm: 'story-dark',
chapter: '원소의 장막',
background: 'story-wandering',
speaker: '간옹',
text: '원소의 진영은 넓고 군세는 크지만, 그만큼 말과 눈도 많습니다. 오늘 접선은 살 길을 얻은 일이지, 마음까지 맡긴 일은 아니라고 보아야 하겠지요.'
},
{
id: 'fifteenth-road-to-liu-biao',
bgm: 'battle-prep',
chapter: '백마의 소식',
background: 'story-wandering',
speaker: '유비',
portrait: 'liuBei',
text: '원소의 군영에 머물며 때를 보자. 공손찬 장군의 옛 장수 조운이 이 근처에 있다는 말도 들었다. 다시 뜻을 같이할 인연이 있다면, 다음 길은 더 단단해질 것이다.'
}
];
export const sixteenthBattleIntroPages: StoryPage[] = [
{
id: 'sixteenth-yuan-camp-shifts',
bgm: 'story-dark',
chapter: '원소 진영의 그림자',
background: 'story-wolong',
speaker: '간옹',
text: '원소의 군막은 넓지만, 그 안에서는 말 한마디가 칼보다 빠르게 옮겨집니다. 조조의 눈치를 보는 자가 늘었으니, 여기 오래 머물면 의탁이 아니라 볼모가 될 수 있습니다.'
},
{
id: 'sixteenth-zhao-yun-returns',
bgm: 'militia-theme',
chapter: '백마의 재회',
background: 'story-wolong',
speaker: '조운',
text: '공손찬 장군의 군세가 흩어진 뒤에도 주공의 의리를 잊지 않았습니다. 강가 추격로는 제가 먼저 달려 끊겠습니다. 주공께서는 형주로 들어갈 명분을 잃지 마십시오.'
},
{
id: 'sixteenth-liu-biao-road',
bgm: 'battle-prep',
chapter: '형주로 가는 길',
background: 'story-wolong',
speaker: '유비',
portrait: 'liuBei',
text: '원소의 장막 아래 머무는 것은 잠시 몸을 숨기는 일일 뿐, 뜻을 세울 땅은 되지 못한다. 형주의 유표에게 의탁하려면 도망치듯 들어가서는 안 된다. 접선 문서와 예를 갖춰 길을 열어야 하오.'
},
{
id: 'sixteenth-jingzhou-road-sortie',
bgm: 'battle-prep',
chapter: '형주 의탁로',
background: 'story-wolong',
speaker: '손건',
text: '중앙 강가 길목에 유표의 사자가 기다립니다. 조운 장군이 추격 기병을 끊고, 운장과 익덕이 관문 앞을 밀어 주면 제가 문서를 내어 형주 객장으로 들어갈 길을 만들겠습니다.'
}
];
export const sixteenthBattleVictoryPages: StoryPage[] = [
{
id: 'sixteenth-victory-jingzhou-gate',
bgm: 'militia-theme',
chapter: '형주 관문',
background: 'story-wolong',
text: '조인의 추격대가 물러서고, 강가 접선로와 형주 관문이 함께 열렸다. 유표의 사자는 손건의 문서를 받아 들었고, 유비군은 도망자가 아니라 객장으로 들어갈 명분을 얻었다.'
},
{
id: 'sixteenth-liu-biao-welcome',
bgm: 'story-dark',
chapter: '유표의 객장',
background: 'story-wolong',
speaker: '조운',
text: '관문 앞 추격로는 제가 살피겠습니다. 형주가 잠시 몸을 누일 곳이라면, 그동안 주공의 깃발이 다시 백성을 모을 길을 찾으셔야 합니다.'
},
{
id: 'sixteenth-next-zhuge-shadow',
bgm: 'battle-prep',
chapter: '와룡의 소문',
background: 'story-wolong',
speaker: '간옹',
text: '형주 선비들 사이에 융중의 와룡이라는 이름이 오갑니다. 유표의 객장으로 숨만 고를 것인지, 천하의 길을 물을 사람을 찾아갈 것인지, 다음 걸음은 곧 정해질 것입니다.'
}
];
export const seventeenthBattleIntroPages: StoryPage[] = [
{
id: 'seventeenth-wolong-clue-gathered',
bgm: 'story-dark',
chapter: '와룡의 단서',
background: 'story-wolong',
speaker: '손건',
text: '형주 선비들의 말이 하나로 모입니다. 융중의 초가에 머무는 제갈공명, 사람들은 그를 와룡이라 부릅니다. 주공께서 직접 찾아가 예를 다한다면 길이 열릴지도 모릅니다.'
},
{
id: 'seventeenth-liu-bei-third-visit',
bgm: 'militia-theme',
chapter: '삼고초려',
background: 'story-wolong',
speaker: '유비',
portrait: 'liuBei',
text: '한 번 찾아가 만나지 못했다 하여 뜻이 얕아지는 것은 아니오. 천하를 구할 계책을 구하려면, 내가 먼저 몸을 낮추어 그 문 앞에 서야 하오.'
},
{
id: 'seventeenth-road-to-longzhong',
bgm: 'battle-prep',
chapter: '융중 방문로',
background: 'story-wolong',
speaker: '조운',
text: '융중으로 향하는 산길에 수상한 가병들이 숨어 있습니다. 주공의 방문이 형주 안의 권신들에게 알려진 듯합니다. 길을 먼저 정리하겠습니다.'
},
{
id: 'seventeenth-longzhong-sortie',
bgm: 'battle-prep',
chapter: '와룡을 찾아',
background: 'story-wolong',
speaker: '장비',
portrait: 'zhangFei',
text: '군사 하나 만나러 가는데 길목마다 잔챙이들이 성가시게 하는군요. 그래도 형님 뜻이라면 길부터 시원하게 열어 보겠습니다.'
}
];
export const seventeenthBattleVictoryPages: StoryPage[] = [
{
id: 'seventeenth-victory-longzhong-road',
bgm: 'militia-theme',
chapter: '열린 초가 길',
background: 'story-wolong',
text: '융중으로 향하는 길목의 가병들이 흩어지고, 산길은 조용해졌다. 유비는 갑옷의 먼지를 털지도 않은 채 제갈량의 초가 앞에 다시 섰다.'
},
{
id: 'seventeenth-zhuge-liang-counsel',
bgm: 'story-dark',
chapter: '천하삼분의 말',
background: 'story-wolong',
speaker: '제갈량',
text: '한실을 일으키려면 먼저 형주와 익주를 얻어 근본을 세우고, 때를 기다려 북벌의 길을 여십시오. 주공의 뜻이 백성에게 닿는다면, 저는 그 길에 지혜를 보태겠습니다.'
},
{
id: 'seventeenth-zhuge-liang-joins',
bgm: 'battle-prep',
chapter: '와룡 출려',
background: 'story-wolong',
speaker: '유비',
portrait: 'liuBei',
text: '공명 선생이 함께한다면 우리 군은 비로소 길을 보는 눈을 얻은 것이오. 이제 형주의 머무름은 다음 큰 전장을 준비하는 시간이 될 것이오.'
}
];
export const eighteenthBattleIntroPages: StoryPage[] = [
{
id: 'eighteenth-cao-vanguard-moves',
bgm: 'story-dark',
chapter: '조조 남하의 그림자',
background: 'story-wolong',
speaker: '손건',
text: '조조가 형주를 향해 병력을 움직이고 있습니다. 유표의 병세와 형주의 불안이 겹치자, 신야의 작은 군영에도 큰 물결이 밀려옵니다.'
},
{
id: 'eighteenth-zhuge-first-plan',
bgm: 'battle-prep',
chapter: '박망파의 계책',
background: 'story-wolong',
speaker: '제갈량',
text: '하후돈의 선봉은 빠르나 숲과 좁은 길을 가볍게 여길 것입니다. 길을 내어 주는 척하다가 박망파의 숲길에서 불과 매복으로 그 기세를 꺾겠습니다.'
},
{
id: 'eighteenth-generals-doubt',
bgm: 'militia-theme',
chapter: '새 군사의 첫 명',
background: 'story-wolong',
speaker: '관우',
portrait: 'guanYu',
text: '군사의 말이 이치에 맞다 하여도, 전장은 말과 다릅니다. 그러나 형님께서 맡기셨다면 우리 또한 그 계책을 전장에서 증명하겠습니다.'
},
{
id: 'eighteenth-bowang-sortie',
bgm: 'battle-prep',
chapter: '박망파 매복전',
background: 'story-wolong',
speaker: '유비',
portrait: 'liuBei',
text: '오늘 싸움은 적을 많이 베는 것보다 조조군의 발을 묶는 것이 중요하오. 공명의 계책을 중심에 두고, 숲길과 불길 사이에서 전열을 흩트리지 맙시다.'
}
];
export const eighteenthBattleVictoryPages: StoryPage[] = [
{
id: 'eighteenth-victory-bowang-fire',
bgm: 'militia-theme',
chapter: '숲길의 불빛',
background: 'story-wolong',
text: '박망파의 숲길에 불빛이 번지고, 하후돈의 선봉은 좁은 길에서 서로의 퇴로를 막았다. 유비군은 큰 병력 없이도 조조군의 진격을 늦추었다.'
},
{
id: 'eighteenth-zhuge-trust-earned',
bgm: 'battle-prep',
chapter: '계책을 믿다',
background: 'story-wolong',
speaker: '장비',
portrait: 'zhangFei',
text: '처음에는 군사 양반이 종이 위에서만 싸우는 줄 알았습니다. 그런데 오늘 보니, 종이 위의 길이 정말 전장의 길이 되더군요.'
},
{
id: 'eighteenth-red-cliffs-wind',
bgm: 'story-dark',
chapter: '강동으로 부는 바람',
background: 'story-wolong',
speaker: '제갈량',
text: '조조의 큰 군세는 여기서 멈추지 않을 것입니다. 이제 강동과 손을 잡을 길을 열어야 합니다. 바람은 아직 멀리 있으나, 방향은 보이기 시작했습니다.'
}
];
export const nineteenthBattleIntroPages: StoryPage[] = [
{
id: 'nineteenth-cao-army-south',
bgm: 'story-dark',
chapter: '조조의 남하',
background: 'story-red-cliffs',
speaker: '손건',
text: '박망파에서 시간을 벌었지만 조조의 대군은 멈추지 않았습니다. 신야의 백성들이 남쪽으로 몰리고, 장판파 길목에는 추격 기병이 먼저 닿고 있습니다.'
},
{
id: 'nineteenth-zhao-yun-rescue',
bgm: 'battle-prep',
chapter: '백마의 구원',
background: 'story-red-cliffs',
speaker: '조운',
text: '주공, 피난 행렬이 흩어지면 백성도 군도 모두 잃습니다. 제가 앞뒤를 오가며 길을 묶겠습니다. 다리와 마을을 먼저 지켜 주십시오.'
},
{
id: 'nineteenth-zhang-fei-bridge',
bgm: 'battle-prep',
chapter: '장판교의 호령',
background: 'story-red-cliffs',
speaker: '장비',
portrait: 'zhangFei',
text: '형님은 백성을 이끌고 남쪽 길을 보시오. 뒤쫓는 놈들은 제가 다리목에서 한 번 꺾어 놓겠습니다. 다만 누가 옆을 받쳐 줄지는 잘 골라야겠소!'
},
{
id: 'nineteenth-changban-sortie',
bgm: 'battle-prep',
chapter: '장판파 피난로',
background: 'story-red-cliffs',
speaker: '유비',
portrait: 'liuBei',
text: '오늘의 싸움은 이기는 것만으로 끝나지 않소. 백성이 지나갈 길을 열고, 조운과 익덕이 무너지지 않게 서로 받쳐야 하오. 함께할 무장을 신중히 정합시다.'
}
];
export const nineteenthBattleVictoryPages: StoryPage[] = [
{
id: 'nineteenth-victory-refuge-road',
bgm: 'militia-theme',
chapter: '피난로가 열리다',
background: 'story-red-cliffs',
text: '장판파의 먼지 속에서 유비군은 피난 행렬을 가까스로 남쪽 길로 흘려보냈습니다. 조운의 창과 장비의 호령이 무너질 뻔한 길목을 붙들었습니다.'
},
{
id: 'nineteenth-zhao-yun-returns',
bgm: 'battle-prep',
chapter: '흩어진 깃발을 모아',
background: 'story-red-cliffs',
speaker: '조운',
text: '흩어진 병사와 백성을 모두 되찾지는 못했습니다. 그러나 주공의 깃발이 뒤돌아보았기에 사람들은 다시 모일 곳을 알게 되었습니다.'
},
{
id: 'nineteenth-jiangdong-envoy',
bgm: 'story-dark',
chapter: '강동으로 보낼 사절',
background: 'story-red-cliffs',
speaker: '제갈량',
text: '조조의 남하는 이제 강동도 외면할 수 없습니다. 장판파에서 지켜낸 백성의 길과 조조군의 속도를 함께 전하면, 손권과 마주 앉을 명분이 생깁니다.'
}
];
export const twentiethBattleIntroPages: StoryPage[] = [
{
id: 'twentieth-envoy-road-opens',
bgm: 'story-dark',
chapter: '강동으로 가는 길',
background: 'story-red-cliffs',
speaker: '손건',
text: '장판파의 피난로를 지나 유비군은 하구로 향합니다. 강동에 사절을 보내려면 조조군 추격대가 강나루를 닫기 전에 길을 열어야 합니다.'
},
{
id: 'twentieth-zhuge-envoy-plan',
bgm: 'battle-prep',
chapter: '사절의 문서',
background: 'story-red-cliffs',
speaker: '제갈량',
text: '강동은 조조를 두려워하지만, 싸울 계산이 서야 움직입니다. 손건의 문서와 장판파의 기록을 나루까지 지켜야 합니다.'
},
{
id: 'twentieth-generals-protect-envoy',
bgm: 'battle-prep',
chapter: '호위와 돌파',
background: 'story-red-cliffs',
speaker: '관우',
portrait: 'guanYu',
text: '이번 길은 적을 많이 베는 것보다 사절을 온전히 보내는 일이 먼저입니다. 전열과 기동, 보급을 골고루 세우는 편성이 필요하겠습니다.'
},
{
id: 'twentieth-jiangdong-envoy-sortie',
bgm: 'battle-prep',
chapter: '강동 사절로',
background: 'story-red-cliffs',
speaker: '유비',
portrait: 'liuBei',
text: '선생과 손건이 강동에 닿아야 조조의 큰 군세를 막을 길이 열리오. 오늘은 칼끝만이 아니라 말과 문서를 지키는 싸움이오.'
}
];
export const twentiethBattleVictoryPages: StoryPage[] = [
{
id: 'twentieth-victory-river-port',
bgm: 'militia-theme',
chapter: '나루가 열리다',
background: 'story-red-cliffs',
text: '문빙의 추격대가 물러서자 강나루의 문이 열렸습니다. 유비군은 피난 행렬을 뒤에 두고, 강동으로 향할 작은 배와 사절 문서를 지켜냈습니다.'
},
{
id: 'twentieth-sun-qian-letter-ready',
bgm: 'battle-prep',
chapter: '손권에게 보낼 말',
background: 'story-red-cliffs',
speaker: '손건',
text: '강동에 전할 말은 이제 분명합니다. 조조의 남하, 장판파의 피난로, 그리고 주공께서 백성을 버리지 않았다는 사실을 함께 적겠습니다.'
},
{
id: 'twentieth-red-cliffs-near',
bgm: 'story-dark',
chapter: '적벽으로 부는 바람',
background: 'story-red-cliffs',
speaker: '제갈량',
text: '이제 강동의 마음을 움직일 차례입니다. 손권과 주유가 계산을 마치면, 조조의 대군은 장강 위에서 처음으로 멈춰 서게 될 것입니다.'
}
];
export const twentyFirstBattleIntroPages: StoryPage[] = [
{
id: 'twenty-first-sun-quan-council',
bgm: 'story-dark',
chapter: '강동 회담',
background: 'story-red-cliffs',
speaker: '제갈량',
text: '손권의 장막 안에서는 항복과 결전의 말이 맞섰습니다. 제갈량은 조조의 대군이 강을 건너면 강동도, 유비군도 설 곳을 잃는다는 사실을 차분히 짚었습니다.'
},
{
id: 'twenty-first-zhou-yu-decision',
bgm: 'battle-prep',
chapter: '주유의 결단',
background: 'story-red-cliffs',
speaker: '주유',
text: '조조가 강 위에서 싸우는 법을 모른다면, 장강은 우리 편이 될 것입니다. 손권께서 결심하셨으니, 이제 말이 아니라 배와 불길로 답해야 합니다.'
},
{
id: 'twenty-first-liu-bei-alliance',
bgm: 'militia-theme',
chapter: '손유 동맹',
background: 'story-red-cliffs',
speaker: '유비',
portrait: 'liuBei',
text: '강동이 함께 선다면 조조의 군세도 처음으로 멈출 수 있소. 우리는 작은 군이지만, 장강의 바람과 백성을 지키는 뜻을 함께 세웁시다.'
},
{
id: 'twenty-first-red-cliffs-sortie',
bgm: 'battle-prep',
chapter: '적벽 전초전',
background: 'story-red-cliffs',
speaker: '제갈량',
text: '조조군 수군 선봉이 강가 포구를 시험하고 있습니다. 채모의 선봉을 물리쳐야 강동 수군과 합류할 첫 자리를 지킬 수 있습니다.'
}
];
export const twentyFirstBattleVictoryPages: StoryPage[] = [
{
id: 'twenty-first-victory-river-line',
bgm: 'militia-theme',
chapter: '강 위의 첫 승리',
background: 'story-red-cliffs',
text: '채모의 선봉이 물러서자 장강의 물결 위에 손유 동맹의 첫 전선이 세워졌습니다. 작은 승리였지만 조조군이 강 위에서 무적이 아님을 모두가 보았습니다.'
},
{
id: 'twenty-first-zhou-yu-fire-plan',
bgm: 'battle-prep',
chapter: '화공의 실마리',
background: 'story-red-cliffs',
speaker: '주유',
text: '조조군의 배는 많지만 서로를 믿지 못하고, 사슬로 묶으면 바람 앞에서 약점이 됩니다. 아직 때가 무르익지는 않았지만 불길의 길은 보이기 시작했습니다.'
},
{
id: 'twenty-first-zhuge-wind',
bgm: 'story-dark',
chapter: '바람을 기다리다',
background: 'story-red-cliffs',
speaker: '제갈량',
text: '다음 싸움은 힘으로만 밀어붙일 수 없습니다. 황개의 결단, 주유의 수군, 그리고 바람의 때가 맞아야 조조의 대군을 무너뜨릴 수 있습니다.'
}
];
export const twentySecondBattleIntroPages: StoryPage[] = [
{
id: 'twenty-second-huang-gai-bitter-plan',
bgm: 'story-dark',
chapter: '황개의 결단',
background: 'story-red-cliffs',
speaker: '주유',
text: '황개 장군은 거짓 항복의 배를 준비했습니다. 조조가 그 배를 의심하지 않게 하려면, 유비군은 강안의 감시선을 흔들어 화선이 다가갈 길을 열어야 합니다.'
},
{
id: 'twenty-second-zhuge-wind-watch',
bgm: 'battle-prep',
chapter: '동남풍을 기다리다',
background: 'story-red-cliffs',
speaker: '제갈량',
text: '바람은 아직 완전히 돌지 않았습니다. 그러나 때가 오면 불길은 강 위에서 산처럼 번질 것입니다. 그 전까지 조조의 척후와 갑판 궁병을 묶어 두어야 합니다.'
},
{
id: 'twenty-second-liu-bei-fire-line',
bgm: 'militia-theme',
chapter: '불길 앞의 뜻',
background: 'story-red-cliffs',
speaker: '유비',
portrait: 'liuBei',
text: '오늘의 불은 백성을 태우기 위한 불이 아니라 난세의 물결을 멈추기 위한 불이오. 화선이 닿을 때까지 강안 전선을 흔들림 없이 지킵시다.'
},
{
id: 'twenty-second-fire-attack-sortie',
bgm: 'battle-prep',
chapter: '적벽 화공전',
background: 'story-red-cliffs',
speaker: '제갈량',
text: '조조의 함대가 사슬로 묶인 채 강북에 모였습니다. 화선의 길을 막는 초병을 베고, 조조 본선이 불길에 휩싸일 때까지 전선을 지키십시오.'
}
];
export const twentySecondBattleVictoryPages: StoryPage[] = [
{
id: 'twenty-second-victory-fire-rises',
bgm: 'battle-prep',
chapter: '불길이 일다',
background: 'story-red-cliffs',
text: '화선이 조조군 함대에 닿자 강 위가 붉게 일렁였습니다. 사슬로 묶인 배들은 서로를 구하지 못했고, 장강의 바람은 불길을 북쪽으로 몰아붙였습니다.'
},
{
id: 'twenty-second-cao-cao-retreat',
bgm: 'story-dark',
chapter: '조조의 퇴각',
background: 'story-red-cliffs',
speaker: '조조',
text: '오늘은 하늘과 강이 나를 막는구나. 그러나 난세는 아직 끝나지 않았다. 살아 돌아가 다시 군을 모으면, 이 치욕도 갚을 날이 있을 것이다.'
},
{
id: 'twenty-second-liu-bei-next-land',
bgm: 'militia-theme',
chapter: '형주를 바라보다',
background: 'story-red-cliffs',
speaker: '유비',
portrait: 'liuBei',
text: '조조의 대군은 물러났지만 우리의 근본은 아직 없습니다. 이제 백성이 머물 땅을 얻고, 형주와 익주로 향할 길을 차근히 세워야 합니다.'
}
];
export const twentyThirdBattleIntroPages: StoryPage[] = [
{
id: 'twenty-third-jingzhou-cause',
bgm: 'militia-theme',
chapter: '형주 남부의 문',
background: 'story-yizhou',
speaker: '유비',
portrait: 'liuBei',
text: '적벽의 불길은 조조를 막았지만 백성이 기대어 살 땅은 아직 없소. 형주 남부의 군현을 힘으로 짓밟지 말고, 먼저 길과 민심을 열어야 하오.'
},
{
id: 'twenty-third-zhuge-plan',
bgm: 'battle-prep',
chapter: '군현을 여는 계책',
background: 'story-yizhou',
speaker: '제갈량',
text: '영릉의 유도는 아직 마음을 정하지 못했고, 형도영은 길목을 막아 자신의 힘을 보이려 합니다. 그를 물리치되 백성을 다치게 하지 않으면 형주 남부가 움직일 것입니다.'
},
{
id: 'twenty-third-ma-liang-rumor',
bgm: 'story-dark',
chapter: '백미의 소문',
background: 'story-yizhou',
speaker: '손건',
text: '형주 선비들 사이에 마량이라는 이름이 오갑니다. 눈썹이 희어 백미라 불리는 사람인데, 남부 군현의 민심과 길을 누구보다 잘 안다고 합니다.'
},
{
id: 'twenty-third-jingzhou-sortie',
bgm: 'battle-prep',
chapter: '형주 남부 진입전',
background: 'story-yizhou',
speaker: '제갈량',
text: '형도영의 가병이 남부 길목과 마을을 막고 있습니다. 성급히 몰아붙이면 백성이 흩어지니, 전열을 세우고 마을을 지키며 길목을 확보하십시오.'
}
];
export const twentyThirdBattleVictoryPages: StoryPage[] = [
{
id: 'twenty-third-victory-southern-road',
bgm: 'militia-theme',
chapter: '남부 길목이 열리다',
background: 'story-yizhou',
text: '형도영이 물러서자 남부 군현으로 이어지는 길이 열렸습니다. 유비군은 약탈 없이 마을을 안정시키며 적벽 이후 처음으로 머물 땅의 윤곽을 얻었습니다.'
},
{
id: 'twenty-third-ma-liang-joins',
bgm: 'battle-prep',
chapter: '마량의 합류',
background: 'story-yizhou',
speaker: '마량',
text: '주공께서 백성을 먼저 살피셨다는 말을 들었습니다. 형주 남부의 길과 사람을 잇는 일이라면, 제 작은 글과 말도 보탬이 될 것입니다.'
},
{
id: 'twenty-third-next-commandery',
bgm: 'story-dark',
chapter: '군현을 차례로',
background: 'story-yizhou',
speaker: '제갈량',
text: '영릉의 문은 열렸지만 형주 남부 전체가 움직인 것은 아닙니다. 계양, 무릉, 장사까지 차례로 설득하고 지켜야 비로소 근거지가 됩니다.'
}
];
export const twentyFourthBattleIntroPages: StoryPage[] = [
{
id: 'twenty-fourth-guiyang-cause',
bgm: 'militia-theme',
chapter: '계양으로 가는 서신',
background: 'story-yizhou',
speaker: '마량',
text: '계양의 조범은 항복과 저항 사이에서 눈치를 보고 있습니다. 먼저 서신을 보내되, 길목의 군사들이 백성을 겁박하지 못하게 막아야 합니다.'
},
{
id: 'twenty-fourth-zhuge-plan',
bgm: 'battle-prep',
chapter: '칼보다 먼저 놓는 글',
background: 'story-yizhou',
speaker: '제갈량',
text: '이번 전투는 성을 불태우는 싸움이 아닙니다. 마을을 안정시키고 조범의 친위대를 물리치면, 계양은 스스로 문을 열 것입니다.'
},
{
id: 'twenty-fourth-yi-ji-rumor',
bgm: 'story-dark',
chapter: '이적의 이름',
background: 'story-yizhou',
speaker: '손건',
text: '형주의 문사 이적이 계양의 움직임을 지켜보고 있다고 합니다. 무리한 점령보다 예를 갖춘 설득을 보이면, 그 역시 길을 함께할지 모릅니다.'
},
{
id: 'twenty-fourth-guiyang-sortie',
bgm: 'battle-prep',
chapter: '계양 설득전',
background: 'story-yizhou',
speaker: '유비',
portrait: 'liuBei',
text: '오늘의 목적은 계양을 꺾는 것이 아니라 열어 보이는 것이오. 마을을 지키고 성채를 압박하되, 백성이 다시 문을 닫지 않게 하시오.'
}
];
export const twentyFourthBattleVictoryPages: StoryPage[] = [
{
id: 'twenty-fourth-victory-guiyang-open',
bgm: 'militia-theme',
chapter: '계양의 문이 열리다',
background: 'story-yizhou',
text: '조범의 친위대가 물러나자 계양의 성문은 불길이 아니라 서신 앞에서 열렸습니다. 유비군은 군율을 세우고 마을의 창고를 함부로 건드리지 않았습니다.'
},
{
id: 'twenty-fourth-yi-ji-joins',
bgm: 'battle-prep',
chapter: '이적의 합류',
background: 'story-yizhou',
speaker: '이적',
text: '주공께서 계양을 힘으로만 다루지 않으셨다는 말을 들었습니다. 형주의 글과 예가 필요하다면, 저도 붓과 길을 보태겠습니다.'
},
{
id: 'twenty-fourth-next-commandery',
bgm: 'story-dark',
chapter: '험한 무릉의 길',
background: 'story-yizhou',
speaker: '제갈량',
text: '계양은 열렸지만 무릉의 산길은 아직 닫혀 있습니다. 다음에는 험한 길을 뚫고 흩어진 마을을 잇는 싸움이 될 것입니다.'
}
];
export const twentyFifthBattleIntroPages: StoryPage[] = [
{
id: 'twenty-fifth-wuling-road',
bgm: 'story-dark',
chapter: '무릉의 닫힌 산길',
background: 'story-yizhou',
speaker: '마량',
text: '무릉은 계양처럼 성문 하나만 바라보는 땅이 아닙니다. 산길과 작은 마을이 흩어져 있어, 길을 잃으면 군량도 마음도 끊어집니다.'
},
{
id: 'twenty-fifth-yi-ji-letter',
bgm: 'battle-prep',
chapter: '먼저 보내는 예',
background: 'story-yizhou',
speaker: '이적',
text: '김선은 강하게 버티려 하지만, 아래 장수 공지는 백성의 피해를 걱정한다고 들었습니다. 산길 마을을 지키면 그에게 말이 닿을 것입니다.'
},
{
id: 'twenty-fifth-zhuge-formation',
bgm: 'battle-prep',
chapter: '좁은 길의 진형',
background: 'story-yizhou',
speaker: '제갈량',
text: '좁은 산길에서는 무장이 많다고 곧 힘이 되는 것이 아닙니다. 앞길을 여는 자, 마을을 달래는 자, 보급을 잇는 자를 골라야 합니다.'
},
{
id: 'twenty-fifth-wuling-sortie',
bgm: 'battle-prep',
chapter: '무릉 산길 확보전',
background: 'story-yizhou',
speaker: '유비',
portrait: 'liuBei',
text: '산길을 불태우지 말고 이어야 하오. 무릉의 길과 마을을 지켜 내면, 닫힌 마음도 함께 열릴 것이오.'
}
];
export const twentyFifthBattleVictoryPages: StoryPage[] = [
{
id: 'twenty-fifth-victory-wuling-open',
bgm: 'militia-theme',
chapter: '무릉의 길이 이어지다',
background: 'story-yizhou',
text: '김선의 산길 방어선이 무너지자 무릉의 마을들은 먼저 불안한 문을 열었습니다. 유비군은 산길 창고를 봉하고 백성의 길을 지켰습니다.'
},
{
id: 'twenty-fifth-gong-zhi-joins',
bgm: 'battle-prep',
chapter: '공지의 결심',
background: 'story-yizhou',
speaker: '공지',
text: '무릉을 힘으로만 누르지 않으셨군요. 백성을 앞세우는 군이라면, 저도 산길과 고을의 형세를 바쳐 따르겠습니다.'
},
{
id: 'twenty-fifth-changsha-shadow',
bgm: 'story-dark',
chapter: '장사의 노장',
background: 'story-yizhou',
speaker: '제갈량',
text: '무릉까지 길이 이어졌습니다. 남은 장사에는 황충이라는 노장이 있습니다. 다음 싸움은 힘보다 예우와 인내를 시험할 것입니다.'
}
];
export const twentySixthBattleIntroPages: StoryPage[] = [
{
id: 'twenty-sixth-changsha-old-general',
bgm: 'story-dark',
chapter: '장사의 노장',
background: 'story-yizhou',
speaker: '공지',
text: '장사에는 황충이라는 노장이 있습니다. 나이는 들었으나 활은 여전히 매섭고, 성 안 병사들은 그 이름을 믿고 버팁니다.'
},
{
id: 'twenty-sixth-han-xuan-suspicion',
bgm: 'battle-prep',
chapter: '의심 많은 태수',
background: 'story-yizhou',
speaker: '이적',
text: '한현은 황충의 명망도 의심한다고 합니다. 성을 무너뜨리기보다 황충의 체면을 지키면, 장사 사람들의 마음도 흔들릴 것입니다.'
},
{
id: 'twenty-sixth-wei-yan-rumor',
bgm: 'battle-prep',
chapter: '성문 안의 불씨',
background: 'story-yizhou',
speaker: '마량',
text: '위연이라는 장수는 성 안의 부당함을 참지 못한다고 들었습니다. 백성을 해치지 않고 한현의 의심을 꺾으면, 성 안에서 길이 열릴 수 있습니다.'
},
{
id: 'twenty-sixth-changsha-sortie',
bgm: 'battle-prep',
chapter: '장사 노장 대면전',
background: 'story-yizhou',
speaker: '유비',
portrait: 'liuBei',
text: '오늘은 노장의 이름을 꺾으러 가는 것이 아니오. 예를 갖추고 한현의 의심을 물리쳐, 장사의 사람을 얻어야 하오.'
}
];
export const twentySixthBattleVictoryPages: StoryPage[] = [
{
id: 'twenty-sixth-victory-changsha-open',
bgm: 'militia-theme',
chapter: '장사 성문이 열리다',
background: 'story-yizhou',
text: '한현의 의심이 전장 위에서 무너지자, 장사 성문은 크게 흔들렸습니다. 유비군은 황충의 명예를 욕보이지 않고 병사들에게 길을 열었습니다.'
},
{
id: 'twenty-sixth-huang-zhong-joins',
bgm: 'battle-prep',
chapter: '황충의 합류',
background: 'story-yizhou',
speaker: '황충',
text: '늙은 몸이라 하나, 아직 활은 뜻을 향해 날아갈 수 있습니다. 장사를 예로 대하신 주공의 군에 제 활을 맡기겠습니다.'
},
{
id: 'twenty-sixth-wei-yan-joins',
bgm: 'battle-prep',
chapter: '위연의 결심',
background: 'story-yizhou',
speaker: '위연',
text: '의심과 두려움으로 닫힌 성문을 더는 따를 수 없습니다. 제 창은 닫힌 문을 여는 데 쓰겠습니다.'
},
{
id: 'twenty-sixth-next-yi-province',
bgm: 'story-dark',
chapter: '형주 남부의 끝',
background: 'story-yizhou',
speaker: '제갈량',
text: '장사까지 열리면 형주 남부의 뿌리가 굳어집니다. 이제 익주로 이어질 더 큰 길을 바라볼 때가 다가옵니다.'
}
];
export const twentySeventhBattleIntroPages: StoryPage[] = [
{
id: 'twenty-seventh-yizhou-request',
bgm: 'story-dark',
chapter: '익주에서 온 요청',
background: 'story-yizhou-luo-road',
speaker: '손건',
text: '익주의 유장이 한중 장로의 압박을 두려워하여 원군을 청했습니다. 형주 남부를 안정시킨 지금, 이 요청은 촉으로 향하는 첫 문이 될 수 있습니다.'
},
{
id: 'twenty-seventh-pang-tong-rumor',
bgm: 'battle-prep',
chapter: '봉추의 그림자',
background: 'story-yizhou-luo-road',
speaker: '제갈량',
text: '익주로 들어가는 길목에는 봉추라 불리는 방통이 머문다는 소문이 있습니다. 그가 뜻을 함께한다면, 산과 관문으로 막힌 촉의 길도 달리 보일 것입니다.'
},
{
id: 'twenty-seventh-gate-warning',
bgm: 'story-dark',
chapter: '원군로의 관문',
background: 'story-yizhou-luo-road',
speaker: '마량',
text: '양회가 이끄는 전초 병력이 원군로를 막고 있습니다. 길목의 마을을 지켜 명분을 잃지 않고, 산길의 척후를 먼저 끊어야 합니다.'
},
{
id: 'twenty-seventh-yizhou-sortie',
bgm: 'battle-prep',
chapter: '익주 원군로',
background: 'story-yizhou-luo-road',
speaker: '유비',
portrait: 'liuBei',
text: '우리는 익주를 빼앗으러 가는 것이 아니라, 백성을 지키라는 부름에 응하는 것이오. 군율을 세우고 길을 열어 봉추의 마음까지 얻어 봅시다.'
}
];
export const twentySeventhBattleVictoryPages: StoryPage[] = [
{
id: 'twenty-seventh-victory-road-open',
bgm: 'militia-theme',
chapter: '익주의 길이 열리다',
background: 'story-yizhou-luo-road',
text: '양회의 전초 병력이 물러나고 익주 원군로가 열렸습니다. 유비군은 마을의 창고를 건드리지 않고 길목을 안정시켜, 원군이라는 명분을 분명히 세웠습니다.'
},
{
id: 'twenty-seventh-pang-tong-joins',
bgm: 'battle-prep',
chapter: '방통의 합류',
background: 'story-yizhou-luo-road',
speaker: '방통',
text: '인의를 말로만 내세우는 군은 많으나, 길목의 작은 마을까지 지키며 움직이는 군은 드뭅니다. 이 방통, 촉으로 향하는 험한 길을 함께 보겠습니다.'
},
{
id: 'twenty-seventh-next-fu-pass',
bgm: 'story-dark',
chapter: '부수관을 바라보다',
background: 'story-yizhou-luo-road',
speaker: '제갈량',
text: '봉추가 합류하니 익주의 지세와 사람의 마음을 함께 읽을 수 있게 되었습니다. 다음 길은 부수관과 낙성으로 이어지는 더 깊은 산문입니다.'
}
];
export const twentyEighthBattleIntroPages: StoryPage[] = [
{
id: 'twenty-eighth-fu-pass-shadow',
bgm: 'story-dark',
chapter: '부수관의 그림자',
background: 'story-yizhou-luo-road',
speaker: '방통',
text: '익주 원군로는 열렸으나 부수관은 아직 닫혀 있습니다. 고패가 관문 병력을 모아 길을 끊으면, 우리 명분은 산문 앞에서 멈출 것입니다.'
},
{
id: 'twenty-eighth-fa-zheng-message',
bgm: 'battle-prep',
chapter: '익주 내부의 손',
background: 'story-yizhou-luo-road',
speaker: '제갈량',
text: '익주 안쪽에서 법정이라는 인물이 은밀히 소식을 보냈습니다. 그는 유장의 답답한 정치를 걱정하며, 부수관을 넘을 길목을 알려 주겠다고 합니다.'
},
{
id: 'twenty-eighth-roster-pressure',
bgm: 'battle-prep',
chapter: '와룡과 봉추의 첫 편성',
background: 'story-yizhou-luo-road',
speaker: '마량',
text: '이번 전투부터 방통도 출전 후보가 됩니다. 책사 둘을 모두 데려가면 관문 계책은 강해지지만, 전열과 보급 중 하나가 얇아질 수 있습니다.'
},
{
id: 'twenty-eighth-fu-pass-sortie',
bgm: 'battle-prep',
chapter: '부수관 진입전',
background: 'story-yizhou-luo-road',
speaker: '유비',
portrait: 'liuBei',
text: '관문을 부수는 일보다 중요한 것은, 그 너머의 백성이 우리를 어떻게 기억하느냐요. 방통의 기책과 제갈량의 큰 판을 살려 부수관의 길을 열겠소.'
}
];
export const twentyEighthBattleVictoryPages: StoryPage[] = [
{
id: 'twenty-eighth-victory-pass-open',
bgm: 'militia-theme',
chapter: '부수관이 열리다',
background: 'story-yizhou-luo-road',
text: '고패의 관문 병력이 물러나고 부수관의 첫 문이 열렸습니다. 유비군은 관문 창고를 봉인하고 마을의 곡식을 지켜, 익주 내부의 의심을 조금 누그러뜨렸습니다.'
},
{
id: 'twenty-eighth-fa-zheng-joins',
bgm: 'battle-prep',
chapter: '법정의 합류',
background: 'story-yizhou-luo-road',
speaker: '법정',
text: '익주는 험한 땅이지만, 더 험한 것은 닫힌 마음입니다. 주공께서 그 마음을 함부로 베지 않으신다면, 이 법정이 안쪽 길을 밝히겠습니다.'
},
{
id: 'twenty-eighth-next-luo-castle',
bgm: 'story-dark',
chapter: '낙성으로 이어지는 길',
background: 'story-yizhou-luo-road',
speaker: '방통',
text: '부수관은 문에 불과합니다. 낙성으로 이어지는 길에는 더 깊은 매복과 더 복잡한 마음이 기다립니다. 이제 법정의 내부 정보까지 함께 써야 합니다.'
}
];
export const twentyNinthBattleIntroPages: StoryPage[] = [
{
id: 'twenty-ninth-luo-outer-wall',
bgm: 'story-dark',
chapter: '낙성의 바깥 성벽',
background: 'story-yizhou-luo-road',
speaker: '법정',
text: '부수관을 넘으면 낙성의 바깥 성벽이 기다립니다. 장임은 성 밖의 고개와 마을을 겹쳐 방어선을 세웠고, 성 안의 장수들은 아직 우리 뜻을 믿지 않습니다.'
},
{
id: 'twenty-ninth-wu-yi-rumor',
bgm: 'battle-prep',
chapter: '흔들리는 오의',
background: 'story-yizhou-luo-road',
speaker: '방통',
text: '오의는 성문을 지키지만 백성을 함부로 몰아붙이는 명령을 달가워하지 않는다고 합니다. 전장을 거칠게 밀지 않고 길을 열면, 그의 마음도 움직일 수 있습니다.'
},
{
id: 'twenty-ninth-roster-pressure',
bgm: 'battle-prep',
chapter: '법정의 첫 출전 선택',
background: 'story-yizhou-luo-road',
speaker: '제갈량',
text: '이번 전투부터 법정도 출전 후보입니다. 익주 내부 사정을 아는 법정을 데려가면 설득은 쉬워지지만, 무장을 줄이는 부담은 더 커집니다.'
},
{
id: 'twenty-ninth-luo-sortie',
bgm: 'battle-prep',
chapter: '낙성 외곽전',
background: 'story-yizhou-luo-road',
speaker: '유비',
portrait: 'liuBei',
text: '낙성의 문을 여는 일은 칼보다 마음이 먼저요. 마을을 지키고 장임의 전열을 물리쳐, 성 안 사람들에게 우리가 어떤 군인지 보이겠소.'
}
];
export const twentyNinthBattleVictoryPages: StoryPage[] = [
{
id: 'twenty-ninth-victory-outer-wall',
bgm: 'militia-theme',
chapter: '외곽 방어선 붕괴',
background: 'story-yizhou-luo-road',
text: '장임은 낙성 안쪽으로 물러났고, 외곽 마을은 큰 피해 없이 유비군의 보호 아래 들어왔습니다. 성 안의 장수들은 유비군을 단순한 침입군으로만 볼 수 없게 되었습니다.'
},
{
id: 'twenty-ninth-wu-yi-joins',
bgm: 'battle-prep',
chapter: '오의의 합류',
background: 'story-yizhou-luo-road',
speaker: '오의',
text: '성문을 지킨다는 명분으로 백성을 몰아넣는 일은 장수의 길이 아니었습니다. 주공께서 마을을 먼저 살피셨으니, 이 오의도 낙성의 다음 길을 열겠습니다.'
},
{
id: 'twenty-ninth-next-luofeng',
bgm: 'story-dark',
chapter: '낙봉파의 그늘',
background: 'story-yizhou-luo-road',
speaker: '방통',
text: '낙성 바깥은 열렸지만 길은 더 좁아집니다. 봉황이 떨어진다는 이름의 고개가 있다 하니, 다음 진군은 가볍게 볼 수 없습니다.'
}
];
export const thirtiethBattleIntroPages: StoryPage[] = [
{
id: 'thirtieth-luofeng-shadow',
bgm: 'story-dark',
chapter: '낙봉파의 좁은 길',
background: 'story-yizhou-luo-road',
speaker: '오의',
text: '낙성 안쪽으로 들어가는 빠른 길은 낙봉파입니다. 길은 짧지만 양쪽 산세가 높고, 장임이 기다리기에는 지나치게 좋은 곳입니다.'
},
{
id: 'thirtieth-pang-tong-warning',
bgm: 'battle-prep',
chapter: '봉추의 불길한 직감',
background: 'story-yizhou-luo-road',
speaker: '방통',
text: '좋은 길이 언제나 좋은 길은 아닙니다. 적이 우리를 빠르게 오게 만들었다면, 빠르게 물러날 길도 함께 보아 두어야 합니다.'
},
{
id: 'thirtieth-roster-pressure',
bgm: 'battle-prep',
chapter: '오의의 첫 출전 선택',
background: 'story-yizhou-luo-road',
speaker: '법정',
text: '이번 전투부터 오의도 출전 후보입니다. 낙성의 길을 아는 오의를 데려가면 매복을 읽기 쉬우나, 전열과 보급 후보는 더 좁아집니다.'
},
{
id: 'thirtieth-luofeng-sortie',
bgm: 'battle-prep',
chapter: '낙봉파 매복전',
background: 'story-yizhou-luo-road',
speaker: '유비',
portrait: 'liuBei',
text: '빠른 길을 택하되 방심하지 않겠소. 방통의 눈, 법정의 정보, 오의의 길 안내를 함께 엮어 장임의 매복을 거꾸로 무너뜨리겠소.'
}
];
export const thirtiethBattleVictoryPages: StoryPage[] = [
{
id: 'thirtieth-victory-ambush-broken',
bgm: 'militia-theme',
chapter: '매복을 꿰뚫다',
background: 'story-yizhou-luo-road',
text: '장임의 매복은 거칠게 덮쳐 왔으나, 유비군은 길목을 버티며 역으로 활로를 열었습니다. 낙봉파의 좁은 비탈에는 무너진 방책과 흩어진 깃발만 남았습니다.'
},
{
id: 'thirtieth-pang-tong-survives',
bgm: 'battle-prep',
chapter: '봉추의 생환',
background: 'story-yizhou-luo-road',
speaker: '방통',
text: '하마터면 길의 이름값을 할 뻔했습니다. 그러나 이번에는 우리 쪽이 한 수 먼저 보았습니다. 이제 낙성 본성은 더 이상 멀지 않습니다.'
},
{
id: 'thirtieth-next-luo-castle',
bgm: 'story-dark',
chapter: '낙성 본성 앞',
background: 'story-yizhou-luo-road',
speaker: '제갈량',
text: '낙봉파를 넘었으니 장임의 방어선은 본성에 몰렸습니다. 다음 전장은 낙성의 문과 익주 장수들의 마음을 함께 여는 싸움이 될 것입니다.'
}
];
export const thirtyFirstBattleIntroPages: StoryPage[] = [
{
id: 'thirty-first-luo-main-gate',
bgm: 'story-dark',
chapter: '낙성 본성의 문',
background: 'story-yizhou-luo-road',
speaker: '법정',
text: '장임은 낙봉파에서 물러난 뒤 낙성 본성의 문을 모두 닫았습니다. 성벽은 높고, 성 안의 장수들은 아직 유비공의 뜻을 의심하고 있습니다.'
},
{
id: 'thirty-first-veteran-wall',
bgm: 'battle-prep',
chapter: '노장 엄안',
background: 'story-yizhou-luo-road',
speaker: '오의',
text: '성 안에는 엄안이라는 노장이 있습니다. 장임과 뜻을 같이해 버티고 있으나, 백성을 해치지 않겠다는 약속을 보이면 마음이 움직일 수 있습니다.'
},
{
id: 'thirty-first-siege-choice',
bgm: 'battle-prep',
chapter: '돌파와 설득',
background: 'story-yizhou-luo-road',
speaker: '제갈량',
text: '성문을 부수는 힘만으로는 낙성을 얻을 수 없습니다. 방통, 법정, 오의를 함께 쓰면 설득의 길이 열리고, 무장을 더 세우면 짧은 돌파가 가능해집니다.'
},
{
id: 'thirty-first-sortie',
bgm: 'battle-prep',
chapter: '낙성 본성 공략',
background: 'story-yizhou-luo-road',
speaker: '유비',
portrait: 'liuBei',
text: '성문을 열되 백성의 마음은 닫지 않겠소. 장임의 방어선을 깨고 엄안 같은 장수에게 우리가 지키려는 뜻을 보여 주시오.'
}
];
export const thirtyFirstBattleVictoryPages: StoryPage[] = [
{
id: 'thirty-first-victory-gate-opened',
bgm: 'militia-theme',
chapter: '낙성의 문이 열리다',
background: 'story-yizhou-luo-road',
text: '낙성 본성의 문은 마침내 열렸습니다. 성벽 위의 깃발은 내려갔고, 장임의 마지막 방어선도 유비군의 꾸준한 압박 앞에 무너졌습니다.'
},
{
id: 'thirty-first-yan-yan-joins',
bgm: 'battle-prep',
chapter: '엄안의 결심',
background: 'story-yizhou-luo-road',
speaker: '엄안',
text: '성을 잃고도 백성이 다치지 않았다면, 장수는 패배 속에서도 새 주군을 볼 수 있습니다. 노장의 활이 이제 유비공의 군영을 지키겠습니다.'
},
{
id: 'thirty-first-next-chengdu-road',
bgm: 'story-dark',
chapter: '성도 압박의 길',
background: 'story-yizhou-luo-road',
speaker: '법정',
text: '낙성이 열렸으니 익주의 심장부가 흔들립니다. 이제 유비군은 성도를 향한 길에서 더 많은 항복과 저항을 동시에 맞이하게 될 것입니다.'
}
];
export const thirtySecondBattleIntroPages: StoryPage[] = [
{
id: 'thirty-second-chengdu-pressure',
bgm: 'story-dark',
chapter: '성도 압박의 시작',
background: 'story-yizhou-luo-road',
speaker: '법정',
text: '낙성이 열리자 성도는 놀랐으나 아직 문을 닫고 있습니다. 면죽관의 수비장 이엄이 항복과 결전을 저울질하고 있으니, 힘과 명분을 함께 보여 주어야 합니다.'
},
{
id: 'thirty-second-yan-yan-first-counsel',
bgm: 'battle-prep',
chapter: '엄안의 첫 출전',
background: 'story-yizhou-luo-road',
speaker: '엄안',
text: '이엄은 무턱대고 물러설 장수가 아닙니다. 그러나 백성을 해치지 않는 군율과 익주 장수를 예우하는 마음을 보이면, 그의 칼끝도 흔들릴 것입니다.'
},
{
id: 'thirty-second-mianzhu-plan',
bgm: 'battle-prep',
chapter: '면죽관 설득',
background: 'story-yizhou-luo-road',
speaker: '방통',
text: '정면으로만 밀면 성도는 더 굳게 닫힙니다. 엄안으로 익주 장수의 마음을 열고, 법정과 오의로 길을 짚으며, 황충과 장비가 수비선을 짧게 끊어야 합니다.'
},
{
id: 'thirty-second-sortie',
bgm: 'battle-prep',
chapter: '면죽관 압박전',
background: 'story-yizhou-luo-road',
speaker: '유비',
portrait: 'liuBei',
text: '우리가 얻으려는 것은 성 하나가 아니라 익주의 마음이오. 면죽관을 넘되 백성을 다치게 하지 말고, 이엄에게도 함께 살 길을 보여 주시오.'
}
];
export const thirtySecondBattleVictoryPages: StoryPage[] = [
{
id: 'thirty-second-victory-pass-yields',
bgm: 'militia-theme',
chapter: '면죽관이 열리다',
background: 'story-yizhou-luo-road',
text: '면죽관의 수비선은 무너졌지만 성도 길목의 마을은 불타지 않았습니다. 유비군이 군율을 지키자 익주 병사들은 패배보다 이후의 처우를 먼저 바라보았습니다.'
},
{
id: 'thirty-second-li-yan-joins',
bgm: 'battle-prep',
chapter: '이엄의 선택',
background: 'story-yizhou-luo-road',
speaker: '이엄',
text: '칼을 거두는 일이 반드시 부끄러운 것은 아니군요. 백성을 살리고 익주의 길을 보전한다면, 이엄 또한 새 주군의 군율 아래 서겠습니다.'
},
{
id: 'thirty-second-next-chengdu-surrender',
bgm: 'story-dark',
chapter: '성도 항복 권고',
background: 'story-yizhou-luo-road',
speaker: '제갈량',
text: '낙성과 면죽이 열렸으니 유장의 선택지는 더욱 좁아졌습니다. 다음 길은 성도 포위와 항복 권고, 그리고 익주를 어떻게 다스릴 것인가에 달렸습니다.'
}
];
export const thirtyThirdBattleIntroPages: StoryPage[] = [
{
id: 'thirty-third-chengdu-encircled',
bgm: 'story-dark',
chapter: '성도 앞의 마지막 권고',
background: 'story-chengdu-surrender',
speaker: '제갈량',
text: '면죽관이 열렸고 이엄까지 합류했습니다. 성도는 아직 문을 닫았으나, 이제 유장은 싸움과 항복 사이에서 더 이상 오래 머물 수 없습니다.'
},
{
id: 'thirty-third-li-yan-counsel',
bgm: 'battle-prep',
chapter: '이엄의 증언',
background: 'story-chengdu-surrender',
speaker: '이엄',
text: '황권은 성도의 체면과 백성의 안위를 함께 보는 장수입니다. 그가 물러서면 유장공도 백성을 살리는 길을 택할 수 있습니다.'
},
{
id: 'thirty-third-final-plan',
bgm: 'battle-prep',
chapter: '성도 항복 권고전',
background: 'story-chengdu-surrender',
speaker: '법정',
text: '성도 성문을 부수는 것이 능사가 아닙니다. 황권의 방어선을 눌러 항복 조건을 받아들이게 하고, 마을과 창고를 지켜 유비군의 약속을 증명해야 합니다.'
},
{
id: 'thirty-third-sortie',
bgm: 'battle-prep',
chapter: '익주를 얻는 길',
background: 'story-chengdu-surrender',
speaker: '유비',
portrait: 'liuBei',
text: '오늘의 승리는 성도의 문을 여는 것보다, 문 안의 백성이 두려움을 내려놓게 하는 데 있소. 칼을 들되 마음을 먼저 잃지 마시오.'
}
];
export const thirtyThirdBattleVictoryPages: StoryPage[] = [
{
id: 'thirty-third-victory-chengdu-yields',
bgm: 'militia-theme',
chapter: '성도 항복',
background: 'story-chengdu-surrender',
text: '성도 외곽의 방어선은 무너졌지만 성문 안쪽은 불타지 않았습니다. 유장에게 보내진 마지막 권고문은 백성을 보전하고 장수의 체면을 남기는 조건을 담았습니다.'
},
{
id: 'thirty-third-huang-quan-joins',
bgm: 'battle-prep',
chapter: '황권의 귀순',
background: 'story-chengdu-surrender',
speaker: '황권',
text: '익주를 지키려던 마음은 변하지 않았습니다. 다만 이제는 백성을 살리는 길이 유비공의 군율 아래 있다는 것을 보았습니다. 황권이 그 길에 서겠습니다.'
},
{
id: 'thirty-third-yizhou-secured',
bgm: 'story-dark',
chapter: '익주 확보',
background: 'story-chengdu-surrender',
speaker: '제갈량',
text: '형주와 익주의 기반이 마련되었습니다. 유비군은 이제 유랑군이 아니라 나라의 뿌리를 갖춘 세력으로 바뀌며, 촉한 건국을 향한 다음 장을 준비합니다.'
}
];
export const thirtyFourthBattleIntroPages: StoryPage[] = [
{
id: 'thirty-fourth-hanzhong-road',
bgm: 'story-dark',
chapter: '한중으로 향하는 길',
background: 'story-yizhou-luo-road',
speaker: '제갈량',
text: '성도는 안정되었으나 북쪽 한중은 아직 장로와 조조의 그늘 아래 흔들립니다. 촉한의 이름을 세우려면 북문을 지킬 길부터 열어야 합니다.'
},
{
id: 'thirty-fourth-huang-quan-first-counsel',
bgm: 'battle-prep',
chapter: '황권의 첫 출전',
background: 'story-yizhou-luo-road',
speaker: '황권',
text: '가맹관은 익주와 한중을 잇는 목입니다. 그곳에 마초의 기병이 나타났다면, 싸움만이 아니라 그가 누구의 길을 택할지도 보아야 합니다.'
},
{
id: 'thirty-fourth-ma-chao-appears',
bgm: 'battle-prep',
chapter: '서량의 기병',
background: 'story-yizhou-luo-road',
speaker: '법정',
text: '마초는 조조에게 쫓기고 장로에게도 마음을 다 주지 못했습니다. 그의 돌격을 막아 내고, 유비군이 서량의 창을 품을 그릇임을 보여 주십시오.'
},
{
id: 'thirty-fourth-sortie',
bgm: 'battle-prep',
chapter: '가맹관 마초 대면전',
background: 'story-yizhou-luo-road',
speaker: '유비',
portrait: 'liuBei',
text: '마초의 용맹을 꺾으려 하지 말고, 그 창끝이 향할 뜻을 바꾸어야 하오. 황권과 법정은 길을 열고, 장수들은 기병의 돌파를 받아내시오.'
}
];
export const thirtyFourthBattleVictoryPages: StoryPage[] = [
{
id: 'thirty-fourth-victory-charge-stopped',
bgm: 'militia-theme',
chapter: '서량 돌격을 막다',
background: 'story-yizhou-luo-road',
text: '가맹관의 좁은 길에서 서량 기병의 첫 돌격은 멈췄습니다. 마초는 패배보다도 유비군의 군율과 익주 장수들의 안정된 태도를 더 오래 바라보았습니다.'
},
{
id: 'thirty-fourth-ma-chao-joins',
bgm: 'battle-prep',
chapter: '마초의 합류',
background: 'story-yizhou-luo-road',
speaker: '마초',
text: '창을 맡길 주군을 찾지 못해 오래 떠돌았습니다. 유비공이 백성을 보전하고 장수를 예우한다면, 서량의 창 또한 그 깃발 아래 서겠습니다.'
},
{
id: 'thirty-fourth-next-hanzhong',
bgm: 'story-dark',
chapter: '한중 전선의 개막',
background: 'story-yizhou-luo-road',
speaker: '제갈량',
text: '마초가 합류하자 북쪽 길이 한층 넓어졌습니다. 이제 촉한의 기반은 성도 안쪽에서 끝나지 않고, 한중을 향한 전선으로 나아가게 됩니다.'
}
];
export const thirtyFifthBattleIntroPages: StoryPage[] = [
{
id: 'thirty-fifth-hanzhong-front',
bgm: 'story-dark',
chapter: '한중 전선의 첫 정찰',
background: 'story-northern',
speaker: '제갈량',
text: '마초가 합류하자 가맹관 너머의 길이 열렸습니다. 그러나 양평관은 장로의 군세가 한중으로 드나드는 목으로, 먼저 길과 병력을 살펴야 합니다.'
},
{
id: 'thirty-fifth-ma-chao-first-sortie',
bgm: 'battle-prep',
chapter: '마초의 첫 출전',
background: 'story-northern',
speaker: '마초',
text: '양평관의 말길은 거칠지만 서량 기병이 숨을 맞추면 뚫을 수 있습니다. 이번에는 제가 앞에서 달리며 유비군의 깃발을 보이겠습니다.'
},
{
id: 'thirty-fifth-huang-quan-map',
bgm: 'battle-prep',
chapter: '황권의 길잡이',
background: 'story-northern',
speaker: '황권',
text: '적을 모두 몰아내는 것보다 관문 창고와 강변 길을 잡는 것이 중요합니다. 한중을 향한 첫 정찰은 병력보다 지형을 얻는 싸움입니다.'
},
{
id: 'thirty-fifth-sortie',
bgm: 'battle-prep',
chapter: '양평관 정찰전',
background: 'story-northern',
speaker: '유비',
portrait: 'liuBei',
text: '마초는 선봉을 맡고, 황권과 법정은 길을 보시오. 이 싸움은 한중을 빼앗는 첫걸음이 아니라, 한중을 얻을 자격을 살피는 첫걸음이오.'
}
];
export const thirtyFifthBattleVictoryPages: StoryPage[] = [
{
id: 'thirty-fifth-victory-pass-opened',
bgm: 'militia-theme',
chapter: '양평관 길을 열다',
background: 'story-northern',
text: '양평관의 선봉대가 물러나자 한중으로 향하는 길목과 보급 창고가 유비군의 눈앞에 드러났습니다. 마초의 첫 돌격은 이제 유비군의 돌격이 되었습니다.'
},
{
id: 'thirty-fifth-ma-dai-joins',
bgm: 'battle-prep',
chapter: '마대의 합류',
background: 'story-northern',
speaker: '마대',
text: '서량의 흩어진 기병을 거두어 마초 형님의 깃발 아래로 데려왔습니다. 유비공께서 허락하신다면 저도 한중 길을 여는 창이 되겠습니다.'
},
{
id: 'thirty-fifth-next-hanzhong',
bgm: 'story-dark',
chapter: '북문을 향하여',
background: 'story-northern',
speaker: '제갈량',
text: '마초와 마대의 기병이 갖춰지자 북쪽 전선은 더 빠르게 움직일 수 있게 되었습니다. 이제 한중을 둘러싼 큰 싸움이 가까워집니다.'
}
];
export const thirtySixthBattleIntroPages: StoryPage[] = [
{
id: 'thirty-sixth-dingjun-mountain',
bgm: 'story-dark',
chapter: '정군산으로',
background: 'story-northern',
speaker: '제갈량',
text: '양평관의 길을 살핀 뒤 한중의 핵심은 정군산으로 모였습니다. 산을 잡으면 한중을 굽어보고, 산을 잃으면 북문 전체가 흔들립니다.'
},
{
id: 'thirty-sixth-huang-zhong-plan',
bgm: 'battle-prep',
chapter: '노장의 결심',
background: 'story-northern',
speaker: '황충',
text: '나이가 전열을 막지는 못합니다. 법정의 계책으로 능선을 잡아 주신다면, 이 늙은 활과 칼이 하후연의 기세를 꺾어 보이겠습니다.'
},
{
id: 'thirty-sixth-western-cavalry',
bgm: 'battle-prep',
chapter: '서량 기병의 우회로',
background: 'story-northern',
speaker: '마초',
text: '정군산 서쪽 능선은 말이 달리기 어렵지만, 마대와 함께 길을 잡으면 적의 눈을 돌릴 수 있습니다. 황충 장군이 치는 순간을 만들겠습니다.'
},
{
id: 'thirty-sixth-sortie',
bgm: 'battle-prep',
chapter: '정군산 전초전',
background: 'story-northern',
speaker: '유비',
portrait: 'liuBei',
text: '정군산을 얻으면 한중의 이름이 가까워질 것이오. 황충과 법정은 산을 보고, 마초와 마대는 길을 흔들며, 모두 유비군의 깃발을 산 위에 세우시오.'
}
];
export const thirtySixthBattleVictoryPages: StoryPage[] = [
{
id: 'thirty-sixth-victory-ridge-held',
bgm: 'militia-theme',
chapter: '정군산 능선을 잡다',
background: 'story-northern',
text: '정군산의 첫 능선이 유비군 손에 들어오자 한중 전선의 무게가 바뀌었습니다. 하후연의 선봉은 물러났고, 산길의 병사들은 새 주인을 가늠하기 시작했습니다.'
},
{
id: 'thirty-sixth-wang-ping-joins',
bgm: 'battle-prep',
chapter: '왕평의 투항',
background: 'story-northern',
speaker: '왕평',
text: '저는 한중의 산길과 병사들의 마음을 압니다. 조조군의 군율은 엄하나 이 땅을 품지는 못했습니다. 유비공께서 한중을 안정시킨다면 제 길도 그곳에 있겠습니다.'
},
{
id: 'thirty-sixth-next-foundation',
bgm: 'story-dark',
chapter: '한중의 깃발',
background: 'story-northern',
speaker: '제갈량',
text: '정군산의 승리와 왕평의 합류로 한중의 산길은 조금씩 유비군 편으로 기울었습니다. 이제 한중 본전과 촉한의 이름이 더 가까워집니다.'
}
];
export const thirtySeventhBattleIntroPages: StoryPage[] = [
{
id: 'thirty-seventh-hanzhong-front',
bgm: 'story-dark',
chapter: '한중 결전으로',
background: 'story-northern',
speaker: '제갈량',
text: '정군산의 능선이 열리자 한중의 길은 마침내 하나의 전장으로 이어졌습니다. 조조군은 물러나기 전에 마지막으로 북문을 움켜쥐려 합니다.'
},
{
id: 'thirty-seventh-wang-ping-map',
bgm: 'battle-prep',
chapter: '산길의 눈',
background: 'story-northern',
speaker: '왕평',
text: '본진으로 곧장 오르는 길은 적이 기다리는 길입니다. 강변 창고를 잡고 서쪽 숲길을 열면 조조군의 퇴로와 보급이 동시에 흔들립니다.'
},
{
id: 'thirty-seventh-huang-fa-plan',
bgm: 'battle-prep',
chapter: '노장과 군사의 합',
background: 'story-northern',
speaker: '법정',
text: '황충 장군이 고지를 누르고 왕평이 길을 잇는 사이, 마초와 마대가 북쪽 기병대를 묶어야 합니다. 이 싸움은 힘보다 순서가 중요합니다.'
},
{
id: 'thirty-seventh-sortie',
bgm: 'battle-prep',
chapter: '한중 결전',
background: 'story-northern',
speaker: '유비',
portrait: 'liuBei',
text: '한중을 얻는 것은 북문을 얻는 일이고, 북문을 얻는 것은 촉의 백성을 지킬 이름을 얻는 일이오. 모두 각자의 길에서 하나의 깃발을 세우시오.'
}
];
export const thirtySeventhBattleVictoryPages: StoryPage[] = [
{
id: 'thirty-seventh-victory-hanzhong-held',
bgm: 'militia-theme',
chapter: '한중을 얻다',
background: 'story-northern',
text: '조조군의 본진이 흔들리고 한중의 창고와 산길이 유비군의 손에 들어왔습니다. 북문을 지키던 군세는 물러났고, 촉으로 향하는 길은 비로소 안정되었습니다.'
},
{
id: 'thirty-seventh-king-of-hanzhong',
bgm: 'battle-prep',
chapter: '한중왕의 이름',
background: 'story-northern',
speaker: '제갈량',
text: '주공께서 한중을 얻었으니 이제 사람들은 촉의 주인이 누구인지 묻게 될 것입니다. 이름은 칼보다 늦게 움직이나, 때로는 칼보다 멀리 갑니다.'
},
{
id: 'thirty-seventh-next-shu-han',
bgm: 'story-dark',
chapter: '촉한의 문턱',
background: 'story-northern',
speaker: '유비',
portrait: 'liuBei',
text: '우리가 세우려는 것은 땅의 이름만이 아니오. 한실을 잇고 백성을 품을 뜻이라면, 이제 그 뜻을 나라의 이름으로 밝힐 준비를 해야 하오.'
}
];
export const hanzhongKingCouncilPages: StoryPage[] = [
{
id: 'hanzhong-king-council-open',
bgm: 'story-dark',
chapter: '한중왕 즉위 논의',
background: 'story-northern',
speaker: '제갈량',
text: '한중을 얻은 뒤 군영의 분위기는 전장의 승리에서 나라의 이름으로 옮겨 갔습니다. 이제 유비군은 어디를 지키는 군대인지, 누구의 뜻을 잇는 세력인지 밝혀야 합니다.'
},
{
id: 'hanzhong-king-liu-bei-doubt',
bgm: 'battle-prep',
chapter: '이름의 무게',
background: 'story-northern',
speaker: '유비',
portrait: 'liuBei',
text: '내가 왕의 이름을 받는 것이 백성을 위한 길이라면 마다하지 않겠소. 다만 그 이름이 욕심으로 보인다면 지금까지 따른 이들의 뜻을 해칠까 두렵소.'
},
{
id: 'hanzhong-king-officers',
bgm: 'battle-prep',
chapter: '장수들의 서명',
background: 'story-northern',
speaker: '관우',
portrait: 'guanYu',
text: '형님이 세우는 이름은 한실을 잇기 위한 깃발입니다. 전장마다 모인 장수들이 그 깃발 아래 서명한다면, 병사들도 무엇을 위해 싸우는지 알게 될 것입니다.'
},
{
id: 'hanzhong-king-next-foundation',
bgm: 'militia-theme',
chapter: '촉한의 문 앞에서',
background: 'story-northern',
speaker: '제갈량',
text: '한중왕의 격문이 준비되면 다음은 촉한의 이름을 세울 차례입니다. 그러나 나라의 이름은 새 전장을 부릅니다. 형주의 긴장과 북방의 그림자도 함께 보아야 합니다.'
}
];
export const shuHanFoundationPages: StoryPage[] = [
{
id: 'shu-han-foundation-banner',
bgm: 'militia-theme',
chapter: '한중왕 즉위',
background: 'story-chengdu-surrender',
speaker: '제갈량',
text: '한중의 깃발 아래 장수들의 이름이 모였습니다. 유비는 한중왕의 이름을 받아들이며, 이 이름이 욕심이 아니라 한실을 잇는 약속임을 밝히려 합니다.'
},
{
id: 'shu-han-foundation-oath',
bgm: 'battle-prep',
chapter: '촉한의 이름',
background: 'story-chengdu-surrender',
speaker: '유비',
portrait: 'liuBei',
text: '우리가 세우려는 나라는 나 한 사람의 나라가 아니오. 도원에서 맺은 뜻, 전장을 지나 모인 장수들의 뜻, 그리고 백성을 지키려는 뜻을 촉한의 이름으로 세우겠소.'
},
{
id: 'shu-han-foundation-generals',
bgm: 'battle-prep',
chapter: '오호의 깃발',
background: 'story-chengdu-surrender',
speaker: '관우',
portrait: 'guanYu',
text: '형님께서 이름을 세우셨으니 장수들도 각자의 자리를 지켜야 합니다. 서쪽은 안정되었으나 형주의 바람은 점점 거칠어지고 있습니다.'
},
{
id: 'shu-han-foundation-next-front',
bgm: 'story-dark',
chapter: '형주의 먹구름',
background: 'story-chengdu-surrender',
speaker: '제갈량',
text: '촉한의 이름은 세워졌지만, 그 이름은 새로운 책임을 부릅니다. 관우가 지키는 형주에는 손권과 조조의 시선이 함께 모이고 있습니다.'
}
];
export const thirtyEighthBattleIntroPages: StoryPage[] = [
{
id: 'thirty-eighth-jing-warning',
bgm: 'story-dark',
chapter: '형주의 먹구름',
background: 'story-jingzhou-crisis',
speaker: '제갈량',
text: '촉한의 이름이 세워지자 형주의 무게가 더 커졌습니다. 관우가 지키는 강릉과 남군은 조조와 손권이 동시에 바라보는 칼끝이 되었습니다.'
},
{
id: 'thirty-eighth-guan-yu-front',
bgm: 'battle-prep',
chapter: '관우의 전선',
background: 'story-jingzhou-crisis',
speaker: '관우',
portrait: 'guanYu',
text: '형주는 형님의 등을 지키는 문입니다. 위의 정찰대가 북쪽에서 움직이고, 오의 배가 강가를 맴돈다면 먼저 봉화대와 나루를 묶어야 합니다.'
},
{
id: 'thirty-eighth-two-fronts',
bgm: 'battle-prep',
chapter: '강과 성 사이',
background: 'story-jingzhou-crisis',
speaker: '마량',
text: '강변 마을은 오의 말에 흔들리고, 북쪽 성채는 위의 군세를 두려워합니다. 백성이 흔들리면 형주는 성벽보다 먼저 무너집니다.'
},
{
id: 'thirty-eighth-sortie',
bgm: 'battle-prep',
chapter: '형주 방위 전초전',
background: 'story-jingzhou-crisis',
speaker: '유비',
portrait: 'liuBei',
text: '촉한의 이름을 세운 지금, 형주를 잃는다면 그 이름도 흔들릴 것이오. 관우는 봉화대를 지키고, 모두 강과 성 사이의 불안을 잠재우시오.'
}
];
export const thirtyEighthBattleVictoryPages: StoryPage[] = [
{
id: 'thirty-eighth-victory-beacon-secured',
bgm: 'militia-theme',
chapter: '봉화가 다시 오르다',
background: 'story-jingzhou-crisis',
text: '형주의 봉화대가 다시 불을 밝혔습니다. 위의 정찰대는 물러났고 오의 배는 강 건너로 물러났지만, 두 시선이 동시에 형주를 향하고 있다는 사실은 분명해졌습니다.'
},
{
id: 'thirty-eighth-guan-yu-resolve',
bgm: 'battle-prep',
chapter: '관우의 결의',
background: 'story-jingzhou-crisis',
speaker: '관우',
portrait: 'guanYu',
text: '적이 둘이라 하여 뜻도 둘이 될 수는 없습니다. 형주를 지키는 칼은 더욱 곧아야 합니다. 다만 강가의 마음까지 지켜야 오래 버틸 수 있겠습니다.'
},
{
id: 'thirty-eighth-next-fan-castle',
bgm: 'story-dark',
chapter: '번성의 그림자',
background: 'story-jingzhou-crisis',
speaker: '제갈량',
text: '형주의 불안은 잠시 가라앉았지만 북쪽 번성의 문은 여전히 굳게 닫혀 있습니다. 촉한의 첫 큰 시험은 관우의 전선에서 시작될 것입니다.'
}
];
export const thirtyNinthBattleIntroPages: StoryPage[] = [
{
id: 'thirty-ninth-fan-castle-shadow',
bgm: 'story-dark',
chapter: '번성의 그림자',
background: 'story-fan-castle-flood',
speaker: '제갈량',
text: '형주의 봉화는 다시 올랐으나, 번성의 문은 더욱 굳게 닫혔습니다. 조조의 북방 병력은 수로와 성채를 엮어 시간을 벌려 하고, 오의 시선도 강 건너에서 조용히 움직입니다.'
},
{
id: 'thirty-ninth-guan-yu-north',
bgm: 'battle-prep',
chapter: '관우의 북상',
background: 'story-fan-castle-flood',
speaker: '관우',
portrait: 'guanYu',
text: '형주를 지키는 일은 곧 한실을 일으키는 일입니다. 번성 외곽의 보루와 나루를 눌러야 적의 숨통을 조이고, 뒤이어 큰 결전을 열 수 있습니다.'
},
{
id: 'thirty-ninth-flooded-fields',
bgm: 'battle-prep',
chapter: '물길을 보는 눈',
background: 'story-fan-castle-flood',
speaker: '법정',
text: '한수의 물길은 평소에는 느려 보이나, 비와 둑의 높이에 따라 전장의 형세를 통째로 바꿉니다. 이번 전투에서는 성 밖 보급선과 제방 감시초를 먼저 잡아야 합니다.'
},
{
id: 'thirty-ninth-sortie',
bgm: 'battle-prep',
chapter: '번성 외곽 압박전',
background: 'story-fan-castle-flood',
speaker: '유비',
portrait: 'liuBei',
text: '관우가 선봉을 잡되 모두가 그 뒤를 받쳐라. 번성 외곽을 열면 다음 물길과 성문을 함께 도모할 수 있다. 오늘의 선택이 다음 전장의 폭을 넓힐 것이다.'
}
];
export const thirtyNinthBattleVictoryPages: StoryPage[] = [
{
id: 'thirty-ninth-victory-outer-wall',
bgm: 'militia-theme',
chapter: '외곽 보루 함락',
background: 'story-fan-castle-flood',
text: '번성 외곽의 보루와 나루가 촉한군의 손에 들어왔습니다. 조조군은 성 안쪽으로 물러났고, 방덕의 선봉은 다시 방어진을 고쳐 세우며 다음 격돌을 예고했습니다.'
},
{
id: 'thirty-ninth-pang-de-resolve',
bgm: 'battle-prep',
chapter: '방덕의 결의',
background: 'story-fan-castle-flood',
speaker: '제갈량',
text: '방덕은 물러났으나 기세를 잃지 않았습니다. 조인과 우금도 성 안의 병력을 다시 묶고 있으니, 다음 전투에서는 물길과 성벽이 함께 움직일 것입니다.'
},
{
id: 'thirty-ninth-next-water-lines',
bgm: 'story-dark',
chapter: '한수 수공 준비',
background: 'story-fan-castle-flood',
speaker: '관우',
portrait: 'guanYu',
text: '성은 아직 멀리 있고, 강은 우리 곁에 있소. 병사들에게 둑을 살피게 하고 배와 밧줄을 준비하라. 다음에는 물길마저 우리 편으로 삼아야 하오.'
}
];
export const fortiethBattleIntroPages: StoryPage[] = [
{
id: 'fortieth-han-river-rain',
bgm: 'story-dark',
chapter: '불어난 한수',
background: 'story-fan-castle-flood',
speaker: '제갈량',
text: '비가 이어지며 한수의 물길이 불어났습니다. 번성 밖의 평지는 진흙으로 변했고, 우금의 본대와 방덕의 선봉은 강과 둑 사이에 길게 늘어섰습니다.'
},
{
id: 'fortieth-water-plan',
bgm: 'battle-prep',
chapter: '수공의 군령',
background: 'story-fan-castle-flood',
speaker: '법정',
text: '둑을 무너뜨리는 것만이 수공은 아닙니다. 물이 차오를 때 적이 믿는 퇴로를 먼저 끊고, 궁병과 기병을 높은 둑 위로 몰아야 합니다.'
},
{
id: 'fortieth-guan-yu-command',
bgm: 'battle-prep',
chapter: '관우의 결단',
background: 'story-fan-castle-flood',
speaker: '관우',
portrait: 'guanYu',
text: '물길이 우리 편에 선다면 적의 칼도 무뎌질 것이오. 우금의 본대를 눌러 번성의 숨통을 끊고, 방덕의 돌격은 둑 위에서 맞받아치겠소.'
},
{
id: 'fortieth-sortie',
bgm: 'battle-prep',
chapter: '한수 수공',
background: 'story-fan-castle-flood',
speaker: '유비',
portrait: 'liuBei',
text: '관우가 앞을 열고, 법정과 마량이 물길을 살피며, 기동대는 둑과 나루를 끊어라. 이번 싸움은 성벽보다 먼저 강을 얻는 싸움이다.'
}
];
export const fortiethBattleVictoryPages: StoryPage[] = [
{
id: 'fortieth-victory-seven-armies',
bgm: 'militia-theme',
chapter: '칠군이 물에 잠기다',
background: 'story-fan-castle-flood',
text: '한수의 물길이 전장을 덮치자 조조군의 진형은 무너졌습니다. 우금의 본대는 퇴로를 잃었고, 번성 외곽에는 관우군의 깃발이 더욱 가까워졌습니다.'
},
{
id: 'fortieth-yu-jin-surrenders',
bgm: 'battle-prep',
chapter: '우금의 항복',
background: 'story-fan-castle-flood',
speaker: '제갈량',
text: '우금은 병사들을 살리기 위해 무기를 내려놓았습니다. 그러나 방덕은 끝까지 물러서지 않았고, 번성 안의 조인은 더 깊은 수성전을 준비하기 시작했습니다.'
},
{
id: 'fortieth-next-siege',
bgm: 'story-dark',
chapter: '번성 포위',
background: 'story-fan-castle-flood',
speaker: '관우',
portrait: 'guanYu',
text: '강은 길을 열었으나 성문은 아직 남아 있소. 병사들에게 쉬게 하되 경계를 늦추지 마시오. 다음은 번성의 성벽을 직접 마주할 차례요.'
}
];
export const fortyFirstBattleIntroPages: StoryPage[] = [
{
id: 'forty-first-fan-wall',
bgm: 'story-dark',
chapter: '성벽 앞의 밤',
background: 'story-fan-castle-flood',
speaker: '제갈량',
text: '한수의 물길은 조조군의 칠군을 무너뜨렸지만, 번성의 성벽은 아직 닫혀 있습니다. 조인은 성문을 걸어 잠그고, 방덕은 마지막 돌격을 준비합니다.'
},
{
id: 'forty-first-siege-plan',
bgm: 'battle-prep',
chapter: '포위의 순서',
background: 'story-fan-castle-flood',
speaker: '마량',
text: '성벽을 바로 두드리면 병사만 지칩니다. 외성 보루와 수문, 강가의 낮은 마을을 먼저 붙잡아야 성 안의 사기가 흔들립니다.'
},
{
id: 'forty-first-wu-shadow',
bgm: 'story-dark',
chapter: '강 건너의 시선',
background: 'story-fan-castle-flood',
speaker: '관우',
portrait: 'guanYu',
text: '북쪽 성문만 보아서는 안 되오. 강동의 배가 멀리서 움직이고 있으니, 번성을 치는 동안 뒤의 나루도 비워 두지 마시오.'
},
{
id: 'forty-first-sortie',
bgm: 'battle-prep',
chapter: '번성 공성전',
background: 'story-fan-castle-flood',
speaker: '유비',
portrait: 'liuBei',
text: '관우가 성문을 압박하고, 남은 무장들은 보루와 나루를 나누어 맡아라. 이번 싸움은 성을 치면서도 뒤의 그림자를 놓치지 않는 싸움이다.'
}
];
export const fortyFirstBattleVictoryPages: StoryPage[] = [
{
id: 'forty-first-victory-gate',
bgm: 'militia-theme',
chapter: '성문이 흔들리다',
background: 'story-fan-castle-flood',
text: '번성의 외성 보루가 무너지고 조인의 방어선은 성 안쪽으로 밀려났습니다. 방덕의 결사대도 더는 성문 밖에서 버티지 못했습니다.'
},
{
id: 'forty-first-pang-de-end',
bgm: 'battle-prep',
chapter: '방덕의 결말',
background: 'story-fan-castle-flood',
speaker: '관우',
portrait: 'guanYu',
text: '방덕은 끝까지 물러서지 않았소. 적이라 하나 그 기개는 가벼이 볼 수 없으니, 병사들에게 전하되 오만해지지 말라 이르시오.'
},
{
id: 'forty-first-jing-warning',
bgm: 'story-dark',
chapter: '형주의 불안',
background: 'story-fan-castle-flood',
speaker: '제갈량',
text: '번성의 성벽은 흔들렸으나, 강 건너 오의 움직임은 더 가까워졌습니다. 다음 장에서는 포위의 승세와 형주 후방의 균열을 함께 다루어야 합니다.'
}
];
export const fortySecondBattleIntroPages: StoryPage[] = [
{
id: 'forty-second-river-rumors',
bgm: 'story-dark',
chapter: '강릉의 불안',
background: 'story-jingzhou-crisis',
speaker: '마량',
text: '번성 성문은 흔들리고 있지만, 강릉 동쪽 나루에는 낯선 상선이 늘었습니다. 장사꾼의 말투 속에 군령이 섞여 있고, 밤 신호는 평소보다 늦게 올라옵니다.'
},
{
id: 'forty-second-lu-meng-shadow',
bgm: 'battle-prep',
chapter: '흰 옷의 그림자',
background: 'story-jingzhou-crisis',
speaker: '제갈량',
text: '강동의 장수들은 칼을 들고 오지 않을 수도 있습니다. 흰 옷의 상인, 약재 배, 빈 곡식 자루가 모두 길을 재는 눈이 될 수 있습니다.'
},
{
id: 'forty-second-guan-yu-rear-order',
bgm: 'battle-prep',
chapter: '후방 경계령',
background: 'story-jingzhou-crisis',
speaker: '관우',
portrait: 'guanYu',
text: '번성을 치는 손을 늦출 수는 없으나, 형주의 뒤를 비울 수도 없소. 나루와 창고를 지키며 강동 정찰대를 몰아내시오.'
},
{
id: 'forty-second-sortie',
bgm: 'battle-prep',
chapter: '강릉 나루 경계전',
background: 'story-jingzhou-crisis',
speaker: '유비',
portrait: 'liuBei',
text: '전선의 승리와 후방의 평온은 따로 있지 않다. 관우의 깃발이 번성 앞에 선 동안, 강릉 나루의 작은 흔들림까지 놓치지 말라.'
}
];
export const fortySecondBattleVictoryPages: StoryPage[] = [
{
id: 'forty-second-victory-river-watch',
bgm: 'militia-theme',
chapter: '나루의 밤이 밝아지다',
background: 'story-jingzhou-crisis',
text: '강릉 동쪽 나루의 정찰선은 물러났고, 강변 창고의 불안은 잠시 가라앉았습니다. 그러나 붙잡힌 척후의 말은 오히려 더 큰 위기를 가리켰습니다.'
},
{
id: 'forty-second-lu-xun-letter',
bgm: 'story-dark',
chapter: '부드러운 글과 날카로운 뜻',
background: 'story-jingzhou-crisis',
speaker: '마량',
text: '강동에서 온 문서는 예를 갖추고 있었지만, 글 사이에는 형주의 빈틈을 재는 뜻이 숨어 있었습니다. 승리보다 후방의 믿음이 더 급해졌습니다.'
},
{
id: 'forty-second-next-crack',
bgm: 'story-dark',
chapter: '갈라지는 형주',
background: 'story-jingzhou-crisis',
speaker: '제갈량',
text: '나루 하나는 지켰으나, 강릉과 공안의 장수들이 흔들리기 시작했습니다. 다음 장에서는 형주 후방의 균열이 더 노골적인 배신과 침투로 이어질 것입니다.'
}
];
export const fortyThirdBattleIntroPages: StoryPage[] = [
{
id: 'forty-third-gongan-gate',
bgm: 'story-dark',
chapter: '공안의 성문',
background: 'story-jingzhou-crisis',
speaker: '미축',
text: '강릉 창고 장부를 대조하니 공안으로 보낸 군량이 사라진 흔적이 있습니다. 성문을 지키는 병사들은 명령을 기다린다 하면서도 강동 배를 그냥 들이고 있습니다.'
},
{
id: 'forty-third-fu-shiren-wavers',
bgm: 'story-dark',
chapter: '흔들리는 수비장',
background: 'story-jingzhou-crisis',
speaker: '마량',
text: '부사인은 관우 장군의 엄한 군령을 두려워하고, 미방은 강동의 말에 마음이 흔들립니다. 이 싸움은 적을 베는 일보다 성문 안의 믿음을 붙드는 일이 더 어렵습니다.'
},
{
id: 'forty-third-lu-meng-infiltration',
bgm: 'battle-prep',
chapter: '강동의 본대',
background: 'story-jingzhou-crisis',
speaker: '제갈량',
text: '여몽은 더는 작은 정찰선만 보내지 않을 것입니다. 흰 옷의 상인이 길을 열고, 육손의 글이 의심을 누그러뜨린 뒤, 본대가 공안 성문을 향해 움직일 것입니다.'
},
{
id: 'forty-third-sortie',
bgm: 'battle-prep',
chapter: '공안 성문 변고',
background: 'story-jingzhou-crisis',
speaker: '관우',
portrait: 'guanYu',
text: '번성 앞 깃발을 거둘 수 없다면, 후방의 성문을 먼저 다시 잠가야 하오. 공안 성문을 붙들고 부사인의 병사들을 안정시켜 형주가 한순간에 무너지지 않게 하시오.'
}
];
export const fortyThirdBattleVictoryPages: StoryPage[] = [
{
id: 'forty-third-victory-gate-held',
bgm: 'militia-theme',
chapter: '잠긴 성문',
background: 'story-jingzhou-crisis',
text: '공안 성문은 다시 잠겼고, 강동의 선봉은 물러났습니다. 그러나 부사인의 얼굴에는 안도보다 두려움이 더 짙게 남았습니다.'
},
{
id: 'forty-third-mi-fang-silence',
bgm: 'story-dark',
chapter: '말 없는 장부',
background: 'story-jingzhou-crisis',
speaker: '미축',
text: '미방은 끝내 분명한 대답을 하지 않았습니다. 창고 장부는 맞춰 놓았으나, 사람의 마음은 장부처럼 줄을 맞추기 어렵습니다.'
},
{
id: 'forty-third-next-shadow',
bgm: 'story-dark',
chapter: '맥성으로 드리우는 그림자',
background: 'story-jingzhou-crisis',
speaker: '제갈량',
text: '성문 하나를 지켰지만 형주는 이미 바깥과 안쪽에서 함께 갈라지고 있습니다. 다음 장에서는 관우의 번성 전선이 고립으로 바뀌는 순간을 다루어야 합니다.'
}
];
export const fortyFourthBattleIntroPages: StoryPage[] = [
{
id: 'forty-fourth-maicheng-orders',
bgm: 'story-dark',
chapter: '끊어진 후방',
background: 'story-maicheng-isolation',
speaker: '마량',
text: '공안 성문을 다시 잠갔으나 강릉과 나루의 소식이 끊겼습니다. 관우 장군의 번성 전선은 앞의 조조군과 뒤의 강동군 사이에서 길을 잃고 있습니다.'
},
{
id: 'forty-fourth-lu-meng-seals-roads',
bgm: 'story-dark',
chapter: '봉쇄되는 길',
background: 'story-maicheng-isolation',
speaker: '왕평',
text: '맥성으로 빠지는 길목마다 흰 옷을 벗은 강동 병사가 서 있습니다. 큰길은 막혔고, 숲과 물목의 작은 길도 오래 버티지 못할 것입니다.'
},
{
id: 'forty-fourth-guan-yu-resolve',
bgm: 'battle-prep',
chapter: '남은 깃발',
background: 'story-maicheng-isolation',
speaker: '관우',
portrait: 'guanYu',
text: '성 하나가 아니라 의리를 지키는 싸움이 되었소. 맥성으로 길을 내고 남은 병사들을 수습하겠소. 길이 좁을수록 마음이 먼저 무너지지 않게 하시오.'
},
{
id: 'forty-fourth-sortie',
bgm: 'battle-prep',
chapter: '맥성 고립전',
background: 'story-maicheng-isolation',
speaker: '유비',
portrait: 'liuBei',
text: '운장의 깃발이 고립되었다면, 늦더라도 길을 열어야 하오. 북문과 갈대 물목을 동시에 살펴 포위망을 찢고 맥성의 퇴로를 확보하시오.'
}
];
export const fortyFourthBattleVictoryPages: StoryPage[] = [
{
id: 'forty-fourth-victory-road-opened',
bgm: 'militia-theme',
chapter: '뚫린 좁은 길',
background: 'story-maicheng-isolation',
text: '맥성 북문의 좁은 길은 간신히 열렸고, 흩어진 병사들이 다시 깃발 아래로 모였습니다. 그러나 길 밖의 횃불은 여전히 더 많았습니다.'
},
{
id: 'forty-fourth-lu-meng-tightens',
bgm: 'story-dark',
chapter: '좁아지는 포위',
background: 'story-maicheng-isolation',
speaker: '제갈량',
text: '여몽은 물러난 것이 아니라 더 넓게 둘러섰습니다. 맥성의 작은 승리는 시간을 벌었을 뿐, 형주를 되찾는 길은 아직 멀고 험합니다.'
},
{
id: 'forty-fourth-next-jing-loss',
bgm: 'story-dark',
chapter: '형주의 상실',
background: 'story-maicheng-isolation',
speaker: '마량',
text: '맥성의 포위는 풀렸으나 강릉과 공안의 마음은 이미 갈라졌습니다. 다음 장에서는 형주 상실의 대가와 유비의 분노가 더 큰 전쟁으로 번지는 흐름을 준비해야 합니다.'
}
];
export const fortyFifthBattleIntroPages: StoryPage[] = [
{
id: 'forty-fifth-jing-loss-news',
bgm: 'story-dark',
chapter: '형주 상실의 비보',
background: 'story-yiling-baidi',
speaker: '마량',
text: '맥성의 길은 열렸지만 형주의 큰 성들은 이미 강동의 깃발 아래로 넘어갔습니다. 돌아온 전령들은 흩어진 잔병과 끊긴 나루, 그리고 다시 모이지 못한 깃발의 소식을 전했습니다.'
},
{
id: 'forty-fifth-liu-bei-grief',
bgm: 'story-dark',
chapter: '복수의 칼끝',
background: 'story-yiling-baidi',
speaker: '유비',
portrait: 'liuBei',
text: '형주의 상실은 땅 하나를 잃은 일이 아니오. 함께 세운 뜻이 강동의 말과 불길에 찢긴 일이오. 이릉으로 가는 길을 열어, 무너진 의리를 다시 묻겠소.'
},
{
id: 'forty-fifth-zhuge-warning',
bgm: 'story-dark',
chapter: '분노와 군략',
background: 'story-yiling-baidi',
speaker: '제갈량',
text: '분노는 군을 움직이지만, 오래 버티게 하지는 못합니다. 오군은 산림과 물길을 이용해 긴 보급로를 태우려 할 것입니다. 먼저 이릉으로 향하는 동진로를 열고 진영을 흩어지지 않게 해야 합니다.'
},
{
id: 'forty-fifth-sortie',
bgm: 'battle-prep',
chapter: '이릉 진격로',
background: 'story-yiling-baidi',
speaker: '유비',
portrait: 'liuBei',
text: '장강을 따라 깊이 들어가면 돌아올 길도 길어지오. 동진로의 숲과 나루를 안정시키고, 오군 선봉을 밀어 이릉 전쟁의 첫 진영을 세우시오.'
}
];
export const fortyFifthBattleVictoryPages: StoryPage[] = [
{
id: 'forty-fifth-victory-road-camp',
bgm: 'militia-theme',
chapter: '세워진 복수의 진',
background: 'story-yiling-baidi',
text: '이릉으로 향하는 첫 진격로가 열렸습니다. 유비군은 강가와 숲 사이에 진영을 세웠지만, 긴 보급로와 뜨거운 여름 바람은 이미 다음 위기를 예고했습니다.'
},
{
id: 'forty-fifth-lu-xun-watches',
bgm: 'story-dark',
chapter: '육손의 침묵',
background: 'story-yiling-baidi',
speaker: '제갈량',
text: '오군은 크게 맞붙지 않았습니다. 육손은 물러난 것이 아니라 기다리고 있습니다. 진영이 길게 늘어설수록, 불길 하나가 군 전체를 흔들 수 있습니다.'
},
{
id: 'forty-fifth-next-yiling-main',
bgm: 'story-dark',
chapter: '이릉의 불씨',
background: 'story-yiling-baidi',
speaker: '유비',
portrait: 'liuBei',
text: '첫 길은 열렸으나 전쟁은 이제 시작이오. 다음에는 흩어진 진영을 붙들고, 강동의 기다림이 무엇을 노리는지 확인해야 하오.'
}
];
export const fortySixthBattleIntroPages: StoryPage[] = [
{
id: 'forty-sixth-camps-stretch',
bgm: 'story-dark',
chapter: '길어진 진영',
background: 'story-yiling-fire-attack',
speaker: '황권',
text: '이릉의 첫 진영은 세웠지만, 촉한의 군막은 강변과 숲길을 따라 너무 길게 늘어졌습니다. 물길은 멀고, 마른 풀은 높으며, 오군은 여전히 큰 싸움을 피하고 있습니다.'
},
{
id: 'forty-sixth-lu-xun-fire',
bgm: 'story-dark',
chapter: '기다린 불씨',
background: 'story-yiling-fire-attack',
speaker: '제갈량',
text: '육손의 침묵은 물러남이 아니었습니다. 바람이 동쪽에서 불고 군막이 말랐을 때, 오군의 작은 횃불이 긴 진영 전체를 흔드는 칼이 되었습니다.'
},
{
id: 'forty-sixth-liu-bei-orders',
bgm: 'story-dark',
chapter: '불길 속의 명령',
background: 'story-yiling-fire-attack',
speaker: '유비',
portrait: 'liuBei',
text: '불길이 먼저 달려든다면, 사람의 길을 먼저 열어야 하오. 진영을 버려도 병사를 버릴 수는 없소. 서쪽 퇴로와 강변 물길을 붙들어 백제성으로 물러날 길을 만드시오.'
},
{
id: 'forty-sixth-sortie',
bgm: 'battle-prep',
chapter: '이릉 화공전',
background: 'story-yiling-fire-attack',
speaker: '유비',
portrait: 'liuBei',
text: '육손의 화공망이 진영을 갈라 놓았소. 불타는 군막 사이로 퇴로를 열고, 흩어진 병사를 모아 서쪽 협곡으로 빠져나가시오.'
}
];
export const fortySixthBattleVictoryPages: StoryPage[] = [
{
id: 'forty-sixth-victory-fire-broken',
bgm: 'story-dark',
chapter: '불길을 뚫은 길',
background: 'story-yiling-fire-attack',
text: '불타는 군막 사이로 좁은 퇴로가 열렸습니다. 승리라 부르기에는 잃은 것이 많았지만, 유비의 깃발은 완전히 꺼지지 않았습니다.'
},
{
id: 'forty-sixth-retreat-baidi',
bgm: 'story-dark',
chapter: '백제성으로',
background: 'story-yiling-fire-attack',
speaker: '제갈량',
text: '이릉의 불길은 복수의 속도를 꺾었습니다. 남은 병사들은 백제성으로 물러나며, 촉한의 다음 길이 전장에서 조정과 후계로 옮겨가고 있음을 느꼈습니다.'
},
{
id: 'forty-sixth-next-baidi',
bgm: 'story-dark',
chapter: '남은 뜻',
background: 'story-yiling-fire-attack',
speaker: '유비',
portrait: 'liuBei',
text: '뜻을 세운 날은 멀어졌고, 손에 남은 것은 불탄 깃발뿐이오. 그러나 남은 이들이 있다면 뜻도 아직 끝나지 않았소. 다음 장에서는 백제성에서 남은 나라의 길을 정해야 하오.'
}
];
export const baidiEntrustmentPages: StoryPage[] = [
{
id: 'baidi-entrustment-arrival',
bgm: 'story-dark',
chapter: '백제성의 밤',
background: 'story-baidi-entrustment',
speaker: '제갈량',
text: '이릉의 불길을 지나 백제성에 닿은 촉한군은 승전의 북소리 대신 낮은 숨소리로 밤을 맞았습니다. 전장은 멀어졌지만, 나라가 잃은 무게는 성 안까지 따라왔습니다.'
},
{
id: 'baidi-entrustment-liu-bei',
bgm: 'story-dark',
chapter: '남은 말',
background: 'story-baidi-entrustment',
speaker: '유비',
portrait: 'liuBei',
text: '내가 사람을 얻어 나라를 세웠으나, 분노를 이기지 못해 사람을 잃었소. 공명, 남은 촉한을 그대에게 부탁하오. 후주가 따를 만하면 보필하고, 부족하면 나라의 뜻을 먼저 보시오.'
},
{
id: 'baidi-entrustment-zhuge',
bgm: 'battle-prep',
chapter: '받아 든 짐',
background: 'story-baidi-entrustment',
speaker: '제갈량',
text: '신은 감히 두 마음을 품지 않겠습니다. 폐하께서 남기신 뜻이 백성에게 닿을 때까지, 군영의 장부와 조정의 붓과 전장의 깃발을 모두 놓지 않겠습니다.'
},
{
id: 'baidi-entrustment-officers',
bgm: 'militia-theme',
chapter: '새 질서',
background: 'story-baidi-entrustment',
speaker: '조운',
text: '장수들은 백제성 뜰에서 조용히 군례를 올렸습니다. 이제 유비의 분노가 남긴 상처를 수습하고, 제갈량을 중심으로 촉한의 다음 길을 다시 세워야 합니다.'
},
{
id: 'baidi-entrustment-next',
bgm: 'story-dark',
chapter: '남쪽의 불안',
background: 'story-baidi-entrustment',
speaker: '황권',
text: '이릉의 패전 뒤 촉한은 안팎으로 흔들리고 있습니다. 남중의 불안과 북방의 압박을 동시에 볼 수는 없습니다. 먼저 나라 안을 다독이고, 흩어진 장수들의 마음을 모아야 합니다.'
}
];
export const fortySeventhBattleIntroPages: StoryPage[] = [
{
id: 'forty-seventh-southern-unrest',
bgm: 'story-dark',
chapter: '남중의 흔들림',
background: 'story-nanzhong',
speaker: '황권',
text: '백제성의 유탁 뒤 촉한은 아직 상처를 다 씻지 못했습니다. 그러나 남중의 여러 호족과 반란군은 바로 그 틈을 보며, 성도 남쪽의 길과 창고를 흔들기 시작했습니다.'
},
{
id: 'forty-seventh-zhuge-policy',
bgm: 'battle-prep',
chapter: '먼저 안을 다스리다',
background: 'story-nanzhong',
speaker: '제갈량',
text: '북방을 논하기 전에 나라 안의 불안을 먼저 다스려야 합니다. 남중을 힘으로만 누르면 길은 열려도 마음은 닫힙니다. 반란의 길목을 끊고, 마을과 창고는 살려 두십시오.'
},
{
id: 'forty-seventh-zhao-yun-vanguard',
bgm: 'battle-prep',
chapter: '남쪽 길의 선봉',
background: 'story-nanzhong',
speaker: '조운',
text: '산길과 숲길이 겹친 전장이라 기병만 앞세울 수 없습니다. 왕평이 길을 보고, 황권이 보급을 재며, 마량이 마을의 말을 들어야 합니다. 저는 뒤처진 부대를 회수하겠습니다.'
},
{
id: 'forty-seventh-sortie',
bgm: 'battle-prep',
chapter: '남중 안정로',
background: 'story-nanzhong',
speaker: '제갈량',
text: '옹개와 남중 반란군이 밀림 길목에 진을 쳤습니다. 반란군 지휘선을 흩뜨리고, 마을과 창고를 확보해 남중 평정의 첫 발판을 세우십시오.'
}
];
export const fortySeventhBattleVictoryPages: StoryPage[] = [
{
id: 'forty-seventh-victory-road-opened',
bgm: 'militia-theme',
chapter: '남쪽 길이 열리다',
background: 'story-nanzhong',
text: '밀림과 산길 사이의 반란군 지휘선이 흔들렸습니다. 촉한군은 마을을 약탈하지 않고 창고를 정리하며, 남중 평정이 단순한 추격전이 아님을 병사들에게 보였습니다.'
},
{
id: 'forty-seventh-meng-huo-shadow',
bgm: 'story-dark',
chapter: '더 깊은 산',
background: 'story-nanzhong',
speaker: '왕평',
text: '옹개의 선봉은 물러났지만 남중의 산은 아직 깊습니다. 맹획의 이름이 여러 마을 사이에서 오가고 있고, 힘으로 꺾은 길 뒤에는 설득해야 할 마음이 남아 있습니다.'
},
{
id: 'forty-seventh-next-nanman',
bgm: 'story-dark',
chapter: '남만 평정의 시작',
background: 'story-nanzhong',
speaker: '제갈량',
text: '첫 길은 열렸습니다. 이제 남중의 여러 세력을 모두 적으로 만들지 않으면서, 반란의 중심을 하나씩 마주해야 합니다. 다음 장에서는 맹획의 본대와 처음으로 맞섭니다.'
}
];
export const fortyEighthBattleIntroPages: StoryPage[] = [
{
id: 'forty-eighth-meng-huo-gathers',
bgm: 'story-dark',
chapter: '맹획의 깃발',
background: 'story-nanzhong-captures',
speaker: '왕평',
text: '옹개의 지휘선은 흩어졌지만 남중의 마을들은 아직 촉한군을 멀리서 바라봅니다. 깊은 숲 안쪽에서는 맹획이 여러 호족을 모아, 첫 패배를 갚겠다고 병력을 다시 세우고 있습니다.'
},
{
id: 'forty-eighth-zhuge-amnesty',
bgm: 'battle-prep',
chapter: '힘과 회유',
background: 'story-nanzhong-captures',
speaker: '제갈량',
text: '맹획을 쓰러뜨리는 것만으로는 남중을 얻을 수 없습니다. 반드시 생포하여 돌려보낼 길을 남기십시오. 마을과 포로 수용소를 지키면, 다음 싸움에서 칼보다 말이 먼저 닿을 것입니다.'
},
{
id: 'forty-eighth-sortie',
bgm: 'battle-prep',
chapter: '맹획 본대전',
background: 'story-nanzhong-captures',
speaker: '마량',
text: '맹획의 본대는 숲길, 늪지, 산채를 함께 쓰고 있습니다. 조운과 마초가 돌격을 막고, 왕평이 지형을 읽으며, 황권이 포로와 군량의 장부를 흐트러뜨리지 않아야 합니다.'
}
];
export const fortyEighthBattleVictoryPages: StoryPage[] = [
{
id: 'forty-eighth-victory-captured',
bgm: 'militia-theme',
chapter: '첫 생포',
background: 'story-nanzhong-captures',
text: '맹획의 본대는 흩어졌고, 촉한군은 산채의 불길을 키우지 않은 채 포로와 마을 사람을 갈라 세웠습니다. 병사들은 적장을 베지 않고 생포하는 싸움이 왜 어려운지 처음으로 깨달았습니다.'
},
{
id: 'forty-eighth-victory-release',
bgm: 'story-dark',
chapter: '돌려보내는 책략',
background: 'story-nanzhong-captures',
speaker: '제갈량',
text: '맹획은 아직 진심으로 굴복하지 않았습니다. 그러나 억지 항복은 오래가지 않습니다. 오늘은 그를 돌려보내 남중의 사람들에게 촉한군이 약탈하러 온 군대가 아님을 보이겠습니다.'
},
{
id: 'forty-eighth-next-capture',
bgm: 'story-dark',
chapter: '칠종칠금의 첫 장',
background: 'story-nanzhong-captures',
speaker: '마량',
text: '맹획은 풀려났으나 산속의 호족들은 이제 촉한군의 태도를 보았습니다. 다음 싸움부터는 힘뿐 아니라 누구를 먼저 달래고 누구를 끝까지 추격할지 선택해야 합니다.'
}
];
export const fortyNinthBattleIntroPages: StoryPage[] = [
{
id: 'forty-ninth-meng-huo-returns',
bgm: 'story-dark',
chapter: '돌아온 맹획',
background: 'story-nanzhong-captures',
speaker: '왕평',
text: '맹획은 풀려나자마자 다시 산채를 모았습니다. 그러나 지난 싸움과 달리 마을 사람들은 촉한군이 약탈하지 않았다는 사실을 알고 있습니다. 이번 싸움은 그 마음의 흔들림을 전장 위에서 붙잡는 일입니다.'
},
{
id: 'forty-ninth-second-capture-plan',
bgm: 'battle-prep',
chapter: '두 번째 생포',
background: 'story-nanzhong-captures',
speaker: '제갈량',
text: '이번에도 베어서는 안 됩니다. 강가의 늪지와 산채 길목을 끊어 맹획을 다시 생포하고, 마을과 포로장을 지켜 그가 돌아갈 때 들을 말까지 남겨 두십시오.'
},
{
id: 'forty-ninth-sortie',
bgm: 'battle-prep',
chapter: '칠종칠금 2차전',
background: 'story-nanzhong-captures',
speaker: '마량',
text: '맹획은 이번에 매복과 주술사를 앞세웠습니다. 왕평이 길을 읽고, 황권이 포로 장부를 지키며, 조운과 황충이 돌격과 고지 궁병을 끊어야 합니다. 회유의 말은 전열이 버텨야 닿습니다.'
}
];
export const fortyNinthBattleVictoryPages: StoryPage[] = [
{
id: 'forty-ninth-victory-second-capture',
bgm: 'militia-theme',
chapter: '두 번째 생포',
background: 'story-nanzhong-captures',
text: '맹획은 다시 포위되었고, 이번에도 촉한군은 진영을 불태우지 않았습니다. 포로장은 닫혔지만 약탈은 없었고, 마을 사람들은 어느 군대가 오래 남을 수 있는지를 보기 시작했습니다.'
},
{
id: 'forty-ninth-victory-release-again',
bgm: 'story-dark',
chapter: '다시 풀어 보내다',
background: 'story-nanzhong-captures',
speaker: '제갈량',
text: '두 번 잡아도 마음이 굽지 않는다면 다시 놓아 보낼 뿐입니다. 다만 이번에는 그가 돌아가는 길마다 촉한군이 지킨 마을과 포로들이 그의 말을 시험할 것입니다.'
},
{
id: 'forty-ninth-next-southern-minds',
bgm: 'story-dark',
chapter: '남중의 마음',
background: 'story-nanzhong-captures',
speaker: '황권',
text: '포로 명부와 군량 장부가 어긋나지 않았습니다. 다음 싸움에서는 맹획만이 아니라 그를 따르는 호족들의 마음도 흔들릴 것입니다. 회유는 이제 전투 뒤의 일이 아니라 전투 중의 목표가 되었습니다.'
}
];
export const fiftiethBattleIntroPages: StoryPage[] = [
{
id: 'fiftieth-southern-clans-waver',
bgm: 'story-dark',
chapter: '흔들리는 호족들',
background: 'story-nanzhong-captures',
speaker: '황권',
text: '맹획이 두 번 붙잡혔다가 풀려나자 남중의 호족들은 서로 다른 말을 하기 시작했습니다. 어떤 이는 촉한군의 군율을 두려워했고, 어떤 이는 맹획이 아직 꺾이지 않았다고 외쳤습니다.'
},
{
id: 'fiftieth-third-capture-plan',
bgm: 'battle-prep',
chapter: '세 번째 회유',
background: 'story-nanzhong-captures',
speaker: '제갈량',
text: '이번 싸움에서는 맹획만 다시 잡아서는 부족합니다. 그를 따르는 호족들이 보는 앞에서 마을과 포로장을 지키고, 회유를 받아들일 길을 전장 안에 남겨야 합니다.'
},
{
id: 'fiftieth-sortie',
bgm: 'battle-prep',
chapter: '칠종칠금 3차전',
background: 'story-nanzhong-captures',
speaker: '왕평',
text: '산채는 더 깊고 늪지는 더 넓습니다. 마량이 호족의 말을 붙잡고, 황권이 장부를 흔들리지 않게 하며, 조운과 마초가 돌격을 막아야 맹획을 세 번째로 생포할 수 있습니다.'
}
];
export const fiftiethBattleVictoryPages: StoryPage[] = [
{
id: 'fiftieth-victory-third-capture',
bgm: 'militia-theme',
chapter: '세 번째 생포',
background: 'story-nanzhong-captures',
text: '맹획은 세 번째로 붙잡혔고, 그의 곁에 있던 호족들은 촉한군이 이번에도 마을을 태우지 않았다는 사실을 직접 보았습니다. 전장의 승리는 이제 남중 사람들의 말 속으로 번지기 시작했습니다.'
},
{
id: 'fiftieth-victory-clan-choice',
bgm: 'story-dark',
chapter: '호족의 흔들림',
background: 'story-nanzhong-captures',
speaker: '마량',
text: '몇몇 촌장은 더 싸워도 마을이 남지 않는다고 말하기 시작했습니다. 그러나 맹획은 아직 고개를 숙이지 않았습니다. 그를 다시 풀어 보내면, 이번에는 남중의 호족들이 먼저 서로를 설득할 것입니다.'
},
{
id: 'fiftieth-next-persuasive-camp',
bgm: 'story-dark',
chapter: '전장 밖의 회유',
background: 'story-nanzhong-captures',
speaker: '제갈량',
text: '남중을 얻는 길은 점점 분명해지고 있습니다. 다음 장에서는 맹획을 따르던 호족들과 직접 이야기를 나누고, 전투 전 선택이 전장 목표에 영향을 주는 흐름을 준비해야 합니다.'
}
];
export const fiftyFirstBattleIntroPages: StoryPage[] = [
{
id: 'fifty-first-clan-council-result',
bgm: 'story-dark',
chapter: '회유가 전장으로',
background: 'story-nanzhong-captures',
speaker: '마량',
text: '호족 회의 뒤 일부 촌장은 맹획을 따르되 끝까지 싸우지는 않겠다고 속내를 보였습니다. 그들이 물러날 길을 남겨 두면 다음 전투는 섬멸보다 설득에 가까워질 것입니다.'
},
{
id: 'fifty-first-fourth-capture-plan',
bgm: 'battle-prep',
chapter: '네 번째 생포',
background: 'story-nanzhong-captures',
speaker: '제갈량',
text: '이번에는 맹획의 본영뿐 아니라 오돌골의 등갑병과 독천 제사장들이 전장을 뒤덮을 것입니다. 화덕과 독천을 함부로 건드리지 말고, 회유 퇴로와 마을 보증을 함께 지키십시오.'
},
{
id: 'fifty-first-sortie',
bgm: 'battle-prep',
chapter: '칠종칠금 4차전',
background: 'story-nanzhong-captures',
speaker: '왕평',
text: '숲길은 더 좁고 강물은 더 깊습니다. 마량이 호족의 말을 붙잡고, 황권이 보증 장부를 지키며, 왕평과 마대가 열어 둔 산길을 따라 맹획을 네 번째 생포해야 합니다.'
}
];
export const fiftyFirstBattleVictoryPages: StoryPage[] = [
{
id: 'fifty-first-victory-fourth-capture',
bgm: 'militia-theme',
chapter: '네 번째 생포',
background: 'story-nanzhong-captures',
text: '맹획은 네 번째로 포위되었고, 등갑병의 화덕과 독천 제사장들은 마을까지 밀려오지 못했습니다. 회유 퇴로로 물러난 호족들은 촉한군이 약속한 길을 지켰다는 사실을 직접 보았습니다.'
},
{
id: 'fifty-first-victory-amnesty-route',
bgm: 'story-dark',
chapter: '열어 둔 길',
background: 'story-nanzhong-captures',
speaker: '황권',
text: '돌아간 자와 끝까지 싸운 자의 이름이 장부에 나뉘었습니다. 이제 남중의 호족들은 맹획의 고집만이 아니라, 촉한군의 약속이 지켜지는지도 함께 따지게 될 것입니다.'
},
{
id: 'fifty-first-next-deeper-nanzhong',
bgm: 'story-dark',
chapter: '더 깊은 남중',
background: 'story-nanzhong-captures',
speaker: '제갈량',
text: '네 번 잡아도 맹획은 아직 남중 전체의 마음을 대표한다고 말합니다. 그렇다면 더 깊은 산채와 더 어려운 조건 앞에서도 같은 군율을 지켜 보여야 합니다.'
}
];
export const fiftySecondBattleIntroPages: StoryPage[] = [
{
id: 'fifty-second-hardliner-split',
bgm: 'story-dark',
chapter: '강경파의 갈라짐',
background: 'story-nanzhong-captures',
speaker: '마량',
text: '네 번째 회유 뒤 일부 호족은 맹획의 깃발 아래 남아 있으면서도 마을을 지키는 길을 찾고 있습니다. 반대로 강경파는 그 길을 배신이라 부르며 퇴로를 끊으려 합니다.'
},
{
id: 'fifty-second-fifth-capture-plan',
bgm: 'battle-prep',
chapter: '다섯 번째 생포',
background: 'story-nanzhong-captures',
speaker: '제갈량',
text: '이번 전투는 맹획을 다시 잡는 것만으로는 부족합니다. 강경파 호족을 본대와 분리하고, 회유 길목과 마을 보증을 동시에 지키면 남중 안에서 싸움을 그만둘 명분이 더 커질 것입니다.'
},
{
id: 'fifty-second-sortie',
bgm: 'battle-prep',
chapter: '칠종칠금 5차전',
background: 'story-nanzhong-captures',
speaker: '왕평',
text: '깊은 죽림과 협곡이 이어져 있습니다. 장수마다 맡을 길이 다릅니다. 마량과 황권은 말을 남기고, 왕평과 마대는 물러날 길을 열며, 조운과 황충은 추격을 막아야 합니다.'
}
];
export const fiftySecondBattleVictoryPages: StoryPage[] = [
{
id: 'fifty-second-victory-fifth-capture',
bgm: 'militia-theme',
chapter: '다섯 번째 생포',
background: 'story-nanzhong-captures',
text: '맹획은 다섯 번째로 포위되었고, 강경파 호족은 본대와 갈라졌습니다. 촉한군은 다시 마을과 퇴로를 지켰고, 돌아간 자들은 이제 맹획의 말만 듣지 않게 되었습니다.'
},
{
id: 'fifty-second-victory-hardliner-ledger',
bgm: 'story-dark',
chapter: '갈라진 장부',
background: 'story-nanzhong-captures',
speaker: '황권',
text: '끝까지 싸운 자와 물러난 자의 이름이 더 분명해졌습니다. 처벌의 장부가 아니라 약속의 장부로 남겨야 합니다. 그래야 다음 석방도 군율을 잃지 않습니다.'
},
{
id: 'fifty-second-next-sixth-capture',
bgm: 'story-dark',
chapter: '여섯 번째 길',
background: 'story-nanzhong-captures',
speaker: '제갈량',
text: '남중의 마음은 점점 흔들리고 있습니다. 그러나 맹획의 자존심은 아직 마지막 벽처럼 남아 있습니다. 다음 싸움에서는 그 자존심을 꺾되, 남중 전체를 꺾지는 말아야 합니다.'
}
];
export const fiftyThirdBattleIntroPages: StoryPage[] = [
{
id: 'fifty-third-pride-remains',
bgm: 'story-dark',
chapter: '남은 자존심',
background: 'story-nanzhong-captures',
speaker: '마량',
text: '다섯 번째 생포 뒤 강경파와 물러설 호족의 말이 갈라졌습니다. 그러나 맹획은 아직 남중의 자존심을 내세우며, 마지막으로 깊은 계곡의 부족들을 불러 모았습니다.'
},
{
id: 'fifty-third-sixth-capture-plan',
bgm: 'battle-prep',
chapter: '여섯 번째 생포',
background: 'story-nanzhong-captures',
speaker: '제갈량',
text: '이번에는 적을 밀어붙이는 힘보다 멈춰 설 줄 아는 군율이 중요합니다. 마을 신뢰를 지키고 강경파 잔당의 길을 끊되, 맹획에게 남중 전체가 더는 같은 마음이 아님을 보이십시오.'
},
{
id: 'fifty-third-sortie',
bgm: 'battle-prep',
chapter: '칠종칠금 6차전',
background: 'story-nanzhong-captures',
speaker: '황권',
text: '계곡 길은 넓어 보이나 물길과 절벽이 칼처럼 갈라져 있습니다. 장부를 들 장수, 산길을 지킬 장수, 추격을 멈출 장수를 따로 세워야 여섯 번째 생포가 설득으로 남습니다.'
}
];
export const fiftyThirdBattleVictoryPages: StoryPage[] = [
{
id: 'fifty-third-victory-sixth-capture',
bgm: 'militia-theme',
chapter: '여섯 번째 생포',
background: 'story-nanzhong-captures',
text: '맹획은 여섯 번째로 붙잡혔고, 깊은 계곡의 부족들은 촉한군이 강경파 잔당을 누르면서도 마을을 함부로 밟지 않는 모습을 보았습니다.'
},
{
id: 'fifty-third-victory-trust-ledger',
bgm: 'story-dark',
chapter: '신뢰의 장부',
background: 'story-nanzhong-captures',
speaker: '마량',
text: '처음에는 두려워 숨던 촌장들이 이제는 직접 이름을 말했습니다. 두려움의 장부가 아니라 신뢰의 장부가 만들어졌으니, 마지막 설득의 말도 조금은 닿을 수 있습니다.'
},
{
id: 'fifty-third-next-final-capture',
bgm: 'story-dark',
chapter: '마지막 설득 앞',
background: 'story-nanzhong-captures',
speaker: '제갈량',
text: '여섯 번 잡고도 맹획은 쉽게 항복하지 않을 것입니다. 그러나 이제 남중의 눈은 맹획의 고집뿐 아니라 촉한군의 약속도 함께 보고 있습니다. 다음은 칠종칠금의 마지막 문턱입니다.'
}
];
export const fiftyFourthBattleIntroPages: StoryPage[] = [
{
id: 'fifty-fourth-final-council',
bgm: 'story-dark',
chapter: '마지막 문턱',
background: 'story-nanzhong-captures',
speaker: '마량',
text: '여섯 번째 생포 뒤 남중의 촌장들은 더는 맹획의 말만 듣지 않았습니다. 그러나 맹획은 마지막 자존심을 걸고, 모든 부족 앞에서 다시 한 번 싸워 보자고 외쳤습니다.'
},
{
id: 'fifty-fourth-seventh-capture-plan',
bgm: 'battle-prep',
chapter: '일곱 번째 생포',
background: 'story-nanzhong-captures',
speaker: '제갈량',
text: '이번 싸움은 남중을 꺾는 전투가 아니라 남중이 스스로 고개를 끄덕이게 만드는 전투입니다. 맹획을 마지막으로 생포하되, 회의장과 마을, 신뢰 장부를 모두 지키십시오.'
},
{
id: 'fifty-fourth-sortie',
bgm: 'battle-prep',
chapter: '칠종칠금 7차전',
background: 'story-nanzhong-captures',
speaker: '왕평',
text: '마지막 전장은 길이 많아 보이지만, 잘못 밀고 들어가면 촌장들이 보는 앞에서 군율을 잃게 됩니다. 빠른 장수는 추격을 멈추고, 문사는 약속을 남기며, 전열은 회의장을 지켜야 합니다.'
}
];
export const fiftyFourthBattleVictoryPages: StoryPage[] = [
{
id: 'fifty-fourth-victory-seventh-capture',
bgm: 'militia-theme',
chapter: '일곱 번째 생포',
background: 'story-nanzhong-captures',
text: '맹획은 일곱 번째로 포위되었습니다. 그러나 이번에는 포로장의 침묵이 아니라, 촌장들의 눈앞에서 지켜진 약속과 무너진 고집이 함께 남았습니다.'
},
{
id: 'fifty-fourth-victory-meng-huo-yields',
bgm: 'story-dark',
chapter: '맹획의 항복',
background: 'story-nanzhong-captures',
speaker: '맹획',
text: '일곱 번 잡히고 일곱 번 풀려도 그대들은 남중의 백성을 짓밟지 않았다. 이제는 내가 졌음을 인정하겠다. 남중의 길은 촉한의 길과 함께하겠다.'
},
{
id: 'fifty-fourth-nanzhong-pacified',
bgm: 'story-dark',
chapter: '남중 평정',
background: 'story-nanzhong-captures',
speaker: '제갈량',
text: '남중은 힘으로만 묶인 땅이 아닙니다. 약속을 지킨 뒤 얻은 땅입니다. 이제 촉한은 뒤를 안정시키고, 북쪽을 바라볼 준비를 시작해야 합니다.'
}
];
export const northernCampaignPrepPages: StoryPage[] = [
{
id: 'northern-prep-back-secured',
bgm: 'story-dark',
chapter: '북벌 준비',
background: 'story-northern',
speaker: '제갈량',
text: '남중이 안정되었으니 촉한의 뒤는 흔들림을 줄였습니다. 이제 한중의 창고, 익주의 장부, 장수들의 출전 순서를 다시 맞추어 북쪽으로 향할 때를 준비하겠습니다.'
},
{
id: 'northern-prep-roster-council',
bgm: 'battle-prep',
chapter: '무장 재편',
background: 'story-northern',
speaker: '조운',
text: '북쪽 길은 남중과 다릅니다. 산길을 읽는 장수, 보급을 세는 문관, 기병을 끊는 전열이 함께 움직여야 합니다. 다음 출진부터는 누가 먼저 나설지 더 신중히 고르겠습니다.'
},
{
id: 'northern-prep-long-war',
bgm: 'militia-theme',
chapter: '긴 전쟁의 문턱',
background: 'story-northern',
speaker: '황권',
text: '북벌은 한 번의 승리로 끝나는 길이 아닙니다. 군량과 대기 무장의 훈련, 공명 관계까지 모두 장부에 남겨야 오래 버틸 수 있습니다.'
}
];
export const fiftyFifthBattleIntroPages: StoryPage[] = [
{
id: 'fifty-fifth-qishan-road-opens',
bgm: 'story-dark',
chapter: '제1차 북벌',
background: 'story-northern',
speaker: '제갈량',
text: '남중이 평정되자 촉한의 군량과 길이 비로소 북쪽을 향할 수 있게 되었습니다. 그러나 북벌은 단번에 끝나는 싸움이 아닙니다. 먼저 기산으로 향하는 산길과 한중 보급로를 동시에 붙잡아야 합니다.'
},
{
id: 'fifty-fifth-sortie-council',
bgm: 'battle-prep',
chapter: '기산 출진로',
background: 'story-northern',
speaker: '조운',
text: '승상께서 직접 지휘하신다면 유비공의 이름만으로 밀어붙이던 때와는 달라집니다. 산길을 여는 무장, 보급을 지킬 문관, 기병을 막을 추격대까지 골라야 합니다. 누구를 함께 데려갈지가 곧 전투의 반입니다.'
},
{
id: 'fifty-fifth-wei-vanguard',
bgm: 'battle-prep',
chapter: '위군 선봉',
background: 'story-northern',
speaker: '황권',
text: '조진이 전초 부대를 앞세워 기산의 입구와 마을, 보급 거점을 눌러 두었습니다. 길을 뚫는 것만으로는 부족합니다. 산길을 확보하고, 마을을 안정시키며, 한중으로 이어지는 보급 거점을 지켜야 합니다.'
}
];
export const fiftyFifthBattleVictoryPages: StoryPage[] = [
{
id: 'fifty-fifth-victory-road-secured',
bgm: 'militia-theme',
chapter: '기산 출진로 확보',
background: 'story-northern',
text: '조진의 전초 부대는 물러났고, 기산으로 이어지는 산길에는 촉한의 깃발이 세워졌습니다. 한중 보급대도 길을 잃지 않았으며, 마을 사람들은 북벌군이 약탈자가 아니라 질서를 세우는 군대임을 보았습니다.'
},
{
id: 'fifty-fifth-victory-northern-front',
bgm: 'story-dark',
chapter: '북벌의 첫 발',
background: 'story-northern',
speaker: '제갈량',
text: '첫 길은 열렸으나, 위나라의 본대는 아직 물러나지 않았습니다. 이제부터는 전투 하나하나가 촉한의 국력을 갉아먹는 긴 싸움이 됩니다. 무장들의 배치와 공명, 보급의 선택이 더 중요해질 것입니다.'
},
{
id: 'fifty-fifth-next-front',
bgm: 'story-dark',
chapter: '천수 방면의 기척',
background: 'story-northern',
speaker: '마량',
text: '기산 길목을 지나자 천수 방면에서 새로운 소문이 들어옵니다. 위군 안에서도 촉한의 북벌을 가볍게 보지 않는 장수들이 움직이고 있습니다. 다음 진군은 더 넓은 전선과 더 어려운 선택을 요구할 것입니다.'
}
];
export const fiftySixthBattleIntroPages: StoryPage[] = [
{
id: 'fifty-sixth-tianshui-rumor',
bgm: 'story-dark',
chapter: '천수 방면',
background: 'story-tianshui-front',
speaker: '마량',
text: '기산 길목을 확보하자 천수와 가정 사이의 성들이 급히 봉화를 올렸습니다. 위군은 조진의 전초대가 물러난 틈을 곽회에게 맡기고, 젊은 장수 강유가 산길의 허점을 살피고 있다고 합니다.'
},
{
id: 'fifty-sixth-qishan-council',
bgm: 'battle-prep',
chapter: '진군로 재편',
background: 'story-tianshui-front',
speaker: '제갈량',
text: '북벌은 빠르게 밀어붙이는 것보다 끊기지 않는 것이 중요합니다. 조운은 우회로를 보고, 황권과 마량은 마을과 창고를 묶고, 왕평은 가정으로 이어지는 고개를 살펴 주십시오.'
},
{
id: 'fifty-sixth-jiang-wei-shadow',
bgm: 'battle-prep',
chapter: '젊은 장수의 그림자',
background: 'story-tianshui-front',
speaker: '조운',
text: '강유라는 장수는 평범한 수비장이 아닙니다. 정면에서만 치면 곽회의 방어선에 묶이고, 너무 깊이 들어가면 가정 방면의 퇴로가 끊깁니다. 이번 싸움은 적장 하나보다 전선 전체를 읽는 싸움이 되겠습니다.'
}
];
export const fiftySixthBattleVictoryPages: StoryPage[] = [
{
id: 'fifty-sixth-victory-tianshui-road',
bgm: 'militia-theme',
chapter: '천수 진군로 확보',
background: 'story-tianshui-front',
text: '곽회의 방어선은 물러났고, 천수로 향하는 길에는 촉한군의 표식이 세워졌습니다. 그러나 강유의 움직임은 끝내 가볍지 않았고, 위군은 가정 방면으로 더 넓은 방어선을 펼치기 시작했습니다.'
},
{
id: 'fifty-sixth-victory-jiang-wei',
bgm: 'story-dark',
chapter: '강유의 이름',
background: 'story-tianshui-front',
speaker: '제갈량',
text: '강유는 아직 우리의 사람이 아니지만, 그 재능은 전장 위에 분명히 드러났습니다. 억지로 꺾기보다 길을 남겨 두어야 합니다. 다음 전선에서는 사람을 얻는 일과 땅을 얻는 일이 함께 시험받을 것입니다.'
},
{
id: 'fifty-sixth-next-jieting',
bgm: 'story-dark',
chapter: '가정의 불안',
background: 'story-jieting-crisis',
speaker: '왕평',
text: '가정으로 이어지는 고개는 생각보다 좁고 물길도 멀리 있습니다. 진영을 어디에 세우느냐에 따라 북벌 전체가 흔들릴 수 있습니다. 다음 전장은 승리보다 배치의 판단이 더 무겁게 다가올 것입니다.'
}
];
export const fiftySeventhBattleIntroPages: StoryPage[] = [
{
id: 'fifty-seventh-jieting-order',
bgm: 'story-dark',
chapter: '가정 방면',
background: 'story-jieting-crisis',
speaker: '제갈량',
text: '천수 길목은 열렸으나 가정의 고개가 흔들리면 북벌의 군량과 퇴로가 한꺼번에 끊깁니다. 높은 곳만 바라보는 진영은 오래 버티지 못합니다. 물길과 길목을 함께 지키십시오.'
},
{
id: 'fifty-seventh-ma-su-insists',
bgm: 'battle-prep',
chapter: '마속의 주장',
background: 'story-jieting-crisis',
speaker: '왕평',
text: '마속은 고지를 잡으면 적이 감히 오르지 못한다고 말합니다. 그러나 고개 아래 물길과 수레 길을 잃으면 위군은 우리를 치지 않고도 말릴 수 있습니다. 이번 출전은 강한 장수보다 지형을 읽을 장수가 필요합니다.'
},
{
id: 'fifty-seventh-jiang-wei-contact',
bgm: 'battle-prep',
chapter: '강유 접촉',
background: 'story-jieting-crisis',
speaker: '마량',
text: '천수에서 남긴 글이 강유에게 닿았습니다. 그는 아직 위군의 장수로 서 있지만, 싸움이 명분을 잃는 순간 마음이 흔들릴 것입니다. 가정의 길을 지키며 강유에게 돌아올 길도 남겨 두어야 합니다.'
}
];
export const fiftySeventhBattleVictoryPages: StoryPage[] = [
{
id: 'fifty-seventh-victory-jieting-held',
bgm: 'militia-theme',
chapter: '가정 방면 수습',
background: 'story-jieting-crisis',
text: '장합의 선봉은 고개 아래에서 멈췄고, 촉한군은 가정의 물길과 수레 길을 간신히 잇는 데 성공했습니다. 마속의 고집은 큰 위험을 남겼지만, 왕평의 지형 판단이 북벌의 퇴로를 붙잡았습니다.'
},
{
id: 'fifty-seventh-victory-jiang-wei-joins',
bgm: 'story-dark',
chapter: '새 장수',
background: 'story-jieting-crisis',
speaker: '강유',
text: '강유는 위군의 의심과 백성의 말 사이에서 끝내 마음을 정했습니다. 오늘부터 그는 촉한의 깃발 아래 서지만, 새로 얻은 장수 하나가 곧바로 모든 길을 열어 주지는 않습니다. 다음 출전부터는 더 넓어진 장수진 안에서 누구를 고를지 판단해야 합니다.'
},
{
id: 'fifty-seventh-next-front',
bgm: 'story-dark',
chapter: '북벌의 다음 부담',
background: 'story-jieting-crisis',
speaker: '제갈량',
text: '가정의 위기는 수습되었으나 위군은 이제 우리의 길과 사람을 모두 보았습니다. 강유를 얻은 기쁨과 마속의 실책을 함께 품고, 다음 북벌에서는 더 엄격한 편성과 보급 판단이 필요할 것입니다.'
}
];
export const fiftyEighthBattleIntroPages: StoryPage[] = [
{
id: 'fifty-eighth-qishan-retreat-council',
bgm: 'story-dark',
chapter: '기산 퇴각 명령',
background: 'story-jieting-crisis',
speaker: '제갈량',
text: '가정의 물길은 가까스로 지켰지만 북방의 군량 길은 이미 오래 늘어졌습니다. 지금 억지로 깊게 밀고 들어가면 승리가 아니라 고립을 얻게 됩니다. 기산으로 돌아가는 수레 길을 열고, 병사와 장부를 먼저 살려야 합니다.'
},
{
id: 'fifty-eighth-jiang-wei-first-sortie',
bgm: 'battle-prep',
chapter: '강유의 첫 출전',
background: 'story-jieting-crisis',
speaker: '강유',
text: '제가 알던 천수의 낮은 길이 이제 촉한의 퇴로가 되었습니다. 아직 모두가 저를 믿지는 못하겠지만, 오늘은 말보다 길로 증명하겠습니다. 조운과 마대가 회수 길을 지키고, 왕평이 물길을 보면 위군의 추격을 끊을 수 있습니다.'
},
{
id: 'fifty-eighth-sima-yi-shadow',
bgm: 'story-dark',
chapter: '새로운 그림자',
background: 'story-jieting-crisis',
speaker: '마량',
text: '장합의 추격만 막으면 끝나는 전장이 아닙니다. 위군 본영 뒤에서 사마의가 군량 수레가 어디로 빠지는지 보고 있습니다. 강유를 내보내면 길은 넓어지지만, 누군가는 조운이나 왕평의 자리를 양보해야 합니다.'
}
];
export const fiftyEighthBattleVictoryPages: StoryPage[] = [
{
id: 'fifty-eighth-victory-retreat-road',
bgm: 'militia-theme',
chapter: '기산 퇴로 확보',
background: 'story-jieting-crisis',
text: '촉한군은 군량 수레를 잃지 않고 기산의 낮은 길로 물러났습니다. 장합의 추격은 물길 앞에서 꺾였고, 사마의의 본대는 더 깊게 들어오지 못했습니다. 패배를 승리로 꾸밀 수는 없지만, 다음 북벌을 위한 병사와 장부는 지켜냈습니다.'
},
{
id: 'fifty-eighth-victory-jiang-wei-reviewed',
bgm: 'story-dark',
chapter: '강유의 첫 평가',
background: 'story-jieting-crisis',
speaker: '제갈량',
text: '강유는 천수의 길을 숨기지 않았고, 조운과 마대는 병사들이 돌아올 시간을 벌었습니다. 왕평의 물길 판단도 여전히 군의 목숨줄입니다. 이제부터 출전 명단은 단순히 강한 장수를 고르는 일이 아니라, 어떤 길을 택할지 정하는 일이 됩니다.'
},
{
id: 'fifty-eighth-next-northern-plan',
bgm: 'story-dark',
chapter: '다음 북벌을 위하여',
background: 'story-jieting-crisis',
speaker: '강유',
text: '이번 후퇴로 저는 촉한의 군율과 병사들의 숨을 배웠습니다. 다음에는 물러나는 길이 아니라 나아가는 길을 열겠습니다. 승상께서 다시 북쪽을 보실 때, 제가 먼저 그 길을 살피겠습니다.'
}
];
export const fiftyNinthBattleIntroPages: StoryPage[] = [
{
id: 'fifty-ninth-chencang-order',
bgm: 'story-dark',
chapter: '진창 성채',
background: 'story-chencang-siege',
speaker: '제갈량',
text: '기산에서 병사를 살렸기에 다시 북쪽을 볼 수 있습니다. 그러나 이번 길은 넓은 들이 아니라 진창의 굳은 성채입니다. 성문을 무리하게 깨기보다 공성 진영, 군량 수레, 퇴로를 함께 보아야 합니다.'
},
{
id: 'fifty-ninth-hao-zhao-wall',
bgm: 'battle-prep',
chapter: '학소의 성벽',
background: 'story-chencang-siege',
speaker: '강유',
text: '진창의 수비장 학소는 성을 버리지 않을 사람입니다. 제가 앞길을 살피겠습니다만, 성벽만 바라보면 왕쌍의 기병이 뒤를 물 것입니다. 조운, 마대, 왕평 중 누구를 앞으로 세우느냐가 이번 편성의 무게입니다.'
},
{
id: 'fifty-ninth-supply-limit',
bgm: 'story-dark',
chapter: '군량의 시간',
background: 'story-chencang-siege',
speaker: '황권',
text: '성채 하나에 오래 묶이면 북벌 전체가 굶습니다. 법정의 계책, 마량의 문서, 황권의 장부가 함께 있어야 공성전이 단순한 힘겨루기로 흐르지 않습니다. 진창을 압박하되 돌아갈 수 있는 시간을 남기십시오.'
}
];
export const fiftyNinthBattleVictoryPages: StoryPage[] = [
{
id: 'fifty-ninth-victory-chencang-pressure',
bgm: 'militia-theme',
chapter: '진창 압박',
background: 'story-chencang-siege',
text: '촉한군은 진창의 외곽 진영과 보급로를 흔들었지만, 학소의 성벽은 끝내 쉽게 열리지 않았습니다. 승리라 부르기에는 조심스럽고 패배라 덮기에는 얻은 길이 분명한 전투였습니다.'
},
{
id: 'fifty-ninth-victory-wang-shuang-cut',
bgm: 'story-dark',
chapter: '왕쌍 추격 차단',
background: 'story-chencang-siege',
speaker: '조운',
text: '왕쌍의 기병은 공성 진영 뒤를 물려 했으나, 강유의 길 안내와 마대의 우회, 왕평의 진영 표식이 먼저 움직였습니다. 오래 버티는 성을 상대로도 물러날 때를 정하는 장수가 필요합니다.'
},
{
id: 'fifty-ninth-next-northern-plan',
bgm: 'story-dark',
chapter: '다음 북방 계산',
background: 'story-chencang-siege',
speaker: '제갈량',
text: '진창은 북벌의 끝이 아니라, 무리한 공세가 어디서 멈춰야 하는지를 보여 준 성입니다. 다음 출정에서는 성을 치는 힘뿐 아니라 군량이 버틸 날, 돌아올 길, 장수의 고집을 모두 함께 계산해야 합니다.'
}
];
export const sixtiethBattleIntroPages: StoryPage[] = [
{
id: 'sixtieth-wudu-yinping-order',
bgm: 'story-dark',
chapter: '무도와 음평',
background: 'story-wudu-yinping',
speaker: '제갈량',
text: '진창의 성벽은 오래 물고 늘어질 곳이 아니었습니다. 이번에는 성을 치기보다 무도와 음평의 산길을 나누어 잡아, 북방의 두 고을을 촉한의 숨통으로 만들겠습니다.'
},
{
id: 'sixtieth-guo-huai-relief',
bgm: 'battle-prep',
chapter: '곽회의 구원로',
background: 'story-wudu-yinping',
speaker: '강유',
text: '곽회는 성을 지키는 장수가 아니라 길을 끊는 장수입니다. 제가 아는 천수 길로 앞을 보겠습니다. 다만 위연 장군의 돌파, 조운과 마대의 기병, 왕평의 산길 판단을 모두 한꺼번에 쓸 수는 없습니다.'
},
{
id: 'sixtieth-two-commandery-supply',
bgm: 'story-dark',
chapter: '둘로 갈라진 보급',
background: 'story-wudu-yinping',
speaker: '황권',
text: '무도와 음평을 동시에 안정시키려면 장부가 둘로 갈라집니다. 마량이 마을을 달래고, 왕평이 산길 표식을 세우며, 누가 빠르게 치고 누가 멈출지 출전 전에 정해야 합니다.'
}
];
export const sixtiethBattleVictoryPages: StoryPage[] = [
{
id: 'sixtieth-victory-commanderies-secured',
bgm: 'militia-theme',
chapter: '두 고을 확보',
background: 'story-wudu-yinping',
text: '촉한군은 무도와 음평의 길목을 차례로 눌러 곽회의 구원로를 늦췄습니다. 큰 성 하나를 무너뜨린 승리가 아니라, 북벌이 다시 숨 쉴 수 있는 산길을 확보한 승리였습니다.'
},
{
id: 'sixtieth-victory-jiangwei-weiyan-choice',
bgm: 'story-dark',
chapter: '돌파 뒤의 지도',
background: 'story-wudu-yinping',
speaker: '제갈량',
text: '강유는 길을 읽었고 위연은 길이 열릴 때 망설이지 않았습니다. 하지만 둘이 함께 앞서갈수록 조운과 마대의 회수선, 왕평과 황권의 제동 장치가 더 중요해졌습니다.'
},
{
id: 'sixtieth-next-northern-plan',
bgm: 'story-dark',
chapter: '다음 북방 계산',
background: 'story-wudu-yinping',
speaker: '마량',
text: '무도와 음평의 백성에게는 오늘의 승리가 끝이 아니라 약속의 시작입니다. 다음 북벌에서는 얻은 땅을 지키는 장부와 다시 나아갈 장수의 마음을 함께 보아야 합니다.'
}
];
export const sixtyFirstBattleIntroPages: StoryPage[] = [
{
id: 'sixty-first-hanzhong-rain-warning',
bgm: 'story-dark',
chapter: '한중의 빗길',
background: 'story-hanzhong-rain',
speaker: '황권',
text: '무도와 음평을 얻은 뒤부터 한중의 장부는 더 두꺼워졌습니다. 조진이 북문으로 내려오고, 사마의가 빗길을 따라 별동대를 움직이면 새 고을은 승리의 이름이 아니라 지켜야 할 짐이 됩니다.'
},
{
id: 'sixty-first-cao-zhen-counteroffensive',
bgm: 'battle-prep',
chapter: '조진의 역공',
background: 'story-hanzhong-rain',
speaker: '제갈량',
text: '이번에는 성을 치지 않습니다. 한중 북문의 창고, 무도와 음평으로 이어지는 수레 길, 그리고 비에 무너지는 고개를 함께 지켜야 합니다. 위연의 돌파와 강유의 길눈, 이엄과 황권의 보급 장부 중 무엇을 앞세울지 정하십시오.'
},
{
id: 'sixty-first-two-commandery-burden',
bgm: 'story-dark',
chapter: '넓어진 책임',
background: 'story-hanzhong-rain',
speaker: '마량',
text: '백성은 촉한의 깃발만 보고 안심하지 않습니다. 비가 오면 수레는 늦고, 군문이 흔들리면 새 고을은 먼저 두려워합니다. 출전 명단에서 누가 길을 잡고 누가 장부를 지킬지 분명히 해야 합니다.'
}
];
export const sixtyFirstBattleVictoryPages: StoryPage[] = [
{
id: 'sixty-first-victory-rain-defense',
bgm: 'militia-theme',
chapter: '빗길을 막다',
background: 'story-hanzhong-rain',
text: '촉한군은 한중 북문의 창고를 비워 내지 않고 지켜 냈고, 무도와 음평으로 향하는 수레 길도 끊기지 않게 붙들었습니다. 조진의 역공은 빗길과 산길 사이에서 힘을 잃었습니다.'
},
{
id: 'sixty-first-victory-supply-responsibility',
bgm: 'story-dark',
chapter: '장부의 무게',
background: 'story-hanzhong-rain',
speaker: '이엄',
text: '고을을 얻는 일보다 고을을 먹여 살리는 일이 더 오래 갑니다. 황권의 장부와 마량의 문서가 늦어지면, 강유와 위연이 아무리 앞에서 길을 열어도 뒤의 비명은 전선으로 돌아옵니다.'
},
{
id: 'sixty-first-next-northern-plan',
bgm: 'story-dark',
chapter: '다시 북쪽을 보다',
background: 'story-hanzhong-rain',
speaker: '강유',
text: '조진을 막아 냈지만 위의 북방은 한 번 물러난 것으로 끝나지 않습니다. 다음 출정에서는 지켜 낸 길을 다시 공격의 길로 바꿀 수 있는지, 그리고 그때 누구를 뒤에 남길지까지 따져야 합니다.'
}
];
export const sixtySecondBattleIntroPages: StoryPage[] = [
{
id: 'sixty-second-renewed-qishan-council',
bgm: 'story-dark',
chapter: '기산 재출정',
background: 'story-qishan-renewed',
speaker: '제갈량',
text: '한중 북문의 비가 그치자 지켜 낸 길은 다시 북쪽을 향한 길이 되었습니다. 이번에는 노성 앞의 위군 지연선을 흔들어, 무도와 음평에서 이어진 보급로를 공격의 숨으로 바꾸겠습니다.'
},
{
id: 'sixty-second-sima-yi-delay-line',
bgm: 'battle-prep',
chapter: '사마의의 지연전',
background: 'story-qishan-renewed',
speaker: '강유',
text: '사마의는 성을 내주지 않고 길을 늦추려 합니다. 장합은 기병으로 앞선을 찌르고, 곽회는 돌아갈 길을 끊으려 할 것입니다. 빠른 돌파와 돌아올 표식이 함께 움직여야 합니다.'
},
{
id: 'sixty-second-supply-into-offense',
bgm: 'story-dark',
chapter: '보급을 공세로',
background: 'story-qishan-renewed',
speaker: '황권',
text: '지난 전투에서 지킨 장부를 이번에는 밀어 올릴 차례입니다. 이엄을 후방에 남길지, 마대의 측면 기동을 넣을지, 혹은 마량의 민심 문서를 앞세울지 출전 명단에서 먼저 정해야 합니다.'
}
];
export const sixtySecondBattleVictoryPages: StoryPage[] = [
{
id: 'sixty-second-victory-lucheng-pressure',
bgm: 'militia-theme',
chapter: '노성 앞을 누르다',
background: 'story-qishan-renewed',
text: '촉한군은 노성 앞의 지연선을 밀어 냈고, 사마의의 봉화와 곽회의 차단로가 동시에 이어지는 것을 막았습니다. 기산의 길은 다시 북벌군의 군문 앞에 열렸습니다.'
},
{
id: 'sixty-second-victory-return-markers',
bgm: 'story-dark',
chapter: '돌아올 표식',
background: 'story-qishan-renewed',
speaker: '왕평',
text: '앞으로 나아간 길마다 돌아올 표식이 함께 세워졌습니다. 강유와 위연이 열어 둔 길을 조운이 회수선으로 묶고, 황권과 마량은 그 길이 백성의 부담이 되지 않게 장부를 고쳤습니다.'
},
{
id: 'sixty-second-next-northern-plan',
bgm: 'story-dark',
chapter: '더 깊은 북방 계산',
background: 'story-qishan-renewed',
speaker: '제갈량',
text: '사마의는 한 번 물러났으나 전쟁은 아직 짧아지지 않았습니다. 다음 북벌에서는 이긴 길을 지키는 사람과 더 깊이 들어갈 사람을 다시 나누어야 합니다.'
}
];
export const sixtyThirdBattleIntroPages: StoryPage[] = [
{
id: 'sixty-third-lucheng-pursuit-council',
bgm: 'story-dark',
chapter: '노성 추격',
background: 'story-lucheng-pursuit',
speaker: '제갈량',
text: '사마의가 노성 뒤로 물러났다고 하여 길이 끝난 것은 아닙니다. 물러난 군은 추격당하는 척하며 돌아갈 길과 보급 수레를 끊으려 합니다.'
},
{
id: 'sixty-third-zhanghe-rear-raid',
bgm: 'battle-prep',
chapter: '장합의 뒷길',
background: 'story-lucheng-pursuit',
speaker: '조운',
text: '장합의 기병은 앞의 성보다 뒤의 표식을 노릴 것입니다. 전진하는 부대가 승리를 보고 달릴수록, 돌아오는 병사는 어둠 속에서 길을 잃습니다.'
},
{
id: 'sixty-third-supply-and-villages',
bgm: 'story-dark',
chapter: '이긴 길을 지키다',
background: 'story-lucheng-pursuit',
speaker: '황권',
text: '노성으로 더 깊이 들어가려면 수레와 고시문이 군기보다 먼저 도착해야 합니다. 이번 출전에서는 추격과 회수, 장부와 민심을 한 전장 안에서 다시 나누어야 합니다.'
}
];
export const sixtyThirdBattleVictoryPages: StoryPage[] = [
{
id: 'sixty-third-victory-return-road-held',
bgm: 'militia-theme',
chapter: '돌아오는 길',
background: 'story-lucheng-pursuit',
text: '촉한군은 노성 추격로를 열었고, 장합의 기병이 회수 표식을 흔들기 전에 예비대를 움직였습니다. 전진한 병사들은 처음으로 깊이 들어간 뒤에도 돌아올 길을 보았습니다.'
},
{
id: 'sixty-third-victory-ledger-and-signal',
bgm: 'story-dark',
chapter: '봉화와 장부',
background: 'story-lucheng-pursuit',
speaker: '강유',
text: '곽회의 봉화가 끊기자 노성 앞 마을과 수레 진영이 한 줄로 이어졌습니다. 강유는 낮은 길을 새 지도에 옮겼고, 왕평은 그 길마다 멈출 표식을 남겼습니다.'
},
{
id: 'sixty-third-next-northern-plan',
bgm: 'story-dark',
chapter: '다음 북방의 무게',
background: 'story-lucheng-pursuit',
speaker: '제갈량',
text: '오늘의 추격은 길을 얻었을 뿐, 아직 전쟁의 끝은 아닙니다. 더 깊은 북방으로 가려면 누가 길을 열고 누가 나라의 숨을 아낄지 다시 정해야 합니다.'
}
];
export const sixtyFourthBattleIntroPages: StoryPage[] = [
{
id: 'sixty-fourth-weishui-camp-council',
bgm: 'story-dark',
chapter: '위수 진영',
background: 'story-weishui-camps',
speaker: '제갈량',
text: '노성 추격으로 돌아올 길은 지켰으나, 사마의는 위수 북안에 여러 진영을 겹겹이 세웠습니다. 강을 건너기보다 먼저 적의 진영 사이를 흔들어 보급 표식과 물목을 빼앗아야 합니다.'
},
{
id: 'sixty-fourth-river-camps-ledger',
bgm: 'battle-prep',
chapter: '강가의 장부',
background: 'story-weishui-camps',
speaker: '황권',
text: '위수까지 나아가면 길은 넓어지지만 수레는 더 느려집니다. 진영 하나를 깨는 것보다, 얻은 진영에 군량과 표식을 남겨 다음 부대가 길을 잃지 않게 하는 일이 먼저입니다.'
},
{
id: 'sixty-fourth-zhanghe-crossing-threat',
bgm: 'story-dark',
chapter: '장합의 물목',
background: 'story-weishui-camps',
speaker: '강유',
text: '장합은 정면에서 기다리지 않을 것입니다. 강안의 낮은 길과 물목을 이용해 뒤를 물고, 곽회는 봉화로 사마의의 본영에 시간을 벌어 줄 것입니다. 이번 출전은 돌파와 회수, 진영 확보가 한꺼번에 얽힙니다.'
}
];
export const sixtyFourthBattleVictoryPages: StoryPage[] = [
{
id: 'sixty-fourth-victory-river-camps-held',
bgm: 'militia-theme',
chapter: '위수 진영 확보',
background: 'story-weishui-camps',
text: '촉한군은 위수 남안의 진영을 빼앗고 장합의 물목 추격을 늦췄습니다. 사마의의 본영은 여전히 멀지만, 강가의 표식과 군량 장부가 처음으로 북방 깊숙한 곳에 남았습니다.'
},
{
id: 'sixty-fourth-victory-signal-lines',
bgm: 'story-dark',
chapter: '꺼진 봉화',
background: 'story-weishui-camps',
speaker: '마량',
text: '곽회의 봉화는 늦어졌고, 강가 마을에는 촉한군이 지나간 까닭을 적은 고시문이 붙었습니다. 병사들은 이긴 길보다 돌아올 표식을 먼저 확인하며 다음 명령을 기다렸습니다.'
},
{
id: 'sixty-fourth-next-northern-plan',
bgm: 'story-dark',
chapter: '더 먼 북방',
background: 'story-weishui-camps',
speaker: '제갈량',
text: '위수 진영을 얻었다 해도 북방의 끝은 아직 보이지 않습니다. 강을 끼고 오래 싸울 사람, 수레를 붙들 사람, 적의 다음 계책을 먼저 읽을 사람을 다시 나누어야 합니다.'
}
];
export const sixtyFifthBattleIntroPages: StoryPage[] = [
{
id: 'sixty-fifth-northbank-council',
bgm: 'story-dark',
chapter: '위수 북안',
background: 'story-weishui-northbank',
speaker: '제갈량',
text: '위수 남안의 진영은 확보했지만, 사마의는 북안의 진문과 봉화대를 더 촘촘히 묶었습니다. 이번에는 강을 건너 끝장을 보려는 싸움이 아니라, 북안 지연선을 눌러 다음 출정의 숨을 확보하는 싸움입니다.'
},
{
id: 'sixty-fifth-forward-ledger',
bgm: 'battle-prep',
chapter: '전진 장부',
background: 'story-weishui-northbank',
speaker: '황권',
text: '강을 건너면 이긴 곳보다 버릴 수 없는 곳이 더 빨리 늘어납니다. 전진 진영과 회수선, 마을 군량을 한 장부에 묶지 않으면 승리한 길이 곧 굶주린 길이 됩니다.'
},
{
id: 'sixty-fifth-rearguard-threat',
bgm: 'story-dark',
chapter: '재추격의 그림자',
background: 'story-weishui-northbank',
speaker: '강유',
text: '장합은 물러나는 척하며 다시 뒤를 물 것이고, 곽회는 봉화와 우회 기병으로 사마의의 시간을 벌 것입니다. 북안으로 나아가되, 돌아올 표식과 남길 진영을 동시에 지켜야 합니다.'
}
];
export const sixtyFifthBattleVictoryPages: StoryPage[] = [
{
id: 'sixty-fifth-victory-delay-line-pressed',
bgm: 'militia-theme',
chapter: '눌린 지연선',
background: 'story-weishui-northbank',
text: '촉한군은 위수 북안의 전진 진영을 압박하고 장합의 재추격을 늦췄습니다. 사마의의 본영은 아직 물러서지 않았지만, 그의 시간을 버는 선이 처음으로 흔들렸습니다.'
},
{
id: 'sixty-fifth-victory-northbank-ledger',
bgm: 'story-dark',
chapter: '강북 장부',
background: 'story-weishui-northbank',
speaker: '황권',
text: '전진 진영과 마을 군량, 회수 깃발이 한 장부에 묶였습니다. 제갈량은 그 장부 위에 더 깊은 북방 길을 그리되, 아직 끝이라는 말을 적지 않았습니다.'
},
{
id: 'sixty-fifth-next-front-choice',
bgm: 'story-dark',
chapter: '다음 선택',
background: 'story-weishui-northbank',
speaker: '제갈량',
text: '위수 북안이 열렸다고 북벌이 끝난 것은 아닙니다. 오래 붙들 진영, 버릴 진영, 다시 밀고 들어갈 길을 나누어야만 다음 북방 공세가 병사의 숨을 해치지 않습니다.'
}
];
export const sixtySixthBattleIntroPages: StoryPage[] = [
{
id: 'sixty-sixth-wuzhang-council',
bgm: 'story-dark',
chapter: '오장원의 밤',
background: 'story-weishui-northbank',
speaker: '제갈량',
text: '위수 북안의 장부를 정리하자 오장원의 등불이 마지막 작전도를 비추었습니다. 더 멀리 밀어붙이는 전공보다, 병사들이 살아 돌아갈 길과 다음 세대가 이어 받을 질서가 먼저였습니다.'
},
{
id: 'sixty-sixth-inherited-ledger',
bgm: 'battle-prep',
chapter: '이어 받을 장부',
background: 'story-northern',
speaker: '강유',
text: '강유는 새로 고친 진군 장부를 품에 넣었습니다. 오늘의 북벌은 끝을 향하지만 촉한의 뜻은 여기서 끊기지 않습니다. 그는 이 싸움이 승리보다 더 무거운 계승의 시험임을 알았습니다.'
},
{
id: 'sixty-sixth-final-orders',
bgm: 'story-dark',
chapter: '마지막 명령',
background: 'story-hanzhong-rain',
speaker: '왕평',
text: '왕평은 퇴로의 북을 낮게 울리고, 마대와 위연은 측면의 기병을 다시 묶었습니다. 사마의가 마지막으로 압박해 오기 전에 본영과 장부, 병사들의 귀로를 함께 지켜야 합니다.'
}
];
export const sixtySixthBattleVictoryPages: StoryPage[] = [
{
id: 'sixty-sixth-victory-wuzhang-held',
bgm: 'militia-theme',
chapter: '지켜 낸 오장원',
background: 'story-weishui-northbank',
text: '촉한군은 오장원 본영을 끝까지 지켜 냈습니다. 위군의 추격 깃발은 강가에서 멈추었고, 제갈량의 장부는 불타지 않은 채 다음 손으로 건너갔습니다.'
},
{
id: 'sixty-sixth-victory-jiang-wei-oath',
bgm: 'battle-prep',
chapter: '새 길의 맹세',
background: 'story-northern',
speaker: '강유',
text: '강유는 퇴각하는 병사들의 뒤에서 마지막으로 북쪽을 바라보았습니다. 오늘은 물러나지만, 백성의 이름으로 세운 나라가 스스로를 잊지 않는 한 북벌의 뜻도 사라지지 않을 것입니다.'
},
{
id: 'sixty-sixth-victory-returning-banners',
bgm: 'story-dark',
chapter: '돌아가는 깃발',
background: 'story-hanzhong-rain',
speaker: '내레이션',
text: '오장원의 불빛은 하나씩 꺼졌습니다. 하지만 도원에서 시작된 맹세, 형주와 익주를 지나 촉한에 이른 사람들의 이름은 마지막 행군 속에서도 서로를 붙들었습니다.'
}
];
export const endingEpiloguePages: StoryPage[] = [
{
id: 'ending-wuzhang-council',
bgm: 'story-dark',
chapter: '불 꺼진 본영',
background: 'story-wuzhang-jiangwei-inheritance',
speaker: '내레이션',
text: '오장원의 불빛이 사라진 뒤에도 빈 의자 앞의 장부는 남았습니다. 남은 장수들은 더 밀고 들어갈 길보다 돌아갈 병사와 지킬 나라를 먼저 적었고, 승상의 뜻은 다음 사람이 이어 받을 약속이 되었습니다.'
},
{
id: 'ending-jiang-wei-inherits-map',
bgm: 'battle-prep',
chapter: '이어 받은 지도',
background: 'story-wuzhang-jiangwei-inheritance',
speaker: '강유',
text: '강유는 낡은 지도와 봉한 장부를 품에 넣었습니다. 오늘의 북벌은 멈추지만, 촉한이 백성을 버리지 않았다는 증거와 다시 길을 볼 눈은 다음 세대의 군문에 남았습니다.'
},
{
id: 'ending-roster-returns',
bgm: 'militia-theme',
chapter: '돌아오는 깃발',
background: 'story-hanzhong-rain',
speaker: '왕평',
text: '조운이 세운 회수선, 왕평의 표식, 황권과 이엄의 장부, 마량의 고시문은 병사들이 돌아오는 길을 잃지 않게 했습니다. 이긴 전장보다 잃지 않은 사람들이 촉한의 마지막 장부에 남았습니다.'
},
{
id: 'ending-shu-han-legacy',
bgm: 'oath-theme',
chapter: '촉한의 뜻',
background: 'story-yiling-baidi',
speaker: '내레이션',
text: '도원에서 시작된 맹세는 전장을 지나 나라가 되었고, 나라는 다시 사람들의 기억이 되었습니다. 촉한의 북벌은 끝을 보지 못했으나, 의와 선택으로 버틴 시간은 다음 이야기가 설 자리를 남겼습니다.'
}
];
export const firstBattleMap: BattleMap = {
width: 20,
height: 18,
terrain: [
['forest', 'forest', 'hill', 'hill', 'cliff', 'cliff', 'hill', 'plain', 'road', 'road', 'plain', 'forest', 'hill', 'hill', 'plain', 'plain', 'forest', 'hill', 'hill', 'plain'],
['forest', 'hill', 'hill', 'plain', 'cliff', 'hill', 'plain', 'plain', 'road', 'road', 'plain', 'forest', 'forest', 'hill', 'plain', 'plain', 'plain', 'hill', 'fort', 'plain'],
['plain', 'forest', 'plain', 'plain', 'hill', 'hill', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'fort', 'fort', 'plain', 'plain'],
['plain', 'plain', 'plain', 'forest', 'hill', 'plain', 'road', 'road', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'hill', 'plain', 'fort', 'plain', 'plain', 'forest'],
['plain', 'plain', 'forest', 'forest', 'plain', 'plain', 'road', 'plain', 'plain', 'forest', 'forest', 'plain', 'river', 'river', 'plain', 'plain', 'plain', 'plain', 'forest', 'forest'],
['plain', 'plain', 'plain', 'forest', 'plain', 'road', 'road', 'plain', 'forest', 'plain', 'plain', 'plain', 'river', 'river', 'plain', 'village', 'plain', 'plain', 'plain', 'forest'],
['plain', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'plain', 'hill', 'plain', 'river', 'river', 'plain', 'plain', 'plain', 'plain', 'hill', 'plain'],
['hill', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'hill', 'hill', 'plain', 'hill', 'plain', 'road', 'road', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain'],
['hill', 'hill', 'plain', 'road', 'forest', 'plain', 'plain', 'hill', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain'],
['plain', 'plain', 'road', 'road', 'forest', 'plain', 'plain', 'plain', 'village', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'plain', 'plain', 'hill', 'plain', 'plain'],
['plain', 'road', 'road', 'plain', 'plain', 'plain', 'forest', 'plain', 'road', 'road', 'road', 'plain', 'plain', 'forest', 'plain', 'plain', 'hill', 'hill', 'plain', 'plain'],
['road', 'road', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'forest', 'forest', 'plain', 'hill', 'hill', 'plain', 'plain', 'plain'],
['plain', 'road', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'river', 'river', 'plain', 'village', 'plain', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain'],
['plain', 'road', 'plain', 'plain', 'plain', 'plain', 'hill', 'plain', 'river', 'river', 'plain', 'plain', 'plain', 'camp', 'plain', 'plain', 'forest', 'plain', 'plain', 'hill'],
['camp', 'road', 'plain', 'plain', 'hill', 'plain', 'hill', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain', 'hill', 'hill'],
['camp', 'camp', 'road', 'plain', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain', 'road', 'road', 'plain', 'forest', 'plain', 'plain', 'plain', 'plain', 'plain', 'hill'],
['plain', 'camp', 'road', 'plain', 'forest', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain'],
['plain', 'plain', 'road', 'road', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'plain', 'plain', 'plain']
]
};
export const secondBattleMap: BattleMap = {
width: 24,
height: 20,
terrain: [
['forest', 'forest', 'forest', 'hill', 'plain', 'plain', 'road', 'plain', 'forest', 'hill', 'plain', 'river', 'river', 'plain', 'plain', 'forest', 'forest', 'plain', 'hill', 'hill', 'plain', 'plain', 'forest', 'forest'],
['forest', 'hill', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'hill', 'river', 'river', 'plain', 'forest', 'forest', 'plain', 'plain', 'hill', 'fort', 'fort', 'plain', 'plain', 'forest'],
['plain', 'plain', 'plain', 'forest', 'plain', 'road', 'plain', 'plain', 'forest', 'plain', 'plain', 'river', 'river', 'road', 'road', 'plain', 'plain', 'plain', 'plain', 'fort', 'plain', 'plain', 'plain', 'forest'],
['plain', 'plain', 'forest', 'forest', 'plain', 'road', 'plain', 'forest', 'forest', 'plain', 'plain', 'river', 'river', 'road', 'plain', 'plain', 'hill', 'hill', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain'],
['plain', 'forest', 'forest', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'hill', 'river', 'river', 'road', 'plain', 'plain', 'hill', 'cliff', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain'],
['plain', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'hill', 'plain', 'plain', 'plain', 'river', 'river', 'road', 'plain', 'plain', 'hill', 'plain', 'village', 'plain', 'forest', 'forest', 'plain'],
['plain', 'plain', 'forest', 'plain', 'road', 'plain', 'plain', 'hill', 'hill', 'plain', 'plain', 'plain', 'river', 'river', 'road', 'road', 'plain', 'plain', 'plain', 'village', 'plain', 'plain', 'forest', 'plain'],
['plain', 'forest', 'forest', 'plain', 'road', 'plain', 'plain', 'plain', 'hill', 'plain', 'road', 'road', 'plain', 'river', 'river', 'road', 'plain', 'plain', 'plain', 'plain', 'plain', 'plain', 'hill', 'plain'],
['plain', 'forest', 'plain', 'road', 'road', 'plain', 'hill', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'hill', 'hill', 'plain'],
['plain', 'plain', 'plain', 'road', 'plain', 'plain', 'hill', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'plain', 'hill', 'plain'],
['hill', 'plain', 'plain', 'road', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'village', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'plain', 'plain'],
['hill', 'hill', 'plain', 'road', 'plain', 'forest', 'plain', 'road', 'plain', 'plain', 'village', 'village', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'plain'],
['cliff', 'hill', 'plain', 'road', 'road', 'plain', 'plain', 'road', 'plain', 'plain', 'plain', 'village', 'plain', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'plain'],
['cliff', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'road', 'plain', 'plain', 'plain', 'plain', 'forest', 'plain', 'river', 'river', 'plain', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain'],
['plain', 'plain', 'camp', 'plain', 'plain', 'road', 'road', 'plain', 'road', 'plain', 'forest', 'plain', 'plain', 'forest', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain'],
['plain', 'camp', 'camp', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'plain', 'forest', 'plain', 'hill'],
['plain', 'camp', 'plain', 'plain', 'forest', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'plain', 'hill', 'hill'],
['plain', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'plain', 'hill'],
['plain', 'plain', 'road', 'road', 'plain', 'plain', 'forest', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'plain'],
['plain', 'road', 'road', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'plain', 'river', 'river', 'plain', 'plain']
]
};
export const thirdBattleMap: BattleMap = {
width: 24,
height: 20,
terrain: [
['forest', 'forest', 'hill', 'plain', 'plain', 'road', 'plain', 'forest', 'hill', 'plain', 'river', 'river', 'plain', 'forest', 'forest', 'hill', 'hill', 'plain', 'fort', 'fort', 'plain', 'forest', 'forest', 'hill'],
['forest', 'hill', 'plain', 'plain', 'road', 'road', 'plain', 'forest', 'plain', 'plain', 'river', 'river', 'road', 'plain', 'forest', 'plain', 'hill', 'plain', 'fort', 'plain', 'plain', 'plain', 'forest', 'forest'],
['hill', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'plain', 'road', 'road', 'road', 'road', 'plain', 'plain', 'plain', 'plain', 'hill', 'plain', 'plain', 'forest', 'plain', 'plain', 'forest'],
['plain', 'plain', 'forest', 'road', 'plain', 'plain', 'forest', 'plain', 'hill', 'road', 'river', 'river', 'road', 'road', 'plain', 'hill', 'hill', 'plain', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain'],
['plain', 'forest', 'forest', 'road', 'plain', 'hill', 'plain', 'plain', 'plain', 'road', 'river', 'river', 'plain', 'road', 'plain', 'plain', 'hill', 'cliff', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain'],
['plain', 'plain', 'forest', 'road', 'road', 'plain', 'plain', 'hill', 'plain', 'road', 'plain', 'river', 'river', 'road', 'plain', 'village', 'plain', 'hill', 'plain', 'plain', 'plain', 'forest', 'forest', 'plain'],
['plain', 'plain', 'plain', 'plain', 'road', 'plain', 'hill', 'hill', 'plain', 'road', 'plain', 'river', 'river', 'road', 'plain', 'village', 'plain', 'plain', 'plain', 'plain', 'hill', 'plain', 'forest', 'plain'],
['plain', 'forest', 'plain', 'plain', 'road', 'plain', 'plain', 'hill', 'plain', 'road', 'road', 'plain', 'river', 'river', 'road', 'plain', 'plain', 'forest', 'plain', 'plain', 'hill', 'hill', 'plain', 'plain'],
['forest', 'forest', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'hill', 'plain', 'road', 'plain', 'plain', 'river', 'river', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'hill', 'plain', 'plain'],
['forest', 'plain', 'plain', 'road', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'river', 'river', 'plain', 'plain', 'forest', 'plain', 'hill', 'plain', 'plain', 'plain', 'plain'],
['plain', 'plain', 'road', 'road', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'river', 'river', 'plain', 'plain', 'plain', 'hill', 'hill', 'plain', 'plain', 'plain'],
['plain', 'road', 'road', 'plain', 'plain', 'forest', 'plain', 'plain', 'village', 'plain', 'plain', 'plain', 'road', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'plain', 'hill', 'hill', 'plain', 'plain'],
['hill', 'road', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'village', 'plain', 'forest', 'plain', 'road', 'road', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'plain', 'plain', 'plain', 'plain'],
['hill', 'road', 'plain', 'forest', 'forest', 'plain', 'plain', 'hill', 'plain', 'plain', 'forest', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'forest', 'plain', 'plain'],
['plain', 'road', 'plain', 'plain', 'plain', 'plain', 'hill', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'forest', 'plain'],
['camp', 'road', 'road', 'plain', 'plain', 'hill', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'hill'],
['camp', 'camp', 'road', 'plain', 'forest', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'hill', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'river', 'river', 'plain', 'hill'],
['plain', 'camp', 'road', 'road', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'hill', 'plain', 'hill', 'plain', 'forest', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'river', 'river', 'plain'],
['plain', 'plain', 'camp', 'road', 'plain', 'forest', 'forest', 'plain', 'plain', 'hill', 'plain', 'plain', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'river', 'plain'],
['plain', 'plain', 'plain', 'road', 'road', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'hill', 'plain', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain']
]
};
export const fourthBattleMap: BattleMap = {
width: 24,
height: 20,
terrain: [
['forest', 'forest', 'hill', 'hill', 'plain', 'plain', 'road', 'road', 'plain', 'forest', 'forest', 'hill', 'plain', 'plain', 'fort', 'fort', 'fort', 'plain', 'hill', 'hill', 'forest', 'forest', 'plain', 'plain'],
['forest', 'hill', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'forest', 'hill', 'plain', 'plain', 'fort', 'fort', 'fort', 'plain', 'plain', 'hill', 'forest', 'forest', 'plain', 'plain', 'hill'],
['hill', 'plain', 'plain', 'forest', 'plain', 'road', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'road', 'road', 'fort', 'plain', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain', 'hill', 'hill'],
['plain', 'plain', 'forest', 'forest', 'plain', 'road', 'plain', 'forest', 'plain', 'plain', 'hill', 'plain', 'road', 'road', 'plain', 'plain', 'hill', 'hill', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain'],
['plain', 'forest', 'forest', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'hill', 'hill', 'plain', 'river', 'river', 'road', 'road', 'plain', 'hill', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain'],
['plain', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'hill', 'plain', 'plain', 'plain', 'river', 'river', 'plain', 'road', 'road', 'plain', 'village', 'plain', 'plain', 'forest', 'forest', 'plain'],
['plain', 'forest', 'plain', 'plain', 'road', 'plain', 'plain', 'hill', 'plain', 'plain', 'forest', 'plain', 'river', 'river', 'plain', 'plain', 'road', 'plain', 'village', 'plain', 'forest', 'forest', 'plain', 'plain'],
['plain', 'forest', 'plain', 'road', 'road', 'plain', 'hill', 'hill', 'plain', 'plain', 'forest', 'plain', 'plain', 'river', 'river', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'forest', 'hill', 'plain'],
['plain', 'plain', 'road', 'road', 'plain', 'plain', 'hill', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'road', 'plain', 'plain', 'hill', 'hill', 'plain', 'plain'],
['plain', 'road', 'road', 'plain', 'plain', 'forest', 'plain', 'plain', 'village', 'plain', 'plain', 'road', 'plain', 'plain', 'river', 'river', 'plain', 'road', 'plain', 'forest', 'plain', 'plain', 'plain', 'plain'],
['road', 'road', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain', 'village', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'river', 'river', 'road', 'road', 'plain', 'plain', 'plain', 'plain', 'plain'],
['plain', 'road', 'plain', 'forest', 'forest', 'plain', 'plain', 'hill', 'plain', 'plain', 'forest', 'plain', 'road', 'road', 'plain', 'plain', 'river', 'river', 'road', 'road', 'plain', 'forest', 'plain', 'plain'],
['plain', 'road', 'plain', 'plain', 'plain', 'plain', 'hill', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'forest', 'plain', 'hill'],
['hill', 'road', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'hill', 'plain', 'plain', 'forest', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'hill', 'hill'],
['hill', 'road', 'road', 'plain', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'hill'],
['plain', 'camp', 'road', 'road', 'plain', 'hill', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'hill', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'river', 'river', 'plain', 'plain'],
['camp', 'camp', 'road', 'plain', 'plain', 'hill', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'hill', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'river', 'river', 'plain'],
['plain', 'camp', 'road', 'plain', 'forest', 'plain', 'plain', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'hill', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'river', 'plain'],
['plain', 'plain', 'road', 'road', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'hill', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain'],
['plain', 'plain', 'plain', 'road', 'road', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'plain', 'hill', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain']
]
};
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 sixthBattleMap: BattleMap = {
width: 24,
height: 20,
terrain: [
['forest', 'hill', 'hill', 'plain', 'plain', 'road', 'road', 'plain', 'hill', 'hill', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'fort', 'fort', 'plain', 'hill', 'hill', 'forest', 'forest', 'plain'],
['hill', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'hill', 'plain', 'plain', 'road', 'river', 'river', 'road', 'plain', 'fort', 'plain', 'plain', 'plain', 'hill', 'forest', 'plain', 'plain'],
['plain', 'plain', 'forest', 'plain', 'road', 'plain', 'plain', 'forest', 'plain', 'plain', 'road', 'road', 'road', 'road', 'road', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain', 'hill', 'plain', 'plain'],
['plain', 'forest', 'forest', 'plain', 'road', 'plain', 'hill', 'forest', 'plain', 'road', 'road', 'plain', 'plain', 'river', 'river', 'road', 'plain', 'hill', 'plain', 'forest', 'plain', 'plain', 'plain', 'plain'],
['plain', 'plain', 'forest', 'road', 'road', 'plain', 'hill', 'plain', 'plain', 'road', 'plain', 'plain', 'river', 'river', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain', 'hill'],
['plain', 'plain', 'plain', 'road', 'plain', 'plain', 'plain', 'plain', 'forest', 'road', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'road', 'plain', 'village', 'plain', 'forest', 'forest', 'plain', 'hill'],
['forest', 'plain', 'plain', 'road', 'plain', 'hill', 'hill', 'plain', 'forest', 'road', 'plain', 'plain', 'plain', 'river', 'river', 'plain', 'road', 'plain', 'village', 'plain', 'plain', 'forest', 'plain', 'plain'],
['forest', 'plain', 'road', 'road', 'plain', 'plain', 'hill', 'plain', 'plain', 'road', 'forest', 'plain', 'plain', 'river', 'river', 'plain', 'road', 'road', 'plain', 'plain', 'hill', 'plain', 'plain', 'plain'],
['plain', 'plain', 'road', 'plain', 'plain', 'forest', 'plain', 'plain', 'hill', 'road', 'forest', 'plain', 'plain', 'plain', 'river', 'river', 'plain', 'road', 'plain', 'plain', 'hill', 'plain', 'forest', 'plain'],
['plain', 'road', 'road', 'plain', 'forest', 'forest', 'plain', 'plain', 'hill', 'road', 'road', 'road', 'road', 'road', 'road', '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 seventhBattleMap: BattleMap = {
width: 24,
height: 20,
terrain: [
['forest', 'forest', 'plain', 'plain', 'road', 'road', 'plain', 'hill', 'hill', 'plain', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'fort', 'fort', 'plain', 'hill', 'forest', 'forest', 'plain', 'plain'],
['forest', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'hill', 'plain', 'plain', 'road', 'road', 'river', 'river', 'road', 'plain', 'fort', 'plain', 'plain', 'plain', 'hill', 'forest', 'plain', 'plain'],
['plain', 'plain', 'forest', 'road', 'plain', 'plain', 'forest', 'plain', 'plain', 'road', 'road', 'plain', 'road', 'road', 'road', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain', 'hill', 'plain', 'plain'],
['plain', 'forest', 'plain', 'road', 'plain', 'hill', 'forest', 'plain', 'road', 'road', 'plain', 'plain', 'river', 'river', 'road', 'road', 'plain', 'hill', 'plain', 'forest', 'plain', 'plain', 'plain', 'plain'],
['plain', 'plain', 'road', 'road', 'plain', 'hill', 'plain', 'plain', 'road', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'road', 'road', 'plain', 'village', 'plain', 'forest', 'plain', 'plain', 'hill'],
['plain', 'plain', 'road', 'plain', 'plain', 'plain', 'plain', 'forest', 'road', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'plain', 'road', 'village', 'village', 'plain', 'forest', 'forest', 'plain', 'hill'],
['forest', 'plain', 'road', 'plain', 'hill', 'hill', 'plain', 'forest', 'road', 'plain', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'road', 'plain', 'village', 'plain', 'plain', 'forest', 'plain', 'plain'],
['forest', 'road', 'road', 'plain', 'plain', 'hill', 'plain', 'plain', 'road', 'forest', 'plain', 'plain', 'river', 'river', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'hill', 'plain', 'plain', 'plain'],
['plain', 'road', 'plain', 'plain', 'forest', 'plain', 'plain', 'hill', 'road', 'forest', 'plain', 'plain', 'plain', 'river', 'river', 'plain', 'road', 'plain', 'plain', 'hill', 'plain', 'plain', 'forest', 'plain'],
['road', 'road', 'plain', 'forest', 'forest', 'plain', 'plain', 'hill', 'road', 'road', 'road', 'road', 'road', 'road', 'river', 'river', 'road', 'road', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain'],
['road', 'plain', 'plain', 'forest', 'plain', 'plain', 'hill', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'river', 'road', 'road', 'plain', 'plain', 'hill', 'plain', 'plain', 'plain'],
['plain', 'road', 'forest', 'plain', 'plain', 'hill', 'plain', 'plain', 'forest', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'hill', 'plain', 'plain', 'plain'],
['plain', 'road', 'forest', 'forest', 'plain', 'plain', 'plain', 'hill', 'plain', 'forest', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'plain', 'plain', 'plain'],
['plain', 'road', 'plain', 'plain', 'hill', 'plain', 'forest', 'plain', 'plain', 'plain', 'forest', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'river', 'river', 'plain', 'hill', 'plain', 'plain'],
['camp', 'road', 'road', 'plain', 'hill', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'hill', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'river', 'river', 'plain', 'plain', 'plain'],
['camp', 'camp', 'road', 'plain', 'forest', 'plain', 'plain', 'forest', 'plain', 'plain', 'hill', 'plain', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'river', 'river', 'plain', 'plain'],
['plain', 'camp', 'road', 'road', 'plain', 'plain', 'forest', 'plain', 'plain', 'hill', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'river', 'plain', 'plain'],
['plain', 'plain', 'camp', 'road', 'plain', 'forest', 'plain', 'plain', 'hill', 'plain', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'plain', 'plain'],
['plain', 'plain', 'plain', 'road', 'road', 'plain', 'forest', 'forest', 'plain', 'plain', 'hill', 'plain', 'forest', 'forest', 'plain', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'plain'],
['plain', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'forest', 'forest', 'plain', 'plain', 'hill', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain']
]
};
export const eighthBattleMap: BattleMap = {
width: 26,
height: 22,
terrain: createEighthBattleTerrain()
};
export const ninthBattleMap: BattleMap = {
width: 26,
height: 22,
terrain: createNinthBattleTerrain()
};
export const tenthBattleMap: BattleMap = {
width: 28,
height: 22,
terrain: createTenthBattleTerrain()
};
export const eleventhBattleMap: BattleMap = {
width: 28,
height: 22,
terrain: createEleventhBattleTerrain()
};
export const twelfthBattleMap: BattleMap = {
width: 30,
height: 24,
terrain: createTwelfthBattleTerrain()
};
export const thirteenthBattleMap: BattleMap = {
width: 32,
height: 24,
terrain: createThirteenthBattleTerrain()
};
export const fourteenthBattleMap: BattleMap = {
width: 32,
height: 24,
terrain: createFourteenthBattleTerrain()
};
export const fifteenthBattleMap: BattleMap = {
width: 34,
height: 24,
terrain: createFifteenthBattleTerrain()
};
export const sixteenthBattleMap: BattleMap = {
width: 34,
height: 26,
terrain: createSixteenthBattleTerrain()
};
export const seventeenthBattleMap: BattleMap = {
width: 34,
height: 26,
terrain: createSeventeenthBattleTerrain()
};
export const eighteenthBattleMap: BattleMap = {
width: 36,
height: 26,
terrain: createEighteenthBattleTerrain()
};
export const nineteenthBattleMap: BattleMap = {
width: 38,
height: 28,
terrain: createNineteenthBattleTerrain()
};
export const twentiethBattleMap: BattleMap = {
width: 40,
height: 28,
terrain: createTwentiethBattleTerrain()
};
export const twentyFirstBattleMap: BattleMap = {
width: 42,
height: 30,
terrain: createTwentyFirstBattleTerrain()
};
export const twentySecondBattleMap: BattleMap = {
width: 44,
height: 30,
terrain: createTwentySecondBattleTerrain()
};
export const twentyThirdBattleMap: BattleMap = {
width: 46,
height: 32,
terrain: createTwentyThirdBattleTerrain()
};
export const twentyFourthBattleMap: BattleMap = {
width: 48,
height: 32,
terrain: createTwentyFourthBattleTerrain()
};
export const twentyFifthBattleMap: BattleMap = {
width: 50,
height: 34,
terrain: createTwentyFifthBattleTerrain()
};
export const twentySixthBattleMap: BattleMap = {
width: 52,
height: 34,
terrain: createTwentySixthBattleTerrain()
};
export const twentySeventhBattleMap: BattleMap = {
width: 54,
height: 36,
terrain: createTwentySeventhBattleTerrain()
};
export const twentyEighthBattleMap: BattleMap = {
width: 56,
height: 38,
terrain: createTwentyEighthBattleTerrain()
};
export const twentyNinthBattleMap: BattleMap = {
width: 58,
height: 40,
terrain: createTwentyNinthBattleTerrain()
};
export const thirtiethBattleMap: BattleMap = {
width: 60,
height: 42,
terrain: createThirtiethBattleTerrain()
};
export const thirtyFirstBattleMap: BattleMap = {
width: 62,
height: 44,
terrain: createThirtyFirstBattleTerrain()
};
export const thirtySecondBattleMap: BattleMap = {
width: 64,
height: 46,
terrain: createThirtySecondBattleTerrain()
};
export const thirtyThirdBattleMap: BattleMap = {
width: 66,
height: 48,
terrain: createThirtyThirdBattleTerrain()
};
export const thirtyFourthBattleMap: BattleMap = {
width: 68,
height: 50,
terrain: createThirtyFourthBattleTerrain()
};
export const thirtyFifthBattleMap: BattleMap = {
width: 70,
height: 52,
terrain: createThirtyFifthBattleTerrain()
};
export const thirtySixthBattleMap: BattleMap = {
width: 72,
height: 54,
terrain: createThirtySixthBattleTerrain()
};
export const thirtySeventhBattleMap: BattleMap = {
width: 74,
height: 56,
terrain: createThirtySeventhBattleTerrain()
};
export const thirtyEighthBattleMap: BattleMap = {
width: 76,
height: 58,
terrain: createThirtyEighthBattleTerrain()
};
export const thirtyNinthBattleMap: BattleMap = {
width: 78,
height: 60,
terrain: createThirtyNinthBattleTerrain()
};
export const fortiethBattleMap: BattleMap = {
width: 80,
height: 62,
terrain: createFortiethBattleTerrain()
};
export const fortyFirstBattleMap: BattleMap = {
width: 82,
height: 64,
terrain: createFortyFirstBattleTerrain()
};
export const fortySecondBattleMap: BattleMap = {
width: 84,
height: 66,
terrain: createFortySecondBattleTerrain()
};
export const fortyThirdBattleMap: BattleMap = {
width: 86,
height: 68,
terrain: createFortyThirdBattleTerrain()
};
export const fortyFourthBattleMap: BattleMap = {
width: 88,
height: 70,
terrain: createFortyFourthBattleTerrain()
};
export const fortyFifthBattleMap: BattleMap = {
width: 90,
height: 72,
terrain: createFortyFifthBattleTerrain()
};
export const fortySixthBattleMap: BattleMap = {
width: 92,
height: 74,
terrain: createFortySixthBattleTerrain()
};
export const fortySeventhBattleMap: BattleMap = {
width: 94,
height: 76,
terrain: createFortySeventhBattleTerrain()
};
export const fortyEighthBattleMap: BattleMap = {
width: 96,
height: 78,
terrain: createFortyEighthBattleTerrain()
};
export const fortyNinthBattleMap: BattleMap = {
width: 98,
height: 80,
terrain: createFortyNinthBattleTerrain()
};
export const fiftiethBattleMap: BattleMap = {
width: 100,
height: 82,
terrain: createFiftiethBattleTerrain()
};
export const fiftyFirstBattleMap: BattleMap = {
width: 102,
height: 84,
terrain: createFiftyFirstBattleTerrain()
};
export const fiftySecondBattleMap: BattleMap = {
width: 104,
height: 86,
terrain: createFiftySecondBattleTerrain()
};
export const fiftyThirdBattleMap: BattleMap = {
width: 106,
height: 88,
terrain: createFiftyThirdBattleTerrain()
};
export const fiftyFourthBattleMap: BattleMap = {
width: 108,
height: 90,
terrain: createFiftyFourthBattleTerrain()
};
export const fiftyFifthBattleMap: BattleMap = {
width: 110,
height: 92,
terrain: createFiftyFifthBattleTerrain()
};
export const fiftySixthBattleMap: BattleMap = {
width: 112,
height: 94,
terrain: createFiftySixthBattleTerrain()
};
export const fiftySeventhBattleMap: BattleMap = {
width: 114,
height: 96,
terrain: createFiftySeventhBattleTerrain()
};
export const fiftyEighthBattleMap: BattleMap = {
width: 116,
height: 98,
terrain: createFiftyEighthBattleTerrain()
};
export const fiftyNinthBattleMap: BattleMap = {
width: 118,
height: 100,
terrain: createFiftyNinthBattleTerrain()
};
export const sixtiethBattleMap: BattleMap = {
width: 120,
height: 102,
terrain: createSixtiethBattleTerrain()
};
export const sixtyFirstBattleMap: BattleMap = {
width: 122,
height: 104,
terrain: createSixtyFirstBattleTerrain()
};
export const sixtySecondBattleMap: BattleMap = {
width: 124,
height: 106,
terrain: createSixtySecondBattleTerrain()
};
export const sixtyThirdBattleMap: BattleMap = {
width: 126,
height: 108,
terrain: createSixtyThirdBattleTerrain()
};
export const sixtyFourthBattleMap: BattleMap = {
width: 128,
height: 110,
terrain: createSixtyFourthBattleTerrain()
};
export const sixtyFifthBattleMap: BattleMap = {
width: 130,
height: 112,
terrain: createSixtyFifthBattleTerrain()
};
export const sixtySixthBattleMap: BattleMap = {
width: 132,
height: 114,
terrain: createSixtySixthBattleTerrain()
};
export const firstBattleUnits: UnitData[] = [
{
id: 'liu-bei',
name: '유비',
faction: 'ally',
className: '군웅',
classKey: 'lord',
level: 3,
exp: 18,
hp: 32,
maxHp: 32,
attack: 9,
move: 4,
stats: { might: 76, intelligence: 78, leadership: 84, agility: 70, luck: 88 },
equipment: {
weapon: { itemId: 'twin-oath-blades', level: 1, exp: 18 },
armor: { itemId: 'oath-robe', level: 1, exp: 12 },
accessory: { itemId: 'peach-charm', level: 1, exp: 0 }
},
x: 1,
y: 15
},
{
id: 'guan-yu',
name: '관우',
faction: 'ally',
className: '의용 보병',
classKey: 'infantry',
level: 3,
exp: 26,
hp: 30,
maxHp: 30,
attack: 10,
move: 3,
stats: { might: 96, intelligence: 74, leadership: 91, agility: 72, luck: 68 },
equipment: {
weapon: { itemId: 'green-dragon-glaive', level: 1, exp: 26 },
armor: { itemId: 'reinforced-lamellar', level: 1, exp: 10 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 2,
y: 15
},
{
id: 'zhang-fei',
name: '장비',
faction: 'ally',
className: '창병',
classKey: 'spearman',
level: 3,
exp: 20,
hp: 30,
maxHp: 30,
attack: 10,
move: 3,
stats: { might: 95, intelligence: 42, leadership: 83, agility: 67, luck: 61 },
equipment: {
weapon: { itemId: 'serpent-spear', level: 1, exp: 20 },
armor: { itemId: 'lamellar-armor', level: 1, exp: 8 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 1,
y: 16
},
{
id: 'rebel-a',
name: '황건병',
faction: 'enemy',
className: '황건병',
classKey: 'yellowTurban',
level: 1,
exp: 6,
hp: 18,
maxHp: 18,
attack: 6,
move: 3,
stats: { might: 49, intelligence: 34, leadership: 38, agility: 45, luck: 40 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 6 },
armor: { itemId: 'rebel-vest', level: 1, exp: 4 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 5,
y: 13
},
{
id: 'rebel-b',
name: '황건병',
faction: 'enemy',
className: '황건병',
classKey: 'yellowTurban',
level: 1,
exp: 4,
hp: 19,
maxHp: 19,
attack: 6,
move: 3,
stats: { might: 47, intelligence: 32, leadership: 36, agility: 48, luck: 38 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 4 },
armor: { itemId: 'rebel-vest', level: 1, exp: 5 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 7,
y: 12
},
{
id: 'rebel-c',
name: '황건궁병',
faction: 'enemy',
className: '궁병',
classKey: 'archer',
level: 1,
exp: 10,
hp: 17,
maxHp: 17,
attack: 6,
move: 3,
stats: { might: 52, intelligence: 40, leadership: 43, agility: 56, luck: 42 },
equipment: {
weapon: { itemId: 'short-bow', level: 1, exp: 10 },
armor: { itemId: 'cloth-armor', level: 1, exp: 6 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 9,
y: 11
},
{
id: 'rebel-d',
name: '황건병',
faction: 'enemy',
className: '황건병',
classKey: 'yellowTurban',
level: 1,
exp: 8,
hp: 19,
maxHp: 19,
attack: 6,
move: 3,
stats: { might: 51, intelligence: 31, leadership: 39, agility: 44, luck: 39 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 8 },
armor: { itemId: 'rebel-vest', level: 1, exp: 5 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 6,
y: 9
},
{
id: 'rebel-e',
name: '황건병',
faction: 'enemy',
className: '황건병',
classKey: 'yellowTurban',
level: 1,
exp: 8,
hp: 20,
maxHp: 20,
attack: 6,
move: 3,
stats: { might: 50, intelligence: 33, leadership: 37, agility: 46, luck: 41 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 8 },
armor: { itemId: 'rebel-vest', level: 1, exp: 5 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 10,
y: 9
},
{
id: 'rebel-cavalry-a',
name: '황건기병',
faction: 'enemy',
className: '경기병',
classKey: 'cavalry',
level: 2,
exp: 14,
hp: 23,
maxHp: 23,
attack: 8,
move: 5,
stats: { might: 58, intelligence: 34, leadership: 45, agility: 62, luck: 42 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 12 },
armor: { itemId: 'rebel-vest', level: 1, exp: 6 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 12,
y: 10
},
{
id: 'rebel-archer-b',
name: '황건궁병',
faction: 'enemy',
className: '궁병',
classKey: 'archer',
level: 2,
exp: 12,
hp: 18,
maxHp: 18,
attack: 7,
move: 3,
stats: { might: 53, intelligence: 42, leadership: 44, agility: 57, luck: 44 },
equipment: {
weapon: { itemId: 'short-bow', level: 1, exp: 12 },
armor: { itemId: 'cloth-armor', level: 1, exp: 6 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 15,
y: 5
},
{
id: 'rebel-cavalry-b',
name: '황건기병',
faction: 'enemy',
className: '경기병',
classKey: 'cavalry',
level: 2,
exp: 16,
hp: 23,
maxHp: 23,
attack: 7,
move: 5,
stats: { might: 60, intelligence: 35, leadership: 48, agility: 63, luck: 45 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 14 },
armor: { itemId: 'rebel-vest', level: 1, exp: 7 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 13,
y: 7
},
{
id: 'rebel-f',
name: '황건병',
faction: 'enemy',
className: '황건병',
classKey: 'yellowTurban',
level: 2,
exp: 10,
hp: 21,
maxHp: 21,
attack: 7,
move: 3,
stats: { might: 54, intelligence: 35, leadership: 43, agility: 47, luck: 42 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 10 },
armor: { itemId: 'rebel-vest', level: 1, exp: 6 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 15,
y: 3
},
{
id: 'rebel-g',
name: '황건병',
faction: 'enemy',
className: '황건병',
classKey: 'yellowTurban',
level: 2,
exp: 11,
hp: 22,
maxHp: 22,
attack: 7,
move: 3,
stats: { might: 55, intelligence: 36, leadership: 44, agility: 48, luck: 43 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 10 },
armor: { itemId: 'rebel-vest', level: 1, exp: 6 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 17,
y: 3
},
{
id: 'rebel-leader',
name: '두령 한석',
faction: 'enemy',
className: '두령',
classKey: 'rebelLeader',
level: 2,
exp: 18,
hp: 31,
maxHp: 31,
attack: 9,
move: 3,
stats: { might: 64, intelligence: 46, leadership: 61, agility: 52, luck: 50 },
equipment: {
weapon: { itemId: 'leader-axe', level: 1, exp: 18 },
armor: { itemId: 'lamellar-armor', level: 1, exp: 12 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 16,
y: 2
}
];
const secondBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 2, y: 15 },
'guan-yu': { x: 3, y: 15 },
'zhang-fei': { x: 2, y: 16 }
};
export const secondBattleUnits: UnitData[] = [
...firstBattleUnits
.filter((unit) => unit.faction === 'ally')
.map((unit) => placeScenarioUnit(unit, secondBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
{
id: 'pursuit-raider-a',
name: '황건 추격병',
faction: 'enemy',
className: '황건병',
classKey: 'yellowTurban',
level: 2,
exp: 12,
hp: 22,
maxHp: 22,
attack: 7,
move: 3,
stats: { might: 55, intelligence: 34, leadership: 43, agility: 48, luck: 42 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 12 },
armor: { itemId: 'rebel-vest', level: 1, exp: 6 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 7,
y: 13
},
{
id: 'pursuit-raider-b',
name: '황건 습격병',
faction: 'enemy',
className: '황건병',
classKey: 'yellowTurban',
level: 2,
exp: 12,
hp: 22,
maxHp: 22,
attack: 7,
move: 3,
stats: { might: 54, intelligence: 35, leadership: 42, agility: 47, luck: 41 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 12 },
armor: { itemId: 'rebel-vest', level: 1, exp: 6 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 10,
y: 11
},
{
id: 'pursuit-bandit-a',
name: '산길 복병',
faction: 'enemy',
className: '산적',
classKey: 'bandit',
level: 2,
exp: 14,
hp: 23,
maxHp: 23,
attack: 8,
move: 3,
stats: { might: 58, intelligence: 32, leadership: 40, agility: 53, luck: 44 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 13 },
armor: { itemId: 'rebel-vest', level: 1, exp: 7 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 8,
y: 10
},
{
id: 'pursuit-archer-a',
name: '황건 궁병',
faction: 'enemy',
className: '궁병',
classKey: 'archer',
level: 2,
exp: 16,
hp: 19,
maxHp: 19,
attack: 7,
move: 3,
stats: { might: 54, intelligence: 43, leadership: 45, agility: 58, luck: 45 },
equipment: {
weapon: { itemId: 'short-bow', level: 1, exp: 16 },
armor: { itemId: 'cloth-armor', level: 1, exp: 7 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 12,
y: 9
},
{
id: 'pursuit-cavalry-a',
name: '황건 기병',
faction: 'enemy',
className: '경기병',
classKey: 'cavalry',
level: 3,
exp: 18,
hp: 26,
maxHp: 26,
attack: 9,
move: 5,
stats: { might: 62, intelligence: 35, leadership: 48, agility: 65, luck: 46 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 18 },
armor: { itemId: 'rebel-vest', level: 1, exp: 8 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 14,
y: 8
},
{
id: 'pursuit-raider-c',
name: '마을 습격병',
faction: 'enemy',
className: '황건병',
classKey: 'yellowTurban',
level: 2,
exp: 13,
hp: 23,
maxHp: 23,
attack: 7,
move: 3,
stats: { might: 56, intelligence: 34, leadership: 43, agility: 49, luck: 42 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 13 },
armor: { itemId: 'rebel-vest', level: 1, exp: 7 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 16,
y: 6
},
{
id: 'pursuit-archer-b',
name: '황건 궁병',
faction: 'enemy',
className: '궁병',
classKey: 'archer',
level: 3,
exp: 18,
hp: 20,
maxHp: 20,
attack: 7,
move: 3,
stats: { might: 55, intelligence: 45, leadership: 46, agility: 59, luck: 47 },
equipment: {
weapon: { itemId: 'short-bow', level: 1, exp: 18 },
armor: { itemId: 'cloth-armor', level: 1, exp: 8 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 20,
y: 5
},
{
id: 'pursuit-cavalry-b',
name: '황건 기병',
faction: 'enemy',
className: '경기병',
classKey: 'cavalry',
level: 3,
exp: 19,
hp: 27,
maxHp: 27,
attack: 9,
move: 5,
stats: { might: 63, intelligence: 35, leadership: 49, agility: 66, luck: 47 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 19 },
armor: { itemId: 'rebel-vest', level: 1, exp: 8 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 17,
y: 5
},
{
id: 'pursuit-guard-a',
name: '한석 친위병',
faction: 'enemy',
className: '황건병',
classKey: 'yellowTurban',
level: 3,
exp: 16,
hp: 25,
maxHp: 25,
attack: 8,
move: 3,
stats: { might: 58, intelligence: 36, leadership: 48, agility: 50, luck: 44 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 16 },
armor: { itemId: 'rebel-vest', level: 1, exp: 8 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 18,
y: 3
},
{
id: 'pursuit-guard-b',
name: '한석 친위병',
faction: 'enemy',
className: '황건병',
classKey: 'yellowTurban',
level: 3,
exp: 16,
hp: 24,
maxHp: 24,
attack: 8,
move: 3,
stats: { might: 58, intelligence: 36, leadership: 48, agility: 50, luck: 44 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 16 },
armor: { itemId: 'rebel-vest', level: 1, exp: 8 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 20,
y: 3
},
{
id: 'pursuit-leader-han-seok',
name: '두령 한석',
faction: 'enemy',
className: '두령',
classKey: 'rebelLeader',
level: 4,
exp: 24,
hp: 36,
maxHp: 36,
attack: 10,
move: 3,
stats: { might: 68, intelligence: 48, leadership: 64, agility: 54, luck: 52 },
equipment: {
weapon: { itemId: 'leader-axe', level: 1, exp: 24 },
armor: { itemId: 'lamellar-armor', level: 1, exp: 14 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 19,
y: 2
}
];
const thirdBattleAllyPositions: 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 thirdBattleUnits: UnitData[] = [
...firstBattleUnits
.filter((unit) => unit.faction === 'ally')
.map((unit) => placeScenarioUnit(unit, thirdBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
{
id: 'guangzong-scout-a',
name: '황건 척후병',
faction: 'enemy',
className: '황건병',
classKey: 'yellowTurban',
level: 3,
exp: 18,
hp: 24,
maxHp: 24,
attack: 8,
move: 3,
stats: { might: 58, intelligence: 36, leadership: 45, agility: 52, luck: 43 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 18 },
armor: { itemId: 'rebel-vest', level: 1, exp: 8 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 6,
y: 15
},
{
id: 'guangzong-bandit-a',
name: '숲길 복병',
faction: 'enemy',
className: '도적',
classKey: 'bandit',
level: 3,
exp: 20,
hp: 25,
maxHp: 25,
attack: 8,
move: 3,
stats: { might: 62, intelligence: 34, leadership: 42, agility: 58, luck: 46 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 18 },
armor: { itemId: 'rebel-vest', level: 1, exp: 8 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 8,
y: 13
},
{
id: 'guangzong-archer-a',
name: '강가 궁병',
faction: 'enemy',
className: '궁병',
classKey: 'archer',
level: 3,
exp: 20,
hp: 21,
maxHp: 21,
attack: 8,
move: 3,
stats: { might: 57, intelligence: 45, leadership: 47, agility: 60, luck: 48 },
equipment: {
weapon: { itemId: 'short-bow', level: 1, exp: 20 },
armor: { itemId: 'cloth-armor', level: 1, exp: 8 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 11,
y: 14
},
{
id: 'guangzong-cavalry-a',
name: '황건 기병',
faction: 'enemy',
className: '경기병',
classKey: 'cavalry',
level: 4,
exp: 22,
hp: 28,
maxHp: 28,
attack: 9,
move: 5,
stats: { might: 66, intelligence: 36, leadership: 50, agility: 68, luck: 48 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 22 },
armor: { itemId: 'rebel-vest', level: 1, exp: 9 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 12,
y: 11
},
{
id: 'guangzong-raider-a',
name: '황건 장정',
faction: 'enemy',
className: '황건병',
classKey: 'yellowTurban',
level: 3,
exp: 18,
hp: 26,
maxHp: 26,
attack: 8,
move: 3,
stats: { might: 59, intelligence: 35, leadership: 46, agility: 51, luck: 44 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 18 },
armor: { itemId: 'rebel-vest', level: 1, exp: 8 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 10,
y: 9
},
{
id: 'guangzong-raider-b',
name: '황건 장정',
faction: 'enemy',
className: '황건병',
classKey: 'yellowTurban',
level: 3,
exp: 18,
hp: 26,
maxHp: 26,
attack: 8,
move: 3,
stats: { might: 59, intelligence: 35, leadership: 46, agility: 51, luck: 44 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 18 },
armor: { itemId: 'rebel-vest', level: 1, exp: 8 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 14,
y: 10
},
{
id: 'guangzong-archer-b',
name: '요새 궁병',
faction: 'enemy',
className: '궁병',
classKey: 'archer',
level: 4,
exp: 24,
hp: 22,
maxHp: 22,
attack: 8,
move: 3,
stats: { might: 58, intelligence: 47, leadership: 48, agility: 61, luck: 49 },
equipment: {
weapon: { itemId: 'short-bow', level: 1, exp: 24 },
armor: { itemId: 'cloth-armor', level: 1, exp: 9 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 15,
y: 7
},
{
id: 'guangzong-cavalry-b',
name: '전령 기병',
faction: 'enemy',
className: '경기병',
classKey: 'cavalry',
level: 4,
exp: 25,
hp: 28,
maxHp: 28,
attack: 9,
move: 5,
stats: { might: 67, intelligence: 38, leadership: 51, agility: 70, luck: 50 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 25 },
armor: { itemId: 'rebel-vest', level: 1, exp: 10 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 16,
y: 6
},
{
id: 'guangzong-guard-a',
name: '요새 수비병',
faction: 'enemy',
className: '황건병',
classKey: 'yellowTurban',
level: 4,
exp: 22,
hp: 26,
maxHp: 26,
attack: 8,
move: 3,
stats: { might: 62, intelligence: 37, leadership: 50, agility: 52, luck: 46 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 22 },
armor: { itemId: 'rebel-vest', level: 1, exp: 10 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 17,
y: 4
},
{
id: 'guangzong-guard-b',
name: '요새 수비병',
faction: 'enemy',
className: '황건병',
classKey: 'yellowTurban',
level: 4,
exp: 22,
hp: 26,
maxHp: 26,
attack: 8,
move: 3,
stats: { might: 62, intelligence: 37, leadership: 50, agility: 52, luck: 46 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 22 },
armor: { itemId: 'rebel-vest', level: 1, exp: 10 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 19,
y: 4
},
{
id: 'guangzong-fort-archer',
name: '망루 궁병',
faction: 'enemy',
className: '궁병',
classKey: 'archer',
level: 4,
exp: 25,
hp: 22,
maxHp: 22,
attack: 9,
move: 3,
stats: { might: 60, intelligence: 49, leadership: 49, agility: 61, luck: 50 },
equipment: {
weapon: { itemId: 'short-bow', level: 1, exp: 25 },
armor: { itemId: 'cloth-armor', level: 1, exp: 10 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 18,
y: 2
},
{
id: 'guangzong-leader-ma-yuan',
name: '전령 마원',
faction: 'enemy',
className: '두령',
classKey: 'rebelLeader',
level: 5,
exp: 30,
hp: 40,
maxHp: 40,
attack: 11,
move: 3,
stats: { might: 72, intelligence: 50, leadership: 68, agility: 56, luck: 54 },
equipment: {
weapon: { itemId: 'leader-axe', level: 2, exp: 8 },
armor: { itemId: 'lamellar-armor', level: 1, exp: 18 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 19,
y: 2
}
];
const fourthBattleAllyPositions: 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 fourthBattleUnits: UnitData[] = [
...firstBattleUnits
.filter((unit) => unit.faction === 'ally')
.map((unit) => placeScenarioUnit(unit, fourthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
{
id: 'guangzong-main-vanguard-a',
name: '황건 선봉',
faction: 'enemy',
className: '황건병',
classKey: 'yellowTurban',
level: 4,
exp: 24,
hp: 28,
maxHp: 28,
attack: 9,
move: 3,
stats: { might: 63, intelligence: 36, leadership: 48, agility: 53, luck: 45 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 24 },
armor: { itemId: 'rebel-vest', level: 1, exp: 10 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 6,
y: 14
},
{
id: 'guangzong-main-vanguard-b',
name: '황건 선봉',
faction: 'enemy',
className: '황건병',
classKey: 'yellowTurban',
level: 4,
exp: 24,
hp: 28,
maxHp: 28,
attack: 9,
move: 3,
stats: { might: 63, intelligence: 36, leadership: 48, agility: 53, luck: 45 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 24 },
armor: { itemId: 'rebel-vest', level: 1, exp: 10 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 8,
y: 12
},
{
id: 'guangzong-main-bandit-a',
name: '숲길 돌격병',
faction: 'enemy',
className: '도적',
classKey: 'bandit',
level: 4,
exp: 26,
hp: 29,
maxHp: 29,
attack: 10,
move: 3,
stats: { might: 66, intelligence: 34, leadership: 44, agility: 61, luck: 48 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 24 },
armor: { itemId: 'rebel-vest', level: 1, exp: 10 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 5,
y: 10
},
{
id: 'guangzong-main-archer-a',
name: '황건 궁병',
faction: 'enemy',
className: '궁병',
classKey: 'archer',
level: 4,
exp: 26,
hp: 24,
maxHp: 24,
attack: 10,
move: 3,
stats: { might: 60, intelligence: 48, leadership: 50, agility: 62, luck: 50 },
equipment: {
weapon: { itemId: 'short-bow', level: 1, exp: 26 },
armor: { itemId: 'cloth-armor', level: 1, exp: 10 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 9,
y: 10
},
{
id: 'guangzong-main-cavalry-a',
name: '황건 기병',
faction: 'enemy',
className: '경기병',
classKey: 'cavalry',
level: 5,
exp: 28,
hp: 32,
maxHp: 32,
attack: 11,
move: 5,
stats: { might: 70, intelligence: 38, leadership: 52, agility: 72, luck: 51 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 28 },
armor: { itemId: 'rebel-vest', level: 1, exp: 12 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 12,
y: 9
},
{
id: 'guangzong-main-guard-a',
name: '본영 수비병',
faction: 'enemy',
className: '황건병',
classKey: 'yellowTurban',
level: 5,
exp: 28,
hp: 31,
maxHp: 31,
attack: 10,
move: 3,
stats: { might: 68, intelligence: 38, leadership: 54, agility: 55, luck: 49 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 28 },
armor: { itemId: 'rebel-vest', level: 1, exp: 12 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 14,
y: 7
},
{
id: 'guangzong-main-archer-b',
name: '본영 궁병',
faction: 'enemy',
className: '궁병',
classKey: 'archer',
level: 5,
exp: 30,
hp: 25,
maxHp: 25,
attack: 10,
move: 3,
stats: { might: 61, intelligence: 50, leadership: 51, agility: 63, luck: 51 },
equipment: {
weapon: { itemId: 'short-bow', level: 1, exp: 30 },
armor: { itemId: 'cloth-armor', level: 1, exp: 12 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 16,
y: 6
},
{
id: 'guangzong-main-cavalry-b',
name: '황건 기병',
faction: 'enemy',
className: '경기병',
classKey: 'cavalry',
level: 5,
exp: 30,
hp: 33,
maxHp: 33,
attack: 11,
move: 5,
stats: { might: 71, intelligence: 38, leadership: 53, agility: 73, luck: 51 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 30 },
armor: { itemId: 'rebel-vest', level: 1, exp: 12 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 18,
y: 10
},
{
id: 'guangzong-main-guard-b',
name: '본영 수비병',
faction: 'enemy',
className: '황건병',
classKey: 'yellowTurban',
level: 5,
exp: 30,
hp: 32,
maxHp: 32,
attack: 10,
move: 3,
stats: { might: 69, intelligence: 39, leadership: 55, agility: 55, luck: 50 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 30 },
armor: { itemId: 'rebel-vest', level: 1, exp: 12 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 18,
y: 4
},
{
id: 'guangzong-main-guard-c',
name: '본영 수비병',
faction: 'enemy',
className: '황건병',
classKey: 'yellowTurban',
level: 5,
exp: 30,
hp: 32,
maxHp: 32,
attack: 10,
move: 3,
stats: { might: 69, intelligence: 39, leadership: 55, agility: 55, luck: 50 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 30 },
armor: { itemId: 'rebel-vest', level: 1, exp: 12 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 14,
y: 3
},
{
id: 'guangzong-main-archer-c',
name: '망루 궁병',
faction: 'enemy',
className: '궁병',
classKey: 'archer',
level: 5,
exp: 32,
hp: 26,
maxHp: 26,
attack: 11,
move: 3,
stats: { might: 62, intelligence: 52, leadership: 52, agility: 64, luck: 52 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 6 },
armor: { itemId: 'cloth-armor', level: 1, exp: 12 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 16,
y: 1
},
{
id: 'guangzong-main-leader-zhang-jue',
name: '장각',
faction: 'enemy',
className: '황건 대현량사',
classKey: 'rebelLeader',
level: 6,
exp: 40,
hp: 48,
maxHp: 48,
attack: 13,
move: 3,
stats: { might: 74, intelligence: 78, leadership: 82, agility: 58, luck: 64 },
equipment: {
weapon: { itemId: 'leader-axe', level: 2, exp: 16 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 4 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 15,
y: 1
}
];
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
}
];
const sixthBattleAllyPositions: 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 sixthBattleUnits: UnitData[] = [
...firstBattleUnits
.filter((unit) => unit.faction === 'ally')
.map((unit) => placeScenarioUnit(unit, sixthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
{
id: 'jieqiao-skirmisher-a',
name: '원소군 척후',
faction: 'enemy',
className: '척후병',
classKey: 'bandit',
level: 6,
exp: 36,
hp: 32,
maxHp: 32,
attack: 11,
move: 4,
stats: { might: 72, intelligence: 43, leadership: 50, agility: 68, luck: 50 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 14 },
armor: { itemId: 'rebel-vest', level: 2, exp: 6 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 5,
y: 12
},
{
id: 'jieqiao-infantry-a',
name: '원소 보병',
faction: 'enemy',
className: '원소 보병',
classKey: 'yellowTurban',
level: 6,
exp: 36,
hp: 36,
maxHp: 36,
attack: 11,
move: 3,
stats: { might: 73, intelligence: 42, leadership: 58, agility: 56, luck: 49 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 14 },
armor: { itemId: 'rebel-vest', level: 2, exp: 6 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 7,
y: 11
},
{
id: 'jieqiao-archer-a',
name: '원소 궁병',
faction: 'enemy',
className: '원소 궁병',
classKey: 'archer',
level: 6,
exp: 38,
hp: 27,
maxHp: 27,
attack: 10,
move: 3,
stats: { might: 66, intelligence: 54, leadership: 54, agility: 66, luck: 50 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 16 },
armor: { itemId: 'cloth-armor', level: 2, exp: 4 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 9,
y: 10
},
{
id: 'jieqiao-cavalry-a',
name: '원소 기병',
faction: 'enemy',
className: '원소 경기병',
classKey: 'cavalry',
level: 7,
exp: 40,
hp: 37,
maxHp: 37,
attack: 12,
move: 5,
stats: { might: 78, intelligence: 42, leadership: 60, agility: 78, luck: 52 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 18 },
armor: { itemId: 'rebel-vest', level: 2, exp: 8 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 12,
y: 9
},
{
id: 'jieqiao-skirmisher-b',
name: '강가 척후',
faction: 'enemy',
className: '척후병',
classKey: 'bandit',
level: 6,
exp: 38,
hp: 33,
maxHp: 33,
attack: 10,
move: 4,
stats: { might: 74, intelligence: 44, leadership: 51, agility: 69, luck: 51 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 16 },
armor: { itemId: 'rebel-vest', level: 2, exp: 6 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 6,
y: 7
},
{
id: 'jieqiao-archer-b',
name: '강안 궁병',
faction: 'enemy',
className: '원소 궁병',
classKey: 'archer',
level: 7,
exp: 40,
hp: 27,
maxHp: 27,
attack: 9,
move: 3,
stats: { might: 68, intelligence: 56, leadership: 56, agility: 67, luck: 51 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 18 },
armor: { itemId: 'cloth-armor', level: 2, exp: 6 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 11,
y: 6
},
{
id: 'jieqiao-cavalry-b',
name: '원소 기병',
faction: 'enemy',
className: '원소 경기병',
classKey: 'cavalry',
level: 7,
exp: 42,
hp: 38,
maxHp: 38,
attack: 12,
move: 5,
stats: { might: 79, intelligence: 42, leadership: 61, agility: 79, luck: 52 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 20 },
armor: { itemId: 'rebel-vest', level: 2, exp: 8 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 15,
y: 8
},
{
id: 'jieqiao-guard-a',
name: '계교 수비병',
faction: 'enemy',
className: '원소 보병',
classKey: 'yellowTurban',
level: 7,
exp: 42,
hp: 26,
maxHp: 26,
attack: 8,
move: 3,
stats: { might: 76, intelligence: 45, leadership: 62, agility: 58, luck: 51 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 20 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 8 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 16,
y: 5
},
{
id: 'jieqiao-cavalry-c',
name: '측면 기병',
faction: 'enemy',
className: '원소 경기병',
classKey: 'cavalry',
level: 7,
exp: 44,
hp: 34,
maxHp: 34,
attack: 10,
move: 5,
stats: { might: 80, intelligence: 43, leadership: 62, agility: 80, luck: 53 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 22 },
armor: { itemId: 'rebel-vest', level: 2, exp: 10 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 20,
y: 5
},
{
id: 'jieqiao-guard-b',
name: '계교 수비병',
faction: 'enemy',
className: '원소 보병',
classKey: 'yellowTurban',
level: 7,
exp: 44,
hp: 26,
maxHp: 26,
attack: 8,
move: 3,
stats: { might: 77, intelligence: 45, leadership: 63, agility: 58, luck: 52 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 22 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 8 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 18,
y: 3
},
{
id: 'jieqiao-archer-c',
name: '계교 궁병',
faction: 'enemy',
className: '원소 궁병',
classKey: 'archer',
level: 7,
exp: 44,
hp: 20,
maxHp: 20,
attack: 7,
move: 3,
stats: { might: 69, intelligence: 57, leadership: 57, agility: 68, luck: 52 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 22 },
armor: { itemId: 'cloth-armor', level: 2, exp: 8 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 16,
y: 1
},
{
id: 'jieqiao-leader-qu-yi',
name: '곡의',
faction: 'enemy',
className: '원소군 교위',
classKey: 'rebelLeader',
level: 8,
exp: 48,
hp: 38,
maxHp: 38,
attack: 10,
move: 3,
stats: { might: 84, intelligence: 62, leadership: 78, agility: 62, luck: 56 },
equipment: {
weapon: { itemId: 'leader-axe', level: 2, exp: 26 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 14 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 17,
y: 1
}
];
const seventhBattleAllyPositions: 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 seventhBattleUnits: UnitData[] = [
...firstBattleUnits
.filter((unit) => unit.faction === 'ally')
.map((unit) => placeScenarioUnit(unit, seventhBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
{
id: 'xuzhou-raider-a',
name: '조조군 척후',
faction: 'enemy',
className: '조조 척후',
classKey: 'bandit',
level: 7,
exp: 42,
hp: 34,
maxHp: 34,
attack: 12,
move: 4,
stats: { might: 74, intelligence: 48, leadership: 54, agility: 70, luck: 52 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 18 },
armor: { itemId: 'rebel-vest', level: 2, exp: 8 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 5,
y: 13
},
{
id: 'xuzhou-infantry-a',
name: '조조 보병',
faction: 'enemy',
className: '조조 보병',
classKey: 'yellowTurban',
level: 7,
exp: 42,
hp: 39,
maxHp: 39,
attack: 12,
move: 3,
stats: { might: 77, intelligence: 48, leadership: 64, agility: 58, luck: 52 },
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: 7,
y: 12
},
{
id: 'xuzhou-archer-a',
name: '조조 궁병',
faction: 'enemy',
className: '조조 궁병',
classKey: 'archer',
level: 7,
exp: 44,
hp: 31,
maxHp: 31,
attack: 13,
move: 3,
stats: { might: 69, intelligence: 58, leadership: 58, agility: 68, luck: 52 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 20 },
armor: { itemId: 'cloth-armor', level: 2, exp: 8 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 9,
y: 11
},
{
id: 'xuzhou-cavalry-a',
name: '조조 기병',
faction: 'enemy',
className: '조조 경기병',
classKey: 'cavalry',
level: 8,
exp: 46,
hp: 42,
maxHp: 42,
attack: 14,
move: 5,
stats: { might: 82, intelligence: 46, leadership: 64, agility: 82, luck: 54 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 22 },
armor: { itemId: 'rebel-vest', level: 2, exp: 10 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 11,
y: 9
},
{
id: 'xuzhou-raider-b',
name: '피난로 척후',
faction: 'enemy',
className: '조조 척후',
classKey: 'bandit',
level: 7,
exp: 44,
hp: 35,
maxHp: 35,
attack: 13,
move: 4,
stats: { might: 76, intelligence: 49, leadership: 55, agility: 71, luck: 53 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 20 },
armor: { itemId: 'rebel-vest', level: 2, exp: 8 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 6,
y: 8
},
{
id: 'xuzhou-archer-b',
name: '마을 궁병',
faction: 'enemy',
className: '조조 궁병',
classKey: 'archer',
level: 8,
exp: 46,
hp: 32,
maxHp: 32,
attack: 14,
move: 3,
stats: { might: 70, intelligence: 60, leadership: 59, agility: 69, luck: 53 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 22 },
armor: { itemId: 'cloth-armor', level: 2, exp: 10 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 10,
y: 7
},
{
id: 'xuzhou-cavalry-b',
name: '조조 기병',
faction: 'enemy',
className: '조조 경기병',
classKey: 'cavalry',
level: 8,
exp: 48,
hp: 43,
maxHp: 43,
attack: 14,
move: 5,
stats: { might: 83, intelligence: 47, leadership: 65, agility: 83, luck: 54 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 24 },
armor: { itemId: 'rebel-vest', level: 2, exp: 10 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 14,
y: 8
},
{
id: 'xuzhou-guard-a',
name: '선봉 수비병',
faction: 'enemy',
className: '조조 보병',
classKey: 'yellowTurban',
level: 8,
exp: 48,
hp: 41,
maxHp: 41,
attack: 13,
move: 3,
stats: { might: 80, intelligence: 50, leadership: 67, agility: 60, luck: 53 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 24 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 10 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 15,
y: 5
},
{
id: 'xuzhou-cavalry-c',
name: '측면 기병',
faction: 'enemy',
className: '조조 경기병',
classKey: 'cavalry',
level: 8,
exp: 50,
hp: 44,
maxHp: 44,
attack: 14,
move: 5,
stats: { might: 84, intelligence: 47, leadership: 66, agility: 84, luck: 55 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 26 },
armor: { itemId: 'rebel-vest', level: 2, exp: 12 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 19,
y: 6
},
{
id: 'xuzhou-guard-b',
name: '선봉 수비병',
faction: 'enemy',
className: '조조 보병',
classKey: 'yellowTurban',
level: 8,
exp: 50,
hp: 42,
maxHp: 42,
attack: 13,
move: 3,
stats: { might: 81, intelligence: 50, leadership: 68, agility: 60, luck: 54 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 26 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 10 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 17,
y: 3
},
{
id: 'xuzhou-archer-c',
name: '서주 길목 궁병',
faction: 'enemy',
className: '조조 궁병',
classKey: 'archer',
level: 8,
exp: 50,
hp: 33,
maxHp: 33,
attack: 14,
move: 3,
stats: { might: 71, intelligence: 61, leadership: 60, agility: 70, luck: 54 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 26 },
armor: { itemId: 'cloth-armor', level: 2, exp: 10 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 15,
y: 1
},
{
id: 'xuzhou-leader-xiahou-dun',
name: '하후돈',
faction: 'enemy',
className: '조조군 장수',
classKey: 'rebelLeader',
level: 9,
exp: 54,
hp: 58,
maxHp: 58,
attack: 16,
move: 4,
stats: { might: 88, intelligence: 66, leadership: 82, agility: 66, luck: 58 },
equipment: {
weapon: { itemId: 'leader-axe', level: 2, exp: 30 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 16 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 16,
y: 1
}
];
export const xuzhouRecruitUnits: UnitData[] = [
{
id: 'jian-yong',
name: '간옹',
faction: 'ally',
className: '책사',
classKey: 'strategist',
level: 4,
exp: 12,
hp: 26,
maxHp: 26,
attack: 7,
move: 4,
stats: { might: 42, intelligence: 78, leadership: 66, agility: 64, luck: 72 },
equipment: {
weapon: { itemId: 'training-sword', level: 1, exp: 8 },
armor: { itemId: 'cloth-armor', level: 1, exp: 6 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 3,
y: 17
},
{
id: 'mi-zhu',
name: '미축',
faction: 'ally',
className: '군량관',
classKey: 'quartermaster',
level: 4,
exp: 8,
hp: 28,
maxHp: 28,
attack: 7,
move: 4,
stats: { might: 40, intelligence: 74, leadership: 70, agility: 58, luck: 82 },
equipment: {
weapon: { itemId: 'training-sword', level: 1, exp: 6 },
armor: { itemId: 'cloth-armor', level: 1, exp: 6 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 4,
y: 17
}
];
export const caoBreakRecruitUnits: UnitData[] = [
{
id: 'sun-qian',
name: '손건',
faction: 'ally',
className: '책사',
classKey: 'strategist',
level: 5,
exp: 10,
hp: 27,
maxHp: 27,
attack: 7,
move: 4,
stats: { might: 38, intelligence: 82, leadership: 68, agility: 62, luck: 78 },
equipment: {
weapon: { itemId: 'training-sword', level: 1, exp: 8 },
armor: { itemId: 'cloth-armor', level: 1, exp: 8 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 5,
y: 20
}
];
export const liuBiaoRecruitUnits: UnitData[] = [
{
id: 'zhao-yun',
name: '조운',
faction: 'ally',
className: '백마 기병',
classKey: 'cavalry',
level: 7,
exp: 18,
hp: 36,
maxHp: 36,
attack: 12,
move: 5,
stats: { might: 88, intelligence: 76, leadership: 82, agility: 92, luck: 80 },
equipment: {
weapon: { itemId: 'iron-spear', level: 1, exp: 18 },
armor: { itemId: 'lamellar-armor', level: 1, exp: 14 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 6,
y: 21
}
];
export const zhugeRecruitUnits: UnitData[] = [
{
id: 'zhuge-liang',
name: '제갈량',
faction: 'ally',
className: '군사',
classKey: 'strategist',
level: 8,
exp: 0,
hp: 28,
maxHp: 28,
attack: 8,
move: 4,
stats: { might: 34, intelligence: 100, leadership: 88, agility: 74, luck: 86 },
equipment: {
weapon: { itemId: 'white-feather-fan', level: 1, exp: 0 },
armor: { itemId: 'oath-robe', level: 1, exp: 0 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 7,
y: 20
}
];
export const jingzhouRecruitUnits: UnitData[] = [
{
id: 'ma-liang',
name: '마량',
faction: 'ally',
className: '백미 책사',
classKey: 'strategist',
level: 11,
exp: 0,
hp: 30,
maxHp: 30,
attack: 8,
move: 4,
stats: { might: 36, intelligence: 92, leadership: 80, agility: 70, luck: 88 },
equipment: {
weapon: { itemId: 'white-feather-fan', level: 1, exp: 10 },
armor: { itemId: 'cloth-armor', level: 2, exp: 8 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 7,
y: 22
}
];
export const guiyangRecruitUnits: UnitData[] = [
{
id: 'yi-ji',
name: '이적',
faction: 'ally',
className: '형주 문사',
classKey: 'quartermaster',
level: 12,
exp: 0,
hp: 32,
maxHp: 32,
attack: 8,
move: 4,
stats: { might: 38, intelligence: 88, leadership: 82, agility: 68, luck: 84 },
equipment: {
weapon: { itemId: 'white-feather-fan', level: 1, exp: 8 },
armor: { itemId: 'cloth-armor', level: 2, exp: 10 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 8,
y: 22
}
];
export const wulingRecruitUnits: UnitData[] = [
{
id: 'gong-zhi',
name: '공지',
faction: 'ally',
className: '무릉 의병장',
classKey: 'infantry',
level: 13,
exp: 0,
hp: 40,
maxHp: 40,
attack: 12,
move: 4,
stats: { might: 76, intelligence: 72, leadership: 82, agility: 74, luck: 78 },
equipment: {
weapon: { itemId: 'iron-spear', level: 2, exp: 6 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 8 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 8,
y: 23
}
];
export const changshaRecruitUnits: UnitData[] = [
{
id: 'huang-zhong',
name: '황충',
faction: 'ally',
className: '노장 궁기병',
classKey: 'archer',
level: 15,
exp: 0,
hp: 44,
maxHp: 44,
attack: 15,
move: 4,
stats: { might: 88, intelligence: 72, leadership: 86, agility: 78, luck: 76 },
equipment: {
weapon: { itemId: 'short-bow', level: 3, exp: 12 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 14 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 8,
y: 23
},
{
id: 'wei-yan',
name: '위연',
faction: 'ally',
className: '장사 돌격장',
classKey: 'infantry',
level: 15,
exp: 0,
hp: 48,
maxHp: 48,
attack: 16,
move: 4,
stats: { might: 90, intelligence: 64, leadership: 82, agility: 82, luck: 70 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 10 },
armor: { itemId: 'reinforced-lamellar', level: 2, exp: 10 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 9,
y: 24
}
];
export const yizhouRecruitUnits: UnitData[] = [
{
id: 'pang-tong',
name: '방통',
faction: 'ally',
className: '봉추 책사',
classKey: 'strategist',
level: 16,
exp: 0,
hp: 36,
maxHp: 36,
attack: 9,
move: 4,
stats: { might: 44, intelligence: 96, leadership: 88, agility: 72, luck: 82 },
equipment: {
weapon: { itemId: 'white-feather-fan', level: 2, exp: 16 },
armor: { itemId: 'cloth-armor', level: 2, exp: 12 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 8,
y: 24
}
];
export const fuPassRecruitUnits: UnitData[] = [
{
id: 'fa-zheng',
name: '법정',
faction: 'ally',
className: '익주 모사',
classKey: 'strategist',
level: 17,
exp: 0,
hp: 38,
maxHp: 38,
attack: 9,
move: 4,
stats: { might: 42, intelligence: 94, leadership: 84, agility: 70, luck: 80 },
equipment: {
weapon: { itemId: 'white-feather-fan', level: 2, exp: 18 },
armor: { itemId: 'cloth-armor', level: 2, exp: 16 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 8,
y: 25
}
];
export const luoCastleRecruitUnits: UnitData[] = [
{
id: 'wu-yi',
name: '오의',
faction: 'ally',
className: '익주 장군',
classKey: 'infantry',
level: 18,
exp: 0,
hp: 46,
maxHp: 46,
attack: 15,
move: 4,
stats: { might: 82, intelligence: 72, leadership: 86, agility: 74, luck: 78 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 16 },
armor: { itemId: 'reinforced-lamellar', level: 2, exp: 18 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 9,
y: 26
}
];
export const luoCastleProperRecruitUnits: UnitData[] = [
{
id: 'yan-yan',
name: '엄안',
faction: 'ally',
className: '익주 노장',
classKey: 'archer',
level: 19,
exp: 0,
hp: 42,
maxHp: 42,
attack: 14,
move: 4,
stats: { might: 78, intelligence: 70, leadership: 88, agility: 68, luck: 74 },
equipment: {
weapon: { itemId: 'short-bow', level: 3, exp: 18 },
armor: { itemId: 'reinforced-lamellar', level: 2, exp: 20 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 10,
y: 27
}
];
export const chengduPressureRecruitUnits: UnitData[] = [
{
id: 'li-yan',
name: '이엄',
faction: 'ally',
className: '익주 수비장',
classKey: 'infantry',
level: 20,
exp: 0,
hp: 46,
maxHp: 46,
attack: 15,
move: 4,
stats: { might: 80, intelligence: 78, leadership: 88, agility: 70, luck: 72 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 24 },
armor: { itemId: 'reinforced-lamellar', level: 3, exp: 12 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 11,
y: 28
}
];
export const chengduSurrenderRecruitUnits: UnitData[] = [
{
id: 'huang-quan',
name: '황권',
faction: 'ally',
className: '익주 참모',
classKey: 'strategist',
level: 21,
exp: 0,
hp: 38,
maxHp: 38,
attack: 13,
move: 4,
stats: { might: 67, intelligence: 86, leadership: 82, agility: 64, luck: 74 },
equipment: {
weapon: { itemId: 'white-feather-fan', level: 3, exp: 18 },
armor: { itemId: 'oath-robe', level: 3, exp: 8 },
accessory: { itemId: 'war-manual', level: 2, exp: 12 }
},
x: 12,
y: 30
}
];
export const hanzhongOpeningRecruitUnits: UnitData[] = [
{
id: 'ma-chao',
name: '마초',
faction: 'ally',
className: '서량 기병',
classKey: 'cavalry',
level: 23,
exp: 0,
hp: 52,
maxHp: 52,
attack: 18,
move: 6,
stats: { might: 92, intelligence: 62, leadership: 86, agility: 84, luck: 70 },
equipment: {
weapon: { itemId: 'sky-piercer-halberd', level: 4, exp: 22 },
armor: { itemId: 'reinforced-lamellar', level: 3, exp: 18 },
accessory: { itemId: 'bravery-token', level: 2, exp: 14 }
},
x: 13,
y: 32
}
];
export const hanzhongScoutRecruitUnits: UnitData[] = [
{
id: 'ma-dai',
name: '마대',
faction: 'ally',
className: '서량 기병',
classKey: 'cavalry',
level: 24,
exp: 0,
hp: 50,
maxHp: 50,
attack: 17,
move: 6,
stats: { might: 86, intelligence: 58, leadership: 80, agility: 82, luck: 68 },
equipment: {
weapon: { itemId: 'western-cavalry-spear', level: 3, exp: 18 },
armor: { itemId: 'lamellar-armor', level: 3, exp: 16 },
accessory: { itemId: 'bravery-token', level: 2, exp: 10 }
},
x: 14,
y: 34
}
];
export const hanzhongMainRecruitUnits: UnitData[] = [
{
id: 'wang-ping',
name: '왕평',
faction: 'ally',
className: '한중 보병',
classKey: 'spearman',
level: 25,
exp: 0,
hp: 54,
maxHp: 54,
attack: 17,
move: 4,
stats: { might: 82, intelligence: 70, leadership: 78, agility: 72, luck: 66 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 22 },
armor: { itemId: 'reinforced-lamellar', level: 3, exp: 18 },
accessory: { itemId: 'mountain-guide-scroll', level: 2, exp: 10 }
},
x: 15,
y: 36
}
];
export const jiangWeiRecruitUnits: UnitData[] = [
{
id: 'jiang-wei',
name: '강유',
faction: 'ally',
className: '천수 기병',
classKey: 'cavalry',
level: 27,
exp: 0,
hp: 56,
maxHp: 56,
attack: 19,
move: 6,
stats: { might: 84, intelligence: 88, leadership: 82, agility: 80, luck: 70 },
equipment: {
weapon: { itemId: 'western-cavalry-spear', level: 4, exp: 20 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 18 },
accessory: { itemId: 'mountain-guide-scroll', level: 3, exp: 12 }
},
x: 18,
y: 38
}
];
export const campaignRecruitUnits: UnitData[] = [
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits,
...jiangWeiRecruitUnits
];
const eighthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 2, y: 17 },
'guan-yu': { x: 3, y: 17 },
'zhang-fei': { x: 2, y: 18 },
'jian-yong': { x: 3, y: 18 },
'mi-zhu': { x: 1, y: 18 }
};
export const eighthBattleUnits: UnitData[] = [
...[...firstBattleUnits.filter((unit) => unit.faction === 'ally'), ...xuzhouRecruitUnits].map((unit) =>
placeScenarioUnit(unit, eighthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })
),
{
id: 'xiaopei-raider-a',
name: '여포군 척후',
faction: 'enemy',
className: '기동 척후',
classKey: 'cavalry',
level: 8,
exp: 52,
hp: 43,
maxHp: 43,
attack: 15,
move: 5,
stats: { might: 82, intelligence: 50, leadership: 62, agility: 86, luck: 55 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 28 },
armor: { itemId: 'rebel-vest', level: 2, exp: 14 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 17,
y: 9
},
{
id: 'xiaopei-raider-b',
name: '여포군 척후',
faction: 'enemy',
className: '기동 척후',
classKey: 'cavalry',
level: 8,
exp: 54,
hp: 44,
maxHp: 44,
attack: 15,
move: 5,
stats: { might: 83, intelligence: 50, leadership: 62, agility: 86, luck: 55 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 30 },
armor: { itemId: 'rebel-vest', level: 2, exp: 14 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 19,
y: 10
},
{
id: 'xiaopei-infantry-a',
name: '소패 침투병',
faction: 'enemy',
className: '여포군 보병',
classKey: 'yellowTurban',
level: 8,
exp: 50,
hp: 42,
maxHp: 42,
attack: 13,
move: 3,
stats: { might: 78, intelligence: 50, leadership: 66, agility: 61, luck: 53 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 26 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 12 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 11,
y: 12
},
{
id: 'xiaopei-infantry-b',
name: '소패 침투병',
faction: 'enemy',
className: '여포군 보병',
classKey: 'yellowTurban',
level: 8,
exp: 52,
hp: 43,
maxHp: 43,
attack: 13,
move: 3,
stats: { might: 79, intelligence: 50, leadership: 67, agility: 62, luck: 53 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 28 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 12 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 12,
y: 14
},
{
id: 'xiaopei-archer-a',
name: '소패 궁병',
faction: 'enemy',
className: '여포군 궁병',
classKey: 'archer',
level: 8,
exp: 52,
hp: 34,
maxHp: 34,
attack: 14,
move: 3,
stats: { might: 70, intelligence: 62, leadership: 60, agility: 71, luck: 54 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 28 },
armor: { itemId: 'cloth-armor', level: 2, exp: 12 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 18,
y: 7
},
{
id: 'xiaopei-archer-b',
name: '소패 궁병',
faction: 'enemy',
className: '여포군 궁병',
classKey: 'archer',
level: 9,
exp: 54,
hp: 35,
maxHp: 35,
attack: 15,
move: 3,
stats: { might: 72, intelligence: 63, leadership: 61, agility: 72, luck: 55 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 30 },
armor: { itemId: 'cloth-armor', level: 2, exp: 12 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 21,
y: 14
},
{
id: 'xiaopei-guard-a',
name: '창고 습격병',
faction: 'enemy',
className: '여포군 보병',
classKey: 'bandit',
level: 8,
exp: 50,
hp: 38,
maxHp: 38,
attack: 14,
move: 4,
stats: { might: 79, intelligence: 48, leadership: 58, agility: 72, luck: 52 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 26 },
armor: { itemId: 'rebel-vest', level: 2, exp: 12 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 8,
y: 11
},
{
id: 'xiaopei-guard-b',
name: '창고 습격병',
faction: 'enemy',
className: '여포군 보병',
classKey: 'bandit',
level: 8,
exp: 52,
hp: 39,
maxHp: 39,
attack: 14,
move: 4,
stats: { might: 80, intelligence: 48, leadership: 58, agility: 73, luck: 52 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 28 },
armor: { itemId: 'rebel-vest', level: 2, exp: 12 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 9,
y: 14
},
{
id: 'xiaopei-cavalry-a',
name: '여포군 기병',
faction: 'enemy',
className: '여포군 기병',
classKey: 'cavalry',
level: 9,
exp: 56,
hp: 46,
maxHp: 46,
attack: 16,
move: 5,
stats: { might: 86, intelligence: 50, leadership: 66, agility: 88, luck: 56 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 32 },
armor: { itemId: 'rebel-vest', level: 2, exp: 16 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 23,
y: 6
},
{
id: 'xiaopei-cavalry-b',
name: '여포군 기병',
faction: 'enemy',
className: '여포군 기병',
classKey: 'cavalry',
level: 9,
exp: 58,
hp: 47,
maxHp: 47,
attack: 16,
move: 5,
stats: { might: 87, intelligence: 50, leadership: 66, agility: 89, luck: 56 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 34 },
armor: { itemId: 'rebel-vest', level: 2, exp: 16 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 24,
y: 15
},
{
id: 'xiaopei-leader-gao-shun',
name: '고순',
faction: 'enemy',
className: '여포군 선봉장',
classKey: 'rebelLeader',
level: 10,
exp: 62,
hp: 62,
maxHp: 62,
attack: 17,
move: 4,
stats: { might: 88, intelligence: 66, leadership: 86, agility: 68, luck: 58 },
equipment: {
weapon: { itemId: 'leader-axe', level: 2, exp: 34 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 18 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 22,
y: 3
}
];
const ninthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 3, y: 17 },
'guan-yu': { x: 4, y: 17 },
'zhang-fei': { x: 3, y: 18 },
'jian-yong': { x: 5, y: 18 },
'mi-zhu': { x: 4, y: 19 }
};
export const ninthBattleUnits: UnitData[] = [
...[...firstBattleUnits.filter((unit) => unit.faction === 'ally'), ...xuzhouRecruitUnits].map((unit) =>
placeScenarioUnit(unit, ninthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })
),
{
id: 'xuzhou-gate-traitor-a',
name: '성문 배반병',
faction: 'enemy',
className: '서주 배반병',
classKey: 'bandit',
level: 9,
exp: 56,
hp: 40,
maxHp: 40,
attack: 15,
move: 4,
stats: { might: 80, intelligence: 48, leadership: 58, agility: 74, luck: 52 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 30 },
armor: { itemId: 'rebel-vest', level: 2, exp: 14 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 11,
y: 12
},
{
id: 'xuzhou-gate-traitor-b',
name: '성문 배반병',
faction: 'enemy',
className: '서주 배반병',
classKey: 'bandit',
level: 9,
exp: 58,
hp: 41,
maxHp: 41,
attack: 15,
move: 4,
stats: { might: 81, intelligence: 49, leadership: 59, agility: 74, luck: 52 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 32 },
armor: { itemId: 'rebel-vest', level: 2, exp: 14 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 12,
y: 14
},
{
id: 'xuzhou-gate-infantry-a',
name: '성문 수비병',
faction: 'enemy',
className: '조표 휘하 보병',
classKey: 'yellowTurban',
level: 9,
exp: 56,
hp: 44,
maxHp: 44,
attack: 14,
move: 3,
stats: { might: 80, intelligence: 52, leadership: 68, agility: 62, luck: 54 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 30 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 14 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 17,
y: 10
},
{
id: 'xuzhou-gate-infantry-b',
name: '성문 수비병',
faction: 'enemy',
className: '조표 휘하 보병',
classKey: 'yellowTurban',
level: 9,
exp: 58,
hp: 45,
maxHp: 45,
attack: 14,
move: 3,
stats: { might: 81, intelligence: 52, leadership: 68, agility: 63, luck: 54 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 32 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 14 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 18,
y: 12
},
{
id: 'xuzhou-gate-archer-a',
name: '성벽 궁병',
faction: 'enemy',
className: '성벽 궁병',
classKey: 'archer',
level: 9,
exp: 58,
hp: 36,
maxHp: 36,
attack: 15,
move: 3,
stats: { might: 72, intelligence: 64, leadership: 62, agility: 73, luck: 55 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 32 },
armor: { itemId: 'cloth-armor', level: 2, exp: 14 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 20,
y: 7
},
{
id: 'xuzhou-gate-archer-b',
name: '성벽 궁병',
faction: 'enemy',
className: '성벽 궁병',
classKey: 'archer',
level: 9,
exp: 60,
hp: 37,
maxHp: 37,
attack: 15,
move: 3,
stats: { might: 73, intelligence: 64, leadership: 63, agility: 74, luck: 55 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 34 },
armor: { itemId: 'cloth-armor', level: 2, exp: 14 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 22,
y: 13
},
{
id: 'lubu-cavalry-a',
name: '여포군 기병',
faction: 'enemy',
className: '여포군 기병',
classKey: 'cavalry',
level: 10,
exp: 62,
hp: 49,
maxHp: 49,
attack: 17,
move: 5,
stats: { might: 88, intelligence: 50, leadership: 68, agility: 90, luck: 57 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 36 },
armor: { itemId: 'rebel-vest', level: 2, exp: 18 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 23,
y: 5
},
{
id: 'lubu-cavalry-b',
name: '여포군 기병',
faction: 'enemy',
className: '여포군 기병',
classKey: 'cavalry',
level: 10,
exp: 64,
hp: 50,
maxHp: 50,
attack: 17,
move: 5,
stats: { might: 89, intelligence: 50, leadership: 68, agility: 91, luck: 57 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 38 },
armor: { itemId: 'rebel-vest', level: 2, exp: 18 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 24,
y: 16
},
{
id: 'lubu-cavalry-c',
name: '여포군 기병',
faction: 'enemy',
className: '여포군 기병',
classKey: 'cavalry',
level: 10,
exp: 66,
hp: 50,
maxHp: 50,
attack: 18,
move: 5,
stats: { might: 90, intelligence: 52, leadership: 70, agility: 91, luck: 58 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 40 },
armor: { itemId: 'rebel-vest', level: 2, exp: 18 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 21,
y: 10
},
{
id: 'xuzhou-leader-cao-bao',
name: '조표',
faction: 'enemy',
className: '서주 성문장',
classKey: 'rebelLeader',
level: 10,
exp: 68,
hp: 64,
maxHp: 64,
attack: 17,
move: 4,
stats: { might: 84, intelligence: 60, leadership: 82, agility: 66, luck: 56 },
equipment: {
weapon: { itemId: 'leader-axe', level: 2, exp: 38 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 20 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 20,
y: 10
}
];
const tenthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 3, y: 14 },
'guan-yu': { x: 4, y: 15 },
'zhang-fei': { x: 3, y: 16 },
'jian-yong': { x: 5, y: 17 },
'mi-zhu': { x: 4, y: 18 }
};
export const tenthBattleUnits: UnitData[] = [
...[...firstBattleUnits.filter((unit) => unit.faction === 'ally'), ...xuzhouRecruitUnits].map((unit) =>
placeScenarioUnit(unit, tenthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })
),
{
id: 'xuzhou-escape-cavalry-a',
name: '여포군 추격기병',
faction: 'enemy',
className: '여포군 기병',
classKey: 'cavalry',
level: 11,
exp: 64,
hp: 52,
maxHp: 52,
attack: 18,
move: 5,
stats: { might: 91, intelligence: 52, leadership: 70, agility: 92, luck: 58 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 42 },
armor: { itemId: 'rebel-vest', level: 2, exp: 20 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 21,
y: 5
},
{
id: 'xuzhou-escape-cavalry-b',
name: '여포군 추격기병',
faction: 'enemy',
className: '여포군 기병',
classKey: 'cavalry',
level: 11,
exp: 66,
hp: 53,
maxHp: 53,
attack: 18,
move: 5,
stats: { might: 92, intelligence: 52, leadership: 70, agility: 93, luck: 58 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 44 },
armor: { itemId: 'rebel-vest', level: 2, exp: 20 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 23,
y: 9
},
{
id: 'xuzhou-escape-cavalry-c',
name: '여포군 추격기병',
faction: 'enemy',
className: '여포군 기병',
classKey: 'cavalry',
level: 11,
exp: 66,
hp: 53,
maxHp: 53,
attack: 18,
move: 5,
stats: { might: 92, intelligence: 53, leadership: 71, agility: 93, luck: 59 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 46 },
armor: { itemId: 'rebel-vest', level: 2, exp: 20 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 22,
y: 16
},
{
id: 'xuzhou-escape-guard-a',
name: '서주 점거병',
faction: 'enemy',
className: '여포군 보병',
classKey: 'yellowTurban',
level: 10,
exp: 62,
hp: 47,
maxHp: 47,
attack: 15,
move: 3,
stats: { might: 82, intelligence: 54, leadership: 69, agility: 63, luck: 55 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 36 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 18 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 12,
y: 9
},
{
id: 'xuzhou-escape-guard-b',
name: '서주 점거병',
faction: 'enemy',
className: '여포군 보병',
classKey: 'yellowTurban',
level: 10,
exp: 62,
hp: 48,
maxHp: 48,
attack: 15,
move: 3,
stats: { might: 83, intelligence: 54, leadership: 70, agility: 64, luck: 55 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 38 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 18 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 13,
y: 13
},
{
id: 'xuzhou-escape-guard-c',
name: '서주 점거병',
faction: 'enemy',
className: '여포군 보병',
classKey: 'yellowTurban',
level: 10,
exp: 64,
hp: 48,
maxHp: 48,
attack: 15,
move: 3,
stats: { might: 84, intelligence: 55, leadership: 70, agility: 64, luck: 56 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 40 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 18 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 15,
y: 16
},
{
id: 'xuzhou-escape-archer-a',
name: '여포군 궁병',
faction: 'enemy',
className: '여포군 궁병',
classKey: 'archer',
level: 10,
exp: 62,
hp: 38,
maxHp: 38,
attack: 16,
move: 3,
stats: { might: 74, intelligence: 65, leadership: 63, agility: 74, luck: 56 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 38 },
armor: { itemId: 'cloth-armor', level: 2, exp: 16 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 17,
y: 7
},
{
id: 'xuzhou-escape-archer-b',
name: '여포군 궁병',
faction: 'enemy',
className: '여포군 궁병',
classKey: 'archer',
level: 10,
exp: 64,
hp: 39,
maxHp: 39,
attack: 16,
move: 3,
stats: { might: 75, intelligence: 66, leadership: 64, agility: 75, luck: 56 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 40 },
armor: { itemId: 'cloth-armor', level: 2, exp: 16 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 18,
y: 14
},
{
id: 'xuzhou-escape-raider-a',
name: '성내 배반병',
faction: 'enemy',
className: '성내 배반병',
classKey: 'bandit',
level: 10,
exp: 62,
hp: 43,
maxHp: 43,
attack: 16,
move: 4,
stats: { might: 84, intelligence: 52, leadership: 61, agility: 76, luck: 55 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 38 },
armor: { itemId: 'rebel-vest', level: 2, exp: 18 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 8,
y: 10
},
{
id: 'xuzhou-escape-raider-b',
name: '성내 배반병',
faction: 'enemy',
className: '성내 배반병',
classKey: 'bandit',
level: 10,
exp: 64,
hp: 44,
maxHp: 44,
attack: 16,
move: 4,
stats: { might: 85, intelligence: 52, leadership: 62, agility: 77, luck: 55 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 40 },
armor: { itemId: 'rebel-vest', level: 2, exp: 18 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 10,
y: 17
},
{
id: 'xuzhou-escape-leader-song-xian',
name: '송헌',
faction: 'enemy',
className: '여포군 선봉장',
classKey: 'rebelLeader',
level: 11,
exp: 70,
hp: 68,
maxHp: 68,
attack: 18,
move: 4,
stats: { might: 88, intelligence: 60, leadership: 84, agility: 72, luck: 58 },
equipment: {
weapon: { itemId: 'leader-axe', level: 2, exp: 42 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 22 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 20,
y: 11
}
];
const eleventhBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 3, y: 15 },
'guan-yu': { x: 4, y: 14 },
'zhang-fei': { x: 4, y: 16 },
'jian-yong': { x: 5, y: 17 },
'mi-zhu': { x: 3, y: 18 }
};
export const eleventhBattleUnits: UnitData[] = [
...[...firstBattleUnits.filter((unit) => unit.faction === 'ally'), ...xuzhouRecruitUnits].map((unit) =>
placeScenarioUnit(unit, eleventhBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })
),
{
id: 'xudu-road-raider-a',
name: '원술군 잔병',
faction: 'enemy',
className: '원술군 보병',
classKey: 'yellowTurban',
level: 11,
exp: 68,
hp: 50,
maxHp: 50,
attack: 16,
move: 3,
stats: { might: 84, intelligence: 54, leadership: 70, agility: 64, luck: 56 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 42 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 20 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 11,
y: 12
},
{
id: 'xudu-road-raider-b',
name: '원술군 잔병',
faction: 'enemy',
className: '원술군 보병',
classKey: 'yellowTurban',
level: 11,
exp: 70,
hp: 51,
maxHp: 51,
attack: 16,
move: 3,
stats: { might: 85, intelligence: 55, leadership: 71, agility: 65, luck: 56 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 44 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 20 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 13,
y: 16
},
{
id: 'xudu-road-raider-c',
name: '원술군 잔병',
faction: 'enemy',
className: '원술군 보병',
classKey: 'yellowTurban',
level: 11,
exp: 70,
hp: 51,
maxHp: 51,
attack: 16,
move: 3,
stats: { might: 85, intelligence: 55, leadership: 71, agility: 65, luck: 56 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 44 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 20 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 17,
y: 11
},
{
id: 'xudu-road-bandit-a',
name: '군량 약탈병',
faction: 'enemy',
className: '원술군 약탈병',
classKey: 'bandit',
level: 11,
exp: 68,
hp: 45,
maxHp: 45,
attack: 17,
move: 4,
stats: { might: 86, intelligence: 53, leadership: 62, agility: 78, luck: 56 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 42 },
armor: { itemId: 'rebel-vest', level: 2, exp: 20 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 8,
y: 8
},
{
id: 'xudu-road-bandit-b',
name: '군량 약탈병',
faction: 'enemy',
className: '원술군 약탈병',
classKey: 'bandit',
level: 11,
exp: 70,
hp: 46,
maxHp: 46,
attack: 17,
move: 4,
stats: { might: 87, intelligence: 53, leadership: 63, agility: 79, luck: 56 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 44 },
armor: { itemId: 'rebel-vest', level: 2, exp: 20 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 9,
y: 18
},
{
id: 'xudu-road-archer-a',
name: '원술군 궁병',
faction: 'enemy',
className: '원술군 궁병',
classKey: 'archer',
level: 11,
exp: 68,
hp: 40,
maxHp: 40,
attack: 17,
move: 3,
stats: { might: 76, intelligence: 66, leadership: 64, agility: 76, luck: 57 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 42 },
armor: { itemId: 'cloth-armor', level: 2, exp: 18 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 16,
y: 6
},
{
id: 'xudu-road-archer-b',
name: '원술군 궁병',
faction: 'enemy',
className: '원술군 궁병',
classKey: 'archer',
level: 11,
exp: 70,
hp: 41,
maxHp: 41,
attack: 17,
move: 3,
stats: { might: 77, intelligence: 67, leadership: 65, agility: 77, luck: 57 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 44 },
armor: { itemId: 'cloth-armor', level: 2, exp: 18 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 20,
y: 15
},
{
id: 'xudu-road-cavalry-a',
name: '원술군 기병',
faction: 'enemy',
className: '원술군 기병',
classKey: 'cavalry',
level: 12,
exp: 72,
hp: 55,
maxHp: 55,
attack: 19,
move: 5,
stats: { might: 93, intelligence: 54, leadership: 72, agility: 94, luck: 59 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 48 },
armor: { itemId: 'rebel-vest', level: 2, exp: 22 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 21,
y: 8
},
{
id: 'xudu-road-cavalry-b',
name: '원술군 기병',
faction: 'enemy',
className: '원술군 기병',
classKey: 'cavalry',
level: 12,
exp: 74,
hp: 56,
maxHp: 56,
attack: 19,
move: 5,
stats: { might: 94, intelligence: 54, leadership: 72, agility: 95, luck: 59 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 50 },
armor: { itemId: 'rebel-vest', level: 2, exp: 22 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 22,
y: 17
},
{
id: 'xudu-road-guard-a',
name: '원술군 친위병',
faction: 'enemy',
className: '원술군 창병',
classKey: 'spearman',
level: 12,
exp: 72,
hp: 54,
maxHp: 54,
attack: 18,
move: 3,
stats: { might: 90, intelligence: 56, leadership: 76, agility: 68, luck: 58 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 48 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 22 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 23,
y: 11
},
{
id: 'xudu-road-guard-b',
name: '원술군 친위병',
faction: 'enemy',
className: '원술군 창병',
classKey: 'spearman',
level: 12,
exp: 74,
hp: 55,
maxHp: 55,
attack: 18,
move: 3,
stats: { might: 91, intelligence: 56, leadership: 76, agility: 69, luck: 58 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 50 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 22 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 24,
y: 13
},
{
id: 'xudu-road-leader-ji-ling',
name: '기령',
faction: 'enemy',
className: '원술군 대장',
classKey: 'rebelLeader',
level: 13,
exp: 80,
hp: 74,
maxHp: 74,
attack: 20,
move: 4,
stats: { might: 94, intelligence: 64, leadership: 88, agility: 74, luck: 60 },
equipment: {
weapon: { itemId: 'leader-axe', level: 2, exp: 52 },
armor: { itemId: 'reinforced-lamellar', level: 2, exp: 24 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 24,
y: 10
}
];
const twelfthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 3, y: 18 },
'guan-yu': { x: 4, y: 17 },
'zhang-fei': { x: 4, y: 19 },
'jian-yong': { x: 5, y: 20 },
'mi-zhu': { x: 3, y: 21 }
};
export const twelfthBattleUnits: UnitData[] = [
...[...firstBattleUnits.filter((unit) => unit.faction === 'ally'), ...xuzhouRecruitUnits].map((unit) =>
placeScenarioUnit(unit, twelfthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })
),
{
id: 'xiapi-cavalry-a',
name: '여포군 돌격기병',
faction: 'enemy',
className: '여포군 기병',
classKey: 'cavalry',
level: 13,
exp: 76,
hp: 58,
maxHp: 58,
attack: 20,
move: 5,
stats: { might: 95, intelligence: 54, leadership: 74, agility: 96, luck: 60 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 54 },
armor: { itemId: 'rebel-vest', level: 2, exp: 24 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 20,
y: 5
},
{
id: 'xiapi-cavalry-b',
name: '여포군 돌격기병',
faction: 'enemy',
className: '여포군 기병',
classKey: 'cavalry',
level: 13,
exp: 78,
hp: 59,
maxHp: 59,
attack: 20,
move: 5,
stats: { might: 96, intelligence: 54, leadership: 74, agility: 97, luck: 60 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 56 },
armor: { itemId: 'rebel-vest', level: 2, exp: 24 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 23,
y: 15
},
{
id: 'xiapi-cavalry-c',
name: '여포군 돌격기병',
faction: 'enemy',
className: '여포군 기병',
classKey: 'cavalry',
level: 13,
exp: 78,
hp: 59,
maxHp: 59,
attack: 20,
move: 5,
stats: { might: 96, intelligence: 55, leadership: 75, agility: 97, luck: 61 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 56 },
armor: { itemId: 'rebel-vest', level: 2, exp: 24 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 25,
y: 10
},
{
id: 'xiapi-dike-guard-a',
name: '하비 둑길 수비병',
faction: 'enemy',
className: '여포군 보병',
classKey: 'yellowTurban',
level: 12,
exp: 74,
hp: 52,
maxHp: 52,
attack: 17,
move: 3,
stats: { might: 86, intelligence: 56, leadership: 72, agility: 65, luck: 57 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 50 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 22 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 12,
y: 14
},
{
id: 'xiapi-dike-guard-b',
name: '하비 둑길 수비병',
faction: 'enemy',
className: '여포군 보병',
classKey: 'yellowTurban',
level: 12,
exp: 76,
hp: 53,
maxHp: 53,
attack: 17,
move: 3,
stats: { might: 87, intelligence: 56, leadership: 73, agility: 66, luck: 57 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 52 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 22 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 14,
y: 18
},
{
id: 'xiapi-dike-guard-c',
name: '하비 둑길 수비병',
faction: 'enemy',
className: '여포군 보병',
classKey: 'yellowTurban',
level: 12,
exp: 76,
hp: 53,
maxHp: 53,
attack: 17,
move: 3,
stats: { might: 87, intelligence: 57, leadership: 73, agility: 66, luck: 57 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 52 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 22 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 17,
y: 9
},
{
id: 'xiapi-archer-a',
name: '하비 성루 궁병',
faction: 'enemy',
className: '여포군 궁병',
classKey: 'archer',
level: 12,
exp: 74,
hp: 43,
maxHp: 43,
attack: 18,
move: 3,
stats: { might: 78, intelligence: 68, leadership: 66, agility: 78, luck: 58 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 50 },
armor: { itemId: 'cloth-armor', level: 2, exp: 20 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 22,
y: 7
},
{
id: 'xiapi-archer-b',
name: '하비 성루 궁병',
faction: 'enemy',
className: '여포군 궁병',
classKey: 'archer',
level: 12,
exp: 76,
hp: 44,
maxHp: 44,
attack: 18,
move: 3,
stats: { might: 79, intelligence: 69, leadership: 67, agility: 79, luck: 58 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 52 },
armor: { itemId: 'cloth-armor', level: 2, exp: 20 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 24,
y: 18
},
{
id: 'xiapi-archer-c',
name: '하비 성루 궁병',
faction: 'enemy',
className: '여포군 궁병',
classKey: 'archer',
level: 12,
exp: 76,
hp: 44,
maxHp: 44,
attack: 18,
move: 3,
stats: { might: 79, intelligence: 69, leadership: 67, agility: 79, luck: 58 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 52 },
armor: { itemId: 'cloth-armor', level: 2, exp: 20 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 19,
y: 3
},
{
id: 'xiapi-camp-raider-a',
name: '여포군 기습병',
faction: 'enemy',
className: '여포군 기습병',
classKey: 'bandit',
level: 12,
exp: 74,
hp: 48,
maxHp: 48,
attack: 18,
move: 4,
stats: { might: 88, intelligence: 55, leadership: 64, agility: 81, luck: 58 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 50 },
armor: { itemId: 'rebel-vest', level: 2, exp: 22 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 9,
y: 8
},
{
id: 'xiapi-camp-raider-b',
name: '여포군 기습병',
faction: 'enemy',
className: '여포군 기습병',
classKey: 'bandit',
level: 12,
exp: 76,
hp: 49,
maxHp: 49,
attack: 18,
move: 4,
stats: { might: 89, intelligence: 55, leadership: 64, agility: 82, luck: 58 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 52 },
armor: { itemId: 'rebel-vest', level: 2, exp: 22 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 11,
y: 21
},
{
id: 'xiapi-strategist-chen-gong',
name: '진궁',
faction: 'enemy',
className: '여포군 책사',
classKey: 'strategist',
level: 13,
exp: 82,
hp: 52,
maxHp: 52,
attack: 18,
move: 3,
stats: { might: 62, intelligence: 96, leadership: 84, agility: 70, luck: 64 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 54 },
armor: { itemId: 'cloth-armor', level: 2, exp: 22 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 22,
y: 12
},
{
id: 'xiapi-leader-zhang-liao',
name: '장료',
faction: 'enemy',
className: '여포군 선봉장',
classKey: 'rebelLeader',
level: 14,
exp: 86,
hp: 78,
maxHp: 78,
attack: 21,
move: 5,
stats: { might: 95, intelligence: 78, leadership: 92, agility: 86, luck: 63 },
equipment: {
weapon: { itemId: 'leader-axe', level: 2, exp: 58 },
armor: { itemId: 'reinforced-lamellar', level: 2, exp: 26 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 24,
y: 11
}
];
const thirteenthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 3, y: 19 },
'guan-yu': { x: 4, y: 18 },
'zhang-fei': { x: 4, y: 20 },
'jian-yong': { x: 5, y: 19 },
'mi-zhu': { x: 3, y: 21 }
};
export const thirteenthBattleUnits: UnitData[] = [
...[...firstBattleUnits.filter((unit) => unit.faction === 'ally'), ...xuzhouRecruitUnits].map((unit) =>
placeScenarioUnit(unit, thirteenthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })
),
{
id: 'xiapi-final-cavalry-a',
name: '여포군 돌격기병',
faction: 'enemy',
className: '여포군 기병',
classKey: 'cavalry',
level: 14,
exp: 84,
hp: 62,
maxHp: 62,
attack: 21,
move: 5,
stats: { might: 98, intelligence: 55, leadership: 76, agility: 99, luck: 62 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 60 },
armor: { itemId: 'rebel-vest', level: 2, exp: 26 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 15,
y: 15
},
{
id: 'xiapi-final-cavalry-b',
name: '여포군 돌격기병',
faction: 'enemy',
className: '여포군 기병',
classKey: 'cavalry',
level: 14,
exp: 84,
hp: 62,
maxHp: 62,
attack: 21,
move: 5,
stats: { might: 98, intelligence: 55, leadership: 76, agility: 99, luck: 62 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 60 },
armor: { itemId: 'rebel-vest', level: 2, exp: 26 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 20,
y: 7
},
{
id: 'xiapi-final-cavalry-c',
name: '여포군 돌격기병',
faction: 'enemy',
className: '여포군 기병',
classKey: 'cavalry',
level: 14,
exp: 86,
hp: 63,
maxHp: 63,
attack: 21,
move: 5,
stats: { might: 99, intelligence: 56, leadership: 77, agility: 100, luck: 63 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 62 },
armor: { itemId: 'rebel-vest', level: 2, exp: 26 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 25,
y: 17
},
{
id: 'xiapi-final-cavalry-d',
name: '여포군 친위기병',
faction: 'enemy',
className: '여포군 기병',
classKey: 'cavalry',
level: 15,
exp: 88,
hp: 66,
maxHp: 66,
attack: 22,
move: 5,
stats: { might: 101, intelligence: 58, leadership: 80, agility: 101, luck: 64 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 64 },
armor: { itemId: 'rebel-vest', level: 2, exp: 28 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 27,
y: 12
},
{
id: 'xiapi-final-gate-guard-a',
name: '하비 성문 수비병',
faction: 'enemy',
className: '여포군 보병',
classKey: 'yellowTurban',
level: 13,
exp: 82,
hp: 56,
maxHp: 56,
attack: 18,
move: 3,
stats: { might: 89, intelligence: 58, leadership: 75, agility: 68, luck: 59 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 56 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 24 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 18,
y: 13
},
{
id: 'xiapi-final-gate-guard-b',
name: '하비 성문 수비병',
faction: 'enemy',
className: '여포군 보병',
classKey: 'yellowTurban',
level: 13,
exp: 82,
hp: 56,
maxHp: 56,
attack: 18,
move: 3,
stats: { might: 89, intelligence: 58, leadership: 75, agility: 68, luck: 59 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 56 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 24 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 19,
y: 14
},
{
id: 'xiapi-final-gate-guard-c',
name: '하비 성문 수비병',
faction: 'enemy',
className: '여포군 보병',
classKey: 'yellowTurban',
level: 13,
exp: 84,
hp: 57,
maxHp: 57,
attack: 18,
move: 3,
stats: { might: 90, intelligence: 58, leadership: 76, agility: 69, luck: 59 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 58 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 24 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 23,
y: 10
},
{
id: 'xiapi-final-gate-guard-d',
name: '하비 성문 수비병',
faction: 'enemy',
className: '여포군 보병',
classKey: 'yellowTurban',
level: 13,
exp: 84,
hp: 57,
maxHp: 57,
attack: 18,
move: 3,
stats: { might: 90, intelligence: 58, leadership: 76, agility: 69, luck: 59 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 58 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 24 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 24,
y: 11
},
{
id: 'xiapi-final-archer-a',
name: '하비 성루 궁병',
faction: 'enemy',
className: '여포군 궁병',
classKey: 'archer',
level: 13,
exp: 82,
hp: 46,
maxHp: 46,
attack: 19,
move: 3,
stats: { might: 80, intelligence: 70, leadership: 68, agility: 82, luck: 60 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 56 },
armor: { itemId: 'cloth-armor', level: 2, exp: 22 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 22,
y: 7
},
{
id: 'xiapi-final-archer-b',
name: '하비 성루 궁병',
faction: 'enemy',
className: '여포군 궁병',
classKey: 'archer',
level: 13,
exp: 84,
hp: 47,
maxHp: 47,
attack: 19,
move: 3,
stats: { might: 81, intelligence: 71, leadership: 69, agility: 83, luck: 60 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 58 },
armor: { itemId: 'cloth-armor', level: 2, exp: 22 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 25,
y: 8
},
{
id: 'xiapi-final-archer-c',
name: '하비 성루 궁병',
faction: 'enemy',
className: '여포군 궁병',
classKey: 'archer',
level: 13,
exp: 84,
hp: 47,
maxHp: 47,
attack: 19,
move: 3,
stats: { might: 81, intelligence: 71, leadership: 69, agility: 83, luck: 60 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 58 },
armor: { itemId: 'cloth-armor', level: 2, exp: 22 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 27,
y: 15
},
{
id: 'xiapi-final-raider-a',
name: '여포군 성내 기습병',
faction: 'enemy',
className: '여포군 기습병',
classKey: 'bandit',
level: 13,
exp: 82,
hp: 52,
maxHp: 52,
attack: 19,
move: 4,
stats: { might: 91, intelligence: 57, leadership: 67, agility: 85, luck: 61 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 56 },
armor: { itemId: 'rebel-vest', level: 2, exp: 24 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 11,
y: 10
},
{
id: 'xiapi-final-raider-b',
name: '여포군 성내 기습병',
faction: 'enemy',
className: '여포군 기습병',
classKey: 'bandit',
level: 13,
exp: 84,
hp: 53,
maxHp: 53,
attack: 19,
move: 4,
stats: { might: 92, intelligence: 57, leadership: 67, agility: 86, luck: 61 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 58 },
armor: { itemId: 'rebel-vest', level: 2, exp: 24 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 12,
y: 21
},
{
id: 'xiapi-final-strategist-chen-gong',
name: '진궁',
faction: 'enemy',
className: '여포군 책사',
classKey: 'strategist',
level: 14,
exp: 90,
hp: 56,
maxHp: 56,
attack: 19,
move: 3,
stats: { might: 64, intelligence: 98, leadership: 88, agility: 72, luck: 66 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 60 },
armor: { itemId: 'cloth-armor', level: 2, exp: 24 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 25,
y: 11
},
{
id: 'xiapi-final-leader-lu-bu',
name: '여포',
faction: 'enemy',
className: '비장군',
classKey: 'rebelLeader',
level: 16,
exp: 96,
hp: 94,
maxHp: 94,
attack: 25,
move: 5,
stats: { might: 108, intelligence: 46, leadership: 88, agility: 102, luck: 65 },
equipment: {
weapon: { itemId: 'sky-piercer-halberd', level: 3, exp: 20 },
armor: { itemId: 'reinforced-lamellar', level: 2, exp: 32 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 28,
y: 11
}
];
const fourteenthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 3, y: 19 },
'guan-yu': { x: 4, y: 18 },
'zhang-fei': { x: 4, y: 20 },
'jian-yong': { x: 5, y: 19 },
'mi-zhu': { x: 3, y: 21 },
'sun-qian': { x: 5, y: 21 }
};
export const fourteenthBattleUnits: UnitData[] = [
...[...firstBattleUnits.filter((unit) => unit.faction === 'ally'), ...xuzhouRecruitUnits, ...caoBreakRecruitUnits].map((unit) =>
placeScenarioUnit(unit, fourteenthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })
),
{
id: 'cao-break-scout-a',
name: '조조군 척후',
faction: 'enemy',
className: '조조 척후',
classKey: 'bandit',
level: 14,
exp: 86,
hp: 52,
maxHp: 52,
attack: 19,
move: 4,
stats: { might: 88, intelligence: 61, leadership: 66, agility: 86, luck: 62 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 62 },
armor: { itemId: 'rebel-vest', level: 2, exp: 26 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 11,
y: 15
},
{
id: 'cao-break-scout-b',
name: '조조군 척후',
faction: 'enemy',
className: '조조 척후',
classKey: 'bandit',
level: 14,
exp: 86,
hp: 52,
maxHp: 52,
attack: 19,
move: 4,
stats: { might: 88, intelligence: 61, leadership: 66, agility: 86, luck: 62 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 62 },
armor: { itemId: 'rebel-vest', level: 2, exp: 26 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 13,
y: 20
},
{
id: 'cao-break-infantry-a',
name: '조조 보병',
faction: 'enemy',
className: '조조 보병',
classKey: 'yellowTurban',
level: 14,
exp: 86,
hp: 58,
maxHp: 58,
attack: 18,
move: 3,
stats: { might: 90, intelligence: 60, leadership: 76, agility: 68, luck: 60 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 62 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 26 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 15,
y: 13
},
{
id: 'cao-break-infantry-b',
name: '조조 보병',
faction: 'enemy',
className: '조조 보병',
classKey: 'yellowTurban',
level: 14,
exp: 88,
hp: 59,
maxHp: 59,
attack: 18,
move: 3,
stats: { might: 91, intelligence: 60, leadership: 77, agility: 69, luck: 60 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 64 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 28 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 16,
y: 14
},
{
id: 'cao-break-infantry-c',
name: '조조 보병',
faction: 'enemy',
className: '조조 보병',
classKey: 'yellowTurban',
level: 14,
exp: 88,
hp: 59,
maxHp: 59,
attack: 18,
move: 3,
stats: { might: 91, intelligence: 60, leadership: 77, agility: 69, luck: 60 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 64 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 28 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 19,
y: 10
},
{
id: 'cao-break-infantry-d',
name: '조조 보병',
faction: 'enemy',
className: '조조 보병',
classKey: 'yellowTurban',
level: 15,
exp: 90,
hp: 61,
maxHp: 61,
attack: 19,
move: 3,
stats: { might: 92, intelligence: 61, leadership: 79, agility: 70, luck: 61 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 66 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 30 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 22,
y: 15
},
{
id: 'cao-break-archer-a',
name: '조조 궁병',
faction: 'enemy',
className: '조조 궁병',
classKey: 'archer',
level: 14,
exp: 86,
hp: 48,
maxHp: 48,
attack: 19,
move: 3,
stats: { might: 81, intelligence: 72, leadership: 70, agility: 82, luck: 61 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 62 },
armor: { itemId: 'cloth-armor', level: 2, exp: 24 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 18,
y: 8
},
{
id: 'cao-break-archer-b',
name: '조조 궁병',
faction: 'enemy',
className: '조조 궁병',
classKey: 'archer',
level: 14,
exp: 88,
hp: 49,
maxHp: 49,
attack: 19,
move: 3,
stats: { might: 82, intelligence: 73, leadership: 71, agility: 83, luck: 61 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 64 },
armor: { itemId: 'cloth-armor', level: 2, exp: 26 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 24,
y: 9
},
{
id: 'cao-break-archer-c',
name: '조조 궁병',
faction: 'enemy',
className: '조조 궁병',
classKey: 'archer',
level: 14,
exp: 88,
hp: 49,
maxHp: 49,
attack: 19,
move: 3,
stats: { might: 82, intelligence: 73, leadership: 71, agility: 83, luck: 61 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 64 },
armor: { itemId: 'cloth-armor', level: 2, exp: 26 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 26,
y: 16
},
{
id: 'cao-break-cavalry-a',
name: '조조 기병',
faction: 'enemy',
className: '조조 경기병',
classKey: 'cavalry',
level: 15,
exp: 90,
hp: 66,
maxHp: 66,
attack: 22,
move: 5,
stats: { might: 100, intelligence: 58, leadership: 80, agility: 100, luck: 63 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 66 },
armor: { itemId: 'rebel-vest', level: 2, exp: 30 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 20,
y: 6
},
{
id: 'cao-break-cavalry-b',
name: '조조 기병',
faction: 'enemy',
className: '조조 경기병',
classKey: 'cavalry',
level: 15,
exp: 90,
hp: 66,
maxHp: 66,
attack: 22,
move: 5,
stats: { might: 100, intelligence: 58, leadership: 80, agility: 100, luck: 63 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 66 },
armor: { itemId: 'rebel-vest', level: 2, exp: 30 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 25,
y: 13
},
{
id: 'cao-break-cavalry-c',
name: '조조 기병',
faction: 'enemy',
className: '조조 경기병',
classKey: 'cavalry',
level: 15,
exp: 92,
hp: 68,
maxHp: 68,
attack: 22,
move: 5,
stats: { might: 101, intelligence: 59, leadership: 81, agility: 101, luck: 64 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 68 },
armor: { itemId: 'rebel-vest', level: 2, exp: 32 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 28,
y: 18
},
{
id: 'cao-break-guard-a',
name: '서주 관문 수비대',
faction: 'enemy',
className: '조조 수비대',
classKey: 'yellowTurban',
level: 15,
exp: 92,
hp: 64,
maxHp: 64,
attack: 19,
move: 3,
stats: { might: 93, intelligence: 64, leadership: 82, agility: 70, luck: 62 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 68 },
armor: { itemId: 'reinforced-lamellar', level: 2, exp: 32 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 25,
y: 11
},
{
id: 'cao-break-guard-b',
name: '서주 관문 수비대',
faction: 'enemy',
className: '조조 수비대',
classKey: 'yellowTurban',
level: 15,
exp: 92,
hp: 64,
maxHp: 64,
attack: 19,
move: 3,
stats: { might: 93, intelligence: 64, leadership: 82, agility: 70, luck: 62 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 68 },
armor: { itemId: 'reinforced-lamellar', level: 2, exp: 32 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 26,
y: 12
},
{
id: 'cao-break-leader-che-zhou',
name: '차주',
faction: 'enemy',
className: '조조군 장수',
classKey: 'rebelLeader',
level: 17,
exp: 98,
hp: 88,
maxHp: 88,
attack: 24,
move: 4,
stats: { might: 102, intelligence: 72, leadership: 92, agility: 78, luck: 65 },
equipment: {
weapon: { itemId: 'leader-axe', level: 3, exp: 10 },
armor: { itemId: 'reinforced-lamellar', level: 2, exp: 36 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 27,
y: 11
}
];
const fifteenthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 3, y: 18 },
'guan-yu': { x: 4, y: 17 },
'zhang-fei': { x: 4, y: 19 },
'jian-yong': { x: 5, y: 18 },
'mi-zhu': { x: 3, y: 20 },
'sun-qian': { x: 5, y: 20 }
};
export const fifteenthBattleUnits: UnitData[] = [
...[...firstBattleUnits.filter((unit) => unit.faction === 'ally'), ...xuzhouRecruitUnits, ...caoBreakRecruitUnits].map((unit) =>
placeScenarioUnit(unit, fifteenthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })
),
{
id: 'yuan-refuge-scout-a',
name: '조조군 척후',
faction: 'enemy',
className: '추격 척후',
classKey: 'bandit',
level: 15,
exp: 92,
hp: 48,
maxHp: 54,
attack: 18,
move: 4,
stats: { might: 90, intelligence: 62, leadership: 68, agility: 88, luck: 62 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 68 },
armor: { itemId: 'rebel-vest', level: 2, exp: 30 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 10,
y: 16
},
{
id: 'yuan-refuge-scout-b',
name: '조조군 척후',
faction: 'enemy',
className: '추격 척후',
classKey: 'bandit',
level: 15,
exp: 92,
hp: 48,
maxHp: 54,
attack: 18,
move: 4,
stats: { might: 90, intelligence: 62, leadership: 68, agility: 88, luck: 62 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 68 },
armor: { itemId: 'rebel-vest', level: 2, exp: 30 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 12,
y: 20
},
{
id: 'yuan-refuge-infantry-a',
name: '조조 보병',
faction: 'enemy',
className: '추격 보병',
classKey: 'yellowTurban',
level: 15,
exp: 94,
hp: 54,
maxHp: 62,
attack: 18,
move: 3,
stats: { might: 92, intelligence: 62, leadership: 80, agility: 70, luck: 61 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 70 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 32 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 15,
y: 12
},
{
id: 'yuan-refuge-infantry-b',
name: '조조 보병',
faction: 'enemy',
className: '추격 보병',
classKey: 'yellowTurban',
level: 15,
exp: 94,
hp: 54,
maxHp: 62,
attack: 18,
move: 3,
stats: { might: 92, intelligence: 62, leadership: 80, agility: 70, luck: 61 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 70 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 32 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 17,
y: 14
},
{
id: 'yuan-refuge-infantry-c',
name: '조조 보병',
faction: 'enemy',
className: '추격 보병',
classKey: 'yellowTurban',
level: 16,
exp: 96,
hp: 54,
maxHp: 64,
attack: 18,
move: 3,
stats: { might: 94, intelligence: 63, leadership: 82, agility: 71, luck: 62 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 72 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 34 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 20,
y: 10
},
{
id: 'yuan-refuge-infantry-d',
name: '조조 보병',
faction: 'enemy',
className: '추격 보병',
classKey: 'yellowTurban',
level: 16,
exp: 96,
hp: 54,
maxHp: 64,
attack: 18,
move: 3,
stats: { might: 94, intelligence: 63, leadership: 82, agility: 71, luck: 62 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 72 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 34 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 23,
y: 15
},
{
id: 'yuan-refuge-archer-a',
name: '조조 궁병',
faction: 'enemy',
className: '추격 궁병',
classKey: 'archer',
level: 15,
exp: 94,
hp: 42,
maxHp: 50,
attack: 18,
move: 3,
stats: { might: 83, intelligence: 74, leadership: 72, agility: 84, luck: 62 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 68 },
armor: { itemId: 'cloth-armor', level: 2, exp: 30 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 18,
y: 8
},
{
id: 'yuan-refuge-archer-b',
name: '조조 궁병',
faction: 'enemy',
className: '추격 궁병',
classKey: 'archer',
level: 15,
exp: 94,
hp: 42,
maxHp: 50,
attack: 18,
move: 3,
stats: { might: 83, intelligence: 74, leadership: 72, agility: 84, luck: 62 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 68 },
armor: { itemId: 'cloth-armor', level: 2, exp: 30 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 23,
y: 8
},
{
id: 'yuan-refuge-archer-c',
name: '조조 궁병',
faction: 'enemy',
className: '추격 궁병',
classKey: 'archer',
level: 16,
exp: 96,
hp: 32,
maxHp: 52,
attack: 16,
move: 3,
stats: { might: 84, intelligence: 75, leadership: 73, agility: 85, luck: 63 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 70 },
armor: { itemId: 'cloth-armor', level: 2, exp: 32 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 27,
y: 13
},
{
id: 'yuan-refuge-cavalry-a',
name: '조조 기병',
faction: 'enemy',
className: '추격 기병',
classKey: 'cavalry',
level: 16,
exp: 98,
hp: 68,
maxHp: 68,
attack: 23,
move: 5,
stats: { might: 98, intelligence: 58, leadership: 76, agility: 92, luck: 64 },
equipment: {
weapon: { itemId: 'iron-spear', level: 2, exp: 72 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 34 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 14,
y: 18
},
{
id: 'yuan-refuge-cavalry-b',
name: '조조 기병',
faction: 'enemy',
className: '추격 기병',
classKey: 'cavalry',
level: 16,
exp: 98,
hp: 68,
maxHp: 68,
attack: 23,
move: 5,
stats: { might: 98, intelligence: 58, leadership: 76, agility: 92, luck: 64 },
equipment: {
weapon: { itemId: 'iron-spear', level: 2, exp: 72 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 34 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 19,
y: 19
},
{
id: 'yuan-refuge-cavalry-c',
name: '조조 기병',
faction: 'enemy',
className: '추격 기병',
classKey: 'cavalry',
level: 16,
exp: 98,
hp: 68,
maxHp: 68,
attack: 23,
move: 5,
stats: { might: 98, intelligence: 58, leadership: 76, agility: 92, luck: 64 },
equipment: {
weapon: { itemId: 'iron-spear', level: 2, exp: 72 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 34 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 25,
y: 19
},
{
id: 'yuan-refuge-guard-a',
name: '북상로 수비대',
faction: 'enemy',
className: '관문 수비대',
classKey: 'yellowTurban',
level: 16,
exp: 98,
hp: 54,
maxHp: 70,
attack: 20,
move: 3,
stats: { might: 96, intelligence: 64, leadership: 84, agility: 70, luck: 62 },
equipment: {
weapon: { itemId: 'iron-spear', level: 2, exp: 74 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 36 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 27,
y: 9
},
{
id: 'yuan-refuge-guard-b',
name: '북상로 수비대',
faction: 'enemy',
className: '관문 수비대',
classKey: 'yellowTurban',
level: 16,
exp: 98,
hp: 36,
maxHp: 64,
attack: 17,
move: 3,
stats: { might: 96, intelligence: 64, leadership: 84, agility: 70, luck: 62 },
equipment: {
weapon: { itemId: 'iron-spear', level: 2, exp: 74 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 36 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 29,
y: 12
},
{
id: 'yuan-refuge-guard-c',
name: '북상로 수비대',
faction: 'enemy',
className: '관문 수비대',
classKey: 'yellowTurban',
level: 16,
exp: 98,
hp: 36,
maxHp: 64,
attack: 17,
move: 3,
stats: { might: 96, intelligence: 64, leadership: 84, agility: 70, luck: 62 },
equipment: {
weapon: { itemId: 'iron-spear', level: 2, exp: 74 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 36 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 30,
y: 15
},
{
id: 'yuan-refuge-strategist-a',
name: '조조군 참모',
faction: 'enemy',
className: '추격 참모',
classKey: 'archer',
level: 16,
exp: 98,
hp: 36,
maxHp: 50,
attack: 17,
move: 3,
stats: { might: 70, intelligence: 88, leadership: 78, agility: 76, luck: 66 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 72 },
armor: { itemId: 'cloth-armor', level: 2, exp: 34 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 26,
y: 11
},
{
id: 'yuan-refuge-leader-cai-yang',
name: '채양',
faction: 'enemy',
className: '조조군 추격장',
classKey: 'rebelLeader',
level: 18,
exp: 12,
hp: 48,
maxHp: 92,
attack: 18,
move: 4,
stats: { might: 104, intelligence: 58, leadership: 90, agility: 82, luck: 64 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 18 },
armor: { itemId: 'reinforced-lamellar', level: 2, exp: 42 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 31,
y: 12
}
];
const sixteenthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 3, y: 20 },
'guan-yu': { x: 4, y: 19 },
'zhang-fei': { x: 4, y: 21 },
'jian-yong': { x: 5, y: 20 },
'mi-zhu': { x: 3, y: 22 },
'sun-qian': { x: 5, y: 22 },
'zhao-yun': { x: 6, y: 21 }
};
export const sixteenthBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits
].map((unit) => placeScenarioUnit(unit, sixteenthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
{
id: 'liu-biao-road-scout-a',
name: '조조군 척후',
faction: 'enemy',
className: '추격 척후',
classKey: 'bandit',
level: 16,
exp: 8,
hp: 56,
maxHp: 56,
attack: 21,
move: 4,
stats: { might: 92, intelligence: 62, leadership: 70, agility: 90, luck: 63 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 72 },
armor: { itemId: 'rebel-vest', level: 2, exp: 34 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 10,
y: 20
},
{
id: 'liu-biao-road-scout-b',
name: '조조군 척후',
faction: 'enemy',
className: '추격 척후',
classKey: 'bandit',
level: 16,
exp: 8,
hp: 56,
maxHp: 56,
attack: 21,
move: 4,
stats: { might: 92, intelligence: 62, leadership: 70, agility: 90, luck: 63 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 72 },
armor: { itemId: 'rebel-vest', level: 2, exp: 34 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 12,
y: 22
},
{
id: 'liu-biao-road-infantry-a',
name: '조조 보병',
faction: 'enemy',
className: '추격 보병',
classKey: 'yellowTurban',
level: 16,
exp: 10,
hp: 66,
maxHp: 66,
attack: 22,
move: 3,
stats: { might: 96, intelligence: 64, leadership: 82, agility: 72, luck: 62 },
equipment: {
weapon: { itemId: 'iron-spear', level: 2, exp: 74 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 36 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 15,
y: 16
},
{
id: 'liu-biao-road-infantry-b',
name: '조조 보병',
faction: 'enemy',
className: '추격 보병',
classKey: 'yellowTurban',
level: 16,
exp: 10,
hp: 66,
maxHp: 66,
attack: 22,
move: 3,
stats: { might: 96, intelligence: 64, leadership: 82, agility: 72, luck: 62 },
equipment: {
weapon: { itemId: 'iron-spear', level: 2, exp: 74 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 36 },
accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
},
x: 17,
y: 18
},
{
id: 'liu-biao-road-infantry-c',
name: '조조 보병',
faction: 'enemy',
className: '관문 보병',
classKey: 'yellowTurban',
level: 17,
exp: 12,
hp: 68,
maxHp: 68,
attack: 23,
move: 3,
stats: { might: 98, intelligence: 65, leadership: 84, agility: 72, luck: 63 },
equipment: {
weapon: { itemId: 'iron-spear', level: 2, exp: 78 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 38 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 24,
y: 12
},
{
id: 'liu-biao-road-infantry-d',
name: '조조 보병',
faction: 'enemy',
className: '관문 보병',
classKey: 'yellowTurban',
level: 17,
exp: 12,
hp: 68,
maxHp: 68,
attack: 23,
move: 3,
stats: { might: 98, intelligence: 65, leadership: 84, agility: 72, luck: 63 },
equipment: {
weapon: { itemId: 'iron-spear', level: 2, exp: 78 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 38 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 25,
y: 15
},
{
id: 'liu-biao-road-archer-a',
name: '조조 궁병',
faction: 'enemy',
className: '추격 궁병',
classKey: 'archer',
level: 16,
exp: 10,
hp: 52,
maxHp: 52,
attack: 21,
move: 3,
stats: { might: 84, intelligence: 76, leadership: 74, agility: 86, luck: 64 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 72 },
armor: { itemId: 'cloth-armor', level: 2, exp: 34 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 17,
y: 12
},
{
id: 'liu-biao-road-archer-b',
name: '조조 궁병',
faction: 'enemy',
className: '관문 궁병',
classKey: 'archer',
level: 17,
exp: 12,
hp: 48,
maxHp: 48,
attack: 20,
move: 3,
stats: { might: 86, intelligence: 78, leadership: 76, agility: 86, luck: 64 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 76 },
armor: { itemId: 'cloth-armor', level: 2, exp: 36 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 25,
y: 9
},
{
id: 'liu-biao-road-archer-c',
name: '조조 궁병',
faction: 'enemy',
className: '관문 궁병',
classKey: 'archer',
level: 17,
exp: 12,
hp: 36,
maxHp: 36,
attack: 17,
move: 3,
stats: { might: 86, intelligence: 78, leadership: 76, agility: 86, luck: 64 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 76 },
armor: { itemId: 'cloth-armor', level: 2, exp: 36 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 29,
y: 12
},
{
id: 'liu-biao-road-archer-d',
name: '조조 궁병',
faction: 'enemy',
className: '관문 궁병',
classKey: 'archer',
level: 17,
exp: 12,
hp: 48,
maxHp: 48,
attack: 20,
move: 3,
stats: { might: 86, intelligence: 78, leadership: 76, agility: 86, luck: 64 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 76 },
armor: { itemId: 'cloth-armor', level: 2, exp: 36 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 28,
y: 17
},
{
id: 'liu-biao-road-cavalry-a',
name: '조조 기병',
faction: 'enemy',
className: '추격 기병',
classKey: 'cavalry',
level: 17,
exp: 12,
hp: 70,
maxHp: 70,
attack: 24,
move: 5,
stats: { might: 100, intelligence: 60, leadership: 78, agility: 94, luck: 65 },
equipment: {
weapon: { itemId: 'iron-spear', level: 2, exp: 80 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 38 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 13,
y: 19
},
{
id: 'liu-biao-road-cavalry-b',
name: '조조 기병',
faction: 'enemy',
className: '추격 기병',
classKey: 'cavalry',
level: 17,
exp: 12,
hp: 70,
maxHp: 70,
attack: 24,
move: 5,
stats: { might: 100, intelligence: 60, leadership: 78, agility: 94, luck: 65 },
equipment: {
weapon: { itemId: 'iron-spear', level: 2, exp: 80 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 38 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 19,
y: 21
},
{
id: 'liu-biao-road-cavalry-c',
name: '조조 기병',
faction: 'enemy',
className: '추격 기병',
classKey: 'cavalry',
level: 17,
exp: 12,
hp: 66,
maxHp: 66,
attack: 23,
move: 5,
stats: { might: 100, intelligence: 60, leadership: 78, agility: 94, luck: 65 },
equipment: {
weapon: { itemId: 'iron-spear', level: 2, exp: 80 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 38 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 21,
y: 17
},
{
id: 'liu-biao-road-cavalry-d',
name: '조조 기병',
faction: 'enemy',
className: '관문 기병',
classKey: 'cavalry',
level: 18,
exp: 14,
hp: 58,
maxHp: 68,
attack: 20,
move: 5,
stats: { might: 102, intelligence: 62, leadership: 80, agility: 95, luck: 66 },
equipment: {
weapon: { itemId: 'iron-spear', level: 2, exp: 84 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 40 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 28,
y: 20
},
{
id: 'liu-biao-road-guard-a',
name: '형주 관문 수비',
faction: 'enemy',
className: '관문 수비대',
classKey: 'yellowTurban',
level: 18,
exp: 14,
hp: 44,
maxHp: 44,
attack: 19,
move: 3,
stats: { might: 100, intelligence: 66, leadership: 88, agility: 72, luck: 64 },
equipment: {
weapon: { itemId: 'iron-spear', level: 2, exp: 84 },
armor: { itemId: 'reinforced-lamellar', level: 2, exp: 42 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 30,
y: 13
},
{
id: 'liu-biao-road-guard-b',
name: '형주 관문 수비',
faction: 'enemy',
className: '관문 수비대',
classKey: 'yellowTurban',
level: 18,
exp: 14,
hp: 44,
maxHp: 44,
attack: 19,
move: 3,
stats: { might: 100, intelligence: 66, leadership: 88, agility: 72, luck: 64 },
equipment: {
weapon: { itemId: 'iron-spear', level: 2, exp: 84 },
armor: { itemId: 'reinforced-lamellar', level: 2, exp: 42 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 31,
y: 16
},
{
id: 'liu-biao-road-strategist-a',
name: '조조군 참모',
faction: 'enemy',
className: '추격 참모',
classKey: 'archer',
level: 18,
exp: 14,
hp: 36,
maxHp: 36,
attack: 17,
move: 3,
stats: { might: 72, intelligence: 90, leadership: 80, agility: 78, luck: 66 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 80 },
armor: { itemId: 'cloth-armor', level: 2, exp: 38 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 29,
y: 15
},
{
id: 'liu-biao-road-leader-cao-ren',
name: '조인',
faction: 'enemy',
className: '조조군 추격장',
classKey: 'rebelLeader',
level: 19,
exp: 18,
hp: 70,
maxHp: 90,
attack: 20,
move: 4,
stats: { might: 106, intelligence: 74, leadership: 96, agility: 80, luck: 66 },
equipment: {
weapon: { itemId: 'leader-axe', level: 3, exp: 24 },
armor: { itemId: 'reinforced-lamellar', level: 2, exp: 46 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 31,
y: 14
}
];
const seventeenthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 3, y: 21 },
'guan-yu': { x: 4, y: 20 },
'zhang-fei': { x: 4, y: 22 },
'jian-yong': { x: 5, y: 21 },
'mi-zhu': { x: 3, y: 23 },
'sun-qian': { x: 5, y: 23 },
'zhao-yun': { x: 6, y: 22 }
};
export const seventeenthBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits
].map((unit) => placeScenarioUnit(unit, seventeenthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
{
id: 'wolong-road-scout-a',
name: '산길 척후',
faction: 'enemy',
className: '형주 척후',
classKey: 'bandit',
level: 18,
exp: 16,
hp: 52,
maxHp: 58,
attack: 20,
move: 4,
stats: { might: 94, intelligence: 66, leadership: 72, agility: 92, luck: 64 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 82 },
armor: { itemId: 'rebel-vest', level: 2, exp: 38 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 10,
y: 20
},
{
id: 'wolong-road-scout-b',
name: '산길 척후',
faction: 'enemy',
className: '형주 척후',
classKey: 'bandit',
level: 18,
exp: 16,
hp: 52,
maxHp: 58,
attack: 20,
move: 4,
stats: { might: 94, intelligence: 66, leadership: 72, agility: 92, luck: 64 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 82 },
armor: { itemId: 'rebel-vest', level: 2, exp: 38 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 12,
y: 23
},
{
id: 'wolong-road-infantry-a',
name: '형주 가병',
faction: 'enemy',
className: '산길 보병',
classKey: 'yellowTurban',
level: 18,
exp: 18,
hp: 62,
maxHp: 70,
attack: 21,
move: 3,
stats: { might: 100, intelligence: 68, leadership: 86, agility: 74, luck: 64 },
equipment: {
weapon: { itemId: 'iron-spear', level: 2, exp: 86 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 42 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 15,
y: 18
},
{
id: 'wolong-road-infantry-b',
name: '형주 가병',
faction: 'enemy',
className: '산길 보병',
classKey: 'yellowTurban',
level: 18,
exp: 18,
hp: 62,
maxHp: 70,
attack: 21,
move: 3,
stats: { might: 100, intelligence: 68, leadership: 86, agility: 74, luck: 64 },
equipment: {
weapon: { itemId: 'iron-spear', level: 2, exp: 86 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 42 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 17,
y: 20
},
{
id: 'wolong-road-infantry-c',
name: '형주 가병',
faction: 'enemy',
className: '초가 수비병',
classKey: 'yellowTurban',
level: 19,
exp: 20,
hp: 52,
maxHp: 68,
attack: 19,
move: 3,
stats: { might: 102, intelligence: 70, leadership: 88, agility: 74, luck: 65 },
equipment: {
weapon: { itemId: 'iron-spear', level: 2, exp: 90 },
armor: { itemId: 'reinforced-lamellar', level: 2, exp: 46 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 26,
y: 11
},
{
id: 'wolong-road-infantry-d',
name: '형주 가병',
faction: 'enemy',
className: '초가 수비병',
classKey: 'yellowTurban',
level: 19,
exp: 20,
hp: 52,
maxHp: 68,
attack: 19,
move: 3,
stats: { might: 102, intelligence: 70, leadership: 88, agility: 74, luck: 65 },
equipment: {
weapon: { itemId: 'iron-spear', level: 2, exp: 90 },
armor: { itemId: 'reinforced-lamellar', level: 2, exp: 46 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 27,
y: 15
},
{
id: 'wolong-road-archer-a',
name: '형주 궁병',
faction: 'enemy',
className: '숲길 궁병',
classKey: 'archer',
level: 18,
exp: 18,
hp: 56,
maxHp: 56,
attack: 23,
move: 3,
stats: { might: 88, intelligence: 80, leadership: 78, agility: 88, luck: 65 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 84 },
armor: { itemId: 'cloth-armor', level: 2, exp: 40 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 16,
y: 14
},
{
id: 'wolong-road-archer-b',
name: '형주 궁병',
faction: 'enemy',
className: '숲길 궁병',
classKey: 'archer',
level: 18,
exp: 18,
hp: 44,
maxHp: 50,
attack: 18,
move: 3,
stats: { might: 88, intelligence: 80, leadership: 78, agility: 88, luck: 65 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 84 },
armor: { itemId: 'cloth-armor', level: 2, exp: 40 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 22,
y: 10
},
{
id: 'wolong-road-archer-c',
name: '형주 궁병',
faction: 'enemy',
className: '초가 궁병',
classKey: 'archer',
level: 19,
exp: 20,
hp: 40,
maxHp: 50,
attack: 17,
move: 3,
stats: { might: 90, intelligence: 82, leadership: 80, agility: 88, luck: 66 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 88 },
armor: { itemId: 'cloth-armor', level: 2, exp: 42 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 29,
y: 13
},
{
id: 'wolong-road-cavalry-a',
name: '형주 기병',
faction: 'enemy',
className: '산길 기병',
classKey: 'cavalry',
level: 19,
exp: 20,
hp: 62,
maxHp: 76,
attack: 22,
move: 5,
stats: { might: 104, intelligence: 64, leadership: 82, agility: 96, luck: 66 },
equipment: {
weapon: { itemId: 'iron-spear', level: 2, exp: 90 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 44 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 13,
y: 19
},
{
id: 'wolong-road-cavalry-b',
name: '형주 기병',
faction: 'enemy',
className: '산길 기병',
classKey: 'cavalry',
level: 19,
exp: 20,
hp: 62,
maxHp: 76,
attack: 22,
move: 5,
stats: { might: 104, intelligence: 64, leadership: 82, agility: 96, luck: 66 },
equipment: {
weapon: { itemId: 'iron-spear', level: 2, exp: 90 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 44 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 20,
y: 18
},
{
id: 'wolong-road-guard-a',
name: '채씨 가병',
faction: 'enemy',
className: '초가 감시병',
classKey: 'yellowTurban',
level: 19,
exp: 22,
hp: 52,
maxHp: 66,
attack: 20,
move: 3,
stats: { might: 102, intelligence: 74, leadership: 90, agility: 75, luck: 65 },
equipment: {
weapon: { itemId: 'iron-spear', level: 2, exp: 92 },
armor: { itemId: 'reinforced-lamellar', level: 2, exp: 48 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 30,
y: 14
},
{
id: 'wolong-road-guard-b',
name: '채씨 가병',
faction: 'enemy',
className: '초가 감시병',
classKey: 'yellowTurban',
level: 19,
exp: 22,
hp: 52,
maxHp: 66,
attack: 20,
move: 3,
stats: { might: 102, intelligence: 74, leadership: 90, agility: 75, luck: 65 },
equipment: {
weapon: { itemId: 'iron-spear', level: 2, exp: 92 },
armor: { itemId: 'reinforced-lamellar', level: 2, exp: 48 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 31,
y: 12
},
{
id: 'wolong-road-strategist-a',
name: '형주 문객',
faction: 'enemy',
className: '채씨 문객',
classKey: 'archer',
level: 19,
exp: 22,
hp: 40,
maxHp: 52,
attack: 18,
move: 3,
stats: { might: 74, intelligence: 92, leadership: 82, agility: 80, luck: 68 },
equipment: {
weapon: { itemId: 'short-bow', level: 2, exp: 90 },
armor: { itemId: 'cloth-armor', level: 2, exp: 44 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 28,
y: 12
},
{
id: 'wolong-road-leader-cai-xun',
name: '채순',
faction: 'enemy',
className: '채씨 가병장',
classKey: 'rebelLeader',
level: 20,
exp: 24,
hp: 72,
maxHp: 104,
attack: 22,
move: 4,
stats: { might: 108, intelligence: 76, leadership: 98, agility: 82, luck: 66 },
equipment: {
weapon: { itemId: 'leader-axe', level: 3, exp: 32 },
armor: { itemId: 'reinforced-lamellar', level: 2, exp: 52 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 31,
y: 14
}
];
const eighteenthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 3, y: 18 },
'guan-yu': { x: 4, y: 17 },
'zhang-fei': { x: 4, y: 19 },
'jian-yong': { x: 5, y: 18 },
'mi-zhu': { x: 3, y: 20 },
'sun-qian': { x: 5, y: 20 },
'zhao-yun': { x: 6, y: 17 },
'zhuge-liang': { x: 6, y: 19 }
};
export const eighteenthBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits
].map((unit) => placeScenarioUnit(unit, eighteenthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
{
id: 'bowang-scout-a',
name: '조조군 척후',
faction: 'enemy',
className: '선봉 척후',
classKey: 'bandit',
level: 20,
exp: 24,
hp: 62,
maxHp: 62,
attack: 24,
move: 4,
stats: { might: 98, intelligence: 70, leadership: 76, agility: 94, luck: 66 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 3, exp: 10 },
armor: { itemId: 'rebel-vest', level: 2, exp: 62 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 12,
y: 18
},
{
id: 'bowang-scout-b',
name: '조조군 척후',
faction: 'enemy',
className: '선봉 척후',
classKey: 'bandit',
level: 20,
exp: 24,
hp: 62,
maxHp: 62,
attack: 24,
move: 4,
stats: { might: 98, intelligence: 70, leadership: 76, agility: 94, luck: 66 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 3, exp: 10 },
armor: { itemId: 'rebel-vest', level: 2, exp: 62 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 14,
y: 20
},
{
id: 'bowang-infantry-a',
name: '조조군 보병',
faction: 'enemy',
className: '박망 보병',
classKey: 'yellowTurban',
level: 20,
exp: 26,
hp: 76,
maxHp: 76,
attack: 26,
move: 3,
stats: { might: 104, intelligence: 72, leadership: 88, agility: 76, luck: 66 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 12 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 66 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 17,
y: 17
},
{
id: 'bowang-infantry-b',
name: '조조군 보병',
faction: 'enemy',
className: '박망 보병',
classKey: 'yellowTurban',
level: 20,
exp: 26,
hp: 76,
maxHp: 76,
attack: 26,
move: 3,
stats: { might: 104, intelligence: 72, leadership: 88, agility: 76, luck: 66 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 12 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 66 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 18,
y: 19
},
{
id: 'bowang-infantry-c',
name: '조조군 보병',
faction: 'enemy',
className: '길목 보병',
classKey: 'yellowTurban',
level: 21,
exp: 28,
hp: 80,
maxHp: 80,
attack: 27,
move: 3,
stats: { might: 106, intelligence: 74, leadership: 90, agility: 78, luck: 67 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 16 },
armor: { itemId: 'reinforced-lamellar', level: 2, exp: 68 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 25,
y: 14
},
{
id: 'bowang-infantry-d',
name: '조조군 보병',
faction: 'enemy',
className: '길목 보병',
classKey: 'yellowTurban',
level: 21,
exp: 28,
hp: 80,
maxHp: 80,
attack: 27,
move: 3,
stats: { might: 106, intelligence: 74, leadership: 90, agility: 78, luck: 67 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 16 },
armor: { itemId: 'reinforced-lamellar', level: 2, exp: 68 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 26,
y: 17
},
{
id: 'bowang-archer-a',
name: '조조군 궁병',
faction: 'enemy',
className: '숲길 궁병',
classKey: 'archer',
level: 20,
exp: 24,
hp: 60,
maxHp: 60,
attack: 25,
move: 3,
stats: { might: 92, intelligence: 82, leadership: 82, agility: 90, luck: 68 },
equipment: {
weapon: { itemId: 'short-bow', level: 3, exp: 10 },
armor: { itemId: 'cloth-armor', level: 2, exp: 58 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 19,
y: 14
},
{
id: 'bowang-archer-b',
name: '조조군 궁병',
faction: 'enemy',
className: '숲길 궁병',
classKey: 'archer',
level: 20,
exp: 24,
hp: 60,
maxHp: 60,
attack: 25,
move: 3,
stats: { might: 92, intelligence: 82, leadership: 82, agility: 90, luck: 68 },
equipment: {
weapon: { itemId: 'short-bow', level: 3, exp: 10 },
armor: { itemId: 'cloth-armor', level: 2, exp: 58 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 23,
y: 12
},
{
id: 'bowang-archer-c',
name: '조조군 궁병',
faction: 'enemy',
className: '후방 궁병',
classKey: 'archer',
level: 21,
exp: 26,
hp: 62,
maxHp: 62,
attack: 26,
move: 3,
stats: { might: 94, intelligence: 84, leadership: 84, agility: 90, luck: 68 },
equipment: {
weapon: { itemId: 'short-bow', level: 3, exp: 14 },
armor: { itemId: 'cloth-armor', level: 2, exp: 62 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 29,
y: 15
},
{
id: 'bowang-cavalry-a',
name: '조조군 기병',
faction: 'enemy',
className: '추격 기병',
classKey: 'cavalry',
level: 21,
exp: 28,
hp: 82,
maxHp: 82,
attack: 28,
move: 5,
stats: { might: 108, intelligence: 70, leadership: 86, agility: 98, luck: 68 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 18 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 68 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 15,
y: 16
},
{
id: 'bowang-cavalry-b',
name: '조조군 기병',
faction: 'enemy',
className: '추격 기병',
classKey: 'cavalry',
level: 21,
exp: 28,
hp: 82,
maxHp: 82,
attack: 28,
move: 5,
stats: { might: 108, intelligence: 70, leadership: 86, agility: 98, luck: 68 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 18 },
armor: { itemId: 'lamellar-armor', level: 2, exp: 68 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 21,
y: 18
},
{
id: 'bowang-cavalry-c',
name: '조조군 기병',
faction: 'enemy',
className: '후속 기병',
classKey: 'cavalry',
level: 22,
exp: 30,
hp: 86,
maxHp: 86,
attack: 29,
move: 5,
stats: { might: 110, intelligence: 72, leadership: 88, agility: 100, luck: 68 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 20 },
armor: { itemId: 'reinforced-lamellar', level: 2, exp: 70 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 28,
y: 18
},
{
id: 'bowang-guard-a',
name: '조조군 정예',
faction: 'enemy',
className: '하후돈 친위',
classKey: 'yellowTurban',
level: 22,
exp: 30,
hp: 88,
maxHp: 88,
attack: 29,
move: 3,
stats: { might: 110, intelligence: 76, leadership: 96, agility: 80, luck: 68 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 24 },
armor: { itemId: 'reinforced-lamellar', level: 2, exp: 74 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 31,
y: 13
},
{
id: 'bowang-guard-b',
name: '조조군 정예',
faction: 'enemy',
className: '하후돈 친위',
classKey: 'yellowTurban',
level: 22,
exp: 30,
hp: 88,
maxHp: 88,
attack: 29,
move: 3,
stats: { might: 110, intelligence: 76, leadership: 96, agility: 80, luck: 68 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 24 },
armor: { itemId: 'reinforced-lamellar', level: 2, exp: 74 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 32,
y: 16
},
{
id: 'bowang-strategist-a',
name: '조조군 군리',
faction: 'enemy',
className: '군리',
classKey: 'archer',
level: 21,
exp: 28,
hp: 64,
maxHp: 64,
attack: 26,
move: 3,
stats: { might: 76, intelligence: 94, leadership: 86, agility: 82, luck: 70 },
equipment: {
weapon: { itemId: 'short-bow', level: 3, exp: 18 },
armor: { itemId: 'cloth-armor', level: 2, exp: 64 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 30,
y: 12
},
{
id: 'bowang-leader-xiahou-dun',
name: '하후돈',
faction: 'enemy',
className: '조조군 선봉장',
classKey: 'rebelLeader',
level: 23,
exp: 34,
hp: 118,
maxHp: 118,
attack: 31,
move: 4,
stats: { might: 116, intelligence: 78, leadership: 104, agility: 86, luck: 72 },
equipment: {
weapon: { itemId: 'leader-axe', level: 3, exp: 44 },
armor: { itemId: 'reinforced-lamellar', level: 3, exp: 12 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 33,
y: 15
}
];
const nineteenthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 4, y: 22 },
'guan-yu': { x: 5, y: 20 },
'zhang-fei': { x: 6, y: 22 },
'jian-yong': { x: 3, y: 23 },
'mi-zhu': { x: 4, y: 24 },
'sun-qian': { x: 6, y: 24 },
'zhao-yun': { x: 8, y: 20 },
'zhuge-liang': { x: 5, y: 23 }
};
export const nineteenthBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits
].map((unit) => placeScenarioUnit(unit, nineteenthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
{
id: 'changban-scout-a',
name: '조조군 척후',
faction: 'enemy',
className: '추격 척후',
classKey: 'bandit',
level: 22,
exp: 30,
hp: 66,
maxHp: 66,
attack: 25,
move: 4,
stats: { might: 98, intelligence: 72, leadership: 78, agility: 98, luck: 68 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 3, exp: 22 },
armor: { itemId: 'rebel-vest', level: 2, exp: 70 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 13,
y: 21
},
{
id: 'changban-scout-b',
name: '조조군 척후',
faction: 'enemy',
className: '측면 척후',
classKey: 'bandit',
level: 22,
exp: 30,
hp: 66,
maxHp: 66,
attack: 25,
move: 4,
stats: { might: 98, intelligence: 72, leadership: 78, agility: 98, luck: 68 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 3, exp: 22 },
armor: { itemId: 'rebel-vest', level: 2, exp: 70 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 12,
y: 24
},
{
id: 'changban-cavalry-a',
name: '호표 추격기',
faction: 'enemy',
className: '조조 경기병',
classKey: 'cavalry',
level: 23,
exp: 32,
hp: 88,
maxHp: 88,
attack: 30,
move: 5,
stats: { might: 112, intelligence: 72, leadership: 90, agility: 106, luck: 70 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 28 },
armor: { itemId: 'lamellar-armor', level: 3, exp: 4 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 16,
y: 18
},
{
id: 'changban-cavalry-b',
name: '호표 추격기',
faction: 'enemy',
className: '조조 경기병',
classKey: 'cavalry',
level: 23,
exp: 32,
hp: 88,
maxHp: 88,
attack: 30,
move: 5,
stats: { might: 112, intelligence: 72, leadership: 90, agility: 106, luck: 70 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 28 },
armor: { itemId: 'lamellar-armor', level: 3, exp: 4 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 17,
y: 22
},
{
id: 'changban-cavalry-c',
name: '조조군 선봉기',
faction: 'enemy',
className: '선봉 기병',
classKey: 'cavalry',
level: 24,
exp: 34,
hp: 92,
maxHp: 92,
attack: 31,
move: 5,
stats: { might: 114, intelligence: 74, leadership: 92, agility: 108, luck: 70 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 34 },
armor: { itemId: 'lamellar-armor', level: 3, exp: 10 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 22,
y: 17
},
{
id: 'changban-cavalry-d',
name: '조조군 선봉기',
faction: 'enemy',
className: '선봉 기병',
classKey: 'cavalry',
level: 24,
exp: 34,
hp: 92,
maxHp: 92,
attack: 31,
move: 5,
stats: { might: 114, intelligence: 74, leadership: 92, agility: 108, luck: 70 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 34 },
armor: { itemId: 'lamellar-armor', level: 3, exp: 10 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 25,
y: 21
},
{
id: 'changban-infantry-a',
name: '조조 보병',
faction: 'enemy',
className: '추격 보병',
classKey: 'yellowTurban',
level: 22,
exp: 30,
hp: 82,
maxHp: 82,
attack: 27,
move: 3,
stats: { might: 106, intelligence: 74, leadership: 92, agility: 78, luck: 68 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 26 },
armor: { itemId: 'lamellar-armor', level: 3, exp: 2 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 18,
y: 16
},
{
id: 'changban-infantry-b',
name: '조조 보병',
faction: 'enemy',
className: '추격 보병',
classKey: 'yellowTurban',
level: 22,
exp: 30,
hp: 82,
maxHp: 82,
attack: 27,
move: 3,
stats: { might: 106, intelligence: 74, leadership: 92, agility: 78, luck: 68 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 26 },
armor: { itemId: 'lamellar-armor', level: 3, exp: 2 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 20,
y: 20
},
{
id: 'changban-infantry-c',
name: '장판 보병',
faction: 'enemy',
className: '다리목 보병',
classKey: 'yellowTurban',
level: 23,
exp: 32,
hp: 86,
maxHp: 86,
attack: 28,
move: 3,
stats: { might: 108, intelligence: 76, leadership: 94, agility: 80, luck: 69 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 30 },
armor: { itemId: 'reinforced-lamellar', level: 3, exp: 6 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 26,
y: 16
},
{
id: 'changban-infantry-d',
name: '장판 보병',
faction: 'enemy',
className: '다리목 보병',
classKey: 'yellowTurban',
level: 23,
exp: 32,
hp: 86,
maxHp: 86,
attack: 28,
move: 3,
stats: { might: 108, intelligence: 76, leadership: 94, agility: 80, luck: 69 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 30 },
armor: { itemId: 'reinforced-lamellar', level: 3, exp: 6 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 28,
y: 20
},
{
id: 'changban-archer-a',
name: '조조 궁병',
faction: 'enemy',
className: '언덕 궁병',
classKey: 'archer',
level: 22,
exp: 30,
hp: 64,
maxHp: 64,
attack: 27,
move: 3,
stats: { might: 94, intelligence: 86, leadership: 84, agility: 92, luck: 70 },
equipment: {
weapon: { itemId: 'short-bow', level: 3, exp: 24 },
armor: { itemId: 'cloth-armor', level: 3, exp: 0 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 21,
y: 14
},
{
id: 'changban-archer-b',
name: '조조 궁병',
faction: 'enemy',
className: '강변 궁병',
classKey: 'archer',
level: 22,
exp: 30,
hp: 64,
maxHp: 64,
attack: 27,
move: 3,
stats: { might: 94, intelligence: 86, leadership: 84, agility: 92, luck: 70 },
equipment: {
weapon: { itemId: 'short-bow', level: 3, exp: 24 },
armor: { itemId: 'cloth-armor', level: 3, exp: 0 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 24,
y: 23
},
{
id: 'changban-archer-c',
name: '조조 궁병',
faction: 'enemy',
className: '후방 궁병',
classKey: 'archer',
level: 23,
exp: 32,
hp: 66,
maxHp: 66,
attack: 28,
move: 3,
stats: { might: 96, intelligence: 88, leadership: 86, agility: 94, luck: 70 },
equipment: {
weapon: { itemId: 'short-bow', level: 3, exp: 30 },
armor: { itemId: 'cloth-armor', level: 3, exp: 4 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 31,
y: 18
},
{
id: 'changban-guard-a',
name: '조조 친위',
faction: 'enemy',
className: '호표 친위',
classKey: 'yellowTurban',
level: 24,
exp: 34,
hp: 94,
maxHp: 94,
attack: 30,
move: 3,
stats: { might: 114, intelligence: 78, leadership: 102, agility: 84, luck: 70 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 38 },
armor: { itemId: 'reinforced-lamellar', level: 3, exp: 14 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 33,
y: 16
},
{
id: 'changban-guard-b',
name: '조조 친위',
faction: 'enemy',
className: '호표 친위',
classKey: 'yellowTurban',
level: 24,
exp: 34,
hp: 94,
maxHp: 94,
attack: 30,
move: 3,
stats: { might: 114, intelligence: 78, leadership: 102, agility: 84, luck: 70 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 38 },
armor: { itemId: 'reinforced-lamellar', level: 3, exp: 14 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 33,
y: 20
},
{
id: 'changban-strategist-a',
name: '조조군 군리',
faction: 'enemy',
className: '군리',
classKey: 'archer',
level: 23,
exp: 32,
hp: 68,
maxHp: 68,
attack: 27,
move: 3,
stats: { might: 76, intelligence: 96, leadership: 88, agility: 84, luck: 72 },
equipment: {
weapon: { itemId: 'short-bow', level: 3, exp: 34 },
armor: { itemId: 'cloth-armor', level: 3, exp: 8 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 31,
y: 14
},
{
id: 'changban-leader-cao-chun',
name: '조순',
faction: 'enemy',
className: '호표기장',
classKey: 'rebelLeader',
level: 25,
exp: 38,
hp: 126,
maxHp: 126,
attack: 33,
move: 5,
stats: { might: 118, intelligence: 82, leadership: 110, agility: 96, luck: 74 },
equipment: {
weapon: { itemId: 'leader-axe', level: 3, exp: 52 },
armor: { itemId: 'reinforced-lamellar', level: 3, exp: 22 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 35,
y: 18
}
];
const twentiethBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 4, y: 22 },
'guan-yu': { x: 5, y: 20 },
'zhang-fei': { x: 6, y: 23 },
'jian-yong': { x: 3, y: 24 },
'mi-zhu': { x: 5, y: 25 },
'sun-qian': { x: 4, y: 24 },
'zhao-yun': { x: 8, y: 21 },
'zhuge-liang': { x: 6, y: 21 }
};
export const twentiethBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits
].map((unit) => placeScenarioUnit(unit, twentiethBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
{
id: 'envoy-road-scout-a',
name: '조조군 척후',
faction: 'enemy',
className: '나루 척후',
classKey: 'bandit',
level: 24,
exp: 34,
hp: 44,
maxHp: 56,
attack: 18,
move: 4,
stats: { might: 102, intelligence: 74, leadership: 80, agility: 100, luck: 70 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 3, exp: 36 },
armor: { itemId: 'rebel-vest', level: 3, exp: 4 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 14,
y: 21
},
{
id: 'envoy-road-scout-b',
name: '조조군 척후',
faction: 'enemy',
className: '강변 척후',
classKey: 'bandit',
level: 24,
exp: 34,
hp: 56,
maxHp: 56,
attack: 23,
move: 4,
stats: { might: 102, intelligence: 74, leadership: 80, agility: 100, luck: 70 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 3, exp: 36 },
armor: { itemId: 'rebel-vest', level: 3, exp: 4 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 15,
y: 24
},
{
id: 'envoy-road-cavalry-a',
name: '조조 추격기',
faction: 'enemy',
className: '추격 기병',
classKey: 'cavalry',
level: 25,
exp: 36,
hp: 74,
maxHp: 86,
attack: 26,
move: 5,
stats: { might: 116, intelligence: 74, leadership: 92, agility: 110, luck: 72 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 44 },
armor: { itemId: 'lamellar-armor', level: 3, exp: 18 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 19,
y: 19
},
{
id: 'envoy-road-cavalry-b',
name: '조조 추격기',
faction: 'enemy',
className: '추격 기병',
classKey: 'cavalry',
level: 25,
exp: 36,
hp: 74,
maxHp: 86,
attack: 26,
move: 5,
stats: { might: 116, intelligence: 74, leadership: 92, agility: 110, luck: 72 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 44 },
armor: { itemId: 'lamellar-armor', level: 3, exp: 18 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 20,
y: 23
},
{
id: 'envoy-road-cavalry-c',
name: '문빙 기병',
faction: 'enemy',
className: '나루 기병',
classKey: 'cavalry',
level: 26,
exp: 38,
hp: 64,
maxHp: 92,
attack: 24,
move: 5,
stats: { might: 118, intelligence: 76, leadership: 94, agility: 112, luck: 72 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 50 },
armor: { itemId: 'reinforced-lamellar', level: 3, exp: 26 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 25,
y: 18
},
{
id: 'envoy-road-cavalry-d',
name: '문빙 기병',
faction: 'enemy',
className: '나루 기병',
classKey: 'cavalry',
level: 26,
exp: 38,
hp: 64,
maxHp: 92,
attack: 24,
move: 5,
stats: { might: 118, intelligence: 76, leadership: 94, agility: 112, luck: 72 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 50 },
armor: { itemId: 'reinforced-lamellar', level: 3, exp: 26 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 28,
y: 21
},
{
id: 'envoy-road-infantry-a',
name: '나루 보병',
faction: 'enemy',
className: '강나루 보병',
classKey: 'yellowTurban',
level: 24,
exp: 34,
hp: 72,
maxHp: 88,
attack: 25,
move: 3,
stats: { might: 110, intelligence: 76, leadership: 94, agility: 82, luck: 70 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 40 },
armor: { itemId: 'lamellar-armor', level: 3, exp: 14 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 21,
y: 19
},
{
id: 'envoy-road-infantry-b',
name: '나루 보병',
faction: 'enemy',
className: '강나루 보병',
classKey: 'yellowTurban',
level: 24,
exp: 34,
hp: 72,
maxHp: 88,
attack: 25,
move: 3,
stats: { might: 110, intelligence: 76, leadership: 94, agility: 82, luck: 70 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 40 },
armor: { itemId: 'lamellar-armor', level: 3, exp: 14 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 23,
y: 21
},
{
id: 'envoy-road-infantry-c',
name: '문빙 보병',
faction: 'enemy',
className: '포구 보병',
classKey: 'yellowTurban',
level: 25,
exp: 36,
hp: 64,
maxHp: 92,
attack: 24,
move: 3,
stats: { might: 112, intelligence: 78, leadership: 96, agility: 84, luck: 71 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 46 },
armor: { itemId: 'reinforced-lamellar', level: 3, exp: 22 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 31,
y: 16
},
{
id: 'envoy-road-infantry-d',
name: '문빙 보병',
faction: 'enemy',
className: '포구 보병',
classKey: 'yellowTurban',
level: 25,
exp: 36,
hp: 64,
maxHp: 92,
attack: 24,
move: 3,
stats: { might: 112, intelligence: 78, leadership: 96, agility: 84, luck: 71 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 46 },
armor: { itemId: 'reinforced-lamellar', level: 3, exp: 22 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 33,
y: 19
},
{
id: 'envoy-road-archer-a',
name: '강변 궁병',
faction: 'enemy',
className: '강변 궁병',
classKey: 'archer',
level: 24,
exp: 34,
hp: 56,
maxHp: 68,
attack: 24,
move: 3,
stats: { might: 98, intelligence: 88, leadership: 86, agility: 96, luck: 72 },
equipment: {
weapon: { itemId: 'short-bow', level: 3, exp: 42 },
armor: { itemId: 'cloth-armor', level: 3, exp: 16 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 20,
y: 15
},
{
id: 'envoy-road-archer-b',
name: '강변 궁병',
faction: 'enemy',
className: '언덕 궁병',
classKey: 'archer',
level: 24,
exp: 34,
hp: 56,
maxHp: 68,
attack: 24,
move: 3,
stats: { might: 98, intelligence: 88, leadership: 86, agility: 96, luck: 72 },
equipment: {
weapon: { itemId: 'short-bow', level: 3, exp: 42 },
armor: { itemId: 'cloth-armor', level: 3, exp: 16 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 27,
y: 14
},
{
id: 'envoy-road-archer-c',
name: '포구 궁병',
faction: 'enemy',
className: '포구 궁병',
classKey: 'archer',
level: 25,
exp: 36,
hp: 44,
maxHp: 52,
attack: 22,
move: 3,
stats: { might: 100, intelligence: 90, leadership: 88, agility: 98, luck: 72 },
equipment: {
weapon: { itemId: 'short-bow', level: 3, exp: 48 },
armor: { itemId: 'cloth-armor', level: 3, exp: 20 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 35,
y: 15
},
{
id: 'envoy-road-guard-a',
name: '포구 수비대',
faction: 'enemy',
className: '포구 수비대',
classKey: 'yellowTurban',
level: 26,
exp: 38,
hp: 52,
maxHp: 84,
attack: 22,
move: 3,
stats: { might: 118, intelligence: 80, leadership: 104, agility: 86, luck: 72 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 52 },
armor: { itemId: 'reinforced-lamellar', level: 3, exp: 28 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 35,
y: 18
},
{
id: 'envoy-road-guard-b',
name: '포구 수비대',
faction: 'enemy',
className: '포구 수비대',
classKey: 'yellowTurban',
level: 26,
exp: 38,
hp: 52,
maxHp: 84,
attack: 22,
move: 3,
stats: { might: 118, intelligence: 80, leadership: 104, agility: 86, luck: 72 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 52 },
armor: { itemId: 'reinforced-lamellar', level: 3, exp: 28 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 36,
y: 20
},
{
id: 'envoy-road-strategist-a',
name: '조조군 군리',
faction: 'enemy',
className: '군리',
classKey: 'archer',
level: 25,
exp: 36,
hp: 52,
maxHp: 64,
attack: 23,
move: 3,
stats: { might: 78, intelligence: 98, leadership: 90, agility: 86, luck: 74 },
equipment: {
weapon: { itemId: 'short-bow', level: 3, exp: 50 },
armor: { itemId: 'cloth-armor', level: 3, exp: 22 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 34,
y: 14
},
{
id: 'envoy-road-leader-wen-pin',
name: '문빙',
faction: 'enemy',
className: '조조군 추격장',
classKey: 'rebelLeader',
level: 27,
exp: 42,
hp: 84,
maxHp: 132,
attack: 26,
move: 4,
stats: { might: 120, intelligence: 86, leadership: 112, agility: 90, luck: 76 },
equipment: {
weapon: { itemId: 'leader-axe', level: 4, exp: 4 },
armor: { itemId: 'reinforced-lamellar', level: 3, exp: 36 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 37,
y: 17
}
];
const twentyFirstBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 4, y: 24 },
'guan-yu': { x: 6, y: 22 },
'zhang-fei': { x: 6, y: 25 },
'jian-yong': { x: 3, y: 26 },
'mi-zhu': { x: 5, y: 27 },
'sun-qian': { x: 8, y: 24 },
'zhao-yun': { x: 8, y: 21 },
'zhuge-liang': { x: 6, y: 23 }
};
export const twentyFirstBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits
].map((unit) => placeScenarioUnit(unit, twentyFirstBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
{
id: 'redcliff-vanguard-scout-a',
name: '조조 수군 척후',
faction: 'enemy',
className: '수군 척후',
classKey: 'bandit',
level: 26,
exp: 38,
hp: 74,
maxHp: 74,
attack: 29,
move: 4,
stats: { might: 106, intelligence: 78, leadership: 84, agility: 104, luck: 72 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 3, exp: 52 },
armor: { itemId: 'rebel-vest', level: 3, exp: 28 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 14,
y: 22
},
{
id: 'redcliff-vanguard-scout-b',
name: '조조 수군 척후',
faction: 'enemy',
className: '강변 척후',
classKey: 'bandit',
level: 26,
exp: 38,
hp: 74,
maxHp: 74,
attack: 29,
move: 4,
stats: { might: 106, intelligence: 78, leadership: 84, agility: 104, luck: 72 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 3, exp: 52 },
armor: { itemId: 'rebel-vest', level: 3, exp: 28 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 15,
y: 26
},
{
id: 'redcliff-vanguard-marine-a',
name: '조조 수군 보병',
faction: 'enemy',
className: '갑판 보병',
classKey: 'yellowTurban',
level: 26,
exp: 38,
hp: 96,
maxHp: 96,
attack: 31,
move: 3,
stats: { might: 116, intelligence: 80, leadership: 98, agility: 86, luck: 72 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 58 },
armor: { itemId: 'lamellar-armor', level: 3, exp: 34 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 19,
y: 20
},
{
id: 'redcliff-vanguard-marine-b',
name: '조조 수군 보병',
faction: 'enemy',
className: '갑판 보병',
classKey: 'yellowTurban',
level: 26,
exp: 38,
hp: 96,
maxHp: 96,
attack: 31,
move: 3,
stats: { might: 116, intelligence: 80, leadership: 98, agility: 86, luck: 72 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 58 },
armor: { itemId: 'lamellar-armor', level: 3, exp: 34 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 21,
y: 23
},
{
id: 'redcliff-vanguard-marine-c',
name: '조조 수군 보병',
faction: 'enemy',
className: '포구 보병',
classKey: 'yellowTurban',
level: 27,
exp: 40,
hp: 100,
maxHp: 100,
attack: 32,
move: 3,
stats: { might: 118, intelligence: 82, leadership: 100, agility: 88, luck: 73 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 64 },
armor: { itemId: 'reinforced-lamellar', level: 3, exp: 38 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 27,
y: 18
},
{
id: 'redcliff-vanguard-marine-d',
name: '조조 수군 보병',
faction: 'enemy',
className: '포구 보병',
classKey: 'yellowTurban',
level: 27,
exp: 40,
hp: 100,
maxHp: 100,
attack: 32,
move: 3,
stats: { might: 118, intelligence: 82, leadership: 100, agility: 88, luck: 73 },
equipment: {
weapon: { itemId: 'iron-spear', level: 3, exp: 64 },
armor: { itemId: 'reinforced-lamellar', level: 3, exp: 38 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 29,
y: 22
},
{
id: 'redcliff-vanguard-archer-a',
name: '조조 선상 궁병',
faction: 'enemy',
className: '선상 궁병',
classKey: 'archer',
level: 26,
exp: 38,
hp: 54,
maxHp: 54,
attack: 25,
move: 3,
stats: { might: 102, intelligence: 92, leadership: 90, agility: 100, luck: 74 },
equipment: {
weapon: { itemId: 'short-bow', level: 3, exp: 58 },
armor: { itemId: 'cloth-armor', level: 3, exp: 32 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 20,
y: 16
},
{
id: 'redcliff-vanguard-archer-b',
name: '조조 선상 궁병',
faction: 'enemy',
className: '선상 궁병',
classKey: 'archer',
level: 26,
exp: 38,
hp: 54,
maxHp: 54,
attack: 25,
move: 3,
stats: { might: 102, intelligence: 92, leadership: 90, agility: 100, luck: 74 },
equipment: {
weapon: { itemId: 'short-bow', level: 3, exp: 58 },
armor: { itemId: 'cloth-armor', level: 3, exp: 32 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 25,
y: 15
},
{
id: 'redcliff-vanguard-archer-c',
name: '조조 선상 궁병',
faction: 'enemy',
className: '강북 궁병',
classKey: 'archer',
level: 27,
exp: 40,
hp: 56,
maxHp: 56,
attack: 25,
move: 3,
stats: { might: 104, intelligence: 94, leadership: 92, agility: 102, luck: 74 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 2 },
armor: { itemId: 'cloth-armor', level: 3, exp: 36 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 33,
y: 17
},
{
id: 'redcliff-vanguard-cavalry-a',
name: '조조 강안 기병',
faction: 'enemy',
className: '강안 기병',
classKey: 'cavalry',
level: 27,
exp: 40,
hp: 82,
maxHp: 82,
attack: 27,
move: 5,
stats: { might: 120, intelligence: 78, leadership: 96, agility: 114, luck: 74 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 2 },
armor: { itemId: 'lamellar-armor', level: 3, exp: 42 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 17,
y: 25
},
{
id: 'redcliff-vanguard-cavalry-b',
name: '조조 강안 기병',
faction: 'enemy',
className: '강안 기병',
classKey: 'cavalry',
level: 27,
exp: 40,
hp: 82,
maxHp: 82,
attack: 27,
move: 5,
stats: { might: 120, intelligence: 78, leadership: 96, agility: 114, luck: 74 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 2 },
armor: { itemId: 'lamellar-armor', level: 3, exp: 42 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 23,
y: 26
},
{
id: 'redcliff-vanguard-cavalry-c',
name: '조조 강안 기병',
faction: 'enemy',
className: '강안 기병',
classKey: 'cavalry',
level: 28,
exp: 42,
hp: 84,
maxHp: 84,
attack: 28,
move: 5,
stats: { might: 122, intelligence: 80, leadership: 98, agility: 116, luck: 75 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 8 },
armor: { itemId: 'reinforced-lamellar', level: 3, exp: 46 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 31,
y: 24
},
{
id: 'redcliff-vanguard-guard-a',
name: '채모 친위',
faction: 'enemy',
className: '수군 친위',
classKey: 'yellowTurban',
level: 28,
exp: 42,
hp: 86,
maxHp: 86,
attack: 28,
move: 3,
stats: { might: 122, intelligence: 84, leadership: 106, agility: 90, luck: 75 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 10 },
armor: { itemId: 'reinforced-lamellar', level: 3, exp: 50 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 35,
y: 18
},
{
id: 'redcliff-vanguard-guard-b',
name: '채모 친위',
faction: 'enemy',
className: '수군 친위',
classKey: 'yellowTurban',
level: 28,
exp: 42,
hp: 86,
maxHp: 86,
attack: 28,
move: 3,
stats: { might: 122, intelligence: 84, leadership: 106, agility: 90, luck: 75 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 10 },
armor: { itemId: 'reinforced-lamellar', level: 3, exp: 50 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 36,
y: 21
},
{
id: 'redcliff-vanguard-strategist-a',
name: '수군 군리',
faction: 'enemy',
className: '수군 군리',
classKey: 'archer',
level: 27,
exp: 40,
hp: 56,
maxHp: 56,
attack: 25,
move: 3,
stats: { might: 80, intelligence: 100, leadership: 94, agility: 88, luck: 76 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 6 },
armor: { itemId: 'cloth-armor', level: 3, exp: 42 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 34,
y: 15
},
{
id: 'redcliff-vanguard-strategist-b',
name: '수군 군리',
faction: 'enemy',
className: '수군 군리',
classKey: 'archer',
level: 27,
exp: 40,
hp: 56,
maxHp: 56,
attack: 25,
move: 3,
stats: { might: 80, intelligence: 100, leadership: 94, agility: 88, luck: 76 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 6 },
armor: { itemId: 'cloth-armor', level: 3, exp: 42 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 37,
y: 16
},
{
id: 'redcliff-vanguard-leader-cai-mao',
name: '채모',
faction: 'enemy',
className: '조조 수군 선봉장',
classKey: 'rebelLeader',
level: 29,
exp: 46,
hp: 112,
maxHp: 124,
attack: 29,
move: 4,
stats: { might: 124, intelligence: 88, leadership: 116, agility: 92, luck: 78 },
equipment: {
weapon: { itemId: 'leader-axe', level: 4, exp: 14 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 4 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 39,
y: 19
}
];
const twentySecondBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 4, y: 23 },
'guan-yu': { x: 6, y: 21 },
'zhang-fei': { x: 6, y: 25 },
'jian-yong': { x: 3, y: 26 },
'mi-zhu': { x: 5, y: 27 },
'sun-qian': { x: 8, y: 23 },
'zhao-yun': { x: 8, y: 20 },
'zhuge-liang': { x: 6, y: 22 }
};
export const twentySecondBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits
].map((unit) => placeScenarioUnit(unit, twentySecondBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
{
id: 'redcliff-fire-scout-a',
name: '조조 화선 감시병',
faction: 'enemy',
className: '강안 척후',
classKey: 'bandit',
level: 28,
exp: 42,
hp: 66,
maxHp: 66,
attack: 27,
move: 4,
stats: { might: 110, intelligence: 82, leadership: 88, agility: 108, luck: 74 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 4 },
armor: { itemId: 'rebel-vest', level: 3, exp: 42 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 14,
y: 21
},
{
id: 'redcliff-fire-scout-b',
name: '조조 화선 감시병',
faction: 'enemy',
className: '강변 척후',
classKey: 'bandit',
level: 28,
exp: 42,
hp: 66,
maxHp: 66,
attack: 27,
move: 4,
stats: { might: 110, intelligence: 82, leadership: 88, agility: 108, luck: 74 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 4 },
armor: { itemId: 'rebel-vest', level: 3, exp: 42 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 16,
y: 24
},
{
id: 'redcliff-fire-marine-a',
name: '조조 갑판 보병',
faction: 'enemy',
className: '갑판 보병',
classKey: 'yellowTurban',
level: 28,
exp: 44,
hp: 84,
maxHp: 84,
attack: 27,
move: 3,
stats: { might: 120, intelligence: 82, leadership: 102, agility: 90, luck: 74 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 12 },
armor: { itemId: 'lamellar-armor', level: 4, exp: 2 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 21,
y: 19
},
{
id: 'redcliff-fire-marine-b',
name: '조조 갑판 보병',
faction: 'enemy',
className: '갑판 보병',
classKey: 'yellowTurban',
level: 28,
exp: 44,
hp: 84,
maxHp: 84,
attack: 27,
move: 3,
stats: { might: 120, intelligence: 82, leadership: 102, agility: 90, luck: 74 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 12 },
armor: { itemId: 'lamellar-armor', level: 4, exp: 2 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 23,
y: 21
},
{
id: 'redcliff-fire-marine-c',
name: '조조 갑판 보병',
faction: 'enemy',
className: '연환선 보병',
classKey: 'yellowTurban',
level: 29,
exp: 46,
hp: 82,
maxHp: 82,
attack: 27,
move: 3,
stats: { might: 122, intelligence: 84, leadership: 104, agility: 92, luck: 75 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 18 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 8 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 30,
y: 15
},
{
id: 'redcliff-fire-marine-d',
name: '조조 갑판 보병',
faction: 'enemy',
className: '연환선 보병',
classKey: 'yellowTurban',
level: 29,
exp: 46,
hp: 82,
maxHp: 82,
attack: 27,
move: 3,
stats: { might: 122, intelligence: 84, leadership: 104, agility: 92, luck: 75 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 18 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 8 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 32,
y: 17
},
{
id: 'redcliff-fire-archer-a',
name: '조조 선상 궁병',
faction: 'enemy',
className: '선상 궁병',
classKey: 'archer',
level: 28,
exp: 42,
hp: 52,
maxHp: 52,
attack: 24,
move: 3,
stats: { might: 106, intelligence: 96, leadership: 92, agility: 104, luck: 76 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 12 },
armor: { itemId: 'cloth-armor', level: 4, exp: 4 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 24,
y: 17
},
{
id: 'redcliff-fire-archer-b',
name: '조조 선상 궁병',
faction: 'enemy',
className: '선상 궁병',
classKey: 'archer',
level: 28,
exp: 42,
hp: 52,
maxHp: 52,
attack: 24,
move: 3,
stats: { might: 106, intelligence: 96, leadership: 92, agility: 104, luck: 76 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 12 },
armor: { itemId: 'cloth-armor', level: 4, exp: 4 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 26,
y: 18
},
{
id: 'redcliff-fire-archer-c',
name: '조조 연환 궁병',
faction: 'enemy',
className: '연환선 궁병',
classKey: 'archer',
level: 29,
exp: 46,
hp: 54,
maxHp: 54,
attack: 24,
move: 3,
stats: { might: 108, intelligence: 98, leadership: 94, agility: 106, luck: 76 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 20 },
armor: { itemId: 'cloth-armor', level: 4, exp: 8 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 35,
y: 12
},
{
id: 'redcliff-fire-archer-d',
name: '조조 연환 궁병',
faction: 'enemy',
className: '연환선 궁병',
classKey: 'archer',
level: 29,
exp: 46,
hp: 54,
maxHp: 54,
attack: 24,
move: 3,
stats: { might: 108, intelligence: 98, leadership: 94, agility: 106, luck: 76 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 20 },
armor: { itemId: 'cloth-armor', level: 4, exp: 8 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 37,
y: 17
},
{
id: 'redcliff-fire-cavalry-a',
name: '조조 강안 기병',
faction: 'enemy',
className: '강안 기병',
classKey: 'cavalry',
level: 29,
exp: 46,
hp: 84,
maxHp: 84,
attack: 29,
move: 5,
stats: { might: 126, intelligence: 82, leadership: 100, agility: 118, luck: 76 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 22 },
armor: { itemId: 'lamellar-armor', level: 4, exp: 12 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 18,
y: 25
},
{
id: 'redcliff-fire-cavalry-b',
name: '조조 강안 기병',
faction: 'enemy',
className: '강안 기병',
classKey: 'cavalry',
level: 29,
exp: 46,
hp: 80,
maxHp: 80,
attack: 28,
move: 5,
stats: { might: 126, intelligence: 82, leadership: 100, agility: 118, luck: 76 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 22 },
armor: { itemId: 'lamellar-armor', level: 4, exp: 12 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 28,
y: 20
},
{
id: 'redcliff-fire-cavalry-c',
name: '조조 강안 기병',
faction: 'enemy',
className: '강북 기병',
classKey: 'cavalry',
level: 30,
exp: 48,
hp: 82,
maxHp: 82,
attack: 28,
move: 5,
stats: { might: 128, intelligence: 84, leadership: 102, agility: 120, luck: 77 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 28 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 16 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 34,
y: 22
},
{
id: 'redcliff-fire-guard-a',
name: '조조 본선 친위',
faction: 'enemy',
className: '본선 친위',
classKey: 'yellowTurban',
level: 30,
exp: 50,
hp: 82,
maxHp: 82,
attack: 28,
move: 3,
stats: { might: 128, intelligence: 86, leadership: 110, agility: 94, luck: 78 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 34 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 22 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 38,
y: 13
},
{
id: 'redcliff-fire-guard-b',
name: '조조 본선 친위',
faction: 'enemy',
className: '본선 친위',
classKey: 'yellowTurban',
level: 30,
exp: 50,
hp: 82,
maxHp: 82,
attack: 28,
move: 3,
stats: { might: 128, intelligence: 86, leadership: 110, agility: 94, luck: 78 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 34 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 22 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 39,
y: 16
},
{
id: 'redcliff-fire-strategist-a',
name: '조조 수군 군리',
faction: 'enemy',
className: '연환선 군리',
classKey: 'archer',
level: 29,
exp: 48,
hp: 54,
maxHp: 54,
attack: 24,
move: 3,
stats: { might: 84, intelligence: 104, leadership: 98, agility: 90, luck: 78 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 28 },
armor: { itemId: 'cloth-armor', level: 4, exp: 14 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 36,
y: 11
},
{
id: 'redcliff-fire-strategist-b',
name: '조조 수군 군리',
faction: 'enemy',
className: '연환선 군리',
classKey: 'archer',
level: 29,
exp: 48,
hp: 54,
maxHp: 54,
attack: 24,
move: 3,
stats: { might: 84, intelligence: 104, leadership: 98, agility: 90, luck: 78 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 28 },
armor: { itemId: 'cloth-armor', level: 4, exp: 14 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 40,
y: 12
},
{
id: 'redcliff-fire-leader-cao-cao',
name: '조조',
faction: 'enemy',
className: '위왕군 총대장',
classKey: 'rebelLeader',
level: 32,
exp: 54,
hp: 110,
maxHp: 126,
attack: 30,
move: 4,
stats: { might: 130, intelligence: 118, leadership: 132, agility: 96, luck: 82 },
equipment: {
weapon: { itemId: 'leader-axe', level: 4, exp: 42 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 34 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 41,
y: 14
}
];
const twentyThirdBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 4, y: 25 },
'guan-yu': { x: 6, y: 23 },
'zhang-fei': { x: 6, y: 27 },
'jian-yong': { x: 3, y: 28 },
'mi-zhu': { x: 5, y: 29 },
'sun-qian': { x: 8, y: 25 },
'zhao-yun': { x: 8, y: 22 },
'zhuge-liang': { x: 6, y: 24 }
};
export const twentyThirdBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits
].map((unit) => placeScenarioUnit(unit, twentyThirdBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
{
id: 'jing-south-scout-a',
name: '형주 남부 척후',
faction: 'enemy',
className: '남부 척후',
classKey: 'bandit',
level: 30,
exp: 48,
hp: 82,
maxHp: 82,
attack: 33,
move: 4,
stats: { might: 114, intelligence: 84, leadership: 90, agility: 110, luck: 76 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 18 },
armor: { itemId: 'rebel-vest', level: 4, exp: 8 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 13,
y: 24
},
{
id: 'jing-south-scout-b',
name: '형주 남부 척후',
faction: 'enemy',
className: '마을 척후',
classKey: 'bandit',
level: 30,
exp: 48,
hp: 82,
maxHp: 82,
attack: 33,
move: 4,
stats: { might: 114, intelligence: 84, leadership: 90, agility: 110, luck: 76 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 18 },
armor: { itemId: 'rebel-vest', level: 4, exp: 8 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 14,
y: 28
},
{
id: 'jing-south-infantry-a',
name: '영릉 가병',
faction: 'enemy',
className: '영릉 가병',
classKey: 'yellowTurban',
level: 31,
exp: 50,
hp: 108,
maxHp: 108,
attack: 35,
move: 3,
stats: { might: 124, intelligence: 84, leadership: 104, agility: 92, luck: 76 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 30 },
armor: { itemId: 'lamellar-armor', level: 4, exp: 18 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 18,
y: 22
},
{
id: 'jing-south-infantry-b',
name: '영릉 가병',
faction: 'enemy',
className: '마을 가병',
classKey: 'yellowTurban',
level: 31,
exp: 50,
hp: 108,
maxHp: 108,
attack: 35,
move: 3,
stats: { might: 124, intelligence: 84, leadership: 104, agility: 92, luck: 76 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 30 },
armor: { itemId: 'lamellar-armor', level: 4, exp: 18 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 20,
y: 25
},
{
id: 'jing-south-infantry-c',
name: '영릉 가병',
faction: 'enemy',
className: '관문 가병',
classKey: 'yellowTurban',
level: 31,
exp: 52,
hp: 110,
maxHp: 110,
attack: 35,
move: 3,
stats: { might: 125, intelligence: 85, leadership: 106, agility: 92, luck: 76 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 34 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 20 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 28,
y: 18
},
{
id: 'jing-south-infantry-d',
name: '영릉 가병',
faction: 'enemy',
className: '관문 가병',
classKey: 'yellowTurban',
level: 31,
exp: 52,
hp: 110,
maxHp: 110,
attack: 35,
move: 3,
stats: { might: 125, intelligence: 85, leadership: 106, agility: 92, luck: 76 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 34 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 20 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 30,
y: 21
},
{
id: 'jing-south-archer-a',
name: '영릉 궁병',
faction: 'enemy',
className: '마을 궁병',
classKey: 'archer',
level: 30,
exp: 48,
hp: 80,
maxHp: 80,
attack: 34,
move: 3,
stats: { might: 108, intelligence: 98, leadership: 94, agility: 106, luck: 78 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 26 },
armor: { itemId: 'cloth-armor', level: 4, exp: 16 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 18,
y: 18
},
{
id: 'jing-south-archer-b',
name: '영릉 궁병',
faction: 'enemy',
className: '언덕 궁병',
classKey: 'archer',
level: 31,
exp: 50,
hp: 82,
maxHp: 82,
attack: 35,
move: 3,
stats: { might: 110, intelligence: 100, leadership: 96, agility: 108, luck: 78 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 32 },
armor: { itemId: 'cloth-armor', level: 4, exp: 20 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 25,
y: 16
},
{
id: 'jing-south-archer-c',
name: '영릉 궁병',
faction: 'enemy',
className: '성채 궁병',
classKey: 'archer',
level: 31,
exp: 52,
hp: 84,
maxHp: 84,
attack: 35,
move: 3,
stats: { might: 110, intelligence: 100, leadership: 96, agility: 108, luck: 78 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 36 },
armor: { itemId: 'cloth-armor', level: 4, exp: 22 },
accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
},
x: 36,
y: 14
},
{
id: 'jing-south-cavalry-a',
name: '영릉 기병',
faction: 'enemy',
className: '남부 기병',
classKey: 'cavalry',
level: 31,
exp: 52,
hp: 116,
maxHp: 116,
attack: 37,
move: 5,
stats: { might: 130, intelligence: 84, leadership: 104, agility: 122, luck: 78 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 40 },
armor: { itemId: 'lamellar-armor', level: 4, exp: 24 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 17,
y: 29
},
{
id: 'jing-south-cavalry-b',
name: '영릉 기병',
faction: 'enemy',
className: '남부 기병',
classKey: 'cavalry',
level: 31,
exp: 52,
hp: 116,
maxHp: 116,
attack: 37,
move: 5,
stats: { might: 130, intelligence: 84, leadership: 104, agility: 122, luck: 78 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 40 },
armor: { itemId: 'lamellar-armor', level: 4, exp: 24 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 26,
y: 27
},
{
id: 'jing-south-cavalry-c',
name: '영릉 기병',
faction: 'enemy',
className: '성채 기병',
classKey: 'cavalry',
level: 32,
exp: 54,
hp: 120,
maxHp: 120,
attack: 38,
move: 5,
stats: { might: 132, intelligence: 86, leadership: 106, agility: 124, luck: 79 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 46 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 28 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 35,
y: 23
},
{
id: 'jing-south-guard-a',
name: '형도영 친위',
faction: 'enemy',
className: '영릉 친위',
classKey: 'yellowTurban',
level: 32,
exp: 56,
hp: 122,
maxHp: 122,
attack: 38,
move: 3,
stats: { might: 132, intelligence: 88, leadership: 112, agility: 96, luck: 80 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 52 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 34 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 38,
y: 16
},
{
id: 'jing-south-guard-b',
name: '형도영 친위',
faction: 'enemy',
className: '영릉 친위',
classKey: 'yellowTurban',
level: 32,
exp: 56,
hp: 122,
maxHp: 122,
attack: 38,
move: 3,
stats: { might: 132, intelligence: 88, leadership: 112, agility: 96, luck: 80 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 52 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 34 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 39,
y: 19
},
{
id: 'jing-south-strategist-a',
name: '영릉 문객',
faction: 'enemy',
className: '남부 문객',
classKey: 'archer',
level: 31,
exp: 52,
hp: 86,
maxHp: 86,
attack: 34,
move: 3,
stats: { might: 84, intelligence: 106, leadership: 100, agility: 92, luck: 80 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 44 },
armor: { itemId: 'cloth-armor', level: 4, exp: 28 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 36,
y: 13
},
{
id: 'jing-south-strategist-b',
name: '영릉 문객',
faction: 'enemy',
className: '남부 문객',
classKey: 'archer',
level: 31,
exp: 52,
hp: 86,
maxHp: 86,
attack: 34,
move: 3,
stats: { might: 84, intelligence: 106, leadership: 100, agility: 92, luck: 80 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 44 },
armor: { itemId: 'cloth-armor', level: 4, exp: 28 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 40,
y: 14
},
{
id: 'jing-south-leader-xing-daorong',
name: '형도영',
faction: 'enemy',
className: '영릉 맹장',
classKey: 'rebelLeader',
level: 33,
exp: 58,
hp: 164,
maxHp: 164,
attack: 41,
move: 4,
stats: { might: 136, intelligence: 76, leadership: 118, agility: 96, luck: 80 },
equipment: {
weapon: { itemId: 'leader-axe', level: 4, exp: 58 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 40 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 42,
y: 17
}
];
const twentyFourthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 5, y: 24 },
'guan-yu': { x: 7, y: 22 },
'zhang-fei': { x: 7, y: 27 },
'jian-yong': { x: 4, y: 28 },
'mi-zhu': { x: 5, y: 29 },
'sun-qian': { x: 9, y: 25 },
'zhao-yun': { x: 9, y: 22 },
'zhuge-liang': { x: 6, y: 24 },
'ma-liang': { x: 8, y: 26 }
};
export const twentyFourthBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits
].map((unit) => placeScenarioUnit(unit, twentyFourthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
{
id: 'guiyang-scout-a',
name: '계양 산길 척후',
faction: 'enemy',
className: '산길 척후',
classKey: 'bandit',
level: 31,
exp: 50,
hp: 86,
maxHp: 86,
attack: 34,
move: 4,
stats: { might: 116, intelligence: 86, leadership: 92, agility: 112, luck: 78 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 22 },
armor: { itemId: 'rebel-vest', level: 4, exp: 10 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 15,
y: 23
},
{
id: 'guiyang-scout-b',
name: '계양 산길 척후',
faction: 'enemy',
className: '서문 척후',
classKey: 'bandit',
level: 31,
exp: 50,
hp: 86,
maxHp: 86,
attack: 34,
move: 4,
stats: { might: 116, intelligence: 86, leadership: 92, agility: 112, luck: 78 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 22 },
armor: { itemId: 'rebel-vest', level: 4, exp: 10 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 17,
y: 28
},
{
id: 'guiyang-infantry-a',
name: '계양 보병',
faction: 'enemy',
className: '계양 보병',
classKey: 'yellowTurban',
level: 32,
exp: 52,
hp: 112,
maxHp: 112,
attack: 36,
move: 3,
stats: { might: 126, intelligence: 86, leadership: 108, agility: 94, luck: 78 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 34 },
armor: { itemId: 'lamellar-armor', level: 4, exp: 20 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 22,
y: 21
},
{
id: 'guiyang-infantry-b',
name: '계양 보병',
faction: 'enemy',
className: '마을 보병',
classKey: 'yellowTurban',
level: 32,
exp: 52,
hp: 112,
maxHp: 112,
attack: 36,
move: 3,
stats: { might: 126, intelligence: 86, leadership: 108, agility: 94, luck: 78 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 34 },
armor: { itemId: 'lamellar-armor', level: 4, exp: 20 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 24,
y: 25
},
{
id: 'guiyang-infantry-c',
name: '계양 보병',
faction: 'enemy',
className: '성문 보병',
classKey: 'yellowTurban',
level: 33,
exp: 54,
hp: 116,
maxHp: 116,
attack: 37,
move: 3,
stats: { might: 128, intelligence: 86, leadership: 110, agility: 94, luck: 78 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 38 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 22 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 35,
y: 18
},
{
id: 'guiyang-infantry-d',
name: '계양 보병',
faction: 'enemy',
className: '성문 보병',
classKey: 'yellowTurban',
level: 33,
exp: 54,
hp: 116,
maxHp: 116,
attack: 37,
move: 3,
stats: { might: 128, intelligence: 86, leadership: 110, agility: 94, luck: 78 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 38 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 22 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 38,
y: 21
},
{
id: 'guiyang-archer-a',
name: '계양 궁병',
faction: 'enemy',
className: '계양 궁병',
classKey: 'archer',
level: 32,
exp: 50,
hp: 84,
maxHp: 84,
attack: 34,
move: 3,
stats: { might: 88, intelligence: 92, leadership: 96, agility: 104, luck: 80 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 32 },
armor: { itemId: 'cloth-armor', level: 4, exp: 18 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 28,
y: 17
},
{
id: 'guiyang-archer-b',
name: '계양 궁병',
faction: 'enemy',
className: '언덕 궁병',
classKey: 'archer',
level: 32,
exp: 50,
hp: 84,
maxHp: 84,
attack: 34,
move: 3,
stats: { might: 88, intelligence: 92, leadership: 96, agility: 104, luck: 80 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 32 },
armor: { itemId: 'cloth-armor', level: 4, exp: 18 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 31,
y: 22
},
{
id: 'guiyang-archer-c',
name: '계양 궁병',
faction: 'enemy',
className: '성루 궁병',
classKey: 'archer',
level: 33,
exp: 52,
hp: 86,
maxHp: 86,
attack: 35,
move: 3,
stats: { might: 90, intelligence: 94, leadership: 98, agility: 104, luck: 80 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 36 },
armor: { itemId: 'cloth-armor', level: 4, exp: 20 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 41,
y: 16
},
{
id: 'guiyang-cavalry-a',
name: '계양 기병',
faction: 'enemy',
className: '계양 기병',
classKey: 'cavalry',
level: 33,
exp: 54,
hp: 122,
maxHp: 122,
attack: 38,
move: 5,
stats: { might: 130, intelligence: 86, leadership: 108, agility: 112, luck: 82 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 40 },
armor: { itemId: 'lamellar-armor', level: 4, exp: 24 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 26,
y: 28
},
{
id: 'guiyang-cavalry-b',
name: '계양 기병',
faction: 'enemy',
className: '남문 기병',
classKey: 'cavalry',
level: 33,
exp: 54,
hp: 122,
maxHp: 122,
attack: 38,
move: 5,
stats: { might: 130, intelligence: 86, leadership: 108, agility: 112, luck: 82 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 40 },
armor: { itemId: 'lamellar-armor', level: 4, exp: 24 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 34,
y: 26
},
{
id: 'guiyang-cavalry-c',
name: '계양 기병',
faction: 'enemy',
className: '성채 기병',
classKey: 'cavalry',
level: 34,
exp: 56,
hp: 126,
maxHp: 126,
attack: 39,
move: 5,
stats: { might: 132, intelligence: 88, leadership: 110, agility: 114, luck: 82 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 42 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 26 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 39,
y: 24
},
{
id: 'guiyang-guard-a',
name: '조범 친위대',
faction: 'enemy',
className: '계양 친위대',
classKey: 'yellowTurban',
level: 34,
exp: 58,
hp: 124,
maxHp: 124,
attack: 39,
move: 3,
stats: { might: 132, intelligence: 88, leadership: 114, agility: 96, luck: 82 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 44 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 30 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 42,
y: 18
},
{
id: 'guiyang-guard-b',
name: '조범 친위대',
faction: 'enemy',
className: '계양 친위대',
classKey: 'yellowTurban',
level: 34,
exp: 58,
hp: 124,
maxHp: 124,
attack: 39,
move: 3,
stats: { might: 132, intelligence: 88, leadership: 114, agility: 96, luck: 82 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 44 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 30 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 43,
y: 21
},
{
id: 'guiyang-strategist-a',
name: '계양 책사',
faction: 'enemy',
className: '계양 책사',
classKey: 'archer',
level: 33,
exp: 54,
hp: 88,
maxHp: 88,
attack: 35,
move: 3,
stats: { might: 86, intelligence: 108, leadership: 100, agility: 92, luck: 82 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 34 },
armor: { itemId: 'cloth-armor', level: 4, exp: 18 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 37,
y: 16
},
{
id: 'guiyang-strategist-b',
name: '계양 책사',
faction: 'enemy',
className: '성내 책사',
classKey: 'archer',
level: 33,
exp: 54,
hp: 88,
maxHp: 88,
attack: 35,
move: 3,
stats: { might: 86, intelligence: 108, leadership: 100, agility: 92, luck: 82 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 34 },
armor: { itemId: 'cloth-armor', level: 4, exp: 18 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 40,
y: 19
},
{
id: 'guiyang-leader-zhao-fan',
name: '조범',
faction: 'enemy',
className: '계양 태수',
classKey: 'rebelLeader',
level: 35,
exp: 60,
hp: 172,
maxHp: 172,
attack: 42,
move: 4,
stats: { might: 134, intelligence: 96, leadership: 122, agility: 98, luck: 84 },
equipment: {
weapon: { itemId: 'leader-axe', level: 4, exp: 62 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 44 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 44,
y: 19
}
];
const twentyFifthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 4, y: 28 },
'guan-yu': { x: 6, y: 26 },
'zhang-fei': { x: 6, y: 30 },
'jian-yong': { x: 3, y: 31 },
'mi-zhu': { x: 4, y: 32 },
'sun-qian': { x: 8, y: 29 },
'zhao-yun': { x: 8, y: 26 },
'zhuge-liang': { x: 5, y: 28 },
'ma-liang': { x: 7, y: 31 },
'yi-ji': { x: 9, y: 28 }
};
export const twentyFifthBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits
].map((unit) => placeScenarioUnit(unit, twentyFifthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
{
id: 'wuling-scout-a',
name: '무릉 산길 척후',
faction: 'enemy',
className: '산길 척후',
classKey: 'bandit',
level: 34,
exp: 52,
hp: 40,
maxHp: 40,
attack: 14,
move: 4,
stats: { might: 120, intelligence: 88, leadership: 96, agility: 116, luck: 80 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 28 },
armor: { itemId: 'rebel-vest', level: 4, exp: 16 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 13,
y: 27
},
{
id: 'wuling-scout-b',
name: '무릉 산길 척후',
faction: 'enemy',
className: '북릉 척후',
classKey: 'bandit',
level: 34,
exp: 52,
hp: 40,
maxHp: 40,
attack: 14,
move: 4,
stats: { might: 120, intelligence: 88, leadership: 96, agility: 116, luck: 80 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 28 },
armor: { itemId: 'rebel-vest', level: 4, exp: 16 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 16,
y: 23
},
{
id: 'wuling-scout-c',
name: '무릉 산길 척후',
faction: 'enemy',
className: '서곡 척후',
classKey: 'bandit',
level: 35,
exp: 54,
hp: 44,
maxHp: 44,
attack: 15,
move: 4,
stats: { might: 122, intelligence: 88, leadership: 98, agility: 118, luck: 80 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 30 },
armor: { itemId: 'rebel-vest', level: 4, exp: 18 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 20,
y: 29
},
{
id: 'wuling-bandit-a',
name: '무릉 산적',
faction: 'enemy',
className: '산적',
classKey: 'bandit',
level: 34,
exp: 52,
hp: 48,
maxHp: 48,
attack: 16,
move: 4,
stats: { might: 126, intelligence: 80, leadership: 92, agility: 112, luck: 78 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 30 },
armor: { itemId: 'rebel-vest', level: 4, exp: 18 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 18,
y: 17
},
{
id: 'wuling-bandit-b',
name: '무릉 산적',
faction: 'enemy',
className: '숲길 산적',
classKey: 'bandit',
level: 34,
exp: 52,
hp: 48,
maxHp: 48,
attack: 16,
move: 4,
stats: { might: 126, intelligence: 80, leadership: 92, agility: 112, luck: 78 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 30 },
armor: { itemId: 'rebel-vest', level: 4, exp: 18 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 23,
y: 20
},
{
id: 'wuling-bandit-c',
name: '무릉 산적',
faction: 'enemy',
className: '협곡 산적',
classKey: 'bandit',
level: 35,
exp: 54,
hp: 50,
maxHp: 50,
attack: 17,
move: 4,
stats: { might: 128, intelligence: 82, leadership: 94, agility: 114, luck: 78 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 32 },
armor: { itemId: 'rebel-vest', level: 4, exp: 20 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 25,
y: 13
},
{
id: 'wuling-infantry-a',
name: '무릉 보병',
faction: 'enemy',
className: '무릉 보병',
classKey: 'yellowTurban',
level: 35,
exp: 54,
hp: 70,
maxHp: 70,
attack: 24,
move: 3,
stats: { might: 132, intelligence: 88, leadership: 112, agility: 96, luck: 80 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 42 },
armor: { itemId: 'lamellar-armor', level: 4, exp: 26 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 27,
y: 23
},
{
id: 'wuling-infantry-b',
name: '무릉 보병',
faction: 'enemy',
className: '마을 보병',
classKey: 'yellowTurban',
level: 35,
exp: 54,
hp: 70,
maxHp: 70,
attack: 24,
move: 3,
stats: { might: 132, intelligence: 88, leadership: 112, agility: 96, luck: 80 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 42 },
armor: { itemId: 'lamellar-armor', level: 4, exp: 26 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 31,
y: 26
},
{
id: 'wuling-infantry-c',
name: '무릉 보병',
faction: 'enemy',
className: '산문 보병',
classKey: 'yellowTurban',
level: 36,
exp: 56,
hp: 70,
maxHp: 70,
attack: 24,
move: 3,
stats: { might: 134, intelligence: 88, leadership: 114, agility: 96, luck: 80 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 46 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 30 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 37,
y: 18
},
{
id: 'wuling-infantry-d',
name: '무릉 보병',
faction: 'enemy',
className: '성채 보병',
classKey: 'yellowTurban',
level: 36,
exp: 56,
hp: 70,
maxHp: 70,
attack: 24,
move: 3,
stats: { might: 134, intelligence: 88, leadership: 114, agility: 96, luck: 80 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 46 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 30 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 41,
y: 14
},
{
id: 'wuling-archer-a',
name: '무릉 궁병',
faction: 'enemy',
className: '능선 궁병',
classKey: 'archer',
level: 35,
exp: 54,
hp: 50,
maxHp: 50,
attack: 20,
move: 3,
stats: { might: 92, intelligence: 96, leadership: 100, agility: 108, luck: 82 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 38 },
armor: { itemId: 'cloth-armor', level: 4, exp: 22 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 24,
y: 16
},
{
id: 'wuling-archer-b',
name: '무릉 궁병',
faction: 'enemy',
className: '산채 궁병',
classKey: 'archer',
level: 35,
exp: 54,
hp: 50,
maxHp: 50,
attack: 20,
move: 3,
stats: { might: 92, intelligence: 96, leadership: 100, agility: 108, luck: 82 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 38 },
armor: { itemId: 'cloth-armor', level: 4, exp: 22 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 34,
y: 21
},
{
id: 'wuling-archer-c',
name: '무릉 궁병',
faction: 'enemy',
className: '성루 궁병',
classKey: 'archer',
level: 36,
exp: 56,
hp: 50,
maxHp: 50,
attack: 22,
move: 3,
stats: { might: 94, intelligence: 98, leadership: 102, agility: 110, luck: 82 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 42 },
armor: { itemId: 'cloth-armor', level: 4, exp: 24 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 43,
y: 16
},
{
id: 'wuling-cavalry-a',
name: '무릉 기병',
faction: 'enemy',
className: '산길 기병',
classKey: 'cavalry',
level: 36,
exp: 56,
hp: 52,
maxHp: 52,
attack: 18,
move: 5,
stats: { might: 136, intelligence: 88, leadership: 112, agility: 116, luck: 82 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 48 },
armor: { itemId: 'lamellar-armor', level: 4, exp: 30 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 30,
y: 29
},
{
id: 'wuling-cavalry-b',
name: '무릉 기병',
faction: 'enemy',
className: '동릉 기병',
classKey: 'cavalry',
level: 36,
exp: 56,
hp: 60,
maxHp: 60,
attack: 22,
move: 5,
stats: { might: 136, intelligence: 88, leadership: 112, agility: 116, luck: 82 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 48 },
armor: { itemId: 'lamellar-armor', level: 4, exp: 30 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 36,
y: 27
},
{
id: 'wuling-guard-a',
name: '김선 친위대',
faction: 'enemy',
className: '무릉 친위대',
classKey: 'yellowTurban',
level: 37,
exp: 58,
hp: 55,
maxHp: 55,
attack: 24,
move: 3,
stats: { might: 138, intelligence: 90, leadership: 118, agility: 98, luck: 82 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 52 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 34 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 44,
y: 13
},
{
id: 'wuling-guard-b',
name: '김선 친위대',
faction: 'enemy',
className: '무릉 친위대',
classKey: 'yellowTurban',
level: 37,
exp: 58,
hp: 55,
maxHp: 55,
attack: 24,
move: 3,
stats: { might: 138, intelligence: 90, leadership: 118, agility: 98, luck: 82 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 52 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 34 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 45,
y: 16
},
{
id: 'wuling-strategist-a',
name: '무릉 책사',
faction: 'enemy',
className: '무릉 책사',
classKey: 'archer',
level: 36,
exp: 56,
hp: 40,
maxHp: 40,
attack: 20,
move: 3,
stats: { might: 88, intelligence: 112, leadership: 104, agility: 94, luck: 84 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 42 },
armor: { itemId: 'cloth-armor', level: 4, exp: 24 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 42,
y: 12
},
{
id: 'wuling-leader-jin-xuan',
name: '김선',
faction: 'enemy',
className: '무릉 태수',
classKey: 'rebelLeader',
level: 38,
exp: 62,
hp: 70,
maxHp: 120,
attack: 26,
move: 4,
stats: { might: 140, intelligence: 98, leadership: 126, agility: 100, luck: 84 },
equipment: {
weapon: { itemId: 'leader-axe', level: 4, exp: 68 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 48 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 46,
y: 14
}
];
const twentySixthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 4, y: 27 },
'guan-yu': { x: 6, y: 25 },
'zhang-fei': { x: 6, y: 29 },
'jian-yong': { x: 3, y: 30 },
'mi-zhu': { x: 4, y: 31 },
'sun-qian': { x: 8, y: 28 },
'zhao-yun': { x: 8, y: 25 },
'zhuge-liang': { x: 5, y: 27 },
'ma-liang': { x: 7, y: 30 },
'yi-ji': { x: 9, y: 27 },
'gong-zhi': { x: 9, y: 30 }
};
export const twentySixthBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits
].map((unit) => placeScenarioUnit(unit, twentySixthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
{
id: 'changsha-scout-a',
name: '장사 척후',
faction: 'enemy',
className: '장사 척후',
classKey: 'bandit',
level: 37,
exp: 56,
hp: 100,
maxHp: 100,
attack: 38,
move: 4,
stats: { might: 124, intelligence: 90, leadership: 100, agility: 118, luck: 82 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 36 },
armor: { itemId: 'rebel-vest', level: 4, exp: 22 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 14,
y: 25
},
{
id: 'changsha-scout-b',
name: '장사 척후',
faction: 'enemy',
className: '서문 척후',
classKey: 'bandit',
level: 37,
exp: 56,
hp: 100,
maxHp: 100,
attack: 38,
move: 4,
stats: { might: 124, intelligence: 90, leadership: 100, agility: 118, luck: 82 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 36 },
armor: { itemId: 'rebel-vest', level: 4, exp: 22 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 17,
y: 30
},
{
id: 'changsha-infantry-a',
name: '장사 보병',
faction: 'enemy',
className: '장사 보병',
classKey: 'yellowTurban',
level: 38,
exp: 58,
hp: 130,
maxHp: 130,
attack: 42,
move: 3,
stats: { might: 138, intelligence: 90, leadership: 116, agility: 98, luck: 82 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 50 },
armor: { itemId: 'lamellar-armor', level: 4, exp: 34 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 23,
y: 24
},
{
id: 'changsha-infantry-b',
name: '장사 보병',
faction: 'enemy',
className: '마을 보병',
classKey: 'yellowTurban',
level: 38,
exp: 58,
hp: 130,
maxHp: 130,
attack: 42,
move: 3,
stats: { might: 138, intelligence: 90, leadership: 116, agility: 98, luck: 82 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 50 },
armor: { itemId: 'lamellar-armor', level: 4, exp: 34 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 26,
y: 28
},
{
id: 'changsha-infantry-c',
name: '장사 보병',
faction: 'enemy',
className: '성문 보병',
classKey: 'yellowTurban',
level: 39,
exp: 60,
hp: 136,
maxHp: 136,
attack: 43,
move: 3,
stats: { might: 140, intelligence: 90, leadership: 118, agility: 98, luck: 82 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 54 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 38 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 34,
y: 20
},
{
id: 'changsha-infantry-d',
name: '장사 보병',
faction: 'enemy',
className: '성내 보병',
classKey: 'yellowTurban',
level: 39,
exp: 60,
hp: 136,
maxHp: 136,
attack: 43,
move: 3,
stats: { might: 140, intelligence: 90, leadership: 118, agility: 98, luck: 82 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 54 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 38 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 39,
y: 17
},
{
id: 'changsha-archer-a',
name: '장사 궁병',
faction: 'enemy',
className: '장사 궁병',
classKey: 'archer',
level: 38,
exp: 58,
hp: 98,
maxHp: 98,
attack: 39,
move: 3,
stats: { might: 96, intelligence: 98, leadership: 104, agility: 112, luck: 84 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 46 },
armor: { itemId: 'cloth-armor', level: 4, exp: 28 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 28,
y: 20
},
{
id: 'changsha-archer-b',
name: '장사 궁병',
faction: 'enemy',
className: '성루 궁병',
classKey: 'archer',
level: 38,
exp: 58,
hp: 98,
maxHp: 98,
attack: 39,
move: 3,
stats: { might: 96, intelligence: 98, leadership: 104, agility: 112, luck: 84 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 46 },
armor: { itemId: 'cloth-armor', level: 4, exp: 28 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 37,
y: 13
},
{
id: 'changsha-archer-c',
name: '장사 궁병',
faction: 'enemy',
className: '동문 궁병',
classKey: 'archer',
level: 39,
exp: 60,
hp: 102,
maxHp: 102,
attack: 40,
move: 3,
stats: { might: 98, intelligence: 100, leadership: 106, agility: 114, luck: 84 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 50 },
armor: { itemId: 'cloth-armor', level: 4, exp: 30 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 44,
y: 19
},
{
id: 'changsha-cavalry-a',
name: '장사 기병',
faction: 'enemy',
className: '장사 기병',
classKey: 'cavalry',
level: 39,
exp: 60,
hp: 138,
maxHp: 138,
attack: 44,
move: 5,
stats: { might: 140, intelligence: 90, leadership: 116, agility: 118, luck: 84 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 56 },
armor: { itemId: 'lamellar-armor', level: 4, exp: 36 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 31,
y: 29
},
{
id: 'changsha-cavalry-b',
name: '장사 기병',
faction: 'enemy',
className: '동문 기병',
classKey: 'cavalry',
level: 39,
exp: 60,
hp: 138,
maxHp: 138,
attack: 44,
move: 5,
stats: { might: 140, intelligence: 90, leadership: 116, agility: 118, luck: 84 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 56 },
armor: { itemId: 'lamellar-armor', level: 4, exp: 36 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 42,
y: 28
},
{
id: 'changsha-guard-a',
name: '한현 친위대',
faction: 'enemy',
className: '장사 친위대',
classKey: 'yellowTurban',
level: 40,
exp: 62,
hp: 132,
maxHp: 132,
attack: 41,
move: 3,
stats: { might: 144, intelligence: 92, leadership: 122, agility: 100, luck: 84 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 62 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 42 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 45,
y: 15
},
{
id: 'changsha-guard-b',
name: '한현 친위대',
faction: 'enemy',
className: '장사 친위대',
classKey: 'yellowTurban',
level: 40,
exp: 62,
hp: 132,
maxHp: 132,
attack: 41,
move: 3,
stats: { might: 144, intelligence: 92, leadership: 122, agility: 100, luck: 84 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 62 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 42 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 47,
y: 18
},
{
id: 'changsha-strategist-a',
name: '장사 책사',
faction: 'enemy',
className: '장사 책사',
classKey: 'archer',
level: 39,
exp: 60,
hp: 88,
maxHp: 88,
attack: 36,
move: 3,
stats: { might: 90, intelligence: 116, leadership: 108, agility: 96, luck: 84 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 50 },
armor: { itemId: 'cloth-armor', level: 4, exp: 30 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 41,
y: 14
},
{
id: 'changsha-strategist-b',
name: '장사 책사',
faction: 'enemy',
className: '의심 많은 책사',
classKey: 'archer',
level: 39,
exp: 60,
hp: 88,
maxHp: 88,
attack: 36,
move: 3,
stats: { might: 90, intelligence: 116, leadership: 108, agility: 96, luck: 84 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 50 },
armor: { itemId: 'cloth-armor', level: 4, exp: 30 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 43,
y: 16
},
{
id: 'changsha-veteran-huang-zhong',
name: '황충',
faction: 'enemy',
className: '장사 노장',
classKey: 'archer',
level: 41,
exp: 66,
hp: 140,
maxHp: 150,
attack: 43,
move: 4,
stats: { might: 150, intelligence: 96, leadership: 128, agility: 108, luck: 88 },
equipment: {
weapon: { itemId: 'short-bow', level: 5, exp: 18 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 48 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 38,
y: 17
},
{
id: 'changsha-officer-wei-yan',
name: '위연',
faction: 'enemy',
className: '장사 돌격장',
classKey: 'yellowTurban',
level: 40,
exp: 64,
hp: 140,
maxHp: 148,
attack: 43,
move: 4,
stats: { might: 148, intelligence: 82, leadership: 120, agility: 112, luck: 80 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 12 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 44 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 36,
y: 23
},
{
id: 'changsha-leader-han-xuan',
name: '한현',
faction: 'enemy',
className: '장사 태수',
classKey: 'rebelLeader',
level: 41,
exp: 66,
hp: 174,
maxHp: 186,
attack: 42,
move: 4,
stats: { might: 138, intelligence: 104, leadership: 130, agility: 100, luck: 84 },
equipment: {
weapon: { itemId: 'leader-axe', level: 5, exp: 10 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 8 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 48,
y: 16
}
];
const twentySeventhBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 4, y: 30 },
'guan-yu': { x: 6, y: 29 },
'zhang-fei': { x: 5, y: 32 },
'jian-yong': { x: 3, y: 33 },
'mi-zhu': { x: 4, y: 34 },
'sun-qian': { x: 7, y: 33 },
'zhao-yun': { x: 8, y: 30 },
'zhuge-liang': { x: 5, y: 30 },
'ma-liang': { x: 8, y: 34 },
'yi-ji': { x: 9, y: 32 },
'gong-zhi': { x: 10, y: 34 },
'huang-zhong': { x: 7, y: 31 },
'wei-yan': { x: 9, y: 29 }
};
export const twentySeventhBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits
].map((unit) => placeScenarioUnit(unit, twentySeventhBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
{
id: 'yizhou-scout-a',
name: '익주 척후',
faction: 'enemy',
className: '산길 척후',
classKey: 'bandit',
level: 41,
exp: 62,
hp: 106,
maxHp: 106,
attack: 40,
move: 4,
stats: { might: 128, intelligence: 92, leadership: 104, agility: 120, luck: 84 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 42 },
armor: { itemId: 'rebel-vest', level: 4, exp: 28 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 16,
y: 30
},
{
id: 'yizhou-scout-b',
name: '익주 척후',
faction: 'enemy',
className: '관문 척후',
classKey: 'bandit',
level: 41,
exp: 62,
hp: 106,
maxHp: 106,
attack: 40,
move: 4,
stats: { might: 128, intelligence: 92, leadership: 104, agility: 120, luck: 84 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 42 },
armor: { itemId: 'rebel-vest', level: 4, exp: 28 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 20,
y: 28
},
{
id: 'yizhou-infantry-a',
name: '익주 보병',
faction: 'enemy',
className: '원군로 보병',
classKey: 'yellowTurban',
level: 42,
exp: 64,
hp: 140,
maxHp: 140,
attack: 44,
move: 3,
stats: { might: 142, intelligence: 92, leadership: 120, agility: 100, luck: 84 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 58 },
armor: { itemId: 'lamellar-armor', level: 4, exp: 42 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 24,
y: 27
},
{
id: 'yizhou-infantry-b',
name: '익주 보병',
faction: 'enemy',
className: '고개 보병',
classKey: 'yellowTurban',
level: 42,
exp: 64,
hp: 140,
maxHp: 140,
attack: 44,
move: 3,
stats: { might: 142, intelligence: 92, leadership: 120, agility: 100, luck: 84 },
equipment: {
weapon: { itemId: 'iron-spear', level: 4, exp: 58 },
armor: { itemId: 'lamellar-armor', level: 4, exp: 42 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 28,
y: 24
},
{
id: 'yizhou-infantry-c',
name: '익주 보병',
faction: 'enemy',
className: '관문 보병',
classKey: 'yellowTurban',
level: 43,
exp: 66,
hp: 132,
maxHp: 132,
attack: 42,
move: 3,
stats: { might: 146, intelligence: 94, leadership: 124, agility: 102, luck: 84 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 8 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 48 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 35,
y: 21
},
{
id: 'yizhou-infantry-d',
name: '익주 보병',
faction: 'enemy',
className: '성문 보병',
classKey: 'yellowTurban',
level: 43,
exp: 66,
hp: 132,
maxHp: 132,
attack: 42,
move: 3,
stats: { might: 146, intelligence: 94, leadership: 124, agility: 102, luck: 84 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 8 },
armor: { itemId: 'reinforced-lamellar', level: 4, exp: 48 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 40,
y: 17
},
{
id: 'yizhou-archer-a',
name: '익주 궁병',
faction: 'enemy',
className: '산비탈 궁병',
classKey: 'archer',
level: 42,
exp: 64,
hp: 104,
maxHp: 104,
attack: 42,
move: 3,
stats: { might: 102, intelligence: 102, leadership: 108, agility: 116, luck: 86 },
equipment: {
weapon: { itemId: 'short-bow', level: 4, exp: 54 },
armor: { itemId: 'cloth-armor', level: 4, exp: 34 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 30,
y: 21
},
{
id: 'yizhou-archer-b',
name: '익주 궁병',
faction: 'enemy',
className: '관문 궁병',
classKey: 'archer',
level: 43,
exp: 66,
hp: 96,
maxHp: 96,
attack: 38,
move: 3,
stats: { might: 104, intelligence: 104, leadership: 110, agility: 118, luck: 86 },
equipment: {
weapon: { itemId: 'short-bow', level: 5, exp: 4 },
armor: { itemId: 'cloth-armor', level: 4, exp: 38 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 42,
y: 15
},
{
id: 'yizhou-archer-c',
name: '익주 궁병',
faction: 'enemy',
className: '성루 궁병',
classKey: 'archer',
level: 43,
exp: 66,
hp: 96,
maxHp: 96,
attack: 38,
move: 3,
stats: { might: 104, intelligence: 104, leadership: 110, agility: 118, luck: 86 },
equipment: {
weapon: { itemId: 'short-bow', level: 5, exp: 4 },
armor: { itemId: 'cloth-armor', level: 4, exp: 38 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 47,
y: 19
},
{
id: 'yizhou-cavalry-a',
name: '익주 기병',
faction: 'enemy',
className: '원군로 기병',
classKey: 'cavalry',
level: 43,
exp: 66,
hp: 132,
maxHp: 132,
attack: 42,
move: 5,
stats: { might: 146, intelligence: 92, leadership: 120, agility: 120, luck: 86 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 10 },
armor: { itemId: 'lamellar-armor', level: 4, exp: 44 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 22,
y: 31
},
{
id: 'yizhou-cavalry-b',
name: '익주 기병',
faction: 'enemy',
className: '산문 기병',
classKey: 'cavalry',
level: 43,
exp: 66,
hp: 132,
maxHp: 132,
attack: 42,
move: 5,
stats: { might: 146, intelligence: 92, leadership: 120, agility: 120, luck: 86 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 10 },
armor: { itemId: 'lamellar-armor', level: 4, exp: 44 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 37,
y: 28
},
{
id: 'yizhou-cavalry-c',
name: '익주 기병',
faction: 'enemy',
className: '성문 기병',
classKey: 'cavalry',
level: 44,
exp: 68,
hp: 138,
maxHp: 138,
attack: 44,
move: 5,
stats: { might: 150, intelligence: 94, leadership: 124, agility: 122, luck: 86 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 18 },
armor: { itemId: 'lamellar-armor', level: 5, exp: 4 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 45,
y: 25
},
{
id: 'yizhou-guard-a',
name: '양회 친위대',
faction: 'enemy',
className: '관문 친위대',
classKey: 'yellowTurban',
level: 44,
exp: 68,
hp: 142,
maxHp: 142,
attack: 44,
move: 3,
stats: { might: 152, intelligence: 96, leadership: 128, agility: 104, luck: 86 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 20 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 8 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 46,
y: 15
},
{
id: 'yizhou-guard-b',
name: '양회 친위대',
faction: 'enemy',
className: '성문 친위대',
classKey: 'yellowTurban',
level: 44,
exp: 68,
hp: 142,
maxHp: 142,
attack: 44,
move: 3,
stats: { might: 152, intelligence: 96, leadership: 128, agility: 104, luck: 86 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 20 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 8 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 49,
y: 17
},
{
id: 'yizhou-strategist-a',
name: '익주 책사',
faction: 'enemy',
className: '관문 책사',
classKey: 'archer',
level: 43,
exp: 66,
hp: 96,
maxHp: 96,
attack: 38,
move: 3,
stats: { might: 92, intelligence: 120, leadership: 112, agility: 98, luck: 86 },
equipment: {
weapon: { itemId: 'short-bow', level: 5, exp: 4 },
armor: { itemId: 'cloth-armor', level: 4, exp: 38 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 41,
y: 13
},
{
id: 'yizhou-strategist-b',
name: '익주 책사',
faction: 'enemy',
className: '성문 책사',
classKey: 'archer',
level: 43,
exp: 66,
hp: 96,
maxHp: 96,
attack: 38,
move: 3,
stats: { might: 92, intelligence: 120, leadership: 112, agility: 98, luck: 86 },
equipment: {
weapon: { itemId: 'short-bow', level: 5, exp: 4 },
armor: { itemId: 'cloth-armor', level: 4, exp: 38 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 48,
y: 21
},
{
id: 'yizhou-ambusher-a',
name: '복병',
faction: 'enemy',
className: '숲길 복병',
classKey: 'bandit',
level: 42,
exp: 64,
hp: 100,
maxHp: 100,
attack: 38,
move: 4,
stats: { might: 132, intelligence: 94, leadership: 106, agility: 124, luck: 84 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 48 },
armor: { itemId: 'rebel-vest', level: 4, exp: 32 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 31,
y: 30
},
{
id: 'yizhou-ambusher-b',
name: '복병',
faction: 'enemy',
className: '고개 복병',
classKey: 'bandit',
level: 42,
exp: 64,
hp: 100,
maxHp: 100,
attack: 38,
move: 4,
stats: { might: 132, intelligence: 94, leadership: 106, agility: 124, luck: 84 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 48 },
armor: { itemId: 'rebel-vest', level: 4, exp: 32 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 36,
y: 8
},
{
id: 'yizhou-leader-yang-huai',
name: '양회',
faction: 'enemy',
className: '익주 관문장',
classKey: 'rebelLeader',
level: 45,
exp: 72,
hp: 184,
maxHp: 196,
attack: 45,
move: 4,
stats: { might: 150, intelligence: 112, leadership: 136, agility: 106, luck: 88 },
equipment: {
weapon: { itemId: 'leader-axe', level: 5, exp: 20 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 16 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 50,
y: 16
}
];
const twentyEighthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 4, y: 32 },
'guan-yu': { x: 6, y: 31 },
'zhang-fei': { x: 5, y: 34 },
'jian-yong': { x: 3, y: 35 },
'mi-zhu': { x: 4, y: 36 },
'sun-qian': { x: 7, y: 35 },
'zhao-yun': { x: 8, y: 32 },
'zhuge-liang': { x: 5, y: 32 },
'ma-liang': { x: 8, y: 36 },
'yi-ji': { x: 9, y: 34 },
'gong-zhi': { x: 10, y: 36 },
'huang-zhong': { x: 7, y: 33 },
'wei-yan': { x: 10, y: 31 },
'pang-tong': { x: 9, y: 33 }
};
export const twentyEighthBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits
].map((unit) => placeScenarioUnit(unit, twentyEighthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
{
id: 'fupass-scout-a',
name: '부수관 척후',
faction: 'enemy',
className: '관문 척후',
classKey: 'bandit',
level: 44,
exp: 68,
hp: 112,
maxHp: 112,
attack: 43,
move: 4,
stats: { might: 134, intelligence: 96, leadership: 110, agility: 126, luck: 86 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 6 },
armor: { itemId: 'rebel-vest', level: 4, exp: 40 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 16,
y: 32
},
{
id: 'fupass-scout-b',
name: '부수관 척후',
faction: 'enemy',
className: '서문 척후',
classKey: 'bandit',
level: 44,
exp: 68,
hp: 112,
maxHp: 112,
attack: 43,
move: 4,
stats: { might: 134, intelligence: 96, leadership: 110, agility: 126, luck: 86 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 6 },
armor: { itemId: 'rebel-vest', level: 4, exp: 40 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 21,
y: 30
},
{
id: 'fupass-infantry-a',
name: '부수관 보병',
faction: 'enemy',
className: '산문 보병',
classKey: 'yellowTurban',
level: 45,
exp: 70,
hp: 154,
maxHp: 154,
attack: 48,
move: 3,
stats: { might: 150, intelligence: 96, leadership: 128, agility: 104, luck: 86 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 18 },
armor: { itemId: 'lamellar-armor', level: 5, exp: 8 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 25,
y: 29
},
{
id: 'fupass-infantry-b',
name: '부수관 보병',
faction: 'enemy',
className: '협곡 보병',
classKey: 'yellowTurban',
level: 45,
exp: 70,
hp: 154,
maxHp: 154,
attack: 48,
move: 3,
stats: { might: 150, intelligence: 96, leadership: 128, agility: 104, luck: 86 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 18 },
armor: { itemId: 'lamellar-armor', level: 5, exp: 8 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 30,
y: 26
},
{
id: 'fupass-infantry-c',
name: '부수관 보병',
faction: 'enemy',
className: '관문 보병',
classKey: 'yellowTurban',
level: 46,
exp: 72,
hp: 162,
maxHp: 162,
attack: 50,
move: 3,
stats: { might: 154, intelligence: 98, leadership: 132, agility: 106, luck: 86 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 26 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 14 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 38,
y: 23
},
{
id: 'fupass-infantry-d',
name: '부수관 보병',
faction: 'enemy',
className: '성문 보병',
classKey: 'yellowTurban',
level: 46,
exp: 72,
hp: 162,
maxHp: 162,
attack: 50,
move: 3,
stats: { might: 154, intelligence: 98, leadership: 132, agility: 106, luck: 86 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 26 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 14 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 44,
y: 19
},
{
id: 'fupass-archer-a',
name: '부수관 궁병',
faction: 'enemy',
className: '산루 궁병',
classKey: 'archer',
level: 45,
exp: 70,
hp: 112,
maxHp: 112,
attack: 45,
move: 3,
stats: { might: 108, intelligence: 108, leadership: 114, agility: 122, luck: 88 },
equipment: {
weapon: { itemId: 'short-bow', level: 5, exp: 14 },
armor: { itemId: 'cloth-armor', level: 5, exp: 4 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 30,
y: 22
},
{
id: 'fupass-archer-b',
name: '부수관 궁병',
faction: 'enemy',
className: '관문 궁병',
classKey: 'archer',
level: 46,
exp: 72,
hp: 116,
maxHp: 116,
attack: 46,
move: 3,
stats: { might: 110, intelligence: 110, leadership: 116, agility: 124, luck: 88 },
equipment: {
weapon: { itemId: 'short-bow', level: 5, exp: 22 },
armor: { itemId: 'cloth-armor', level: 5, exp: 10 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 42,
y: 16
},
{
id: 'fupass-archer-c',
name: '부수관 궁병',
faction: 'enemy',
className: '성루 궁병',
classKey: 'archer',
level: 46,
exp: 72,
hp: 116,
maxHp: 116,
attack: 46,
move: 3,
stats: { might: 110, intelligence: 110, leadership: 116, agility: 124, luck: 88 },
equipment: {
weapon: { itemId: 'short-bow', level: 5, exp: 22 },
armor: { itemId: 'cloth-armor', level: 5, exp: 10 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 50,
y: 20
},
{
id: 'fupass-cavalry-a',
name: '부수관 기병',
faction: 'enemy',
className: '고개 기병',
classKey: 'cavalry',
level: 46,
exp: 72,
hp: 162,
maxHp: 162,
attack: 51,
move: 5,
stats: { might: 154, intelligence: 98, leadership: 130, agility: 126, luck: 88 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 28 },
armor: { itemId: 'lamellar-armor', level: 5, exp: 16 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 23,
y: 34
},
{
id: 'fupass-cavalry-b',
name: '부수관 기병',
faction: 'enemy',
className: '관문 기병',
classKey: 'cavalry',
level: 46,
exp: 72,
hp: 162,
maxHp: 162,
attack: 51,
move: 5,
stats: { might: 154, intelligence: 98, leadership: 130, agility: 126, luck: 88 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 28 },
armor: { itemId: 'lamellar-armor', level: 5, exp: 16 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 40,
y: 29
},
{
id: 'fupass-cavalry-c',
name: '부수관 기병',
faction: 'enemy',
className: '성문 기병',
classKey: 'cavalry',
level: 47,
exp: 74,
hp: 170,
maxHp: 170,
attack: 53,
move: 5,
stats: { might: 158, intelligence: 100, leadership: 134, agility: 128, luck: 88 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 36 },
armor: { itemId: 'lamellar-armor', level: 5, exp: 24 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 49,
y: 27
},
{
id: 'fupass-guard-a',
name: '고패 친위대',
faction: 'enemy',
className: '관문 친위대',
classKey: 'yellowTurban',
level: 47,
exp: 74,
hp: 174,
maxHp: 174,
attack: 53,
move: 3,
stats: { might: 160, intelligence: 100, leadership: 138, agility: 108, luck: 88 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 40 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 26 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 47,
y: 17
},
{
id: 'fupass-guard-b',
name: '고패 친위대',
faction: 'enemy',
className: '성문 친위대',
classKey: 'yellowTurban',
level: 47,
exp: 74,
hp: 174,
maxHp: 174,
attack: 53,
move: 3,
stats: { might: 160, intelligence: 100, leadership: 138, agility: 108, luck: 88 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 40 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 26 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 51,
y: 19
},
{
id: 'fupass-strategist-a',
name: '부수관 책사',
faction: 'enemy',
className: '관문 책사',
classKey: 'archer',
level: 46,
exp: 72,
hp: 116,
maxHp: 116,
attack: 46,
move: 3,
stats: { might: 94, intelligence: 124, leadership: 116, agility: 100, luck: 88 },
equipment: {
weapon: { itemId: 'short-bow', level: 5, exp: 24 },
armor: { itemId: 'cloth-armor', level: 5, exp: 12 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 43,
y: 14
},
{
id: 'fupass-strategist-b',
name: '부수관 책사',
faction: 'enemy',
className: '성문 책사',
classKey: 'archer',
level: 46,
exp: 72,
hp: 116,
maxHp: 116,
attack: 46,
move: 3,
stats: { might: 94, intelligence: 124, leadership: 116, agility: 100, luck: 88 },
equipment: {
weapon: { itemId: 'short-bow', level: 5, exp: 24 },
armor: { itemId: 'cloth-armor', level: 5, exp: 12 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 51,
y: 23
},
{
id: 'fupass-ambusher-a',
name: '산길 복병',
faction: 'enemy',
className: '서쪽 복병',
classKey: 'bandit',
level: 45,
exp: 70,
hp: 120,
maxHp: 120,
attack: 45,
move: 4,
stats: { might: 140, intelligence: 98, leadership: 112, agility: 128, luck: 86 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 18 },
armor: { itemId: 'rebel-vest', level: 5, exp: 4 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 31,
y: 34
},
{
id: 'fupass-ambusher-b',
name: '산길 복병',
faction: 'enemy',
className: '북쪽 복병',
classKey: 'bandit',
level: 45,
exp: 70,
hp: 120,
maxHp: 120,
attack: 45,
move: 4,
stats: { might: 140, intelligence: 98, leadership: 112, agility: 128, luck: 86 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 18 },
armor: { itemId: 'rebel-vest', level: 5, exp: 4 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 35,
y: 8
},
{
id: 'fupass-ambusher-c',
name: '산길 복병',
faction: 'enemy',
className: '남쪽 복병',
classKey: 'bandit',
level: 45,
exp: 70,
hp: 120,
maxHp: 120,
attack: 45,
move: 4,
stats: { might: 140, intelligence: 98, leadership: 112, agility: 128, luck: 86 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 18 },
armor: { itemId: 'rebel-vest', level: 5, exp: 4 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 45,
y: 31
},
{
id: 'fupass-leader-gao-pei',
name: '고패',
faction: 'enemy',
className: '부수관 수장',
classKey: 'rebelLeader',
level: 48,
exp: 78,
hp: 222,
maxHp: 222,
attack: 55,
move: 4,
stats: { might: 162, intelligence: 116, leadership: 144, agility: 110, luck: 90 },
equipment: {
weapon: { itemId: 'leader-axe', level: 5, exp: 34 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 30 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 52,
y: 18
}
];
const twentyNinthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 4, y: 34 },
'guan-yu': { x: 6, y: 33 },
'zhang-fei': { x: 5, y: 36 },
'jian-yong': { x: 3, y: 37 },
'mi-zhu': { x: 4, y: 38 },
'sun-qian': { x: 7, y: 37 },
'zhao-yun': { x: 8, y: 34 },
'zhuge-liang': { x: 5, y: 34 },
'ma-liang': { x: 8, y: 38 },
'yi-ji': { x: 9, y: 36 },
'gong-zhi': { x: 10, y: 38 },
'huang-zhong': { x: 7, y: 35 },
'wei-yan': { x: 10, y: 33 },
'pang-tong': { x: 9, y: 35 },
'fa-zheng': { x: 11, y: 36 }
};
export const twentyNinthBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits
].map((unit) => placeScenarioUnit(unit, twentyNinthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
{
id: 'luo-scout-a',
name: '낙성 척후',
faction: 'enemy',
className: '외곽 척후',
classKey: 'bandit',
level: 47,
exp: 74,
hp: 90,
maxHp: 90,
attack: 34,
move: 4,
stats: { might: 142, intelligence: 100, leadership: 116, agility: 130, luck: 88 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 24 },
armor: { itemId: 'rebel-vest', level: 5, exp: 10 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 16,
y: 34
},
{
id: 'luo-scout-b',
name: '낙성 척후',
faction: 'enemy',
className: '동문 척후',
classKey: 'bandit',
level: 47,
exp: 74,
hp: 90,
maxHp: 90,
attack: 34,
move: 4,
stats: { might: 142, intelligence: 100, leadership: 116, agility: 130, luck: 88 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 24 },
armor: { itemId: 'rebel-vest', level: 5, exp: 10 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 22,
y: 32
},
{
id: 'luo-infantry-a',
name: '낙성 보병',
faction: 'enemy',
className: '외곽 보병',
classKey: 'yellowTurban',
level: 48,
exp: 76,
hp: 130,
maxHp: 130,
attack: 42,
move: 3,
stats: { might: 158, intelligence: 100, leadership: 136, agility: 108, luck: 88 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 36 },
armor: { itemId: 'lamellar-armor', level: 5, exp: 22 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 27,
y: 31
},
{
id: 'luo-infantry-b',
name: '낙성 보병',
faction: 'enemy',
className: '성벽 보병',
classKey: 'yellowTurban',
level: 48,
exp: 76,
hp: 130,
maxHp: 130,
attack: 42,
move: 3,
stats: { might: 158, intelligence: 100, leadership: 136, agility: 108, luck: 88 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 36 },
armor: { itemId: 'lamellar-armor', level: 5, exp: 22 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 34,
y: 27
},
{
id: 'luo-infantry-c',
name: '낙성 보병',
faction: 'enemy',
className: '서문 보병',
classKey: 'yellowTurban',
level: 49,
exp: 78,
hp: 136,
maxHp: 136,
attack: 42,
move: 3,
stats: { might: 162, intelligence: 102, leadership: 140, agility: 110, luck: 88 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 44 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 30 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 42,
y: 22
},
{
id: 'luo-infantry-d',
name: '낙성 보병',
faction: 'enemy',
className: '성문 보병',
classKey: 'yellowTurban',
level: 49,
exp: 78,
hp: 110,
maxHp: 110,
attack: 38,
move: 3,
stats: { might: 162, intelligence: 102, leadership: 140, agility: 110, luck: 88 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 44 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 30 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 50,
y: 18
},
{
id: 'luo-archer-a',
name: '낙성 궁병',
faction: 'enemy',
className: '산루 궁병',
classKey: 'archer',
level: 48,
exp: 76,
hp: 90,
maxHp: 90,
attack: 36,
move: 3,
stats: { might: 112, intelligence: 112, leadership: 118, agility: 126, luck: 90 },
equipment: {
weapon: { itemId: 'short-bow', level: 5, exp: 30 },
armor: { itemId: 'cloth-armor', level: 5, exp: 18 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 31,
y: 24
},
{
id: 'luo-archer-b',
name: '낙성 궁병',
faction: 'enemy',
className: '성벽 궁병',
classKey: 'archer',
level: 49,
exp: 78,
hp: 70,
maxHp: 70,
attack: 32,
move: 3,
stats: { might: 114, intelligence: 114, leadership: 120, agility: 128, luck: 90 },
equipment: {
weapon: { itemId: 'short-bow', level: 5, exp: 38 },
armor: { itemId: 'cloth-armor', level: 5, exp: 24 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 45,
y: 16
},
{
id: 'luo-archer-c',
name: '낙성 궁병',
faction: 'enemy',
className: '성루 궁병',
classKey: 'archer',
level: 49,
exp: 78,
hp: 70,
maxHp: 70,
attack: 32,
move: 3,
stats: { might: 114, intelligence: 114, leadership: 120, agility: 128, luck: 90 },
equipment: {
weapon: { itemId: 'short-bow', level: 5, exp: 38 },
armor: { itemId: 'cloth-armor', level: 5, exp: 24 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 53,
y: 21
},
{
id: 'luo-cavalry-a',
name: '낙성 기병',
faction: 'enemy',
className: '외곽 기병',
classKey: 'cavalry',
level: 49,
exp: 78,
hp: 120,
maxHp: 120,
attack: 38,
move: 5,
stats: { might: 162, intelligence: 102, leadership: 138, agility: 130, luck: 90 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 46 },
armor: { itemId: 'lamellar-armor', level: 5, exp: 32 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 25,
y: 36
},
{
id: 'luo-cavalry-b',
name: '낙성 기병',
faction: 'enemy',
className: '성문 기병',
classKey: 'cavalry',
level: 49,
exp: 78,
hp: 162,
maxHp: 162,
attack: 50,
move: 5,
stats: { might: 162, intelligence: 102, leadership: 138, agility: 130, luck: 90 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 46 },
armor: { itemId: 'lamellar-armor', level: 5, exp: 32 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 44,
y: 31
},
{
id: 'luo-cavalry-c',
name: '낙성 기병',
faction: 'enemy',
className: '동문 기병',
classKey: 'cavalry',
level: 50,
exp: 80,
hp: 168,
maxHp: 168,
attack: 51,
move: 5,
stats: { might: 166, intelligence: 104, leadership: 142, agility: 132, luck: 90 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 54 },
armor: { itemId: 'lamellar-armor', level: 5, exp: 40 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 52,
y: 29
},
{
id: 'luo-guard-a',
name: '장임 친위대',
faction: 'enemy',
className: '낙성 친위대',
classKey: 'yellowTurban',
level: 50,
exp: 80,
hp: 112,
maxHp: 112,
attack: 38,
move: 3,
stats: { might: 168, intelligence: 104, leadership: 146, agility: 112, luck: 90 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 58 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 42 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 50,
y: 16
},
{
id: 'luo-guard-b',
name: '장임 친위대',
faction: 'enemy',
className: '성문 친위대',
classKey: 'yellowTurban',
level: 50,
exp: 80,
hp: 112,
maxHp: 112,
attack: 38,
move: 3,
stats: { might: 168, intelligence: 104, leadership: 146, agility: 112, luck: 90 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 58 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 42 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 54,
y: 19
},
{
id: 'luo-strategist-a',
name: '낙성 책사',
faction: 'enemy',
className: '성벽 책사',
classKey: 'archer',
level: 49,
exp: 78,
hp: 70,
maxHp: 70,
attack: 32,
move: 3,
stats: { might: 96, intelligence: 128, leadership: 120, agility: 102, luck: 90 },
equipment: {
weapon: { itemId: 'short-bow', level: 5, exp: 40 },
armor: { itemId: 'cloth-armor', level: 5, exp: 26 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 46,
y: 14
},
{
id: 'luo-strategist-b',
name: '낙성 책사',
faction: 'enemy',
className: '외곽 책사',
classKey: 'archer',
level: 49,
exp: 78,
hp: 70,
maxHp: 70,
attack: 32,
move: 3,
stats: { might: 96, intelligence: 128, leadership: 120, agility: 102, luck: 90 },
equipment: {
weapon: { itemId: 'short-bow', level: 5, exp: 40 },
armor: { itemId: 'cloth-armor', level: 5, exp: 26 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 53,
y: 24
},
{
id: 'luo-ambusher-a',
name: '낙성 복병',
faction: 'enemy',
className: '서쪽 복병',
classKey: 'bandit',
level: 48,
exp: 76,
hp: 88,
maxHp: 88,
attack: 32,
move: 4,
stats: { might: 146, intelligence: 102, leadership: 118, agility: 132, luck: 88 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 34 },
armor: { itemId: 'rebel-vest', level: 5, exp: 20 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 34,
y: 36
},
{
id: 'luo-ambusher-b',
name: '낙성 복병',
faction: 'enemy',
className: '북쪽 복병',
classKey: 'bandit',
level: 48,
exp: 76,
hp: 88,
maxHp: 88,
attack: 32,
move: 4,
stats: { might: 146, intelligence: 102, leadership: 118, agility: 132, luck: 88 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 34 },
armor: { itemId: 'rebel-vest', level: 5, exp: 20 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 37,
y: 8
},
{
id: 'luo-officer-wu-yi',
name: '오의',
faction: 'enemy',
className: '익주 장군',
classKey: 'yellowTurban',
level: 50,
exp: 82,
hp: 125,
maxHp: 145,
attack: 40,
move: 4,
stats: { might: 158, intelligence: 108, leadership: 148, agility: 114, luck: 90 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 60 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 46 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 47,
y: 23
},
{
id: 'luo-leader-zhang-ren',
name: '장임',
faction: 'enemy',
className: '낙성 수장',
classKey: 'rebelLeader',
level: 51,
exp: 84,
hp: 135,
maxHp: 170,
attack: 38,
move: 4,
stats: { might: 170, intelligence: 118, leadership: 152, agility: 116, luck: 92 },
equipment: {
weapon: { itemId: 'leader-axe', level: 5, exp: 48 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 48 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 54,
y: 18
}
];
const thirtiethBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 4, y: 36 },
'guan-yu': { x: 5, y: 34 },
'zhang-fei': { x: 4, y: 38 },
'jian-yong': { x: 3, y: 39 },
'mi-zhu': { x: 5, y: 40 },
'sun-qian': { x: 7, y: 39 },
'zhao-yun': { x: 8, y: 36 },
'zhuge-liang': { x: 6, y: 35 },
'ma-liang': { x: 8, y: 40 },
'yi-ji': { x: 9, y: 38 },
'gong-zhi': { x: 10, y: 40 },
'huang-zhong': { x: 7, y: 37 },
'wei-yan': { x: 10, y: 35 },
'pang-tong': { x: 9, y: 36 },
'fa-zheng': { x: 11, y: 38 },
'wu-yi': { x: 12, y: 36 }
};
export const thirtiethBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits
].map((unit) => placeScenarioUnit(unit, thirtiethBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
{
id: 'luofeng-scout-a',
name: '낙봉 척후',
faction: 'enemy',
className: '비탈 척후',
classKey: 'bandit',
level: 50,
exp: 82,
hp: 132,
maxHp: 132,
attack: 50,
move: 4,
stats: { might: 150, intelligence: 106, leadership: 122, agility: 136, luck: 90 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 42 },
armor: { itemId: 'rebel-vest', level: 5, exp: 28 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 18,
y: 35
},
{
id: 'luofeng-scout-b',
name: '낙봉 척후',
faction: 'enemy',
className: '동쪽 척후',
classKey: 'bandit',
level: 50,
exp: 82,
hp: 132,
maxHp: 132,
attack: 50,
move: 4,
stats: { might: 150, intelligence: 106, leadership: 122, agility: 136, luck: 90 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 42 },
armor: { itemId: 'rebel-vest', level: 5, exp: 28 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 22,
y: 33
},
{
id: 'luofeng-scout-c',
name: '낙봉 척후',
faction: 'enemy',
className: '북쪽 척후',
classKey: 'bandit',
level: 50,
exp: 82,
hp: 132,
maxHp: 132,
attack: 50,
move: 4,
stats: { might: 150, intelligence: 106, leadership: 122, agility: 136, luck: 90 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 42 },
armor: { itemId: 'rebel-vest', level: 5, exp: 28 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 19,
y: 28
},
{
id: 'luofeng-infantry-a',
name: '낙봉 보병',
faction: 'enemy',
className: '비탈 보병',
classKey: 'yellowTurban',
level: 51,
exp: 84,
hp: 184,
maxHp: 184,
attack: 58,
move: 3,
stats: { might: 170, intelligence: 108, leadership: 148, agility: 114, luck: 90 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 62 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 48 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 28,
y: 31
},
{
id: 'luofeng-infantry-b',
name: '낙봉 보병',
faction: 'enemy',
className: '협로 보병',
classKey: 'yellowTurban',
level: 51,
exp: 84,
hp: 184,
maxHp: 184,
attack: 58,
move: 3,
stats: { might: 170, intelligence: 108, leadership: 148, agility: 114, luck: 90 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 62 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 48 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 34,
y: 28
},
{
id: 'luofeng-infantry-c',
name: '낙봉 보병',
faction: 'enemy',
className: '산문 보병',
classKey: 'yellowTurban',
level: 52,
exp: 86,
hp: 192,
maxHp: 192,
attack: 60,
move: 3,
stats: { might: 174, intelligence: 110, leadership: 152, agility: 116, luck: 90 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 70 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 56 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 40,
y: 24
},
{
id: 'luofeng-infantry-d',
name: '낙봉 보병',
faction: 'enemy',
className: '후미 보병',
classKey: 'yellowTurban',
level: 52,
exp: 86,
hp: 192,
maxHp: 192,
attack: 60,
move: 3,
stats: { might: 174, intelligence: 110, leadership: 152, agility: 116, luck: 90 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 70 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 56 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 46,
y: 20
},
{
id: 'luofeng-archer-a',
name: '낙봉 궁병',
faction: 'enemy',
className: '매복 궁병',
classKey: 'archer',
level: 51,
exp: 84,
hp: 132,
maxHp: 132,
attack: 51,
move: 3,
stats: { might: 118, intelligence: 120, leadership: 126, agility: 132, luck: 92 },
equipment: {
weapon: { itemId: 'short-bow', level: 5, exp: 48 },
armor: { itemId: 'cloth-armor', level: 5, exp: 32 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 31,
y: 27
},
{
id: 'luofeng-archer-b',
name: '낙봉 궁병',
faction: 'enemy',
className: '고지 궁병',
classKey: 'archer',
level: 51,
exp: 84,
hp: 132,
maxHp: 132,
attack: 51,
move: 3,
stats: { might: 118, intelligence: 120, leadership: 126, agility: 132, luck: 92 },
equipment: {
weapon: { itemId: 'short-bow', level: 5, exp: 48 },
armor: { itemId: 'cloth-armor', level: 5, exp: 32 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 39,
y: 22
},
{
id: 'luofeng-archer-c',
name: '낙봉 궁병',
faction: 'enemy',
className: '성루 궁병',
classKey: 'archer',
level: 52,
exp: 86,
hp: 136,
maxHp: 136,
attack: 52,
move: 3,
stats: { might: 120, intelligence: 122, leadership: 128, agility: 134, luck: 92 },
equipment: {
weapon: { itemId: 'short-bow', level: 5, exp: 56 },
armor: { itemId: 'cloth-armor', level: 5, exp: 40 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 47,
y: 17
},
{
id: 'luofeng-archer-d',
name: '낙봉 궁병',
faction: 'enemy',
className: '후방 궁병',
classKey: 'archer',
level: 52,
exp: 86,
hp: 136,
maxHp: 136,
attack: 52,
move: 3,
stats: { might: 120, intelligence: 122, leadership: 128, agility: 134, luck: 92 },
equipment: {
weapon: { itemId: 'short-bow', level: 5, exp: 56 },
armor: { itemId: 'cloth-armor', level: 5, exp: 40 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 52,
y: 24
},
{
id: 'luofeng-cavalry-a',
name: '낙봉 기병',
faction: 'enemy',
className: '협곡 기병',
classKey: 'cavalry',
level: 52,
exp: 86,
hp: 194,
maxHp: 194,
attack: 61,
move: 5,
stats: { might: 176, intelligence: 110, leadership: 148, agility: 138, luck: 92 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 66 },
armor: { itemId: 'lamellar-armor', level: 5, exp: 52 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 25,
y: 38
},
{
id: 'luofeng-cavalry-b',
name: '낙봉 기병',
faction: 'enemy',
className: '동쪽 기병',
classKey: 'cavalry',
level: 52,
exp: 86,
hp: 194,
maxHp: 194,
attack: 61,
move: 5,
stats: { might: 176, intelligence: 110, leadership: 148, agility: 138, luck: 92 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 66 },
armor: { itemId: 'lamellar-armor', level: 5, exp: 52 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 42,
y: 31
},
{
id: 'luofeng-cavalry-c',
name: '낙봉 기병',
faction: 'enemy',
className: '후방 기병',
classKey: 'cavalry',
level: 53,
exp: 88,
hp: 202,
maxHp: 202,
attack: 63,
move: 5,
stats: { might: 180, intelligence: 112, leadership: 152, agility: 140, luck: 92 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 74 },
armor: { itemId: 'lamellar-armor', level: 5, exp: 60 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
x: 51,
y: 29
},
{
id: 'luofeng-guard-a',
name: '장임 친위대',
faction: 'enemy',
className: '낙봉 친위대',
classKey: 'yellowTurban',
level: 53,
exp: 88,
hp: 204,
maxHp: 204,
attack: 63,
move: 3,
stats: { might: 182, intelligence: 112, leadership: 158, agility: 118, luck: 92 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 78 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 64 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 53,
y: 18
},
{
id: 'luofeng-guard-b',
name: '장임 친위대',
faction: 'enemy',
className: '성문 친위대',
classKey: 'yellowTurban',
level: 53,
exp: 88,
hp: 204,
maxHp: 204,
attack: 63,
move: 3,
stats: { might: 182, intelligence: 112, leadership: 158, agility: 118, luck: 92 },
equipment: {
weapon: { itemId: 'iron-spear', level: 5, exp: 78 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 64 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 55,
y: 22
},
{
id: 'luofeng-strategist-a',
name: '낙봉 책사',
faction: 'enemy',
className: '매복 책사',
classKey: 'archer',
level: 52,
exp: 86,
hp: 136,
maxHp: 136,
attack: 52,
move: 3,
stats: { might: 98, intelligence: 136, leadership: 126, agility: 106, luck: 92 },
equipment: {
weapon: { itemId: 'short-bow', level: 5, exp: 58 },
armor: { itemId: 'cloth-armor', level: 5, exp: 42 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 48,
y: 15
},
{
id: 'luofeng-strategist-b',
name: '낙봉 책사',
faction: 'enemy',
className: '후방 책사',
classKey: 'archer',
level: 52,
exp: 86,
hp: 136,
maxHp: 136,
attack: 52,
move: 3,
stats: { might: 98, intelligence: 136, leadership: 126, agility: 106, luck: 92 },
equipment: {
weapon: { itemId: 'short-bow', level: 5, exp: 58 },
armor: { itemId: 'cloth-armor', level: 5, exp: 42 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 55,
y: 26
},
{
id: 'luofeng-ambusher-a',
name: '낙봉 복병',
faction: 'enemy',
className: '남쪽 복병',
classKey: 'bandit',
level: 51,
exp: 84,
hp: 140,
maxHp: 140,
attack: 52,
move: 4,
stats: { might: 154, intelligence: 108, leadership: 124, agility: 140, luck: 90 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 50 },
armor: { itemId: 'rebel-vest', level: 5, exp: 36 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 30,
y: 36
},
{
id: 'luofeng-ambusher-b',
name: '낙봉 복병',
faction: 'enemy',
className: '북쪽 복병',
classKey: 'bandit',
level: 51,
exp: 84,
hp: 140,
maxHp: 140,
attack: 52,
move: 4,
stats: { might: 154, intelligence: 108, leadership: 124, agility: 140, luck: 90 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 50 },
armor: { itemId: 'rebel-vest', level: 5, exp: 36 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 35,
y: 15
},
{
id: 'luofeng-ambusher-c',
name: '낙봉 복병',
faction: 'enemy',
className: '동쪽 복병',
classKey: 'bandit',
level: 52,
exp: 86,
hp: 146,
maxHp: 146,
attack: 54,
move: 4,
stats: { might: 158, intelligence: 110, leadership: 126, agility: 142, luck: 90 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 58 },
armor: { itemId: 'rebel-vest', level: 5, exp: 44 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 44,
y: 34
},
{
id: 'luofeng-ambusher-d',
name: '낙봉 복병',
faction: 'enemy',
className: '절벽 복병',
classKey: 'bandit',
level: 52,
exp: 86,
hp: 146,
maxHp: 146,
attack: 54,
move: 4,
stats: { might: 158, intelligence: 110, leadership: 126, agility: 142, luck: 90 },
equipment: {
weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 58 },
armor: { itemId: 'rebel-vest', level: 5, exp: 44 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
x: 50,
y: 10
},
{
id: 'luofeng-leader-zhang-ren',
name: '장임',
faction: 'enemy',
className: '낙봉파 주장',
classKey: 'rebelLeader',
level: 54,
exp: 90,
hp: 256,
maxHp: 256,
attack: 66,
move: 4,
stats: { might: 184, intelligence: 124, leadership: 162, agility: 120, luck: 94 },
equipment: {
weapon: { itemId: 'leader-axe', level: 5, exp: 66 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 66 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
x: 56,
y: 20
}
];
const thirtyFirstBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 4, y: 39 },
'guan-yu': { x: 5, y: 37 },
'zhang-fei': { x: 4, y: 41 },
'jian-yong': { x: 3, y: 42 },
'mi-zhu': { x: 5, y: 42 },
'sun-qian': { x: 7, y: 41 },
'zhao-yun': { x: 8, y: 38 },
'zhuge-liang': { x: 6, y: 37 },
'ma-liang': { x: 8, y: 42 },
'yi-ji': { x: 9, y: 40 },
'gong-zhi': { x: 10, y: 42 },
'huang-zhong': { x: 7, y: 39 },
'wei-yan': { x: 10, y: 37 },
'pang-tong': { x: 9, y: 38 },
'fa-zheng': { x: 11, y: 40 },
'wu-yi': { x: 12, y: 38 }
};
const createThirtyFirstEnemyUnit = (
id: string,
name: string,
className: string,
classKey: UnitClassKey,
level: number,
hp: number,
attack: number,
x: number,
y: number
): UnitData => {
const equipmentByClass: Record<UnitClassKey, UnitData['equipment']> = {
lord: {
weapon: { itemId: 'twin-oath-blades', level: 5, exp: 70 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 62 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
infantry: {
weapon: { itemId: 'iron-spear', level: 5, exp: 74 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 66 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
cavalry: {
weapon: { itemId: 'iron-spear', level: 5, exp: 78 },
armor: { itemId: 'lamellar-armor', level: 5, exp: 68 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
spearman: {
weapon: { itemId: 'iron-spear', level: 5, exp: 76 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 66 },
accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
},
archer: {
weapon: { itemId: 'short-bow', level: 5, exp: 72 },
armor: { itemId: 'cloth-armor', level: 5, exp: 58 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
strategist: {
weapon: { itemId: 'white-feather-fan', level: 5, exp: 64 },
armor: { itemId: 'cloth-armor', level: 5, exp: 54 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
quartermaster: {
weapon: { itemId: 'white-feather-fan', level: 5, exp: 56 },
armor: { itemId: 'cloth-armor', level: 5, exp: 48 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
bandit: {
weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 66 },
armor: { itemId: 'rebel-vest', level: 5, exp: 54 },
accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
},
yellowTurban: {
weapon: { itemId: 'iron-spear', level: 5, exp: 78 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 68 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
},
rebelLeader: {
weapon: { itemId: 'leader-axe', level: 5, exp: 82 },
armor: { itemId: 'reinforced-lamellar', level: 5, exp: 76 },
accessory: { itemId: 'war-manual', level: 1, exp: 0 }
}
};
const moveByClass: Record<UnitClassKey, number> = {
lord: 4,
infantry: 3,
cavalry: 5,
spearman: 3,
archer: 3,
strategist: 4,
quartermaster: 4,
bandit: 4,
yellowTurban: 3,
rebelLeader: 4
};
const statLift = Math.max(0, level - 52) * 2;
const lateNorthernTuned = [
'northern-sixth-',
'northern-seventh-',
'northern-eighth-',
'northern-ninth-',
'northern-tenth-',
'northern-eleventh-',
'northern-twelfth-'
].some((prefix) => id.startsWith(prefix));
const tunedHp = lateNorthernTuned ? Math.max(1, Math.round(hp * 0.72)) : hp;
const tunedAttack = lateNorthernTuned ? Math.max(1, Math.round(attack * 0.72)) : attack;
return {
id,
name,
faction: 'enemy',
className,
classKey,
level,
exp: Math.min(98, 84 + statLift),
hp: tunedHp,
maxHp: tunedHp,
attack: tunedAttack,
move: moveByClass[classKey],
stats: {
might: 148 + statLift + (classKey === 'rebelLeader' ? 34 : classKey === 'cavalry' ? 24 : classKey === 'yellowTurban' ? 20 : 0),
intelligence: 108 + statLift + (classKey === 'strategist' ? 34 : classKey === 'archer' ? 12 : 0),
leadership: 132 + statLift + (classKey === 'rebelLeader' ? 34 : classKey === 'yellowTurban' ? 18 : 0),
agility: 112 + statLift + (classKey === 'bandit' ? 28 : classKey === 'cavalry' ? 26 : classKey === 'archer' ? 18 : 0),
luck: 90 + Math.floor(statLift / 2)
},
equipment: equipmentByClass[classKey],
x,
y
};
};
const tuneEnemyUnitGroup = (
units: UnitData[],
prefixes: string[],
options: {
hpScale?: number;
attackScale?: number;
overrides?: Record<string, Partial<Pick<UnitData, 'hp' | 'maxHp' | 'attack' | 'x' | 'y'>>>;
}
): UnitData[] =>
units.map((unit) => {
if (unit.faction !== 'enemy' || !prefixes.some((prefix) => unit.id.startsWith(prefix))) {
return unit;
}
const scaledHp = options.hpScale === undefined ? unit.maxHp : Math.max(1, Math.round(unit.maxHp * options.hpScale));
const scaledAttack =
options.attackScale === undefined ? unit.attack : Math.max(1, Math.round(unit.attack * options.attackScale));
const override = options.overrides?.[unit.id] ?? {};
const hp = override.hp ?? override.maxHp ?? scaledHp;
return {
...unit,
hp,
maxHp: override.maxHp ?? hp,
attack: override.attack ?? scaledAttack,
x: override.x ?? unit.x,
y: override.y ?? unit.y
};
});
export const thirtyFirstBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits
].map((unit) => placeScenarioUnit(unit, thirtyFirstBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('luo-main-scout-a', '낙성 정찰병', '성밖 정찰병', 'bandit', 53, 130, 42, 18, 39),
createThirtyFirstEnemyUnit('luo-main-scout-b', '낙성 정찰병', '수로 정찰병', 'bandit', 53, 130, 42, 23, 36),
createThirtyFirstEnemyUnit('luo-main-infantry-a', '낙성 보병', '외성 보병', 'yellowTurban', 54, 180, 50, 28, 34),
createThirtyFirstEnemyUnit('luo-main-infantry-b', '낙성 보병', '외성 보병', 'yellowTurban', 54, 180, 50, 33, 32),
createThirtyFirstEnemyUnit('luo-main-infantry-c', '낙성 보병', '성문 보병', 'yellowTurban', 55, 188, 52, 40, 28),
createThirtyFirstEnemyUnit('luo-main-infantry-d', '낙성 보병', '성문 보병', 'yellowTurban', 55, 188, 52, 44, 26),
createThirtyFirstEnemyUnit('luo-main-infantry-e', '낙성 보병', '내성 보병', 'yellowTurban', 56, 196, 54, 51, 23),
createThirtyFirstEnemyUnit('luo-main-archer-a', '낙성 궁병', '외벽 궁병', 'archer', 54, 118, 40, 31, 29),
createThirtyFirstEnemyUnit('luo-main-archer-b', '낙성 궁병', '성벽 궁병', 'archer', 55, 124, 42, 42, 22),
createThirtyFirstEnemyUnit('luo-main-archer-c', '낙성 궁병', '성벽 궁병', 'archer', 55, 124, 42, 49, 18),
createThirtyFirstEnemyUnit('luo-main-archer-d', '낙성 궁병', '내성 궁병', 'archer', 56, 128, 44, 55, 24),
createThirtyFirstEnemyUnit('luo-main-cavalry-a', '낙성 기병', '우익 기병', 'cavalry', 55, 180, 52, 29, 40),
createThirtyFirstEnemyUnit('luo-main-cavalry-b', '낙성 기병', '좌익 기병', 'cavalry', 55, 180, 52, 39, 36),
createThirtyFirstEnemyUnit('luo-main-cavalry-c', '낙성 기병', '내성 기병', 'cavalry', 56, 190, 54, 53, 29),
createThirtyFirstEnemyUnit('luo-main-guard-a', '장임 친위대', '성문 친위대', 'yellowTurban', 56, 190, 52, 48, 21),
createThirtyFirstEnemyUnit('luo-main-guard-b', '장임 친위대', '성문 친위대', 'yellowTurban', 56, 190, 52, 51, 20),
createThirtyFirstEnemyUnit('luo-main-guard-c', '장임 친위대', '내성 친위대', 'yellowTurban', 57, 198, 54, 56, 19),
createThirtyFirstEnemyUnit('luo-main-strategist-a', '낙성 책사', '성문 책사', 'strategist', 55, 118, 40, 45, 18),
createThirtyFirstEnemyUnit('luo-main-strategist-b', '낙성 책사', '내성 책사', 'strategist', 56, 122, 42, 55, 15),
createThirtyFirstEnemyUnit('luo-main-ambusher-a', '낙성 복병', '남벽 복병', 'bandit', 54, 130, 44, 34, 39),
createThirtyFirstEnemyUnit('luo-main-ambusher-b', '낙성 복병', '동문 복병', 'bandit', 54, 130, 44, 48, 32),
createThirtyFirstEnemyUnit('luo-main-ambusher-c', '낙성 복병', '북벽 복병', 'bandit', 55, 136, 46, 57, 11),
createThirtyFirstEnemyUnit('luo-main-veteran-yan-yan', '엄안', '익주 노장', 'archer', 57, 170, 52, 50, 22),
createThirtyFirstEnemyUnit('luo-main-officer-a', '낙성 부장', '성문 부장', 'rebelLeader', 57, 210, 56, 54, 20),
createThirtyFirstEnemyUnit('luo-main-leader-zhang-ren', '장임', '낙성 본성 주장', 'rebelLeader', 58, 232, 58, 58, 18)
];
const thirtySecondBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 4, y: 40 },
'guan-yu': { x: 5, y: 38 },
'zhang-fei': { x: 4, y: 42 },
'jian-yong': { x: 3, y: 43 },
'mi-zhu': { x: 5, y: 44 },
'sun-qian': { x: 7, y: 43 },
'zhao-yun': { x: 8, y: 39 },
'zhuge-liang': { x: 6, y: 38 },
'ma-liang': { x: 8, y: 44 },
'yi-ji': { x: 9, y: 41 },
'gong-zhi': { x: 10, y: 44 },
'huang-zhong': { x: 7, y: 40 },
'wei-yan': { x: 10, y: 38 },
'pang-tong': { x: 9, y: 39 },
'fa-zheng': { x: 11, y: 41 },
'wu-yi': { x: 12, y: 39 },
'yan-yan': { x: 11, y: 37 }
};
export const thirtySecondBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits
].map((unit) => placeScenarioUnit(unit, thirtySecondBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('chengdu-scout-a', '성도 정찰병', '남로 정찰병', 'bandit', 56, 164, 60, 18, 39),
createThirtyFirstEnemyUnit('chengdu-scout-b', '성도 정찰병', '수로 정찰병', 'bandit', 56, 164, 60, 24, 36),
createThirtyFirstEnemyUnit('chengdu-scout-c', '성도 정찰병', '산길 정찰병', 'bandit', 57, 172, 62, 31, 35),
createThirtyFirstEnemyUnit('chengdu-infantry-a', '면죽관 보병', '외곽 보병', 'yellowTurban', 57, 236, 74, 29, 33),
createThirtyFirstEnemyUnit('chengdu-infantry-b', '면죽관 보병', '외곽 보병', 'yellowTurban', 57, 236, 74, 34, 31),
createThirtyFirstEnemyUnit('chengdu-infantry-c', '면죽관 보병', '관문 보병', 'yellowTurban', 58, 246, 76, 41, 27),
createThirtyFirstEnemyUnit('chengdu-infantry-d', '면죽관 보병', '관문 보병', 'yellowTurban', 58, 246, 76, 45, 25),
createThirtyFirstEnemyUnit('chengdu-infantry-e', '성도 보병', '내곽 보병', 'yellowTurban', 59, 256, 78, 53, 22),
createThirtyFirstEnemyUnit('chengdu-infantry-f', '성도 보병', '창고 보병', 'yellowTurban', 59, 256, 78, 57, 25),
createThirtyFirstEnemyUnit('chengdu-archer-a', '면죽관 궁병', '숲길 궁병', 'archer', 57, 160, 60, 31, 29),
createThirtyFirstEnemyUnit('chengdu-archer-b', '면죽관 궁병', '성벽 궁병', 'archer', 58, 166, 62, 43, 21),
createThirtyFirstEnemyUnit('chengdu-archer-c', '성도 궁병', '고지 궁병', 'archer', 58, 166, 62, 50, 18),
createThirtyFirstEnemyUnit('chengdu-archer-d', '성도 궁병', '창고 궁병', 'archer', 59, 174, 64, 58, 23),
createThirtyFirstEnemyUnit('chengdu-cavalry-a', '성도 기병', '우익 기병', 'cavalry', 58, 246, 78, 28, 41),
createThirtyFirstEnemyUnit('chengdu-cavalry-b', '성도 기병', '좌익 기병', 'cavalry', 58, 246, 78, 40, 36),
createThirtyFirstEnemyUnit('chengdu-cavalry-c', '성도 기병', '내성 기병', 'cavalry', 59, 258, 80, 55, 30),
createThirtyFirstEnemyUnit('chengdu-guard-a', '이엄 친위대', '관문 친위대', 'yellowTurban', 59, 266, 80, 48, 22),
createThirtyFirstEnemyUnit('chengdu-guard-b', '이엄 친위대', '관문 친위대', 'yellowTurban', 59, 266, 80, 52, 21),
createThirtyFirstEnemyUnit('chengdu-guard-c', '이엄 친위대', '성도 친위대', 'yellowTurban', 60, 276, 82, 58, 19),
createThirtyFirstEnemyUnit('chengdu-strategist-a', '성도 책사', '항복 반대파', 'strategist', 58, 166, 62, 45, 18),
createThirtyFirstEnemyUnit('chengdu-strategist-b', '성도 책사', '창고 책사', 'strategist', 59, 174, 64, 55, 15),
createThirtyFirstEnemyUnit('chengdu-ambusher-a', '성도 복병', '남벽 복병', 'bandit', 57, 174, 64, 35, 39),
createThirtyFirstEnemyUnit('chengdu-ambusher-b', '성도 복병', '동문 복병', 'bandit', 57, 174, 64, 49, 33),
createThirtyFirstEnemyUnit('chengdu-ambusher-c', '성도 복병', '북벽 복병', 'bandit', 58, 182, 66, 59, 11),
createThirtyFirstEnemyUnit('chengdu-officer-fei-guan', '비관', '익주 부장', 'rebelLeader', 60, 286, 84, 55, 20),
createThirtyFirstEnemyUnit('chengdu-leader-li-yan', '이엄', '면죽관 수비장', 'rebelLeader', 61, 306, 86, 60, 18)
];
const thirtyThirdBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 4, y: 42 },
'guan-yu': { x: 5, y: 40 },
'zhang-fei': { x: 4, y: 44 },
'jian-yong': { x: 3, y: 45 },
'mi-zhu': { x: 5, y: 46 },
'sun-qian': { x: 7, y: 45 },
'zhao-yun': { x: 8, y: 41 },
'zhuge-liang': { x: 6, y: 40 },
'ma-liang': { x: 8, y: 46 },
'yi-ji': { x: 9, y: 43 },
'gong-zhi': { x: 10, y: 46 },
'huang-zhong': { x: 7, y: 42 },
'wei-yan': { x: 10, y: 40 },
'pang-tong': { x: 9, y: 41 },
'fa-zheng': { x: 11, y: 43 },
'wu-yi': { x: 12, y: 41 },
'yan-yan': { x: 11, y: 39 },
'li-yan': { x: 13, y: 40 }
};
export const thirtyThirdBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits
].map((unit) => placeScenarioUnit(unit, thirtyThirdBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('chengdu-final-scout-a', '성도 척후', '남문 척후', 'bandit', 60, 182, 58, 19, 41),
createThirtyFirstEnemyUnit('chengdu-final-scout-b', '성도 척후', '서문 척후', 'bandit', 60, 182, 58, 25, 39),
createThirtyFirstEnemyUnit('chengdu-final-scout-c', '성도 척후', '수로 척후', 'bandit', 61, 190, 60, 32, 37),
createThirtyFirstEnemyUnit('chengdu-final-infantry-a', '성도 보병', '외곽 보병', 'yellowTurban', 61, 266, 70, 31, 34),
createThirtyFirstEnemyUnit('chengdu-final-infantry-b', '성도 보병', '외곽 보병', 'yellowTurban', 61, 266, 70, 36, 33),
createThirtyFirstEnemyUnit('chengdu-final-infantry-c', '성도 보병', '남문 보병', 'yellowTurban', 62, 276, 72, 43, 28),
createThirtyFirstEnemyUnit('chengdu-final-infantry-d', '성도 보병', '남문 보병', 'yellowTurban', 62, 276, 72, 47, 27),
createThirtyFirstEnemyUnit('chengdu-final-infantry-e', '유장 친위대', '성문 친위대', 'yellowTurban', 63, 288, 74, 55, 23),
createThirtyFirstEnemyUnit('chengdu-final-infantry-f', '유장 친위대', '창고 친위대', 'yellowTurban', 63, 288, 74, 60, 25),
createThirtyFirstEnemyUnit('chengdu-final-archer-a', '성도 궁병', '성벽 궁병', 'archer', 61, 182, 58, 34, 31),
createThirtyFirstEnemyUnit('chengdu-final-archer-b', '성도 궁병', '남문 궁병', 'archer', 62, 190, 60, 46, 23),
createThirtyFirstEnemyUnit('chengdu-final-archer-c', '성도 궁병', '고지 궁병', 'archer', 62, 190, 60, 52, 18),
createThirtyFirstEnemyUnit('chengdu-final-archer-d', '성도 궁병', '창고 궁병', 'archer', 63, 198, 62, 61, 20),
createThirtyFirstEnemyUnit('chengdu-final-cavalry-a', '성도 기병', '우익 기병', 'cavalry', 62, 276, 70, 28, 43),
createThirtyFirstEnemyUnit('chengdu-final-cavalry-b', '성도 기병', '좌익 기병', 'cavalry', 62, 276, 70, 43, 38),
createThirtyFirstEnemyUnit('chengdu-final-cavalry-c', '성도 기병', '내성 기병', 'cavalry', 63, 288, 72, 58, 31),
createThirtyFirstEnemyUnit('chengdu-final-guard-a', '황권 친위대', '권고 반대파', 'yellowTurban', 63, 300, 74, 50, 22),
createThirtyFirstEnemyUnit('chengdu-final-guard-b', '황권 친위대', '권고 반대파', 'yellowTurban', 63, 300, 74, 54, 21),
createThirtyFirstEnemyUnit('chengdu-final-guard-c', '황권 친위대', '성도 친위대', 'yellowTurban', 64, 312, 76, 60, 18),
createThirtyFirstEnemyUnit('chengdu-final-strategist-a', '성도 책사', '항복 반대파', 'strategist', 62, 190, 60, 48, 19),
createThirtyFirstEnemyUnit('chengdu-final-strategist-b', '성도 책사', '유장 사자', 'strategist', 63, 198, 62, 57, 16),
createThirtyFirstEnemyUnit('chengdu-final-ambusher-a', '성도 복병', '남벽 복병', 'bandit', 61, 190, 58, 37, 41),
createThirtyFirstEnemyUnit('chengdu-final-ambusher-b', '성도 복병', '동문 복병', 'bandit', 61, 190, 58, 51, 35),
createThirtyFirstEnemyUnit('chengdu-final-ambusher-c', '성도 복병', '북벽 복병', 'bandit', 62, 198, 60, 62, 12),
createThirtyFirstEnemyUnit('chengdu-final-officer-a', '성도 부장', '남문 부장', 'rebelLeader', 64, 300, 78, 58, 22),
createThirtyFirstEnemyUnit('chengdu-final-leader-huang-quan', '황권', '성도 수비 참모', 'rebelLeader', 65, 316, 80, 62, 18)
];
const thirtyFourthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 4, y: 44 },
'guan-yu': { x: 5, y: 42 },
'zhang-fei': { x: 4, y: 46 },
'jian-yong': { x: 3, y: 47 },
'mi-zhu': { x: 5, y: 48 },
'sun-qian': { x: 7, y: 47 },
'zhao-yun': { x: 8, y: 43 },
'zhuge-liang': { x: 6, y: 42 },
'ma-liang': { x: 8, y: 48 },
'yi-ji': { x: 9, y: 45 },
'gong-zhi': { x: 10, y: 48 },
'huang-zhong': { x: 7, y: 44 },
'wei-yan': { x: 10, y: 42 },
'pang-tong': { x: 9, y: 43 },
'fa-zheng': { x: 11, y: 45 },
'wu-yi': { x: 12, y: 43 },
'yan-yan': { x: 11, y: 41 },
'li-yan': { x: 13, y: 42 },
'huang-quan': { x: 14, y: 44 }
};
export const thirtyFourthBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits
].map((unit) => placeScenarioUnit(unit, thirtyFourthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('jiameng-scout-a', '한중 척후', '산길 척후', 'bandit', 64, 198, 64, 18, 43),
createThirtyFirstEnemyUnit('jiameng-scout-b', '한중 척후', '관문 척후', 'bandit', 64, 198, 64, 26, 41),
createThirtyFirstEnemyUnit('jiameng-scout-c', '한중 척후', '수로 척후', 'bandit', 65, 206, 66, 34, 39),
createThirtyFirstEnemyUnit('jiameng-infantry-a', '장로 보병', '외곽 보병', 'yellowTurban', 65, 288, 78, 33, 36),
createThirtyFirstEnemyUnit('jiameng-infantry-b', '장로 보병', '외곽 보병', 'yellowTurban', 65, 288, 78, 38, 35),
createThirtyFirstEnemyUnit('jiameng-infantry-c', '가맹관 보병', '관문 보병', 'yellowTurban', 66, 300, 80, 45, 30),
createThirtyFirstEnemyUnit('jiameng-infantry-d', '가맹관 보병', '관문 보병', 'yellowTurban', 66, 300, 80, 49, 29),
createThirtyFirstEnemyUnit('jiameng-archer-a', '한중 궁병', '산허리 궁병', 'archer', 65, 206, 66, 36, 32),
createThirtyFirstEnemyUnit('jiameng-archer-b', '한중 궁병', '관문 궁병', 'archer', 66, 214, 68, 47, 24),
createThirtyFirstEnemyUnit('jiameng-archer-c', '한중 궁병', '고지 궁병', 'archer', 66, 214, 68, 55, 19),
createThirtyFirstEnemyUnit('jiameng-cavalry-a', '서량 기병', '좌익 기병', 'cavalry', 66, 304, 68, 30, 45),
createThirtyFirstEnemyUnit('jiameng-cavalry-b', '서량 기병', '우익 기병', 'cavalry', 66, 304, 68, 44, 40),
createThirtyFirstEnemyUnit('jiameng-cavalry-c', '서량 기병', '돌격 기병', 'cavalry', 67, 316, 70, 56, 33),
createThirtyFirstEnemyUnit('jiameng-cavalry-d', '서량 기병', '친위 기병', 'cavalry', 67, 316, 70, 61, 26),
createThirtyFirstEnemyUnit('jiameng-guard-a', '마초 친위대', '돌격 친위대', 'yellowTurban', 67, 326, 72, 53, 24),
createThirtyFirstEnemyUnit('jiameng-guard-b', '마초 친위대', '관문 친위대', 'yellowTurban', 67, 326, 72, 58, 23),
createThirtyFirstEnemyUnit('jiameng-strategist-a', '한중 책사', '장로 사자', 'strategist', 66, 214, 68, 50, 20),
createThirtyFirstEnemyUnit('jiameng-strategist-b', '한중 책사', '관문 책사', 'strategist', 67, 222, 70, 60, 18),
createThirtyFirstEnemyUnit('jiameng-ambusher-a', '한중 복병', '남령 복병', 'bandit', 65, 206, 66, 39, 43),
createThirtyFirstEnemyUnit('jiameng-ambusher-b', '한중 복병', '동령 복병', 'bandit', 65, 206, 66, 52, 37),
createThirtyFirstEnemyUnit('jiameng-officer-pang-de', '방덕', '서량 부장', 'rebelLeader', 68, 344, 74, 59, 25),
createThirtyFirstEnemyUnit('jiameng-leader-ma-chao', '마초', '서량 기병장', 'rebelLeader', 69, 336, 76, 63, 20)
];
const thirtyFifthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 4, y: 46 },
'guan-yu': { x: 5, y: 44 },
'zhang-fei': { x: 4, y: 48 },
'jian-yong': { x: 3, y: 49 },
'mi-zhu': { x: 5, y: 50 },
'sun-qian': { x: 7, y: 49 },
'zhao-yun': { x: 8, y: 45 },
'zhuge-liang': { x: 6, y: 44 },
'ma-liang': { x: 8, y: 50 },
'yi-ji': { x: 9, y: 47 },
'gong-zhi': { x: 10, y: 50 },
'huang-zhong': { x: 7, y: 46 },
'wei-yan': { x: 10, y: 44 },
'pang-tong': { x: 9, y: 45 },
'fa-zheng': { x: 11, y: 47 },
'wu-yi': { x: 12, y: 45 },
'yan-yan': { x: 11, y: 43 },
'li-yan': { x: 13, y: 44 },
'huang-quan': { x: 14, y: 46 },
'ma-chao': { x: 13, y: 42 }
};
export const thirtyFifthBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits
].map((unit) => placeScenarioUnit(unit, thirtyFifthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('yangping-scout-a', '양평관 척후', '서쪽 척후', 'bandit', 68, 214, 76, 19, 45),
createThirtyFirstEnemyUnit('yangping-scout-b', '양평관 척후', '강변 척후', 'bandit', 68, 214, 76, 27, 43),
createThirtyFirstEnemyUnit('yangping-scout-c', '양평관 척후', '산허리 척후', 'bandit', 69, 222, 78, 36, 41),
createThirtyFirstEnemyUnit('yangping-infantry-a', '장로 보병', '서문 보병', 'yellowTurban', 69, 316, 94, 35, 38),
createThirtyFirstEnemyUnit('yangping-infantry-b', '장로 보병', '강변 보병', 'yellowTurban', 69, 316, 94, 40, 37),
createThirtyFirstEnemyUnit('yangping-infantry-c', '양평관 보병', '관문 보병', 'yellowTurban', 70, 328, 96, 47, 33),
createThirtyFirstEnemyUnit('yangping-infantry-d', '양평관 보병', '관문 보병', 'yellowTurban', 70, 328, 96, 51, 31),
createThirtyFirstEnemyUnit('yangping-infantry-e', '한중 보병', '창고 보병', 'yellowTurban', 71, 340, 98, 61, 28),
createThirtyFirstEnemyUnit('yangping-archer-a', '한중 궁병', '서벽 궁병', 'archer', 69, 222, 78, 38, 35),
createThirtyFirstEnemyUnit('yangping-archer-b', '한중 궁병', '관문 궁병', 'archer', 70, 230, 80, 50, 27),
createThirtyFirstEnemyUnit('yangping-archer-c', '한중 궁병', '고지 궁병', 'archer', 70, 230, 80, 58, 22),
createThirtyFirstEnemyUnit('yangping-archer-d', '한중 궁병', '창고 궁병', 'archer', 71, 238, 82, 64, 30),
createThirtyFirstEnemyUnit('yangping-cavalry-a', '한중 기병', '좌익 기병', 'cavalry', 70, 332, 98, 31, 47),
createThirtyFirstEnemyUnit('yangping-cavalry-b', '한중 기병', '우익 기병', 'cavalry', 70, 332, 98, 45, 42),
createThirtyFirstEnemyUnit('yangping-cavalry-c', '한중 기병', '돌격 기병', 'cavalry', 71, 344, 100, 57, 36),
createThirtyFirstEnemyUnit('yangping-cavalry-d', '한중 기병', '친위 기병', 'cavalry', 71, 344, 100, 65, 31),
createThirtyFirstEnemyUnit('yangping-guard-a', '장로 친위대', '서문 친위대', 'yellowTurban', 71, 356, 102, 55, 27),
createThirtyFirstEnemyUnit('yangping-guard-b', '장로 친위대', '창고 친위대', 'yellowTurban', 71, 356, 102, 62, 26),
createThirtyFirstEnemyUnit('yangping-strategist-a', '한중 책사', '도술 책사', 'strategist', 70, 230, 80, 53, 23),
createThirtyFirstEnemyUnit('yangping-strategist-b', '한중 책사', '장로 사자', 'strategist', 71, 238, 82, 64, 20),
createThirtyFirstEnemyUnit('yangping-ambusher-a', '한중 복병', '남령 복병', 'bandit', 69, 224, 80, 41, 45),
createThirtyFirstEnemyUnit('yangping-ambusher-b', '한중 복병', '동령 복병', 'bandit', 69, 224, 80, 54, 39),
createThirtyFirstEnemyUnit('yangping-officer-yan-pu', '염포', '한중 참모', 'strategist', 72, 252, 86, 60, 24),
createThirtyFirstEnemyUnit('yangping-leader-zhang-wei', '장위', '양평관 선봉장', 'rebelLeader', 73, 382, 108, 66, 24)
];
const thirtySixthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 4, y: 48 },
'guan-yu': { x: 5, y: 46 },
'zhang-fei': { x: 4, y: 50 },
'jian-yong': { x: 3, y: 51 },
'mi-zhu': { x: 5, y: 52 },
'sun-qian': { x: 7, y: 51 },
'zhao-yun': { x: 8, y: 47 },
'zhuge-liang': { x: 6, y: 46 },
'ma-liang': { x: 8, y: 52 },
'yi-ji': { x: 9, y: 49 },
'gong-zhi': { x: 10, y: 52 },
'huang-zhong': { x: 7, y: 48 },
'wei-yan': { x: 10, y: 46 },
'pang-tong': { x: 9, y: 47 },
'fa-zheng': { x: 11, y: 49 },
'wu-yi': { x: 12, y: 47 },
'yan-yan': { x: 11, y: 45 },
'li-yan': { x: 13, y: 46 },
'huang-quan': { x: 14, y: 48 },
'ma-chao': { x: 13, y: 44 },
'ma-dai': { x: 15, y: 45 }
};
export const thirtySixthBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits
].map((unit) => placeScenarioUnit(unit, thirtySixthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('dingjun-scout-a', '정군산 척후', '서령 척후', 'bandit', 72, 190, 60, 20, 47),
createThirtyFirstEnemyUnit('dingjun-scout-b', '정군산 척후', '산길 척후', 'bandit', 72, 190, 60, 29, 45),
createThirtyFirstEnemyUnit('dingjun-scout-c', '정군산 척후', '강변 척후', 'bandit', 73, 198, 62, 38, 43),
createThirtyFirstEnemyUnit('dingjun-infantry-a', '조조 보병', '서령 보병', 'yellowTurban', 73, 270, 72, 36, 40),
createThirtyFirstEnemyUnit('dingjun-infantry-b', '조조 보병', '중턱 보병', 'yellowTurban', 73, 270, 72, 42, 39),
createThirtyFirstEnemyUnit('dingjun-infantry-c', '하후연 보병', '능선 보병', 'yellowTurban', 74, 280, 76, 49, 35),
createThirtyFirstEnemyUnit('dingjun-infantry-d', '하후연 보병', '본진 보병', 'yellowTurban', 74, 280, 76, 53, 33),
createThirtyFirstEnemyUnit('dingjun-infantry-e', '정군산 보병', '창고 보병', 'yellowTurban', 75, 292, 78, 63, 30),
createThirtyFirstEnemyUnit('dingjun-archer-a', '조조 궁병', '서벽 궁병', 'archer', 73, 196, 62, 39, 37),
createThirtyFirstEnemyUnit('dingjun-archer-b', '조조 궁병', '능선 궁병', 'archer', 74, 204, 64, 51, 29),
createThirtyFirstEnemyUnit('dingjun-archer-c', '조조 궁병', '고지 궁병', 'archer', 74, 204, 64, 60, 24),
createThirtyFirstEnemyUnit('dingjun-archer-d', '조조 궁병', '창고 궁병', 'archer', 75, 212, 66, 66, 32),
createThirtyFirstEnemyUnit('dingjun-cavalry-a', '조조 기병', '좌익 기병', 'cavalry', 74, 286, 64, 32, 49),
createThirtyFirstEnemyUnit('dingjun-cavalry-b', '조조 기병', '우익 기병', 'cavalry', 74, 286, 64, 47, 44),
createThirtyFirstEnemyUnit('dingjun-cavalry-c', '하후연 기병', '돌격 기병', 'cavalry', 75, 296, 66, 59, 38),
createThirtyFirstEnemyUnit('dingjun-cavalry-d', '하후연 기병', '친위 기병', 'cavalry', 75, 296, 66, 67, 33),
createThirtyFirstEnemyUnit('dingjun-guard-a', '하후연 친위대', '능선 친위대', 'yellowTurban', 75, 304, 80, 56, 29),
createThirtyFirstEnemyUnit('dingjun-guard-b', '하후연 친위대', '본진 친위대', 'yellowTurban', 75, 304, 80, 64, 28),
createThirtyFirstEnemyUnit('dingjun-strategist-a', '조조 책사', '고지 책사', 'strategist', 74, 204, 64, 54, 25),
createThirtyFirstEnemyUnit('dingjun-strategist-b', '조조 책사', '본진 책사', 'strategist', 75, 212, 66, 66, 22),
createThirtyFirstEnemyUnit('dingjun-ambusher-a', '조조 복병', '남령 복병', 'bandit', 73, 198, 56, 43, 47),
createThirtyFirstEnemyUnit('dingjun-ambusher-b', '조조 복병', '동령 복병', 'bandit', 73, 198, 56, 56, 41),
createThirtyFirstEnemyUnit('dingjun-officer-zhang-he', '장합', '조조 선봉장', 'cavalry', 76, 300, 72, 57, 31),
createThirtyFirstEnemyUnit('dingjun-officer-wang-ping', '왕평', '한중 길잡이', 'spearman', 75, 270, 76, 55, 34),
createThirtyFirstEnemyUnit('dingjun-leader-xiahou-yuan', '하후연', '정군산 주장', 'rebelLeader', 77, 320, 78, 60, 31)
];
const thirtySeventhBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 4, y: 50 },
'guan-yu': { x: 5, y: 48 },
'zhang-fei': { x: 4, y: 52 },
'jian-yong': { x: 3, y: 53 },
'mi-zhu': { x: 5, y: 54 },
'sun-qian': { x: 7, y: 53 },
'zhao-yun': { x: 8, y: 49 },
'zhuge-liang': { x: 6, y: 48 },
'ma-liang': { x: 8, y: 54 },
'yi-ji': { x: 9, y: 51 },
'gong-zhi': { x: 10, y: 54 },
'huang-zhong': { x: 7, y: 50 },
'wei-yan': { x: 10, y: 48 },
'pang-tong': { x: 9, y: 49 },
'fa-zheng': { x: 11, y: 51 },
'wu-yi': { x: 12, y: 49 },
'yan-yan': { x: 11, y: 47 },
'li-yan': { x: 13, y: 48 },
'huang-quan': { x: 14, y: 50 },
'ma-chao': { x: 13, y: 46 },
'ma-dai': { x: 15, y: 47 },
'wang-ping': { x: 16, y: 49 }
};
export const thirtySeventhBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits
].map((unit) => placeScenarioUnit(unit, thirtySeventhBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('hanzhong-scout-a', '조조 척후', '서곡 척후', 'bandit', 76, 254, 88, 21, 49),
createThirtyFirstEnemyUnit('hanzhong-scout-b', '조조 척후', '강변 척후', 'bandit', 76, 254, 88, 30, 47),
createThirtyFirstEnemyUnit('hanzhong-scout-c', '조조 척후', '북로 척후', 'bandit', 77, 262, 90, 40, 45),
createThirtyFirstEnemyUnit('hanzhong-infantry-a', '조조 보병', '서곡 보병', 'yellowTurban', 77, 386, 110, 36, 42),
createThirtyFirstEnemyUnit('hanzhong-infantry-b', '조조 보병', '중로 보병', 'yellowTurban', 77, 386, 110, 42, 40),
createThirtyFirstEnemyUnit('hanzhong-infantry-c', '한중 보병', '능선 보병', 'yellowTurban', 78, 398, 114, 49, 37),
createThirtyFirstEnemyUnit('hanzhong-infantry-d', '한중 보병', '창고 보병', 'yellowTurban', 78, 398, 114, 56, 34),
createThirtyFirstEnemyUnit('hanzhong-infantry-e', '조조 보병', '본진 보병', 'yellowTurban', 79, 410, 116, 64, 29),
createThirtyFirstEnemyUnit('hanzhong-infantry-f', '조조 보병', '퇴로 보병', 'yellowTurban', 79, 410, 116, 69, 24),
createThirtyFirstEnemyUnit('hanzhong-archer-a', '조조 궁병', '서벽 궁병', 'archer', 77, 270, 92, 39, 39),
createThirtyFirstEnemyUnit('hanzhong-archer-b', '조조 궁병', '능선 궁병', 'archer', 78, 278, 94, 51, 31),
createThirtyFirstEnemyUnit('hanzhong-archer-c', '조조 궁병', '고지 궁병', 'archer', 78, 278, 94, 60, 26),
createThirtyFirstEnemyUnit('hanzhong-archer-d', '조조 궁병', '본진 궁병', 'archer', 79, 286, 96, 68, 22),
createThirtyFirstEnemyUnit('hanzhong-archer-e', '조조 궁병', '퇴로 궁병', 'archer', 79, 286, 96, 70, 31),
createThirtyFirstEnemyUnit('hanzhong-cavalry-a', '조조 기병', '좌익 기병', 'cavalry', 78, 410, 116, 31, 50),
createThirtyFirstEnemyUnit('hanzhong-cavalry-b', '조조 기병', '우익 기병', 'cavalry', 78, 410, 116, 47, 46),
createThirtyFirstEnemyUnit('hanzhong-cavalry-c', '조조 기병', '돌격 기병', 'cavalry', 79, 422, 118, 59, 40),
createThirtyFirstEnemyUnit('hanzhong-cavalry-d', '조조 기병', '친위 기병', 'cavalry', 79, 422, 118, 66, 36),
createThirtyFirstEnemyUnit('hanzhong-cavalry-e', '조조 기병', '북로 기병', 'cavalry', 80, 434, 120, 71, 28),
createThirtyFirstEnemyUnit('hanzhong-guard-a', '조조 친위대', '능선 친위대', 'yellowTurban', 80, 444, 122, 57, 31),
createThirtyFirstEnemyUnit('hanzhong-guard-b', '조조 친위대', '본진 친위대', 'yellowTurban', 80, 444, 122, 65, 27),
createThirtyFirstEnemyUnit('hanzhong-guard-c', '조조 친위대', '퇴로 친위대', 'yellowTurban', 81, 456, 124, 70, 20),
createThirtyFirstEnemyUnit('hanzhong-strategist-a', '조조 책사', '능선 책사', 'strategist', 78, 278, 96, 54, 27),
createThirtyFirstEnemyUnit('hanzhong-strategist-b', '조조 책사', '본진 책사', 'strategist', 79, 286, 98, 66, 24),
createThirtyFirstEnemyUnit('hanzhong-strategist-c', '조조 책사', '퇴로 책사', 'strategist', 80, 294, 100, 71, 18),
createThirtyFirstEnemyUnit('hanzhong-ambusher-a', '조조 복병', '남령 복병', 'bandit', 77, 264, 92, 43, 49),
createThirtyFirstEnemyUnit('hanzhong-ambusher-b', '조조 복병', '동령 복병', 'bandit', 77, 264, 92, 56, 43),
createThirtyFirstEnemyUnit('hanzhong-officer-zhang-he', '장합', '조조 선봉장', 'cavalry', 81, 462, 126, 62, 31),
createThirtyFirstEnemyUnit('hanzhong-officer-xu-huang', '서황', '조조 우장군', 'rebelLeader', 82, 474, 128, 67, 26),
createThirtyFirstEnemyUnit('hanzhong-leader-cao-cao', '조조', '위왕', 'rebelLeader', 84, 520, 138, 70, 18)
];
const thirtyEighthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 5, y: 51 },
'guan-yu': { x: 9, y: 46 },
'zhang-fei': { x: 6, y: 53 },
'jian-yong': { x: 4, y: 54 },
'mi-zhu': { x: 8, y: 52 },
'sun-qian': { x: 7, y: 55 },
'zhao-yun': { x: 11, y: 49 },
'zhuge-liang': { x: 8, y: 48 },
'ma-liang': { x: 10, y: 51 },
'yi-ji': { x: 12, y: 54 },
'gong-zhi': { x: 13, y: 52 },
'huang-zhong': { x: 14, y: 48 },
'wei-yan': { x: 12, y: 46 },
'pang-tong': { x: 9, y: 49 },
'fa-zheng': { x: 15, y: 51 },
'wu-yi': { x: 16, y: 48 },
'yan-yan': { x: 17, y: 50 },
'li-yan': { x: 15, y: 46 },
'huang-quan': { x: 18, y: 52 },
'ma-chao': { x: 19, y: 47 },
'ma-dai': { x: 20, y: 49 },
'wang-ping': { x: 18, y: 45 }
};
export const thirtyEighthBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits
].map((unit) => placeScenarioUnit(unit, thirtyEighthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('jing-defense-wu-scout-a', '오군 척후', '강변 척후', 'bandit', 82, 286, 96, 24, 47),
createThirtyFirstEnemyUnit('jing-defense-wu-scout-b', '오군 척후', '나루 척후', 'bandit', 82, 286, 96, 32, 45),
createThirtyFirstEnemyUnit('jing-defense-wei-scout-a', '위군 척후', '북로 척후', 'bandit', 82, 286, 96, 42, 43),
createThirtyFirstEnemyUnit('jing-defense-wei-scout-b', '위군 척후', '성채 척후', 'bandit', 83, 294, 98, 51, 40),
createThirtyFirstEnemyUnit('jing-defense-wu-infantry-a', '오군 보병', '나루 보병', 'yellowTurban', 83, 432, 122, 37, 39),
createThirtyFirstEnemyUnit('jing-defense-wu-infantry-b', '오군 보병', '강변 보병', 'yellowTurban', 83, 432, 122, 44, 38),
createThirtyFirstEnemyUnit('jing-defense-wei-infantry-a', '위군 보병', '북문 보병', 'yellowTurban', 84, 444, 124, 53, 35),
createThirtyFirstEnemyUnit('jing-defense-wei-infantry-b', '위군 보병', '성채 보병', 'yellowTurban', 84, 444, 124, 61, 31),
createThirtyFirstEnemyUnit('jing-defense-wei-infantry-c', '위군 보병', '봉화 보병', 'yellowTurban', 85, 456, 126, 68, 26),
createThirtyFirstEnemyUnit('jing-defense-wu-archer-a', '오군 궁병', '강안 궁병', 'archer', 83, 298, 100, 39, 41),
createThirtyFirstEnemyUnit('jing-defense-wu-archer-b', '오군 궁병', '나루 궁병', 'archer', 84, 306, 102, 48, 36),
createThirtyFirstEnemyUnit('jing-defense-wei-archer-a', '위군 궁병', '성벽 궁병', 'archer', 84, 306, 102, 58, 28),
createThirtyFirstEnemyUnit('jing-defense-wei-archer-b', '위군 궁병', '봉화 궁병', 'archer', 85, 314, 104, 70, 23),
createThirtyFirstEnemyUnit('jing-defense-wu-cavalry-a', '오군 기병', '강변 기병', 'cavalry', 84, 446, 126, 31, 49),
createThirtyFirstEnemyUnit('jing-defense-wu-cavalry-b', '오군 기병', '나루 기병', 'cavalry', 84, 446, 126, 46, 44),
createThirtyFirstEnemyUnit('jing-defense-wei-cavalry-a', '위군 기병', '북로 기병', 'cavalry', 85, 458, 128, 59, 38),
createThirtyFirstEnemyUnit('jing-defense-wei-cavalry-b', '위군 기병', '성채 기병', 'cavalry', 85, 458, 128, 68, 33),
createThirtyFirstEnemyUnit('jing-defense-wu-guard-a', '오군 수비대', '나루 수비대', 'yellowTurban', 85, 468, 130, 55, 34),
createThirtyFirstEnemyUnit('jing-defense-wu-guard-b', '오군 수비대', '강안 수비대', 'yellowTurban', 85, 468, 130, 63, 36),
createThirtyFirstEnemyUnit('jing-defense-wei-guard-a', '위군 친위대', '성채 친위대', 'yellowTurban', 86, 480, 132, 66, 25),
createThirtyFirstEnemyUnit('jing-defense-wei-guard-b', '위군 친위대', '북문 친위대', 'yellowTurban', 86, 480, 132, 71, 20),
createThirtyFirstEnemyUnit('jing-defense-wu-strategist-a', '오군 책사', '강동 설객', 'strategist', 84, 306, 104, 52, 37),
createThirtyFirstEnemyUnit('jing-defense-wu-strategist-b', '오군 책사', '나루 책사', 'strategist', 85, 314, 106, 66, 35),
createThirtyFirstEnemyUnit('jing-defense-wei-strategist-a', '위군 책사', '북로 책사', 'strategist', 85, 314, 106, 63, 24),
createThirtyFirstEnemyUnit('jing-defense-ambusher-a', '오군 복병', '남안 복병', 'bandit', 83, 300, 102, 36, 51),
createThirtyFirstEnemyUnit('jing-defense-ambusher-b', '위군 복병', '서림 복병', 'bandit', 83, 300, 102, 49, 46),
createThirtyFirstEnemyUnit('jing-defense-ambusher-c', '오군 복병', '동림 복병', 'bandit', 84, 308, 104, 60, 42),
createThirtyFirstEnemyUnit('jing-defense-officer-lu-xun', '육손', '강동 참모', 'strategist', 86, 330, 112, 64, 37),
createThirtyFirstEnemyUnit('jing-defense-officer-cao-ren', '조인', '위군 수비장', 'rebelLeader', 87, 500, 136, 70, 23),
createThirtyFirstEnemyUnit('jing-defense-leader-lu-meng', '여몽', '오군 도독', 'rebelLeader', 88, 520, 140, 72, 35)
];
const thirtyNinthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 5, y: 54 },
'guan-yu': { x: 10, y: 49 },
'zhang-fei': { x: 6, y: 56 },
'jian-yong': { x: 4, y: 57 },
'mi-zhu': { x: 8, y: 55 },
'sun-qian': { x: 9, y: 58 },
'zhao-yun': { x: 13, y: 52 },
'zhuge-liang': { x: 9, y: 51 },
'ma-liang': { x: 12, y: 54 },
'yi-ji': { x: 14, y: 57 },
'gong-zhi': { x: 15, y: 55 },
'huang-zhong': { x: 16, y: 50 },
'wei-yan': { x: 14, y: 48 },
'pang-tong': { x: 11, y: 52 },
'fa-zheng': { x: 17, y: 54 },
'wu-yi': { x: 18, y: 51 },
'yan-yan': { x: 19, y: 53 },
'li-yan': { x: 17, y: 48 },
'huang-quan': { x: 20, y: 55 },
'ma-chao': { x: 21, y: 49 },
'ma-dai': { x: 22, y: 51 },
'wang-ping': { x: 20, y: 47 }
};
export const thirtyNinthBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits
].map((unit) => placeScenarioUnit(unit, thirtyNinthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('fan-castle-scout-a', '조조군 척후', '강변 척후', 'bandit', 85, 306, 102, 28, 51),
createThirtyFirstEnemyUnit('fan-castle-scout-b', '조조군 척후', '제방 척후', 'bandit', 85, 306, 102, 35, 48),
createThirtyFirstEnemyUnit('fan-castle-scout-c', '조조군 척후', '북문 척후', 'bandit', 86, 314, 104, 50, 42),
createThirtyFirstEnemyUnit('fan-castle-infantry-a', '번성 보병', '하류 보병', 'yellowTurban', 86, 462, 130, 40, 44),
createThirtyFirstEnemyUnit('fan-castle-infantry-b', '번성 보병', '중로 보병', 'yellowTurban', 86, 462, 130, 48, 41),
createThirtyFirstEnemyUnit('fan-castle-infantry-c', '번성 보병', '성문 보병', 'yellowTurban', 87, 474, 132, 57, 35),
createThirtyFirstEnemyUnit('fan-castle-infantry-d', '번성 보병', '보루 보병', 'yellowTurban', 87, 474, 132, 63, 31),
createThirtyFirstEnemyUnit('fan-castle-infantry-e', '번성 보병', '상류 보병', 'yellowTurban', 88, 486, 134, 69, 25),
createThirtyFirstEnemyUnit('fan-castle-archer-a', '번성 궁병', '제방 궁병', 'archer', 86, 322, 108, 43, 46),
createThirtyFirstEnemyUnit('fan-castle-archer-b', '번성 궁병', '강안 궁병', 'archer', 87, 330, 110, 53, 38),
createThirtyFirstEnemyUnit('fan-castle-archer-c', '번성 궁병', '북문 궁병', 'archer', 87, 330, 110, 62, 33),
createThirtyFirstEnemyUnit('fan-castle-archer-d', '번성 궁병', '보루 궁병', 'archer', 88, 338, 112, 71, 27),
createThirtyFirstEnemyUnit('fan-castle-archer-e', '번성 궁병', '성벽 궁병', 'archer', 88, 338, 112, 73, 19),
createThirtyFirstEnemyUnit('fan-castle-cavalry-a', '방덕 기병', '좌익 기병', 'cavalry', 87, 474, 134, 32, 52),
createThirtyFirstEnemyUnit('fan-castle-cavalry-b', '방덕 기병', '중앙 기병', 'cavalry', 87, 474, 134, 47, 47),
createThirtyFirstEnemyUnit('fan-castle-cavalry-c', '방덕 기병', '우익 기병', 'cavalry', 88, 486, 136, 58, 41),
createThirtyFirstEnemyUnit('fan-castle-cavalry-d', '방덕 기병', '북로 기병', 'cavalry', 88, 486, 136, 68, 35),
createThirtyFirstEnemyUnit('fan-castle-guard-a', '번성 친위대', '외곽 친위대', 'yellowTurban', 89, 512, 140, 59, 32),
createThirtyFirstEnemyUnit('fan-castle-guard-b', '번성 친위대', '성문 친위대', 'yellowTurban', 89, 512, 140, 66, 28),
createThirtyFirstEnemyUnit('fan-castle-guard-c', '번성 친위대', '수문 친위대', 'yellowTurban', 90, 524, 142, 70, 22),
createThirtyFirstEnemyUnit('fan-castle-guard-d', '번성 친위대', '내성 친위대', 'yellowTurban', 90, 524, 142, 74, 17),
createThirtyFirstEnemyUnit('fan-castle-strategist-a', '조조군 책사', '수로 책사', 'strategist', 87, 338, 114, 55, 39),
createThirtyFirstEnemyUnit('fan-castle-strategist-b', '조조군 책사', '성문 책사', 'strategist', 88, 346, 116, 66, 30),
createThirtyFirstEnemyUnit('fan-castle-strategist-c', '조조군 책사', '상류 책사', 'strategist', 89, 354, 118, 72, 21),
createThirtyFirstEnemyUnit('fan-castle-ambusher-a', '번성 복병', '숲길 복병', 'bandit', 86, 316, 106, 38, 53),
createThirtyFirstEnemyUnit('fan-castle-ambusher-b', '번성 복병', '둑길 복병', 'bandit', 87, 324, 108, 52, 45),
createThirtyFirstEnemyUnit('fan-castle-ambusher-c', '번성 복병', '나루 복병', 'bandit', 87, 324, 108, 64, 40),
createThirtyFirstEnemyUnit('fan-castle-officer-yu-jin', '우금', '조조군 도독', 'rebelLeader', 90, 540, 144, 69, 24),
createThirtyFirstEnemyUnit('fan-castle-officer-cao-ren', '조인', '번성 수비장', 'rebelLeader', 91, 552, 146, 73, 18),
createThirtyFirstEnemyUnit('fan-castle-leader-pang-de', '방덕', '번성 선봉장', 'cavalry', 92, 566, 150, 71, 31)
];
const fortiethBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 5, y: 56 },
'guan-yu': { x: 11, y: 51 },
'zhang-fei': { x: 6, y: 58 },
'jian-yong': { x: 4, y: 59 },
'mi-zhu': { x: 8, y: 57 },
'sun-qian': { x: 9, y: 60 },
'zhao-yun': { x: 14, y: 54 },
'zhuge-liang': { x: 9, y: 53 },
'ma-liang': { x: 13, y: 56 },
'yi-ji': { x: 15, y: 59 },
'gong-zhi': { x: 16, y: 57 },
'huang-zhong': { x: 17, y: 52 },
'wei-yan': { x: 15, y: 50 },
'pang-tong': { x: 12, y: 54 },
'fa-zheng': { x: 18, y: 56 },
'wu-yi': { x: 19, y: 53 },
'yan-yan': { x: 20, y: 55 },
'li-yan': { x: 18, y: 50 },
'huang-quan': { x: 21, y: 57 },
'ma-chao': { x: 22, y: 51 },
'ma-dai': { x: 23, y: 53 },
'wang-ping': { x: 21, y: 49 }
};
export const fortiethBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits
].map((unit) => placeScenarioUnit(unit, fortiethBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('han-river-scout-a', '우금군 척후', '둑길 척후', 'bandit', 88, 326, 108, 30, 53),
createThirtyFirstEnemyUnit('han-river-scout-b', '우금군 척후', '수문 척후', 'bandit', 88, 326, 108, 38, 50),
createThirtyFirstEnemyUnit('han-river-scout-c', '우금군 척후', '상류 척후', 'bandit', 89, 334, 110, 55, 44),
createThirtyFirstEnemyUnit('han-river-infantry-a', '우금군 보병', '하류 보병', 'yellowTurban', 89, 492, 138, 42, 46),
createThirtyFirstEnemyUnit('han-river-infantry-b', '우금군 보병', '둑길 보병', 'yellowTurban', 89, 492, 138, 50, 43),
createThirtyFirstEnemyUnit('han-river-infantry-c', '우금군 보병', '중앙 보병', 'yellowTurban', 90, 504, 140, 59, 37),
createThirtyFirstEnemyUnit('han-river-infantry-d', '우금군 보병', '수로 보병', 'yellowTurban', 90, 504, 140, 66, 33),
createThirtyFirstEnemyUnit('han-river-infantry-e', '우금군 보병', '상류 보병', 'yellowTurban', 91, 516, 142, 72, 27),
createThirtyFirstEnemyUnit('han-river-archer-a', '우금군 궁병', '제방 궁병', 'archer', 89, 346, 116, 45, 48),
createThirtyFirstEnemyUnit('han-river-archer-b', '우금군 궁병', '나루 궁병', 'archer', 90, 354, 118, 55, 40),
createThirtyFirstEnemyUnit('han-river-archer-c', '우금군 궁병', '중앙 궁병', 'archer', 90, 354, 118, 64, 35),
createThirtyFirstEnemyUnit('han-river-archer-d', '우금군 궁병', '성벽 궁병', 'archer', 91, 362, 120, 73, 29),
createThirtyFirstEnemyUnit('han-river-archer-e', '우금군 궁병', '상류 궁병', 'archer', 91, 362, 120, 75, 21),
createThirtyFirstEnemyUnit('han-river-cavalry-a', '방덕 기병', '좌익 기병', 'cavalry', 90, 504, 142, 34, 54),
createThirtyFirstEnemyUnit('han-river-cavalry-b', '방덕 기병', '둑길 기병', 'cavalry', 90, 504, 142, 49, 49),
createThirtyFirstEnemyUnit('han-river-cavalry-c', '방덕 기병', '중앙 기병', 'cavalry', 91, 516, 144, 60, 43),
createThirtyFirstEnemyUnit('han-river-cavalry-d', '방덕 기병', '상류 기병', 'cavalry', 91, 516, 144, 70, 37),
createThirtyFirstEnemyUnit('han-river-guard-a', '우금군 친위대', '수문 친위대', 'yellowTurban', 92, 548, 148, 61, 34),
createThirtyFirstEnemyUnit('han-river-guard-b', '우금군 친위대', '본진 친위대', 'yellowTurban', 92, 548, 148, 68, 30),
createThirtyFirstEnemyUnit('han-river-guard-c', '우금군 친위대', '우금 친위대', 'yellowTurban', 93, 560, 150, 72, 24),
createThirtyFirstEnemyUnit('han-river-guard-d', '우금군 친위대', '성문 친위대', 'yellowTurban', 93, 560, 150, 76, 18),
createThirtyFirstEnemyUnit('han-river-strategist-a', '조조군 책사', '수위 책사', 'strategist', 90, 362, 122, 57, 41),
createThirtyFirstEnemyUnit('han-river-strategist-b', '조조군 책사', '본진 책사', 'strategist', 91, 370, 124, 68, 32),
createThirtyFirstEnemyUnit('han-river-strategist-c', '조조군 책사', '상류 책사', 'strategist', 92, 378, 126, 74, 23),
createThirtyFirstEnemyUnit('han-river-ambusher-a', '둑길 복병', '진흙 복병', 'bandit', 89, 336, 112, 40, 55),
createThirtyFirstEnemyUnit('han-river-ambusher-b', '둑길 복병', '제방 복병', 'bandit', 90, 344, 114, 54, 47),
createThirtyFirstEnemyUnit('han-river-ambusher-c', '둑길 복병', '나루 복병', 'bandit', 90, 344, 114, 66, 42),
createThirtyFirstEnemyUnit('han-river-officer-pang-de', '방덕', '조조군 선봉장', 'cavalry', 93, 584, 154, 72, 34),
createThirtyFirstEnemyUnit('han-river-officer-cao-ren', '조인', '번성 수비장', 'rebelLeader', 94, 588, 154, 76, 19),
createThirtyFirstEnemyUnit('han-river-leader-yu-jin', '우금', '칠군 총대장', 'rebelLeader', 95, 612, 158, 73, 26)
];
const fortyFirstBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 5, y: 58 },
'guan-yu': { x: 12, y: 53 },
'zhang-fei': { x: 6, y: 60 },
'jian-yong': { x: 4, y: 61 },
'mi-zhu': { x: 8, y: 59 },
'sun-qian': { x: 9, y: 62 },
'zhao-yun': { x: 15, y: 56 },
'zhuge-liang': { x: 9, y: 55 },
'ma-liang': { x: 14, y: 58 },
'yi-ji': { x: 16, y: 61 },
'gong-zhi': { x: 17, y: 59 },
'huang-zhong': { x: 18, y: 54 },
'wei-yan': { x: 16, y: 52 },
'pang-tong': { x: 13, y: 56 },
'fa-zheng': { x: 19, y: 58 },
'wu-yi': { x: 20, y: 55 },
'yan-yan': { x: 21, y: 57 },
'li-yan': { x: 19, y: 52 },
'huang-quan': { x: 22, y: 59 },
'ma-chao': { x: 23, y: 53 },
'ma-dai': { x: 24, y: 55 },
'wang-ping': { x: 22, y: 51 }
};
export const fortyFirstBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits
].map((unit) => placeScenarioUnit(unit, fortyFirstBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('fan-siege-scout-a', '번성 척후', '남문 척후', 'bandit', 91, 354, 116, 31, 54),
createThirtyFirstEnemyUnit('fan-siege-scout-b', '번성 척후', '수문 척후', 'bandit', 91, 354, 116, 42, 50),
createThirtyFirstEnemyUnit('fan-siege-scout-c', '번성 척후', '동문 척후', 'bandit', 92, 362, 118, 55, 43),
createThirtyFirstEnemyUnit('fan-siege-scout-d', '강동 척후', '나루 척후', 'bandit', 92, 362, 118, 26, 56),
createThirtyFirstEnemyUnit('fan-siege-infantry-a', '번성 보병', '하류 보병', 'yellowTurban', 92, 528, 146, 44, 48),
createThirtyFirstEnemyUnit('fan-siege-infantry-b', '번성 보병', '외성 보병', 'yellowTurban', 92, 528, 146, 53, 43),
createThirtyFirstEnemyUnit('fan-siege-infantry-c', '번성 보병', '남문 보병', 'yellowTurban', 93, 540, 148, 62, 37),
createThirtyFirstEnemyUnit('fan-siege-infantry-d', '번성 보병', '동문 보병', 'yellowTurban', 93, 540, 148, 69, 31),
createThirtyFirstEnemyUnit('fan-siege-infantry-e', '번성 보병', '내성 보병', 'yellowTurban', 94, 552, 150, 75, 24),
createThirtyFirstEnemyUnit('fan-siege-infantry-f', '번성 보병', '북문 보병', 'yellowTurban', 94, 552, 150, 78, 16),
createThirtyFirstEnemyUnit('fan-siege-archer-a', '번성 궁병', '제방 궁병', 'archer', 92, 378, 124, 46, 50),
createThirtyFirstEnemyUnit('fan-siege-archer-b', '번성 궁병', '외성 궁병', 'archer', 93, 386, 126, 56, 41),
createThirtyFirstEnemyUnit('fan-siege-archer-c', '번성 궁병', '성벽 궁병', 'archer', 93, 386, 126, 66, 34),
createThirtyFirstEnemyUnit('fan-siege-archer-d', '번성 궁병', '내성 궁병', 'archer', 94, 394, 128, 74, 28),
createThirtyFirstEnemyUnit('fan-siege-archer-e', '번성 궁병', '북문 궁병', 'archer', 94, 394, 128, 79, 20),
createThirtyFirstEnemyUnit('fan-siege-archer-f', '강동 궁병', '강안 궁병', 'archer', 93, 386, 126, 32, 57),
createThirtyFirstEnemyUnit('fan-siege-cavalry-a', '방덕 기병', '결사 기병', 'cavalry', 94, 552, 150, 38, 55),
createThirtyFirstEnemyUnit('fan-siege-cavalry-b', '방덕 기병', '중앙 기병', 'cavalry', 94, 552, 150, 51, 48),
createThirtyFirstEnemyUnit('fan-siege-cavalry-c', '방덕 기병', '동문 기병', 'cavalry', 95, 564, 152, 64, 40),
createThirtyFirstEnemyUnit('fan-siege-cavalry-d', '조조군 기병', '북로 기병', 'cavalry', 95, 564, 152, 73, 34),
createThirtyFirstEnemyUnit('fan-siege-cavalry-e', '강동 기병', '나루 기병', 'cavalry', 94, 552, 150, 35, 59),
createThirtyFirstEnemyUnit('fan-siege-guard-a', '번성 친위대', '외성 친위대', 'yellowTurban', 96, 596, 158, 63, 35),
createThirtyFirstEnemyUnit('fan-siege-guard-b', '번성 친위대', '성문 친위대', 'yellowTurban', 96, 596, 158, 70, 30),
createThirtyFirstEnemyUnit('fan-siege-guard-c', '번성 친위대', '수문 친위대', 'yellowTurban', 97, 608, 160, 74, 22),
createThirtyFirstEnemyUnit('fan-siege-guard-d', '번성 친위대', '내성 친위대', 'yellowTurban', 97, 608, 160, 79, 17),
createThirtyFirstEnemyUnit('fan-siege-guard-e', '번성 친위대', '조인 친위대', 'yellowTurban', 98, 620, 162, 77, 12),
createThirtyFirstEnemyUnit('fan-siege-strategist-a', '번성 책사', '수문 책사', 'strategist', 94, 394, 130, 58, 39),
createThirtyFirstEnemyUnit('fan-siege-strategist-b', '번성 책사', '성문 책사', 'strategist', 95, 402, 132, 69, 26),
createThirtyFirstEnemyUnit('fan-siege-strategist-c', '강동 책사', '나루 책사', 'strategist', 94, 394, 130, 30, 53),
createThirtyFirstEnemyUnit('fan-siege-ambusher-a', '성벽 복병', '무너진 담 복병', 'bandit', 92, 364, 120, 47, 45),
createThirtyFirstEnemyUnit('fan-siege-ambusher-b', '성벽 복병', '마른 해자 복병', 'bandit', 93, 372, 122, 60, 38),
createThirtyFirstEnemyUnit('fan-siege-ambusher-c', '강동 복병', '강안 복병', 'bandit', 93, 372, 122, 27, 60),
createThirtyFirstEnemyUnit('fan-siege-officer-pang-de', '방덕', '결사 선봉장', 'cavalry', 98, 648, 168, 61, 32),
createThirtyFirstEnemyUnit('fan-siege-officer-lu-meng', '여몽', '강동 정찰장', 'rebelLeader', 96, 612, 160, 33, 61),
createThirtyFirstEnemyUnit('fan-siege-leader-cao-ren', '조인', '번성 수비장', 'rebelLeader', 99, 676, 172, 78, 18)
];
const fortySecondBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 6, y: 59 },
'guan-yu': { x: 13, y: 54 },
'zhang-fei': { x: 7, y: 61 },
'jian-yong': { x: 5, y: 62 },
'mi-zhu': { x: 9, y: 60 },
'sun-qian': { x: 10, y: 63 },
'zhao-yun': { x: 16, y: 57 },
'zhuge-liang': { x: 10, y: 56 },
'ma-liang': { x: 15, y: 59 },
'yi-ji': { x: 17, y: 62 },
'gong-zhi': { x: 18, y: 60 },
'huang-zhong': { x: 19, y: 55 },
'wei-yan': { x: 17, y: 53 },
'pang-tong': { x: 14, y: 57 },
'fa-zheng': { x: 20, y: 59 },
'wu-yi': { x: 21, y: 56 },
'yan-yan': { x: 22, y: 58 },
'li-yan': { x: 20, y: 53 },
'huang-quan': { x: 23, y: 60 },
'ma-chao': { x: 24, y: 54 },
'ma-dai': { x: 25, y: 56 },
'wang-ping': { x: 23, y: 52 }
};
const fortySecondBattleUnitsBase: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits
].map((unit) => placeScenarioUnit(unit, fortySecondBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('jing-rear-scout-a', '강동 척후', '흰 옷 척후', 'bandit', 94, 382, 126, 30, 57),
createThirtyFirstEnemyUnit('jing-rear-scout-b', '강동 척후', '상선 척후', 'bandit', 94, 382, 126, 39, 54),
createThirtyFirstEnemyUnit('jing-rear-scout-c', '강동 척후', '약재선 척후', 'bandit', 95, 390, 128, 51, 49),
createThirtyFirstEnemyUnit('jing-rear-scout-d', '강동 척후', '북나루 척후', 'bandit', 95, 390, 128, 64, 43),
createThirtyFirstEnemyUnit('jing-rear-scout-e', '강동 척후', '동림 척후', 'bandit', 96, 398, 130, 75, 36),
createThirtyFirstEnemyUnit('jing-rear-infantry-a', '강동 보병', '나루 보병', 'yellowTurban', 95, 558, 152, 43, 50),
createThirtyFirstEnemyUnit('jing-rear-infantry-b', '강동 보병', '창고 보병', 'yellowTurban', 95, 558, 152, 54, 45),
createThirtyFirstEnemyUnit('jing-rear-infantry-c', '강동 보병', '강릉 보병', 'yellowTurban', 96, 570, 154, 63, 38),
createThirtyFirstEnemyUnit('jing-rear-infantry-d', '강동 보병', '동문 보병', 'yellowTurban', 96, 570, 154, 72, 31),
createThirtyFirstEnemyUnit('jing-rear-infantry-e', '강동 보병', '후방 보병', 'yellowTurban', 97, 582, 156, 78, 24),
createThirtyFirstEnemyUnit('jing-rear-infantry-f', '강동 보병', '공안 보병', 'yellowTurban', 97, 582, 156, 80, 15),
createThirtyFirstEnemyUnit('jing-rear-archer-a', '강동 궁병', '강안 궁병', 'archer', 95, 406, 132, 35, 58),
createThirtyFirstEnemyUnit('jing-rear-archer-b', '강동 궁병', '상선 궁병', 'archer', 96, 414, 134, 49, 51),
createThirtyFirstEnemyUnit('jing-rear-archer-c', '강동 궁병', '창고 궁병', 'archer', 96, 414, 134, 59, 44),
createThirtyFirstEnemyUnit('jing-rear-archer-d', '강동 궁병', '동림 궁병', 'archer', 97, 422, 136, 70, 36),
createThirtyFirstEnemyUnit('jing-rear-archer-e', '강동 궁병', '공안 궁병', 'archer', 97, 422, 136, 79, 20),
createThirtyFirstEnemyUnit('jing-rear-cavalry-a', '강동 기병', '나루 기병', 'cavalry', 96, 576, 156, 37, 60),
createThirtyFirstEnemyUnit('jing-rear-cavalry-b', '강동 기병', '창고 기병', 'cavalry', 96, 576, 156, 52, 53),
createThirtyFirstEnemyUnit('jing-rear-cavalry-c', '강동 기병', '동림 기병', 'cavalry', 97, 588, 158, 67, 42),
createThirtyFirstEnemyUnit('jing-rear-cavalry-d', '강동 기병', '공안 기병', 'cavalry', 97, 588, 158, 77, 32),
createThirtyFirstEnemyUnit('jing-rear-guard-a', '강동 수비대', '상선 수비대', 'yellowTurban', 98, 626, 164, 58, 42),
createThirtyFirstEnemyUnit('jing-rear-guard-b', '강동 수비대', '창고 수비대', 'yellowTurban', 98, 626, 164, 68, 34),
createThirtyFirstEnemyUnit('jing-rear-guard-c', '강동 수비대', '여몽 수비대', 'yellowTurban', 99, 638, 166, 75, 27),
createThirtyFirstEnemyUnit('jing-rear-guard-d', '강동 수비대', '동문 수비대', 'yellowTurban', 99, 638, 166, 81, 18),
createThirtyFirstEnemyUnit('jing-rear-strategist-a', '강동 책사', '상선 책사', 'strategist', 96, 422, 136, 45, 55),
createThirtyFirstEnemyUnit('jing-rear-strategist-b', '강동 책사', '강릉 책사', 'strategist', 97, 430, 138, 62, 39),
createThirtyFirstEnemyUnit('jing-rear-strategist-c', '강동 책사', '공안 책사', 'strategist', 98, 438, 140, 77, 22),
createThirtyFirstEnemyUnit('jing-rear-ambusher-a', '강동 복병', '흰 옷 복병', 'bandit', 95, 392, 130, 32, 62),
createThirtyFirstEnemyUnit('jing-rear-ambusher-b', '강동 복병', '창고 복병', 'bandit', 96, 400, 132, 55, 57),
createThirtyFirstEnemyUnit('jing-rear-ambusher-c', '강동 복병', '동림 복병', 'bandit', 96, 400, 132, 72, 45),
createThirtyFirstEnemyUnit('jing-rear-marine-a', '강동 수군', '나루 수군', 'yellowTurban', 96, 570, 154, 41, 61),
createThirtyFirstEnemyUnit('jing-rear-marine-b', '강동 수군', '상선 수군', 'yellowTurban', 97, 582, 156, 48, 58),
createThirtyFirstEnemyUnit('jing-rear-officer-lu-xun', '육손', '강동 설객', 'strategist', 99, 462, 146, 71, 29),
createThirtyFirstEnemyUnit('jing-rear-officer-mi-fang', '미방', '흔들리는 후방장', 'rebelLeader', 98, 620, 162, 66, 48),
createThirtyFirstEnemyUnit('jing-rear-leader-lu-meng', '여몽', '강동 도독', 'rebelLeader', 100, 690, 176, 80, 26)
];
export const fortySecondBattleUnits: UnitData[] = tuneEnemyUnitGroup(fortySecondBattleUnitsBase, ['jing-rear-'], {
hpScale: 0.68,
attackScale: 0.84,
overrides: {
'jing-rear-officer-lu-xun': { hp: 320, attack: 110, x: 56, y: 48 },
'jing-rear-officer-mi-fang': { hp: 400, attack: 122, x: 54, y: 52 },
'jing-rear-leader-lu-meng': { hp: 560, attack: 132, x: 64, y: 42 }
}
});
const fortyThirdBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 8, y: 61 },
'guan-yu': { x: 15, y: 56 },
'zhang-fei': { x: 8, y: 63 },
'jian-yong': { x: 6, y: 64 },
'mi-zhu': { x: 11, y: 61 },
'sun-qian': { x: 12, y: 64 },
'zhao-yun': { x: 18, y: 58 },
'zhuge-liang': { x: 12, y: 57 },
'ma-liang': { x: 17, y: 61 },
'yi-ji': { x: 19, y: 64 },
'gong-zhi': { x: 20, y: 62 },
'huang-zhong': { x: 22, y: 56 },
'wei-yan': { x: 19, y: 54 },
'pang-tong': { x: 15, y: 59 },
'fa-zheng': { x: 23, y: 61 },
'wu-yi': { x: 24, y: 57 },
'yan-yan': { x: 25, y: 59 },
'li-yan': { x: 22, y: 53 },
'huang-quan': { x: 26, y: 62 },
'ma-chao': { x: 27, y: 55 },
'ma-dai': { x: 28, y: 57 },
'wang-ping': { x: 25, y: 52 }
};
const fortyThirdBattleUnitsBase: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits
].map((unit) => placeScenarioUnit(unit, fortyThirdBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('jing-collapse-scout-a', '강동 척후', '백의 척후', 'bandit', 97, 400, 132, 34, 58),
createThirtyFirstEnemyUnit('jing-collapse-scout-b', '강동 척후', '성문 척후', 'bandit', 97, 400, 132, 48, 52),
createThirtyFirstEnemyUnit('jing-collapse-scout-c', '강동 척후', '창고 척후', 'bandit', 98, 408, 134, 61, 46),
createThirtyFirstEnemyUnit('jing-collapse-scout-d', '강동 척후', '내문 척후', 'bandit', 98, 408, 134, 75, 38),
createThirtyFirstEnemyUnit('jing-collapse-infantry-a', '강동 보병', '나루 보병', 'yellowTurban', 98, 590, 158, 42, 56),
createThirtyFirstEnemyUnit('jing-collapse-infantry-b', '강동 보병', '창고 보병', 'yellowTurban', 98, 590, 158, 55, 50),
createThirtyFirstEnemyUnit('jing-collapse-infantry-c', '강동 보병', '외성 보병', 'yellowTurban', 99, 602, 160, 66, 43),
createThirtyFirstEnemyUnit('jing-collapse-infantry-d', '강동 보병', '공안 보병', 'yellowTurban', 99, 602, 160, 76, 31),
createThirtyFirstEnemyUnit('jing-collapse-infantry-e', '강동 보병', '내성 보병', 'yellowTurban', 100, 614, 162, 82, 22),
createThirtyFirstEnemyUnit('jing-collapse-infantry-f', '강동 보병', '동문 보병', 'yellowTurban', 100, 614, 162, 80, 13),
createThirtyFirstEnemyUnit('jing-collapse-archer-a', '강동 궁병', '나루 궁병', 'archer', 98, 430, 138, 38, 60),
createThirtyFirstEnemyUnit('jing-collapse-archer-b', '강동 궁병', '창고 궁병', 'archer', 99, 438, 140, 52, 54),
createThirtyFirstEnemyUnit('jing-collapse-archer-c', '강동 궁병', '성루 궁병', 'archer', 99, 438, 140, 67, 46),
createThirtyFirstEnemyUnit('jing-collapse-archer-d', '강동 궁병', '공안 궁병', 'archer', 100, 446, 142, 79, 34),
createThirtyFirstEnemyUnit('jing-collapse-archer-e', '강동 궁병', '동문 궁병', 'archer', 100, 446, 142, 83, 18),
createThirtyFirstEnemyUnit('jing-collapse-cavalry-a', '강동 기병', '나루 기병', 'cavalry', 99, 606, 160, 39, 63),
createThirtyFirstEnemyUnit('jing-collapse-cavalry-b', '강동 기병', '외성 기병', 'cavalry', 99, 606, 160, 58, 55),
createThirtyFirstEnemyUnit('jing-collapse-cavalry-c', '강동 기병', '동림 기병', 'cavalry', 100, 618, 162, 72, 43),
createThirtyFirstEnemyUnit('jing-collapse-cavalry-d', '강동 기병', '공안 기병', 'cavalry', 100, 618, 162, 78, 28),
createThirtyFirstEnemyUnit('jing-collapse-guard-a', '공안 수비대', '흔들린 수비대', 'yellowTurban', 101, 652, 168, 61, 44),
createThirtyFirstEnemyUnit('jing-collapse-guard-b', '공안 수비대', '성문 수비대', 'yellowTurban', 101, 652, 168, 70, 36),
createThirtyFirstEnemyUnit('jing-collapse-guard-c', '공안 수비대', '부사인 친위대', 'yellowTurban', 102, 664, 170, 77, 25),
createThirtyFirstEnemyUnit('jing-collapse-guard-d', '공안 수비대', '미방 친위대', 'yellowTurban', 102, 664, 170, 81, 17),
createThirtyFirstEnemyUnit('jing-collapse-strategist-a', '강동 설객', '육손 서리', 'strategist', 99, 448, 142, 45, 57),
createThirtyFirstEnemyUnit('jing-collapse-strategist-b', '강동 설객', '공안 설객', 'strategist', 100, 456, 144, 66, 39),
createThirtyFirstEnemyUnit('jing-collapse-strategist-c', '강동 설객', '내성 설객', 'strategist', 101, 464, 146, 79, 23),
createThirtyFirstEnemyUnit('jing-collapse-ambusher-a', '백의 복병', '나루 복병', 'bandit', 98, 410, 134, 31, 64),
createThirtyFirstEnemyUnit('jing-collapse-ambusher-b', '백의 복병', '창고 복병', 'bandit', 99, 418, 136, 56, 59),
createThirtyFirstEnemyUnit('jing-collapse-ambusher-c', '백의 복병', '성문 복병', 'bandit', 99, 418, 136, 73, 47),
createThirtyFirstEnemyUnit('jing-collapse-ambusher-d', '백의 복병', '북문 복병', 'bandit', 100, 426, 138, 84, 29),
createThirtyFirstEnemyUnit('jing-collapse-marine-a', '강동 수군', '상선 수군', 'yellowTurban', 99, 606, 160, 44, 65),
createThirtyFirstEnemyUnit('jing-collapse-marine-b', '강동 수군', '나루 수군', 'yellowTurban', 100, 618, 162, 50, 61),
createThirtyFirstEnemyUnit('jing-collapse-marine-c', '강동 수군', '서문 수군', 'yellowTurban', 100, 618, 162, 63, 56),
createThirtyFirstEnemyUnit('jing-collapse-officer-lu-xun', '육손', '강동 설객', 'strategist', 102, 488, 150, 72, 30),
createThirtyFirstEnemyUnit('jing-collapse-officer-fu-shiren', '부사인', '흔들리는 공안장', 'rebelLeader', 101, 656, 170, 76, 21),
createThirtyFirstEnemyUnit('jing-collapse-officer-mi-fang', '미방', '흔들리는 강릉장', 'rebelLeader', 101, 656, 170, 67, 48),
createThirtyFirstEnemyUnit('jing-collapse-leader-lu-meng', '여몽', '백의도강 도독', 'rebelLeader', 103, 720, 182, 83, 24)
];
export const fortyThirdBattleUnits: UnitData[] = tuneEnemyUnitGroup(fortyThirdBattleUnitsBase, ['jing-collapse-'], {
hpScale: 0.55,
attackScale: 0.78,
overrides: {
'jing-collapse-officer-lu-xun': { hp: 280, attack: 104, x: 52, y: 50 },
'jing-collapse-officer-fu-shiren': { hp: 360, attack: 118, x: 56, y: 48 },
'jing-collapse-officer-mi-fang': { hp: 360, attack: 118, x: 50, y: 55 },
'jing-collapse-leader-lu-meng': { hp: 430, attack: 128, x: 60, y: 52 }
}
});
const fortyFourthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 24, y: 45 },
'guan-yu': { x: 30, y: 38 },
'zhang-fei': { x: 24, y: 49 },
'jian-yong': { x: 20, y: 50 },
'mi-zhu': { x: 23, y: 43 },
'sun-qian': { x: 22, y: 53 },
'zhao-yun': { x: 33, y: 42 },
'zhuge-liang': { x: 25, y: 41 },
'ma-liang': { x: 31, y: 45 },
'yi-ji': { x: 28, y: 51 },
'gong-zhi': { x: 29, y: 54 },
'huang-zhong': { x: 35, y: 36 },
'wei-yan': { x: 32, y: 34 },
'pang-tong': { x: 27, y: 47 },
'fa-zheng': { x: 36, y: 46 },
'wu-yi': { x: 38, y: 41 },
'yan-yan': { x: 39, y: 44 },
'li-yan': { x: 35, y: 32 },
'huang-quan': { x: 40, y: 48 },
'ma-chao': { x: 41, y: 36 },
'ma-dai': { x: 43, y: 39 },
'wang-ping': { x: 37, y: 34 }
};
const fortyFourthBattleUnitsBase: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits
].map((unit) => placeScenarioUnit(unit, fortyFourthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('maicheng-wu-scout-a', '강동 척후', '북문 척후', 'bandit', 101, 426, 138, 48, 30),
createThirtyFirstEnemyUnit('maicheng-wu-scout-b', '강동 척후', '갈대 척후', 'bandit', 101, 426, 138, 53, 52),
createThirtyFirstEnemyUnit('maicheng-wu-scout-c', '강동 척후', '서림 척후', 'bandit', 102, 434, 140, 18, 41),
createThirtyFirstEnemyUnit('maicheng-wu-scout-d', '강동 척후', '남문 척후', 'bandit', 102, 434, 140, 45, 63),
createThirtyFirstEnemyUnit('maicheng-wu-infantry-a', '강동 보병', '북문 보병', 'yellowTurban', 102, 620, 164, 55, 28),
createThirtyFirstEnemyUnit('maicheng-wu-infantry-b', '강동 보병', '북로 보병', 'yellowTurban', 102, 620, 164, 62, 34),
createThirtyFirstEnemyUnit('maicheng-wu-infantry-c', '강동 보병', '동문 보병', 'yellowTurban', 103, 632, 166, 70, 43),
createThirtyFirstEnemyUnit('maicheng-wu-infantry-d', '강동 보병', '남문 보병', 'yellowTurban', 103, 632, 166, 58, 59),
createThirtyFirstEnemyUnit('maicheng-wu-infantry-e', '강동 보병', '서림 보병', 'yellowTurban', 104, 644, 168, 22, 52),
createThirtyFirstEnemyUnit('maicheng-wu-infantry-f', '강동 보병', '포위 보병', 'yellowTurban', 104, 644, 168, 76, 28),
createThirtyFirstEnemyUnit('maicheng-wu-archer-a', '강동 궁병', '북문 궁병', 'archer', 102, 456, 146, 50, 24),
createThirtyFirstEnemyUnit('maicheng-wu-archer-b', '강동 궁병', '동림 궁병', 'archer', 103, 464, 148, 72, 38),
createThirtyFirstEnemyUnit('maicheng-wu-archer-c', '강동 궁병', '남문 궁병', 'archer', 103, 464, 148, 61, 64),
createThirtyFirstEnemyUnit('maicheng-wu-archer-d', '강동 궁병', '서림 궁병', 'archer', 104, 472, 150, 19, 47),
createThirtyFirstEnemyUnit('maicheng-wu-archer-e', '강동 궁병', '갈대 궁병', 'archer', 104, 472, 150, 43, 56),
createThirtyFirstEnemyUnit('maicheng-wu-archer-f', '강동 궁병', '산길 궁병', 'archer', 105, 480, 152, 66, 21),
createThirtyFirstEnemyUnit('maicheng-wu-cavalry-a', '강동 기병', '북로 기병', 'cavalry', 103, 632, 166, 57, 18),
createThirtyFirstEnemyUnit('maicheng-wu-cavalry-b', '강동 기병', '동로 기병', 'cavalry', 103, 632, 166, 80, 36),
createThirtyFirstEnemyUnit('maicheng-wu-cavalry-c', '강동 기병', '남로 기병', 'cavalry', 104, 644, 168, 66, 61),
createThirtyFirstEnemyUnit('maicheng-wu-cavalry-d', '강동 기병', '서로 기병', 'cavalry', 104, 644, 168, 16, 58),
createThirtyFirstEnemyUnit('maicheng-wu-guard-a', '강동 친위대', '북문 친위대', 'yellowTurban', 105, 668, 172, 63, 27),
createThirtyFirstEnemyUnit('maicheng-wu-guard-b', '강동 친위대', '동문 친위대', 'yellowTurban', 105, 668, 172, 78, 45),
createThirtyFirstEnemyUnit('maicheng-wu-guard-c', '강동 친위대', '남문 친위대', 'yellowTurban', 106, 680, 174, 54, 66),
createThirtyFirstEnemyUnit('maicheng-wu-guard-d', '강동 친위대', '서문 친위대', 'yellowTurban', 106, 680, 174, 25, 57),
createThirtyFirstEnemyUnit('maicheng-wu-ambusher-a', '백의 복병', '북문 복병', 'bandit', 102, 442, 142, 44, 28),
createThirtyFirstEnemyUnit('maicheng-wu-ambusher-b', '백의 복병', '숲길 복병', 'bandit', 103, 450, 144, 27, 33),
createThirtyFirstEnemyUnit('maicheng-wu-ambusher-c', '백의 복병', '갈대 복병', 'bandit', 103, 450, 144, 48, 58),
createThirtyFirstEnemyUnit('maicheng-wu-ambusher-d', '백의 복병', '서림 복병', 'bandit', 104, 458, 146, 12, 44),
createThirtyFirstEnemyUnit('maicheng-wu-ambusher-e', '백의 복병', '퇴로 복병', 'bandit', 104, 458, 146, 72, 55),
createThirtyFirstEnemyUnit('maicheng-wu-marine-a', '강동 수군', '갈대 수군', 'yellowTurban', 103, 636, 166, 35, 61),
createThirtyFirstEnemyUnit('maicheng-wu-marine-b', '강동 수군', '물목 수군', 'yellowTurban', 104, 648, 168, 42, 66),
createThirtyFirstEnemyUnit('maicheng-wu-marine-c', '강동 수군', '나루 수군', 'yellowTurban', 104, 648, 168, 52, 67),
createThirtyFirstEnemyUnit('maicheng-wei-cavalry-a', '위군 기병', '번성 추격대', 'cavalry', 104, 654, 170, 67, 15),
createThirtyFirstEnemyUnit('maicheng-wei-cavalry-b', '위군 기병', '북로 추격대', 'cavalry', 105, 666, 172, 74, 19),
createThirtyFirstEnemyUnit('maicheng-wei-cavalry-c', '위군 기병', '동로 추격대', 'cavalry', 105, 666, 172, 82, 25),
createThirtyFirstEnemyUnit('maicheng-wei-infantry-a', '위군 보병', '번성 보병', 'yellowTurban', 104, 650, 168, 69, 12),
createThirtyFirstEnemyUnit('maicheng-wei-infantry-b', '위군 보병', '북로 보병', 'yellowTurban', 105, 662, 170, 78, 16),
createThirtyFirstEnemyUnit('maicheng-wei-infantry-c', '위군 보병', '동로 보병', 'yellowTurban', 105, 662, 170, 84, 30),
createThirtyFirstEnemyUnit('maicheng-strategist-a', '강동 책사', '봉쇄 책사', 'strategist', 105, 492, 152, 61, 31),
createThirtyFirstEnemyUnit('maicheng-strategist-b', '강동 책사', '서찰 책사', 'strategist', 105, 492, 152, 75, 50),
createThirtyFirstEnemyUnit('maicheng-strategist-c', '위군 책사', '추격 책사', 'strategist', 106, 500, 154, 78, 22),
createThirtyFirstEnemyUnit('maicheng-officer-pan-zhang', '반장', '강동 포위장', 'rebelLeader', 106, 690, 176, 68, 53),
createThirtyFirstEnemyUnit('maicheng-officer-ma-zhong', '마충', '매복 지휘관', 'bandit', 106, 520, 156, 52, 36),
createThirtyFirstEnemyUnit('maicheng-officer-lu-xun', '육손', '강동 설객', 'strategist', 107, 512, 156, 73, 34),
createThirtyFirstEnemyUnit('maicheng-officer-xu-huang', '서황', '번성 추격장', 'cavalry', 107, 706, 180, 82, 18),
createThirtyFirstEnemyUnit('maicheng-leader-lu-meng', '여몽', '형주 봉쇄 도독', 'rebelLeader', 108, 742, 186, 80, 43)
];
export const fortyFourthBattleUnits: UnitData[] = tuneEnemyUnitGroup(fortyFourthBattleUnitsBase, ['maicheng-'], {
hpScale: 0.55,
attackScale: 0.64,
overrides: {
'maicheng-officer-pan-zhang': { hp: 360, attack: 108, x: 52, y: 54 },
'maicheng-officer-ma-zhong': { hp: 300, attack: 98, x: 50, y: 42 },
'maicheng-officer-lu-xun': { hp: 280, attack: 98, x: 58, y: 48 },
'maicheng-officer-xu-huang': { hp: 380, attack: 110, x: 60, y: 34 },
'maicheng-leader-lu-meng': { hp: 430, attack: 114, x: 54, y: 55 }
}
});
const fortyFifthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 14, y: 36 },
'guan-yu': { x: 10, y: 41 },
'zhang-fei': { x: 16, y: 39 },
'jian-yong': { x: 9, y: 44 },
'mi-zhu': { x: 11, y: 35 },
'sun-qian': { x: 12, y: 47 },
'zhao-yun': { x: 18, y: 34 },
'zhuge-liang': { x: 8, y: 38 },
'ma-liang': { x: 13, y: 32 },
'yi-ji': { x: 10, y: 50 },
'gong-zhi': { x: 17, y: 49 },
'huang-zhong': { x: 20, y: 37 },
'wei-yan': { x: 19, y: 42 },
'pang-tong': { x: 12, y: 29 },
'fa-zheng': { x: 15, y: 30 },
'wu-yi': { x: 21, y: 45 },
'yan-yan': { x: 22, y: 39 },
'li-yan': { x: 17, y: 27 },
'huang-quan': { x: 8, y: 33 },
'ma-chao': { x: 23, y: 34 },
'ma-dai': { x: 24, y: 38 },
'wang-ping': { x: 19, y: 31 }
};
export const fortyFifthBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits
].map((unit) => placeScenarioUnit(unit, fortyFifthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('yiling-wu-scout-a', '오군 척후', '강변 척후', 'bandit', 108, 448, 144, 36, 23),
createThirtyFirstEnemyUnit('yiling-wu-scout-b', '오군 척후', '숲길 척후', 'bandit', 108, 448, 144, 45, 31),
createThirtyFirstEnemyUnit('yiling-wu-scout-c', '오군 척후', '나루 척후', 'bandit', 109, 456, 146, 57, 49),
createThirtyFirstEnemyUnit('yiling-wu-scout-d', '오군 척후', '남안 척후', 'bandit', 109, 456, 146, 73, 58),
createThirtyFirstEnemyUnit('yiling-wu-infantry-a', '오군 보병', '동진로 보병', 'yellowTurban', 109, 654, 170, 42, 28),
createThirtyFirstEnemyUnit('yiling-wu-infantry-b', '오군 보병', '숲길 보병', 'yellowTurban', 109, 654, 170, 49, 35),
createThirtyFirstEnemyUnit('yiling-wu-infantry-c', '오군 보병', '강변 보병', 'yellowTurban', 110, 666, 172, 56, 44),
createThirtyFirstEnemyUnit('yiling-wu-infantry-d', '오군 보병', '남로 보병', 'yellowTurban', 110, 666, 172, 65, 52),
createThirtyFirstEnemyUnit('yiling-wu-infantry-e', '오군 보병', '협곡 보병', 'yellowTurban', 111, 678, 174, 74, 39),
createThirtyFirstEnemyUnit('yiling-wu-infantry-f', '오군 보병', '후위 보병', 'yellowTurban', 111, 678, 174, 82, 47),
createThirtyFirstEnemyUnit('yiling-wu-archer-a', '오군 궁병', '숲그늘 궁병', 'archer', 109, 492, 150, 38, 20),
createThirtyFirstEnemyUnit('yiling-wu-archer-b', '오군 궁병', '동진 궁병', 'archer', 110, 500, 152, 52, 29),
createThirtyFirstEnemyUnit('yiling-wu-archer-c', '오군 궁병', '강안 궁병', 'archer', 110, 500, 152, 61, 42),
createThirtyFirstEnemyUnit('yiling-wu-archer-d', '오군 궁병', '남안 궁병', 'archer', 111, 508, 154, 71, 55),
createThirtyFirstEnemyUnit('yiling-wu-archer-e', '오군 궁병', '고지 궁병', 'archer', 111, 508, 154, 78, 34),
createThirtyFirstEnemyUnit('yiling-wu-archer-f', '오군 궁병', '화살 진지', 'archer', 112, 516, 156, 84, 50),
createThirtyFirstEnemyUnit('yiling-wu-cavalry-a', '오군 기병', '강북 기병', 'cavalry', 110, 668, 172, 43, 18),
createThirtyFirstEnemyUnit('yiling-wu-cavalry-b', '오군 기병', '숲끝 기병', 'cavalry', 110, 668, 172, 58, 24),
createThirtyFirstEnemyUnit('yiling-wu-cavalry-c', '오군 기병', '남로 기병', 'cavalry', 111, 680, 174, 69, 45),
createThirtyFirstEnemyUnit('yiling-wu-cavalry-d', '오군 기병', '추격 기병', 'cavalry', 111, 680, 174, 84, 39),
createThirtyFirstEnemyUnit('yiling-wu-marine-a', '오군 수군', '강변 수군', 'yellowTurban', 110, 672, 172, 39, 60),
createThirtyFirstEnemyUnit('yiling-wu-marine-b', '오군 수군', '나루 수군', 'yellowTurban', 111, 684, 174, 51, 63),
createThirtyFirstEnemyUnit('yiling-wu-marine-c', '오군 수군', '동쪽 수군', 'yellowTurban', 112, 696, 176, 67, 66),
createThirtyFirstEnemyUnit('yiling-wu-ambusher-a', '오군 복병', '숲속 복병', 'bandit', 109, 468, 148, 34, 35),
createThirtyFirstEnemyUnit('yiling-wu-ambusher-b', '오군 복병', '협곡 복병', 'bandit', 110, 476, 150, 46, 42),
createThirtyFirstEnemyUnit('yiling-wu-ambusher-c', '오군 복병', '강안 복병', 'bandit', 110, 476, 150, 59, 55),
createThirtyFirstEnemyUnit('yiling-wu-ambusher-d', '오군 복병', '후방 복병', 'bandit', 111, 484, 152, 76, 61),
createThirtyFirstEnemyUnit('yiling-wu-ambusher-e', '오군 복병', '화공 준비대', 'bandit', 112, 492, 154, 80, 27),
createThirtyFirstEnemyUnit('yiling-wu-guard-a', '오군 친위대', '전초 친위대', 'yellowTurban', 112, 704, 178, 64, 32),
createThirtyFirstEnemyUnit('yiling-wu-guard-b', '오군 친위대', '강안 친위대', 'yellowTurban', 112, 704, 178, 72, 43),
createThirtyFirstEnemyUnit('yiling-wu-guard-c', '오군 친위대', '후위 친위대', 'yellowTurban', 113, 716, 180, 85, 57),
createThirtyFirstEnemyUnit('yiling-strategist-a', '오군 책사', '화계 책사', 'strategist', 112, 532, 160, 62, 26),
createThirtyFirstEnemyUnit('yiling-strategist-b', '오군 책사', '진영 책사', 'strategist', 113, 540, 162, 74, 51),
createThirtyFirstEnemyUnit('yiling-strategist-c', '오군 책사', '수로 책사', 'strategist', 113, 540, 162, 58, 64),
createThirtyFirstEnemyUnit('yiling-officer-gan-ning-remnant', '감녕 잔부', '강안 돌격장', 'rebelLeader', 112, 712, 180, 53, 58),
createThirtyFirstEnemyUnit('yiling-officer-zhu-ran', '주연', '이릉 전초장', 'rebelLeader', 114, 736, 184, 76, 36),
createThirtyFirstEnemyUnit('yiling-officer-pan-zhang', '반장', '형주 추격장', 'rebelLeader', 113, 728, 182, 70, 24),
createThirtyFirstEnemyUnit('yiling-officer-ma-zhong', '마충', '밀림 매복장', 'bandit', 113, 548, 164, 49, 48),
createThirtyFirstEnemyUnit('yiling-leader-lu-xun', '육손', '오군 대도독', 'rebelLeader', 115, 768, 190, 84, 32)
];
const fortySixthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'liu-bei': { x: 18, y: 41 },
'guan-yu': { x: 13, y: 46 },
'zhang-fei': { x: 20, y: 44 },
'jian-yong': { x: 15, y: 51 },
'mi-zhu': { x: 13, y: 39 },
'sun-qian': { x: 16, y: 54 },
'zhao-yun': { x: 24, y: 38 },
'zhuge-liang': { x: 12, y: 43 },
'ma-liang': { x: 17, y: 35 },
'yi-ji': { x: 11, y: 56 },
'gong-zhi': { x: 21, y: 56 },
'huang-zhong': { x: 26, y: 42 },
'wei-yan': { x: 27, y: 47 },
'pang-tong': { x: 14, y: 32 },
'fa-zheng': { x: 19, y: 33 },
'wu-yi': { x: 28, y: 50 },
'yan-yan': { x: 30, y: 45 },
'li-yan': { x: 22, y: 30 },
'huang-quan': { x: 10, y: 37 },
'ma-chao': { x: 31, y: 39 },
'ma-dai': { x: 32, y: 43 },
'wang-ping': { x: 24, y: 34 }
};
export const fortySixthBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits
].map((unit) => placeScenarioUnit(unit, fortySixthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('yiling-fire-scout-a', '오군 척후', '불길 척후', 'bandit', 114, 480, 150, 36, 26),
createThirtyFirstEnemyUnit('yiling-fire-scout-b', '오군 척후', '강변 척후', 'bandit', 114, 480, 150, 48, 57),
createThirtyFirstEnemyUnit('yiling-fire-scout-c', '오군 척후', '서쪽 척후', 'bandit', 115, 488, 152, 30, 34),
createThirtyFirstEnemyUnit('yiling-fire-scout-d', '오군 척후', '협곡 척후', 'bandit', 115, 488, 152, 64, 33),
createThirtyFirstEnemyUnit('yiling-fire-infantry-a', '오군 보병', '불길 보병', 'yellowTurban', 115, 690, 178, 42, 31),
createThirtyFirstEnemyUnit('yiling-fire-infantry-b', '오군 보병', '진영 보병', 'yellowTurban', 115, 690, 178, 51, 38),
createThirtyFirstEnemyUnit('yiling-fire-infantry-c', '오군 보병', '강안 보병', 'yellowTurban', 116, 702, 180, 58, 53),
createThirtyFirstEnemyUnit('yiling-fire-infantry-d', '오군 보병', '남안 보병', 'yellowTurban', 116, 702, 180, 70, 61),
createThirtyFirstEnemyUnit('yiling-fire-infantry-e', '오군 보병', '협곡 보병', 'yellowTurban', 117, 714, 182, 76, 37),
createThirtyFirstEnemyUnit('yiling-fire-infantry-f', '오군 보병', '후위 보병', 'yellowTurban', 117, 714, 182, 86, 48),
createThirtyFirstEnemyUnit('yiling-fire-archer-a', '오군 궁병', '화살 불씨', 'archer', 115, 530, 160, 39, 22),
createThirtyFirstEnemyUnit('yiling-fire-archer-b', '오군 궁병', '숲그늘 궁병', 'archer', 116, 538, 162, 54, 29),
createThirtyFirstEnemyUnit('yiling-fire-archer-c', '오군 궁병', '강안 궁병', 'archer', 116, 538, 162, 61, 48),
createThirtyFirstEnemyUnit('yiling-fire-archer-d', '오군 궁병', '남안 궁병', 'archer', 117, 546, 164, 75, 58),
createThirtyFirstEnemyUnit('yiling-fire-archer-e', '오군 궁병', '고지 궁병', 'archer', 117, 546, 164, 82, 30),
createThirtyFirstEnemyUnit('yiling-fire-archer-f', '오군 궁병', '퇴로 궁병', 'archer', 118, 554, 166, 88, 43),
createThirtyFirstEnemyUnit('yiling-fire-cavalry-a', '오군 기병', '불길 추격대', 'cavalry', 116, 704, 180, 44, 19),
createThirtyFirstEnemyUnit('yiling-fire-cavalry-b', '오군 기병', '숲끝 기병', 'cavalry', 116, 704, 180, 62, 24),
createThirtyFirstEnemyUnit('yiling-fire-cavalry-c', '오군 기병', '남로 기병', 'cavalry', 117, 716, 182, 73, 45),
createThirtyFirstEnemyUnit('yiling-fire-cavalry-d', '오군 기병', '퇴로 추격대', 'cavalry', 117, 716, 182, 88, 35),
createThirtyFirstEnemyUnit('yiling-fire-marine-a', '오군 수군', '강변 수군', 'yellowTurban', 116, 708, 180, 42, 64),
createThirtyFirstEnemyUnit('yiling-fire-marine-b', '오군 수군', '물길 차단대', 'yellowTurban', 117, 720, 182, 56, 67),
createThirtyFirstEnemyUnit('yiling-fire-marine-c', '오군 수군', '동쪽 수군', 'yellowTurban', 118, 732, 184, 72, 69),
createThirtyFirstEnemyUnit('yiling-fire-ambusher-a', '오군 복병', '불붙임 복병', 'bandit', 115, 500, 154, 35, 39),
createThirtyFirstEnemyUnit('yiling-fire-ambusher-b', '오군 복병', '군막 복병', 'bandit', 116, 508, 156, 47, 44),
createThirtyFirstEnemyUnit('yiling-fire-ambusher-c', '오군 복병', '강안 복병', 'bandit', 116, 508, 156, 59, 59),
createThirtyFirstEnemyUnit('yiling-fire-ambusher-d', '오군 복병', '후방 복병', 'bandit', 117, 516, 158, 80, 62),
createThirtyFirstEnemyUnit('yiling-fire-ambusher-e', '오군 복병', '서쪽 차단대', 'bandit', 117, 516, 158, 28, 50),
createThirtyFirstEnemyUnit('yiling-fire-guard-a', '오군 친위대', '화공 친위대', 'yellowTurban', 118, 742, 186, 66, 34),
createThirtyFirstEnemyUnit('yiling-fire-guard-b', '오군 친위대', '강안 친위대', 'yellowTurban', 118, 742, 186, 78, 51),
createThirtyFirstEnemyUnit('yiling-fire-guard-c', '오군 친위대', '대도독 친위대', 'yellowTurban', 119, 754, 188, 87, 56),
createThirtyFirstEnemyUnit('yiling-fire-strategist-a', '오군 책사', '화계 책사', 'strategist', 118, 570, 168, 63, 28),
createThirtyFirstEnemyUnit('yiling-fire-strategist-b', '오군 책사', '연소 책사', 'strategist', 119, 578, 170, 72, 47),
createThirtyFirstEnemyUnit('yiling-fire-strategist-c', '오군 책사', '수로 책사', 'strategist', 119, 578, 170, 57, 65),
createThirtyFirstEnemyUnit('yiling-fire-officer-zhu-ran', '주연', '화공 선봉장', 'rebelLeader', 120, 776, 192, 78, 40),
createThirtyFirstEnemyUnit('yiling-fire-officer-han-dang', '한당', '강안 노장', 'rebelLeader', 119, 762, 190, 66, 58),
createThirtyFirstEnemyUnit('yiling-fire-officer-pan-zhang', '반장', '추격 지휘관', 'rebelLeader', 119, 762, 190, 72, 24),
createThirtyFirstEnemyUnit('yiling-fire-officer-ma-zhong', '마충', '밀림 차단장', 'bandit', 119, 578, 170, 49, 50),
createThirtyFirstEnemyUnit('yiling-fire-leader-lu-xun', '육손', '화공 대도독', 'rebelLeader', 122, 812, 198, 86, 31)
];
const fortySeventhBattleAllyPositions: Record<string, { x: number; y: number }> = {
'guan-yu': { x: 14, y: 49 },
'zhang-fei': { x: 18, y: 50 },
'jian-yong': { x: 10, y: 55 },
'mi-zhu': { x: 12, y: 52 },
'sun-qian': { x: 14, y: 57 },
'zhao-yun': { x: 20, y: 46 },
'zhuge-liang': { x: 12, y: 47 },
'ma-liang': { x: 16, y: 44 },
'yi-ji': { x: 11, y: 60 },
'gong-zhi': { x: 18, y: 58 },
'huang-zhong': { x: 23, y: 48 },
'wei-yan': { x: 25, y: 52 },
'pang-tong': { x: 15, y: 41 },
'fa-zheng': { x: 19, y: 42 },
'wu-yi': { x: 27, y: 55 },
'yan-yan': { x: 29, y: 50 },
'li-yan': { x: 22, y: 39 },
'huang-quan': { x: 10, y: 45 },
'ma-chao': { x: 31, y: 47 },
'ma-dai': { x: 33, y: 51 },
'wang-ping': { x: 24, y: 43 }
};
const fortySeventhBattleUnitsBase: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally' && unit.id !== 'liu-bei'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits
].map((unit) => placeScenarioUnit(unit, fortySeventhBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('nanzhong-scout-a', '남중 척후', '밀림 척후', 'bandit', 123, 520, 162, 38, 28),
createThirtyFirstEnemyUnit('nanzhong-scout-b', '남중 척후', '계곡 척후', 'bandit', 123, 520, 162, 47, 41),
createThirtyFirstEnemyUnit('nanzhong-scout-c', '남중 척후', '마을 척후', 'bandit', 124, 528, 164, 58, 52),
createThirtyFirstEnemyUnit('nanzhong-scout-d', '남중 척후', '남쪽 척후', 'bandit', 124, 528, 164, 80, 58),
createThirtyFirstEnemyUnit('nanzhong-infantry-a', '남중 보병', '산길 보병', 'yellowTurban', 123, 730, 188, 42, 33),
createThirtyFirstEnemyUnit('nanzhong-infantry-b', '남중 보병', '창고 보병', 'yellowTurban', 124, 742, 190, 52, 39),
createThirtyFirstEnemyUnit('nanzhong-infantry-c', '남중 보병', '마을 보병', 'yellowTurban', 124, 742, 190, 60, 49),
createThirtyFirstEnemyUnit('nanzhong-infantry-d', '남중 보병', '남로 보병', 'yellowTurban', 125, 754, 192, 70, 57),
createThirtyFirstEnemyUnit('nanzhong-infantry-e', '남중 보병', '고개 보병', 'yellowTurban', 125, 754, 192, 82, 43),
createThirtyFirstEnemyUnit('nanzhong-infantry-f', '남중 보병', '후위 보병', 'yellowTurban', 126, 766, 194, 88, 62),
createThirtyFirstEnemyUnit('nanzhong-archer-a', '남중 궁병', '밀림 궁병', 'archer', 123, 570, 170, 40, 24),
createThirtyFirstEnemyUnit('nanzhong-archer-b', '남중 궁병', '절벽 궁병', 'archer', 124, 578, 172, 55, 30),
createThirtyFirstEnemyUnit('nanzhong-archer-c', '남중 궁병', '마을 궁병', 'archer', 124, 578, 172, 65, 47),
createThirtyFirstEnemyUnit('nanzhong-archer-d', '남중 궁병', '남로 궁병', 'archer', 125, 586, 174, 78, 55),
createThirtyFirstEnemyUnit('nanzhong-archer-e', '남중 궁병', '고지 궁병', 'archer', 125, 586, 174, 84, 31),
createThirtyFirstEnemyUnit('nanzhong-archer-f', '남중 궁병', '퇴로 궁병', 'archer', 126, 594, 176, 90, 50),
createThirtyFirstEnemyUnit('nanzhong-beast-rider-a', '남중 기병', '산짐승 기병', 'cavalry', 125, 748, 192, 45, 20),
createThirtyFirstEnemyUnit('nanzhong-beast-rider-b', '남중 기병', '밀림 기병', 'cavalry', 125, 748, 192, 62, 26),
createThirtyFirstEnemyUnit('nanzhong-beast-rider-c', '남중 기병', '남쪽 기병', 'cavalry', 126, 760, 194, 75, 45),
createThirtyFirstEnemyUnit('nanzhong-beast-rider-d', '남중 기병', '추격 기병', 'cavalry', 126, 760, 194, 88, 36),
createThirtyFirstEnemyUnit('nanzhong-ambusher-a', '남중 복병', '덩굴 복병', 'bandit', 124, 540, 166, 35, 38),
createThirtyFirstEnemyUnit('nanzhong-ambusher-b', '남중 복병', '계곡 복병', 'bandit', 125, 548, 168, 49, 46),
createThirtyFirstEnemyUnit('nanzhong-ambusher-c', '남중 복병', '강가 복병', 'bandit', 125, 548, 168, 61, 60),
createThirtyFirstEnemyUnit('nanzhong-ambusher-d', '남중 복병', '후방 복병', 'bandit', 126, 556, 170, 78, 66),
createThirtyFirstEnemyUnit('nanzhong-ambusher-e', '남중 복병', '서쪽 차단대', 'bandit', 126, 556, 170, 30, 53),
createThirtyFirstEnemyUnit('nanzhong-guard-a', '남중 친위대', '마을 친위대', 'yellowTurban', 126, 782, 198, 66, 35),
createThirtyFirstEnemyUnit('nanzhong-guard-b', '남중 친위대', '창고 친위대', 'yellowTurban', 127, 794, 200, 74, 50),
createThirtyFirstEnemyUnit('nanzhong-guard-c', '남중 친위대', '수장 친위대', 'yellowTurban', 127, 794, 200, 86, 56),
createThirtyFirstEnemyUnit('nanzhong-strategist-a', '남중 주술사', '밀림 주술사', 'strategist', 126, 610, 178, 63, 29),
createThirtyFirstEnemyUnit('nanzhong-strategist-b', '남중 주술사', '독안개 주술사', 'strategist', 127, 618, 180, 72, 47),
createThirtyFirstEnemyUnit('nanzhong-strategist-c', '남중 주술사', '강가 주술사', 'strategist', 127, 618, 180, 57, 64),
createThirtyFirstEnemyUnit('nanzhong-officer-gao-ding', '고정', '남중 산채장', 'rebelLeader', 128, 812, 204, 78, 39),
createThirtyFirstEnemyUnit('nanzhong-officer-zhu-bao', '주포', '남중 창고장', 'rebelLeader', 127, 798, 202, 66, 58),
createThirtyFirstEnemyUnit('nanzhong-officer-meng-huo-vanguard', '맹획 선봉', '밀림 호족장', 'rebelLeader', 128, 820, 206, 82, 28),
createThirtyFirstEnemyUnit('nanzhong-leader-yong-kai', '옹개', '남중 반란 수장', 'rebelLeader', 130, 856, 212, 88, 42)
];
export const fortySeventhBattleUnits: UnitData[] = tuneEnemyUnitGroup(fortySeventhBattleUnitsBase, ['nanzhong-'], {
hpScale: 0.74,
attackScale: 0.84,
overrides: {
'nanzhong-officer-gao-ding': { hp: 620, attack: 166, x: 70, y: 39 },
'nanzhong-officer-zhu-bao': { hp: 600, attack: 164, x: 66, y: 55 },
'nanzhong-officer-meng-huo-vanguard': { hp: 620, attack: 166, x: 74, y: 34 },
'nanzhong-leader-yong-kai': { hp: 660, attack: 172, x: 76, y: 42 }
}
});
const fortyEighthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'guan-yu': { x: 12, y: 56 },
'zhang-fei': { x: 16, y: 57 },
'jian-yong': { x: 8, y: 61 },
'mi-zhu': { x: 10, y: 59 },
'sun-qian': { x: 13, y: 63 },
'zhao-yun': { x: 20, y: 53 },
'zhuge-liang': { x: 10, y: 54 },
'ma-liang': { x: 14, y: 51 },
'yi-ji': { x: 9, y: 66 },
'gong-zhi': { x: 17, y: 64 },
'huang-zhong': { x: 23, y: 55 },
'wei-yan': { x: 27, y: 58 },
'pang-tong': { x: 13, y: 48 },
'fa-zheng': { x: 18, y: 49 },
'wu-yi': { x: 29, y: 62 },
'yan-yan': { x: 31, y: 56 },
'li-yan': { x: 23, y: 46 },
'huang-quan': { x: 8, y: 52 },
'ma-chao': { x: 34, y: 53 },
'ma-dai': { x: 36, y: 57 },
'wang-ping': { x: 25, y: 50 }
};
const fortyEighthBattleUnitsBase: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally' && unit.id !== 'liu-bei'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits
].map((unit) => placeScenarioUnit(unit, fortyEighthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('menghuo-scout-a', '남만 척후', '산채 척후', 'bandit', 130, 552, 170, 42, 32),
createThirtyFirstEnemyUnit('menghuo-scout-b', '남만 척후', '숲길 척후', 'bandit', 130, 552, 170, 55, 28),
createThirtyFirstEnemyUnit('menghuo-scout-c', '남만 척후', '늪지 척후', 'bandit', 131, 560, 172, 70, 48),
createThirtyFirstEnemyUnit('menghuo-scout-d', '남만 척후', '동쪽 척후', 'bandit', 131, 560, 172, 86, 59),
createThirtyFirstEnemyUnit('menghuo-vine-infantry-a', '등갑병', '산채 등갑병', 'yellowTurban', 131, 812, 206, 48, 38),
createThirtyFirstEnemyUnit('menghuo-vine-infantry-b', '등갑병', '늪길 등갑병', 'yellowTurban', 132, 824, 208, 61, 42),
createThirtyFirstEnemyUnit('menghuo-vine-infantry-c', '등갑병', '마을 등갑병', 'yellowTurban', 132, 824, 208, 72, 52),
createThirtyFirstEnemyUnit('menghuo-vine-infantry-d', '등갑병', '본대 등갑병', 'yellowTurban', 133, 836, 210, 84, 45),
createThirtyFirstEnemyUnit('menghuo-vine-infantry-e', '등갑병', '수장 등갑병', 'yellowTurban', 133, 836, 210, 89, 36),
createThirtyFirstEnemyUnit('menghuo-archer-a', '남만 궁병', '나무 궁병', 'archer', 130, 604, 180, 45, 24),
createThirtyFirstEnemyUnit('menghuo-archer-b', '남만 궁병', '고지 궁병', 'archer', 131, 612, 182, 58, 21),
createThirtyFirstEnemyUnit('menghuo-archer-c', '남만 궁병', '마을 궁병', 'archer', 131, 612, 182, 68, 39),
createThirtyFirstEnemyUnit('menghuo-archer-d', '남만 궁병', '늪지 궁병', 'archer', 132, 620, 184, 80, 57),
createThirtyFirstEnemyUnit('menghuo-archer-e', '남만 궁병', '본대 궁병', 'archer', 132, 620, 184, 91, 50),
createThirtyFirstEnemyUnit('menghuo-beast-rider-a', '맹수 기병', '코끼리 선봉', 'cavalry', 132, 828, 210, 51, 31),
createThirtyFirstEnemyUnit('menghuo-beast-rider-b', '맹수 기병', '산짐승 기병', 'cavalry', 132, 828, 210, 65, 34),
createThirtyFirstEnemyUnit('menghuo-beast-rider-c', '맹수 기병', '늪지 기병', 'cavalry', 133, 840, 212, 76, 46),
createThirtyFirstEnemyUnit('menghuo-beast-rider-d', '맹수 기병', '추격 기병', 'cavalry', 133, 840, 212, 88, 54),
createThirtyFirstEnemyUnit('menghuo-ambusher-a', '남만 복병', '덩굴 복병', 'bandit', 131, 570, 174, 36, 45),
createThirtyFirstEnemyUnit('menghuo-ambusher-b', '남만 복병', '숲속 복병', 'bandit', 132, 578, 176, 52, 49),
createThirtyFirstEnemyUnit('menghuo-ambusher-c', '남만 복병', '강가 복병', 'bandit', 132, 578, 176, 64, 61),
createThirtyFirstEnemyUnit('menghuo-ambusher-d', '남만 복병', '후방 차단대', 'bandit', 133, 586, 178, 82, 68),
createThirtyFirstEnemyUnit('menghuo-ambusher-e', '남만 복병', '서쪽 차단대', 'bandit', 133, 586, 178, 31, 59),
createThirtyFirstEnemyUnit('menghuo-guard-a', '맹획 친위대', '포로장 경비대', 'yellowTurban', 134, 862, 216, 70, 36),
createThirtyFirstEnemyUnit('menghuo-guard-b', '맹획 친위대', '산채 경비대', 'yellowTurban', 134, 862, 216, 78, 44),
createThirtyFirstEnemyUnit('menghuo-guard-c', '맹획 친위대', '본영 경비대', 'yellowTurban', 135, 874, 218, 88, 40),
createThirtyFirstEnemyUnit('menghuo-shaman-a', '남만 주술사', '독안개 주술사', 'strategist', 133, 644, 190, 60, 30),
createThirtyFirstEnemyUnit('menghuo-shaman-b', '남만 주술사', '늪지 주술사', 'strategist', 134, 652, 192, 73, 43),
createThirtyFirstEnemyUnit('menghuo-shaman-c', '남만 주술사', '산채 주술사', 'strategist', 134, 652, 192, 83, 32),
createThirtyFirstEnemyUnit('menghuo-officer-ahuinan', '아회남', '남만 호족장', 'rebelLeader', 135, 890, 222, 72, 31),
createThirtyFirstEnemyUnit('menghuo-officer-dongtuna', '동도나', '남만 산채장', 'rebelLeader', 135, 890, 222, 78, 60),
createThirtyFirstEnemyUnit('menghuo-officer-mangyachang', '망아장', '맹수대장', 'rebelLeader', 136, 902, 224, 86, 48),
createThirtyFirstEnemyUnit('menghuo-leader', '맹획', '남만왕', 'rebelLeader', 138, 940, 232, 90, 38)
];
export const fortyEighthBattleUnits: UnitData[] = tuneEnemyUnitGroup(fortyEighthBattleUnitsBase, ['menghuo-'], {
hpScale: 0.72,
attackScale: 0.68,
overrides: {
'menghuo-officer-ahuinan': { hp: 640, attack: 158, x: 68, y: 32 },
'menghuo-officer-dongtuna': { hp: 640, attack: 158, x: 74, y: 56 },
'menghuo-officer-mangyachang': { hp: 660, attack: 162, x: 78, y: 45 },
'menghuo-leader': { hp: 760, attack: 170, x: 84, y: 38 }
}
});
const fortyNinthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'guan-yu': { x: 12, y: 59 },
'zhang-fei': { x: 17, y: 61 },
'jian-yong': { x: 8, y: 65 },
'mi-zhu': { x: 10, y: 63 },
'sun-qian': { x: 14, y: 67 },
'zhao-yun': { x: 22, y: 56 },
'zhuge-liang': { x: 11, y: 56 },
'ma-liang': { x: 15, y: 53 },
'yi-ji': { x: 9, y: 70 },
'gong-zhi': { x: 18, y: 68 },
'huang-zhong': { x: 25, y: 57 },
'wei-yan': { x: 30, y: 61 },
'pang-tong': { x: 13, y: 50 },
'fa-zheng': { x: 19, y: 51 },
'wu-yi': { x: 32, y: 66 },
'yan-yan': { x: 35, y: 59 },
'li-yan': { x: 24, y: 49 },
'huang-quan': { x: 8, y: 54 },
'ma-chao': { x: 37, y: 56 },
'ma-dai': { x: 39, y: 61 },
'wang-ping': { x: 27, y: 52 }
};
const fortyNinthBattleUnitsBase: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally' && unit.id !== 'liu-bei'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits
].map((unit) => placeScenarioUnit(unit, fortyNinthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('menghuo-return-scout-a', '남만 재집결 척후', '강가 척후', 'bandit', 136, 586, 178, 43, 33),
createThirtyFirstEnemyUnit('menghuo-return-scout-b', '남만 재집결 척후', '늪지 척후', 'bandit', 136, 586, 178, 58, 31),
createThirtyFirstEnemyUnit('menghuo-return-scout-c', '남만 재집결 척후', '마을 척후', 'bandit', 137, 594, 180, 73, 48),
createThirtyFirstEnemyUnit('menghuo-return-scout-d', '남만 재집결 척후', '동쪽 척후', 'bandit', 137, 594, 180, 88, 62),
createThirtyFirstEnemyUnit('menghuo-return-vine-a', '등갑 재집결병', '습지 등갑병', 'yellowTurban', 137, 846, 214, 48, 41),
createThirtyFirstEnemyUnit('menghuo-return-vine-b', '등갑 재집결병', '산채 등갑병', 'yellowTurban', 138, 858, 216, 60, 44),
createThirtyFirstEnemyUnit('menghuo-return-vine-c', '등갑 재집결병', '마을 등갑병', 'yellowTurban', 138, 858, 216, 72, 54),
createThirtyFirstEnemyUnit('menghuo-return-vine-d', '등갑 재집결병', '본대 등갑병', 'yellowTurban', 139, 870, 218, 85, 47),
createThirtyFirstEnemyUnit('menghuo-return-vine-e', '등갑 재집결병', '후위 등갑병', 'yellowTurban', 139, 870, 218, 92, 38),
createThirtyFirstEnemyUnit('menghuo-return-archer-a', '남만 고지 궁병', '강변 궁병', 'archer', 136, 636, 188, 45, 25),
createThirtyFirstEnemyUnit('menghuo-return-archer-b', '남만 고지 궁병', '절벽 궁병', 'archer', 137, 644, 190, 59, 23),
createThirtyFirstEnemyUnit('menghuo-return-archer-c', '남만 고지 궁병', '마을 궁병', 'archer', 137, 644, 190, 70, 41),
createThirtyFirstEnemyUnit('menghuo-return-archer-d', '남만 고지 궁병', '늪지 궁병', 'archer', 138, 652, 192, 82, 58),
createThirtyFirstEnemyUnit('menghuo-return-archer-e', '남만 고지 궁병', '본영 궁병', 'archer', 138, 652, 192, 91, 51),
createThirtyFirstEnemyUnit('menghuo-return-beast-a', '맹수 재돌격대', '강가 맹수대', 'cavalry', 138, 862, 218, 53, 34),
createThirtyFirstEnemyUnit('menghuo-return-beast-b', '맹수 재돌격대', '늪지 맹수대', 'cavalry', 138, 862, 218, 66, 36),
createThirtyFirstEnemyUnit('menghuo-return-beast-c', '맹수 재돌격대', '산채 맹수대', 'cavalry', 139, 874, 220, 77, 49),
createThirtyFirstEnemyUnit('menghuo-return-beast-d', '맹수 재돌격대', '추격 맹수대', 'cavalry', 139, 874, 220, 89, 55),
createThirtyFirstEnemyUnit('menghuo-return-ambusher-a', '남만 재매복병', '덩굴 매복병', 'bandit', 137, 602, 182, 36, 47),
createThirtyFirstEnemyUnit('menghuo-return-ambusher-b', '남만 재매복병', '숲속 매복병', 'bandit', 138, 610, 184, 51, 50),
createThirtyFirstEnemyUnit('menghuo-return-ambusher-c', '남만 재매복병', '강가 매복병', 'bandit', 138, 610, 184, 64, 63),
createThirtyFirstEnemyUnit('menghuo-return-ambusher-d', '남만 재매복병', '후방 차단대', 'bandit', 139, 618, 186, 82, 70),
createThirtyFirstEnemyUnit('menghuo-return-ambusher-e', '남만 재매복병', '서쪽 차단대', 'bandit', 139, 618, 186, 31, 60),
createThirtyFirstEnemyUnit('menghuo-return-guard-a', '맹획 재집결 친위', '포로장 친위대', 'yellowTurban', 140, 894, 224, 69, 38),
createThirtyFirstEnemyUnit('menghuo-return-guard-b', '맹획 재집결 친위', '산채 친위대', 'yellowTurban', 140, 894, 224, 80, 44),
createThirtyFirstEnemyUnit('menghuo-return-guard-c', '맹획 재집결 친위', '본영 친위대', 'yellowTurban', 141, 906, 226, 90, 41),
createThirtyFirstEnemyUnit('menghuo-return-shaman-a', '남만 독안개 주술사', '늪지 주술사', 'strategist', 139, 676, 198, 61, 32),
createThirtyFirstEnemyUnit('menghuo-return-shaman-b', '남만 독안개 주술사', '강가 주술사', 'strategist', 140, 684, 200, 74, 45),
createThirtyFirstEnemyUnit('menghuo-return-shaman-c', '남만 독안개 주술사', '산채 주술사', 'strategist', 140, 684, 200, 84, 34),
createThirtyFirstEnemyUnit('menghuo-return-officer-meng-you', '맹우', '맹획의 아우', 'rebelLeader', 141, 922, 230, 73, 33),
createThirtyFirstEnemyUnit('menghuo-return-officer-duosi', '타사대왕', '독천 산채장', 'rebelLeader', 141, 922, 230, 79, 61),
createThirtyFirstEnemyUnit('menghuo-return-officer-mulu', '목록대왕', '맹수대장', 'rebelLeader', 142, 934, 232, 87, 50),
createThirtyFirstEnemyUnit('menghuo-second-leader', '맹획', '남만왕', 'rebelLeader', 144, 974, 240, 92, 39)
];
export const fortyNinthBattleUnits: UnitData[] = tuneEnemyUnitGroup(
fortyNinthBattleUnitsBase,
['menghuo-return-', 'menghuo-second-'],
{
hpScale: 0.55,
attackScale: 0.72,
overrides: {
'menghuo-return-officer-meng-you': { hp: 500, attack: 154, x: 64, y: 36 },
'menghuo-return-officer-duosi': { hp: 500, attack: 154, x: 68, y: 48 },
'menghuo-return-officer-mulu': { hp: 500, attack: 154, x: 70, y: 44 },
'menghuo-second-leader': { hp: 560, attack: 160, x: 66, y: 38 }
}
}
);
const fiftiethBattleAllyPositions: Record<string, { x: number; y: number }> = {
'guan-yu': { x: 13, y: 61 },
'zhang-fei': { x: 18, y: 63 },
'jian-yong': { x: 9, y: 68 },
'mi-zhu': { x: 11, y: 66 },
'sun-qian': { x: 15, y: 70 },
'zhao-yun': { x: 23, y: 58 },
'zhuge-liang': { x: 12, y: 58 },
'ma-liang': { x: 16, y: 55 },
'yi-ji': { x: 9, y: 73 },
'gong-zhi': { x: 19, y: 71 },
'huang-zhong': { x: 26, y: 59 },
'wei-yan': { x: 31, y: 63 },
'pang-tong': { x: 14, y: 52 },
'fa-zheng': { x: 20, y: 53 },
'wu-yi': { x: 33, y: 68 },
'yan-yan': { x: 36, y: 61 },
'li-yan': { x: 25, y: 51 },
'huang-quan': { x: 9, y: 56 },
'ma-chao': { x: 38, y: 58 },
'ma-dai': { x: 41, y: 63 },
'wang-ping': { x: 28, y: 54 }
};
const fiftiethBattleUnitsBase: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally' && unit.id !== 'liu-bei'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits
].map((unit) => placeScenarioUnit(unit, fiftiethBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('menghuo-third-scout-a', '남만 호족 척후', '서쪽 촌락 척후', 'bandit', 142, 620, 188, 45, 35),
createThirtyFirstEnemyUnit('menghuo-third-scout-b', '남만 호족 척후', '늪지 척후', 'bandit', 142, 620, 188, 60, 33),
createThirtyFirstEnemyUnit('menghuo-third-scout-c', '남만 호족 척후', '장터 척후', 'bandit', 143, 628, 190, 75, 50),
createThirtyFirstEnemyUnit('menghuo-third-scout-d', '남만 호족 척후', '동쪽 산길 척후', 'bandit', 143, 628, 190, 90, 64),
createThirtyFirstEnemyUnit('menghuo-third-vine-a', '남만 등갑 정예', '늪지 등갑병', 'yellowTurban', 143, 880, 222, 50, 43),
createThirtyFirstEnemyUnit('menghuo-third-vine-b', '남만 등갑 정예', '산채 등갑병', 'yellowTurban', 144, 892, 224, 62, 46),
createThirtyFirstEnemyUnit('menghuo-third-vine-c', '남만 등갑 정예', '마을 등갑병', 'yellowTurban', 144, 892, 224, 74, 56),
createThirtyFirstEnemyUnit('menghuo-third-vine-d', '남만 등갑 정예', '본대 등갑병', 'yellowTurban', 145, 904, 226, 86, 48),
createThirtyFirstEnemyUnit('menghuo-third-vine-e', '남만 등갑 정예', '후위 등갑병', 'yellowTurban', 145, 904, 226, 94, 40),
createThirtyFirstEnemyUnit('menghuo-third-archer-a', '남만 산림 궁병', '강변 궁병', 'archer', 142, 668, 198, 46, 27),
createThirtyFirstEnemyUnit('menghuo-third-archer-b', '남만 산림 궁병', '절벽 궁병', 'archer', 143, 676, 200, 61, 25),
createThirtyFirstEnemyUnit('menghuo-third-archer-c', '남만 산림 궁병', '마을 궁병', 'archer', 143, 676, 200, 72, 43),
createThirtyFirstEnemyUnit('menghuo-third-archer-d', '남만 산림 궁병', '늪지 궁병', 'archer', 144, 684, 202, 84, 60),
createThirtyFirstEnemyUnit('menghuo-third-archer-e', '남만 산림 궁병', '본영 궁병', 'archer', 144, 684, 202, 93, 53),
createThirtyFirstEnemyUnit('menghuo-third-beast-a', '남만 맹수대', '강가 맹수대', 'cavalry', 144, 896, 226, 55, 36),
createThirtyFirstEnemyUnit('menghuo-third-beast-b', '남만 맹수대', '늪지 맹수대', 'cavalry', 144, 896, 226, 68, 38),
createThirtyFirstEnemyUnit('menghuo-third-beast-c', '남만 맹수대', '산채 맹수대', 'cavalry', 145, 908, 228, 79, 51),
createThirtyFirstEnemyUnit('menghuo-third-beast-d', '남만 맹수대', '추격 맹수대', 'cavalry', 145, 908, 228, 91, 57),
createThirtyFirstEnemyUnit('menghuo-third-ambusher-a', '호족 매복병', '덩굴 매복병', 'bandit', 143, 636, 192, 37, 49),
createThirtyFirstEnemyUnit('menghuo-third-ambusher-b', '호족 매복병', '숲속 매복병', 'bandit', 144, 644, 194, 53, 52),
createThirtyFirstEnemyUnit('menghuo-third-ambusher-c', '호족 매복병', '강가 매복병', 'bandit', 144, 644, 194, 66, 65),
createThirtyFirstEnemyUnit('menghuo-third-ambusher-d', '호족 매복병', '후방 차단대', 'bandit', 145, 652, 196, 84, 72),
createThirtyFirstEnemyUnit('menghuo-third-ambusher-e', '호족 매복병', '서쪽 차단대', 'bandit', 145, 652, 196, 32, 62),
createThirtyFirstEnemyUnit('menghuo-third-guard-a', '맹획 호족 친위', '포로장 친위대', 'yellowTurban', 146, 930, 232, 70, 40),
createThirtyFirstEnemyUnit('menghuo-third-guard-b', '맹획 호족 친위', '산채 친위대', 'yellowTurban', 146, 930, 232, 82, 46),
createThirtyFirstEnemyUnit('menghuo-third-guard-c', '맹획 호족 친위', '본영 친위대', 'yellowTurban', 147, 942, 234, 92, 43),
createThirtyFirstEnemyUnit('menghuo-third-shaman-a', '남만 독천 주술사', '늪지 주술사', 'strategist', 145, 708, 208, 62, 34),
createThirtyFirstEnemyUnit('menghuo-third-shaman-b', '남만 독천 주술사', '강가 주술사', 'strategist', 146, 716, 210, 76, 47),
createThirtyFirstEnemyUnit('menghuo-third-shaman-c', '남만 독천 주술사', '산채 주술사', 'strategist', 146, 716, 210, 86, 36),
createThirtyFirstEnemyUnit('menghuo-third-officer-dailai', '대래동주', '남중 호족장', 'rebelLeader', 147, 956, 238, 74, 35),
createThirtyFirstEnemyUnit('menghuo-third-officer-zhurong-vanguard', '축융 선봉', '불창 선봉장', 'rebelLeader', 147, 956, 238, 80, 63),
createThirtyFirstEnemyUnit('menghuo-third-officer-jinhuan', '금환삼결', '산채 연합장', 'rebelLeader', 148, 968, 240, 88, 52),
createThirtyFirstEnemyUnit('menghuo-third-officer-ahuinan', '아회남', '흔들리는 호족장', 'rebelLeader', 146, 936, 234, 68, 58),
createThirtyFirstEnemyUnit('menghuo-third-leader', '맹획', '남만왕', 'rebelLeader', 150, 1010, 248, 94, 41)
];
export const fiftiethBattleUnits: UnitData[] = tuneEnemyUnitGroup(fiftiethBattleUnitsBase, ['menghuo-third-'], {
hpScale: 0.55,
attackScale: 0.72,
overrides: {
'menghuo-third-officer-dailai': { hp: 500, attack: 154, x: 66, y: 36 },
'menghuo-third-officer-zhurong-vanguard': { hp: 500, attack: 154, x: 72, y: 52 },
'menghuo-third-officer-jinhuan': { hp: 490, attack: 150, x: 70, y: 44 },
'menghuo-third-officer-ahuinan': { hp: 490, attack: 150, x: 64, y: 50 },
'menghuo-third-leader': { hp: 580, attack: 164, x: 68, y: 40 }
}
});
const fiftyFirstBattleAllyPositions: Record<string, { x: number; y: number }> = {
'guan-yu': { x: 14, y: 63 },
'zhang-fei': { x: 19, y: 65 },
'jian-yong': { x: 10, y: 70 },
'mi-zhu': { x: 12, y: 68 },
'sun-qian': { x: 16, y: 72 },
'zhao-yun': { x: 24, y: 60 },
'zhuge-liang': { x: 13, y: 60 },
'ma-liang': { x: 17, y: 57 },
'yi-ji': { x: 10, y: 75 },
'gong-zhi': { x: 20, y: 73 },
'huang-zhong': { x: 27, y: 61 },
'wei-yan': { x: 32, y: 65 },
'pang-tong': { x: 15, y: 54 },
'fa-zheng': { x: 21, y: 55 },
'wu-yi': { x: 34, y: 70 },
'yan-yan': { x: 37, y: 63 },
'li-yan': { x: 26, y: 53 },
'huang-quan': { x: 10, y: 58 },
'ma-chao': { x: 39, y: 60 },
'ma-dai': { x: 42, y: 65 },
'wang-ping': { x: 29, y: 56 }
};
const fiftyFirstBattleUnitsBase: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally' && unit.id !== 'liu-bei'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits
].map((unit) => placeScenarioUnit(unit, fiftyFirstBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('menghuo-fourth-scout-a', '남만 회유 감시병', '서쪽 퇴로 감시', 'bandit', 148, 650, 196, 46, 36),
createThirtyFirstEnemyUnit('menghuo-fourth-scout-b', '남만 회유 감시병', '늪지 감시', 'bandit', 148, 650, 196, 61, 34),
createThirtyFirstEnemyUnit('menghuo-fourth-scout-c', '남만 회유 감시병', '장터 감시', 'bandit', 149, 658, 198, 76, 51),
createThirtyFirstEnemyUnit('menghuo-fourth-scout-d', '남만 회유 감시병', '동쪽 산길 감시', 'bandit', 149, 658, 198, 92, 66),
createThirtyFirstEnemyUnit('menghuo-fourth-scout-e', '남만 회유 감시병', '북쪽 협곡 감시', 'bandit', 150, 666, 200, 54, 24),
createThirtyFirstEnemyUnit('menghuo-fourth-vine-a', '등갑 화덕병', '늪지 등갑병', 'yellowTurban', 149, 914, 232, 51, 45),
createThirtyFirstEnemyUnit('menghuo-fourth-vine-b', '등갑 화덕병', '화덕 등갑병', 'yellowTurban', 150, 926, 234, 63, 48),
createThirtyFirstEnemyUnit('menghuo-fourth-vine-c', '등갑 화덕병', '마을 등갑병', 'yellowTurban', 150, 926, 234, 76, 58),
createThirtyFirstEnemyUnit('menghuo-fourth-vine-d', '등갑 화덕병', '본대 등갑병', 'yellowTurban', 151, 938, 236, 88, 50),
createThirtyFirstEnemyUnit('menghuo-fourth-vine-e', '등갑 화덕병', '후위 등갑병', 'yellowTurban', 151, 938, 236, 96, 42),
createThirtyFirstEnemyUnit('menghuo-fourth-vine-f', '등갑 화덕병', '협곡 등갑병', 'yellowTurban', 152, 950, 238, 84, 31),
createThirtyFirstEnemyUnit('menghuo-fourth-archer-a', '남만 산림 궁병', '독천 궁병', 'archer', 148, 702, 208, 47, 28),
createThirtyFirstEnemyUnit('menghuo-fourth-archer-b', '남만 산림 궁병', '절벽 궁병', 'archer', 149, 710, 210, 62, 26),
createThirtyFirstEnemyUnit('menghuo-fourth-archer-c', '남만 산림 궁병', '마을 궁병', 'archer', 149, 710, 210, 74, 44),
createThirtyFirstEnemyUnit('menghuo-fourth-archer-d', '남만 산림 궁병', '늪지 궁병', 'archer', 150, 718, 212, 86, 62),
createThirtyFirstEnemyUnit('menghuo-fourth-archer-e', '남만 산림 궁병', '본영 궁병', 'archer', 150, 718, 212, 95, 55),
createThirtyFirstEnemyUnit('menghuo-fourth-beast-a', '남만 맹수 유인대', '강가 맹수대', 'cavalry', 150, 930, 236, 56, 38),
createThirtyFirstEnemyUnit('menghuo-fourth-beast-b', '남만 맹수 유인대', '늪지 맹수대', 'cavalry', 150, 930, 236, 69, 40),
createThirtyFirstEnemyUnit('menghuo-fourth-beast-c', '남만 맹수 유인대', '산채 맹수대', 'cavalry', 151, 942, 238, 81, 53),
createThirtyFirstEnemyUnit('menghuo-fourth-beast-d', '남만 맹수 유인대', '추격 맹수대', 'cavalry', 151, 942, 238, 93, 59),
createThirtyFirstEnemyUnit('menghuo-fourth-beast-e', '남만 맹수 유인대', '회유로 차단대', 'cavalry', 152, 954, 240, 67, 68),
createThirtyFirstEnemyUnit('menghuo-fourth-ambusher-a', '호족 반전 매복병', '덩굴 매복병', 'bandit', 149, 670, 202, 38, 51),
createThirtyFirstEnemyUnit('menghuo-fourth-ambusher-b', '호족 반전 매복병', '숲속 매복병', 'bandit', 150, 678, 204, 54, 54),
createThirtyFirstEnemyUnit('menghuo-fourth-ambusher-c', '호족 반전 매복병', '강가 매복병', 'bandit', 150, 678, 204, 67, 67),
createThirtyFirstEnemyUnit('menghuo-fourth-ambusher-d', '호족 반전 매복병', '후방 차단대', 'bandit', 151, 686, 206, 86, 74),
createThirtyFirstEnemyUnit('menghuo-fourth-ambusher-e', '호족 반전 매복병', '서쪽 차단대', 'bandit', 151, 686, 206, 33, 64),
createThirtyFirstEnemyUnit('menghuo-fourth-ambusher-f', '호족 반전 매복병', '회유로 감시대', 'bandit', 152, 694, 208, 73, 72),
createThirtyFirstEnemyUnit('menghuo-fourth-guard-a', '맹획 사차 친위', '포로장 친위대', 'yellowTurban', 152, 966, 242, 71, 42),
createThirtyFirstEnemyUnit('menghuo-fourth-guard-b', '맹획 사차 친위', '산채 친위대', 'yellowTurban', 152, 966, 242, 83, 48),
createThirtyFirstEnemyUnit('menghuo-fourth-guard-c', '맹획 사차 친위', '본영 친위대', 'yellowTurban', 153, 978, 244, 94, 45),
createThirtyFirstEnemyUnit('menghuo-fourth-guard-d', '맹획 사차 친위', '화덕 친위대', 'yellowTurban', 153, 978, 244, 89, 35),
createThirtyFirstEnemyUnit('menghuo-fourth-shaman-a', '독천 제사장', '늪지 제사장', 'strategist', 151, 744, 218, 63, 36),
createThirtyFirstEnemyUnit('menghuo-fourth-shaman-b', '독천 제사장', '강가 제사장', 'strategist', 152, 752, 220, 77, 49),
createThirtyFirstEnemyUnit('menghuo-fourth-shaman-c', '독천 제사장', '산채 제사장', 'strategist', 152, 752, 220, 88, 38),
createThirtyFirstEnemyUnit('menghuo-fourth-shaman-d', '독천 제사장', '화덕 제사장', 'strategist', 153, 760, 222, 82, 57),
createThirtyFirstEnemyUnit('menghuo-fourth-officer-wutugu', '오돌골', '등갑병 두령', 'rebelLeader', 154, 1010, 252, 86, 37),
createThirtyFirstEnemyUnit('menghuo-fourth-officer-mangyachang', '망아장', '맹수 선봉장', 'rebelLeader', 154, 1010, 252, 81, 65),
createThirtyFirstEnemyUnit('menghuo-fourth-officer-dongtuna', '동도나', '흔들리는 호족장', 'rebelLeader', 153, 990, 246, 70, 60),
createThirtyFirstEnemyUnit('menghuo-fourth-officer-ahuinan', '아회남', '회유로 감시 호족', 'rebelLeader', 153, 990, 246, 66, 52),
createThirtyFirstEnemyUnit('menghuo-fourth-leader', '맹획', '남만왕', 'rebelLeader', 156, 1048, 258, 96, 43)
];
export const fiftyFirstBattleUnits: UnitData[] = tuneEnemyUnitGroup(fiftyFirstBattleUnitsBase, ['menghuo-fourth-'], {
hpScale: 0.32,
attackScale: 0.5,
overrides: {
'menghuo-fourth-officer-wutugu': { hp: 420, attack: 148, x: 60, y: 40 },
'menghuo-fourth-officer-mangyachang': { hp: 410, attack: 148, x: 62, y: 56 },
'menghuo-fourth-officer-dongtuna': { hp: 380, attack: 140, x: 58, y: 52 },
'menghuo-fourth-officer-ahuinan': { hp: 370, attack: 138, x: 56, y: 48 },
'menghuo-fourth-leader': { hp: 900, attack: 160, x: 62, y: 44 }
}
});
const fiftySecondBattleAllyPositions: Record<string, { x: number; y: number }> = {
'guan-yu': { x: 15, y: 65 },
'zhang-fei': { x: 20, y: 67 },
'jian-yong': { x: 11, y: 72 },
'mi-zhu': { x: 13, y: 70 },
'sun-qian': { x: 17, y: 74 },
'zhao-yun': { x: 25, y: 62 },
'zhuge-liang': { x: 14, y: 62 },
'ma-liang': { x: 18, y: 59 },
'yi-ji': { x: 11, y: 77 },
'gong-zhi': { x: 21, y: 75 },
'huang-zhong': { x: 28, y: 63 },
'wei-yan': { x: 33, y: 67 },
'pang-tong': { x: 16, y: 56 },
'fa-zheng': { x: 22, y: 57 },
'wu-yi': { x: 35, y: 72 },
'yan-yan': { x: 38, y: 65 },
'li-yan': { x: 27, y: 55 },
'huang-quan': { x: 11, y: 60 },
'ma-chao': { x: 40, y: 62 },
'ma-dai': { x: 43, y: 67 },
'wang-ping': { x: 30, y: 58 }
};
const fiftySecondBattleUnitsBase: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally' && unit.id !== 'liu-bei'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits
].map((unit) => placeScenarioUnit(unit, fiftySecondBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('menghuo-fifth-scout-a', '강경파 정찰병', '서쪽 죽림 정찰', 'bandit', 154, 684, 206, 47, 38),
createThirtyFirstEnemyUnit('menghuo-fifth-scout-b', '강경파 정찰병', '늪지 정찰', 'bandit', 154, 684, 206, 63, 36),
createThirtyFirstEnemyUnit('menghuo-fifth-scout-c', '강경파 정찰병', '마을 감시', 'bandit', 155, 692, 208, 78, 53),
createThirtyFirstEnemyUnit('menghuo-fifth-scout-d', '강경파 정찰병', '동쪽 협곡 감시', 'bandit', 155, 692, 208, 94, 68),
createThirtyFirstEnemyUnit('menghuo-fifth-scout-e', '강경파 정찰병', '북쪽 산길 감시', 'bandit', 156, 700, 210, 55, 26),
createThirtyFirstEnemyUnit('menghuo-fifth-scout-f', '강경파 정찰병', '분리로 감시', 'bandit', 156, 700, 210, 70, 74),
createThirtyFirstEnemyUnit('menghuo-fifth-vine-a', '강경파 등갑병', '죽림 등갑병', 'yellowTurban', 155, 960, 244, 52, 47),
createThirtyFirstEnemyUnit('menghuo-fifth-vine-b', '강경파 등갑병', '불씨 등갑병', 'yellowTurban', 156, 972, 246, 65, 50),
createThirtyFirstEnemyUnit('menghuo-fifth-vine-c', '강경파 등갑병', '마을 등갑병', 'yellowTurban', 156, 972, 246, 78, 60),
createThirtyFirstEnemyUnit('menghuo-fifth-vine-d', '강경파 등갑병', '본영 등갑병', 'yellowTurban', 157, 984, 248, 90, 52),
createThirtyFirstEnemyUnit('menghuo-fifth-vine-e', '강경파 등갑병', '후위 등갑병', 'yellowTurban', 157, 984, 248, 98, 44),
createThirtyFirstEnemyUnit('menghuo-fifth-vine-f', '강경파 등갑병', '협곡 등갑병', 'yellowTurban', 158, 996, 250, 86, 33),
createThirtyFirstEnemyUnit('menghuo-fifth-archer-a', '남만 죽림 궁병', '독천 궁병', 'archer', 154, 736, 218, 48, 30),
createThirtyFirstEnemyUnit('menghuo-fifth-archer-b', '남만 죽림 궁병', '절벽 궁병', 'archer', 155, 744, 220, 64, 28),
createThirtyFirstEnemyUnit('menghuo-fifth-archer-c', '남만 죽림 궁병', '마을 궁병', 'archer', 155, 744, 220, 76, 46),
createThirtyFirstEnemyUnit('menghuo-fifth-archer-d', '남만 죽림 궁병', '늪지 궁병', 'archer', 156, 752, 222, 88, 64),
createThirtyFirstEnemyUnit('menghuo-fifth-archer-e', '남만 죽림 궁병', '본영 궁병', 'archer', 156, 752, 222, 97, 57),
createThirtyFirstEnemyUnit('menghuo-fifth-beast-a', '남만 맹수 추격대', '강가 맹수대', 'cavalry', 156, 976, 248, 58, 40),
createThirtyFirstEnemyUnit('menghuo-fifth-beast-b', '남만 맹수 추격대', '늪지 맹수대', 'cavalry', 156, 976, 248, 71, 42),
createThirtyFirstEnemyUnit('menghuo-fifth-beast-c', '남만 맹수 추격대', '산채 맹수대', 'cavalry', 157, 988, 250, 83, 55),
createThirtyFirstEnemyUnit('menghuo-fifth-beast-d', '남만 맹수 추격대', '추격 맹수대', 'cavalry', 157, 988, 250, 95, 61),
createThirtyFirstEnemyUnit('menghuo-fifth-beast-e', '남만 맹수 추격대', '분리로 차단대', 'cavalry', 158, 1000, 252, 69, 70),
createThirtyFirstEnemyUnit('menghuo-fifth-ambusher-a', '강경파 매복병', '죽림 매복병', 'bandit', 155, 704, 212, 39, 53),
createThirtyFirstEnemyUnit('menghuo-fifth-ambusher-b', '강경파 매복병', '숲속 매복병', 'bandit', 156, 712, 214, 55, 56),
createThirtyFirstEnemyUnit('menghuo-fifth-ambusher-c', '강경파 매복병', '강가 매복병', 'bandit', 156, 712, 214, 68, 69),
createThirtyFirstEnemyUnit('menghuo-fifth-ambusher-d', '강경파 매복병', '후방 차단대', 'bandit', 157, 720, 216, 88, 76),
createThirtyFirstEnemyUnit('menghuo-fifth-ambusher-e', '강경파 매복병', '서쪽 차단대', 'bandit', 157, 720, 216, 34, 66),
createThirtyFirstEnemyUnit('menghuo-fifth-ambusher-f', '강경파 매복병', '분리로 감시대', 'bandit', 158, 728, 218, 75, 74),
createThirtyFirstEnemyUnit('menghuo-fifth-guard-a', '맹획 오차 친위', '포로장 친위대', 'yellowTurban', 158, 1012, 254, 72, 44),
createThirtyFirstEnemyUnit('menghuo-fifth-guard-b', '맹획 오차 친위', '산채 친위대', 'yellowTurban', 158, 1012, 254, 85, 50),
createThirtyFirstEnemyUnit('menghuo-fifth-guard-c', '맹획 오차 친위', '본영 친위대', 'yellowTurban', 159, 1024, 256, 96, 47),
createThirtyFirstEnemyUnit('menghuo-fifth-guard-d', '맹획 오차 친위', '죽림 친위대', 'yellowTurban', 159, 1024, 256, 91, 37),
createThirtyFirstEnemyUnit('menghuo-fifth-shaman-a', '독천 제사장', '늪지 제사장', 'strategist', 157, 784, 230, 64, 38),
createThirtyFirstEnemyUnit('menghuo-fifth-shaman-b', '독천 제사장', '강가 제사장', 'strategist', 158, 792, 232, 79, 51),
createThirtyFirstEnemyUnit('menghuo-fifth-shaman-c', '독천 제사장', '산채 제사장', 'strategist', 158, 792, 232, 90, 40),
createThirtyFirstEnemyUnit('menghuo-fifth-shaman-d', '독천 제사장', '죽림 제사장', 'strategist', 159, 800, 234, 84, 59),
createThirtyFirstEnemyUnit('menghuo-fifth-officer-zhurong', '축융 부인', '남중 화전장', 'rebelLeader', 160, 1058, 264, 82, 67),
createThirtyFirstEnemyUnit('menghuo-fifth-officer-mulu', '목록대왕', '맹수대왕', 'rebelLeader', 160, 1058, 264, 88, 39),
createThirtyFirstEnemyUnit('menghuo-fifth-officer-duosi', '타사대왕', '독천 호족장', 'rebelLeader', 159, 1038, 258, 72, 62),
createThirtyFirstEnemyUnit('menghuo-fifth-officer-mengyou', '맹우', '맹획의 아우', 'rebelLeader', 159, 1038, 258, 68, 54),
createThirtyFirstEnemyUnit('menghuo-fifth-leader', '맹획', '남만왕', 'rebelLeader', 162, 1100, 270, 98, 45)
];
export const fiftySecondBattleUnits: UnitData[] = tuneEnemyUnitGroup(fiftySecondBattleUnitsBase, ['menghuo-fifth-'], {
hpScale: 0.3,
attackScale: 0.48,
overrides: {
'menghuo-fifth-officer-zhurong': { hp: 460, attack: 154, x: 62, y: 58 },
'menghuo-fifth-officer-mulu': { hp: 450, attack: 154, x: 64, y: 42 },
'menghuo-fifth-officer-duosi': { hp: 400, attack: 144, x: 60, y: 56 },
'menghuo-fifth-officer-mengyou': { hp: 390, attack: 142, x: 58, y: 50 },
'menghuo-fifth-leader': { hp: 1500, attack: 172, x: 64, y: 46 }
}
});
const fiftyThirdBattleAllyPositions: Record<string, { x: number; y: number }> = {
'guan-yu': { x: 16, y: 67 },
'zhang-fei': { x: 21, y: 69 },
'jian-yong': { x: 12, y: 74 },
'mi-zhu': { x: 14, y: 72 },
'sun-qian': { x: 18, y: 76 },
'zhao-yun': { x: 26, y: 64 },
'zhuge-liang': { x: 15, y: 64 },
'ma-liang': { x: 19, y: 61 },
'yi-ji': { x: 12, y: 79 },
'gong-zhi': { x: 22, y: 77 },
'huang-zhong': { x: 29, y: 65 },
'wei-yan': { x: 34, y: 69 },
'pang-tong': { x: 17, y: 58 },
'fa-zheng': { x: 23, y: 59 },
'wu-yi': { x: 36, y: 74 },
'yan-yan': { x: 39, y: 67 },
'li-yan': { x: 28, y: 57 },
'huang-quan': { x: 12, y: 62 },
'ma-chao': { x: 41, y: 64 },
'ma-dai': { x: 44, y: 69 },
'wang-ping': { x: 31, y: 60 }
};
const fiftyThirdBattleUnitsBase: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally' && unit.id !== 'liu-bei'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits
].map((unit) => placeScenarioUnit(unit, fiftyThirdBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('menghuo-sixth-scout-a', '남중 잔심 척후', '서쪽 계곡 정찰', 'bandit', 160, 716, 214, 48, 40),
createThirtyFirstEnemyUnit('menghuo-sixth-scout-b', '남중 잔심 척후', '물길 정찰', 'bandit', 160, 716, 214, 64, 38),
createThirtyFirstEnemyUnit('menghuo-sixth-scout-c', '남중 잔심 척후', '마을 감시', 'bandit', 161, 724, 216, 80, 55),
createThirtyFirstEnemyUnit('menghuo-sixth-scout-d', '남중 잔심 척후', '동쪽 절벽 감시', 'bandit', 161, 724, 216, 96, 70),
createThirtyFirstEnemyUnit('menghuo-sixth-scout-e', '남중 잔심 척후', '북쪽 산문 감시', 'bandit', 162, 732, 218, 57, 28),
createThirtyFirstEnemyUnit('menghuo-sixth-scout-f', '남중 잔심 척후', '신뢰로 감시', 'bandit', 162, 732, 218, 72, 76),
createThirtyFirstEnemyUnit('menghuo-sixth-vine-a', '잔당 등갑병', '계곡 등갑병', 'yellowTurban', 161, 1002, 252, 54, 49),
createThirtyFirstEnemyUnit('menghuo-sixth-vine-b', '잔당 등갑병', '불씨 등갑병', 'yellowTurban', 162, 1014, 254, 67, 52),
createThirtyFirstEnemyUnit('menghuo-sixth-vine-c', '잔당 등갑병', '마을 등갑병', 'yellowTurban', 162, 1014, 254, 80, 62),
createThirtyFirstEnemyUnit('menghuo-sixth-vine-d', '잔당 등갑병', '본영 등갑병', 'yellowTurban', 163, 1026, 256, 92, 54),
createThirtyFirstEnemyUnit('menghuo-sixth-vine-e', '잔당 등갑병', '후위 등갑병', 'yellowTurban', 163, 1026, 256, 100, 46),
createThirtyFirstEnemyUnit('menghuo-sixth-vine-f', '잔당 등갑병', '산문 등갑병', 'yellowTurban', 164, 1038, 258, 88, 35),
createThirtyFirstEnemyUnit('menghuo-sixth-archer-a', '남만 절벽 궁병', '독천 궁병', 'archer', 160, 768, 226, 50, 32),
createThirtyFirstEnemyUnit('menghuo-sixth-archer-b', '남만 절벽 궁병', '절벽 궁병', 'archer', 161, 776, 228, 66, 30),
createThirtyFirstEnemyUnit('menghuo-sixth-archer-c', '남만 절벽 궁병', '마을 궁병', 'archer', 161, 776, 228, 78, 48),
createThirtyFirstEnemyUnit('menghuo-sixth-archer-d', '남만 절벽 궁병', '물길 궁병', 'archer', 162, 784, 230, 90, 66),
createThirtyFirstEnemyUnit('menghuo-sixth-archer-e', '남만 절벽 궁병', '본영 궁병', 'archer', 162, 784, 230, 99, 59),
createThirtyFirstEnemyUnit('menghuo-sixth-beast-a', '남만 맹수 결사대', '강가 맹수대', 'cavalry', 162, 1018, 256, 60, 42),
createThirtyFirstEnemyUnit('menghuo-sixth-beast-b', '남만 맹수 결사대', '물길 맹수대', 'cavalry', 162, 1018, 256, 73, 44),
createThirtyFirstEnemyUnit('menghuo-sixth-beast-c', '남만 맹수 결사대', '산채 맹수대', 'cavalry', 163, 1030, 258, 85, 57),
createThirtyFirstEnemyUnit('menghuo-sixth-beast-d', '남만 맹수 결사대', '추격 맹수대', 'cavalry', 163, 1030, 258, 97, 63),
createThirtyFirstEnemyUnit('menghuo-sixth-beast-e', '남만 맹수 결사대', '신뢰로 차단대', 'cavalry', 164, 1042, 260, 71, 72),
createThirtyFirstEnemyUnit('menghuo-sixth-ambusher-a', '잔당 매복병', '계곡 매복병', 'bandit', 161, 736, 220, 41, 55),
createThirtyFirstEnemyUnit('menghuo-sixth-ambusher-b', '잔당 매복병', '숲속 매복병', 'bandit', 162, 744, 222, 57, 58),
createThirtyFirstEnemyUnit('menghuo-sixth-ambusher-c', '잔당 매복병', '강가 매복병', 'bandit', 162, 744, 222, 70, 71),
createThirtyFirstEnemyUnit('menghuo-sixth-ambusher-d', '잔당 매복병', '후방 차단대', 'bandit', 163, 752, 224, 90, 78),
createThirtyFirstEnemyUnit('menghuo-sixth-ambusher-e', '잔당 매복병', '서쪽 차단대', 'bandit', 163, 752, 224, 36, 68),
createThirtyFirstEnemyUnit('menghuo-sixth-ambusher-f', '잔당 매복병', '신뢰로 감시대', 'bandit', 164, 760, 226, 77, 76),
createThirtyFirstEnemyUnit('menghuo-sixth-guard-a', '맹획 육차 친위', '포로장 친위대', 'yellowTurban', 164, 1054, 262, 74, 46),
createThirtyFirstEnemyUnit('menghuo-sixth-guard-b', '맹획 육차 친위', '산채 친위대', 'yellowTurban', 164, 1054, 262, 87, 52),
createThirtyFirstEnemyUnit('menghuo-sixth-guard-c', '맹획 육차 친위', '본영 친위대', 'yellowTurban', 165, 1066, 264, 98, 49),
createThirtyFirstEnemyUnit('menghuo-sixth-guard-d', '맹획 육차 친위', '계곡 친위대', 'yellowTurban', 165, 1066, 264, 93, 39),
createThirtyFirstEnemyUnit('menghuo-sixth-shaman-a', '깊은 독천 제사장', '물길 제사장', 'strategist', 163, 816, 238, 66, 40),
createThirtyFirstEnemyUnit('menghuo-sixth-shaman-b', '깊은 독천 제사장', '강가 제사장', 'strategist', 164, 824, 240, 81, 53),
createThirtyFirstEnemyUnit('menghuo-sixth-shaman-c', '깊은 독천 제사장', '산채 제사장', 'strategist', 164, 824, 240, 92, 42),
createThirtyFirstEnemyUnit('menghuo-sixth-shaman-d', '깊은 독천 제사장', '계곡 제사장', 'strategist', 165, 832, 242, 86, 61),
createThirtyFirstEnemyUnit('menghuo-sixth-officer-zhurong', '축융 부인', '남중 화전장', 'rebelLeader', 166, 1098, 272, 84, 69),
createThirtyFirstEnemyUnit('menghuo-sixth-officer-mulu', '목록대왕', '맹수대왕', 'rebelLeader', 166, 1098, 272, 90, 41),
createThirtyFirstEnemyUnit('menghuo-sixth-officer-duosi', '타사대왕', '독천 호족장', 'rebelLeader', 165, 1078, 266, 74, 64),
createThirtyFirstEnemyUnit('menghuo-sixth-officer-mengyou', '맹우', '맹획의 아우', 'rebelLeader', 165, 1078, 266, 70, 56),
createThirtyFirstEnemyUnit('menghuo-sixth-officer-dailai', '대래동주', '깊은 산채 호족', 'rebelLeader', 165, 1078, 266, 83, 71),
createThirtyFirstEnemyUnit('menghuo-sixth-leader', '맹획', '남만왕', 'rebelLeader', 168, 1140, 280, 100, 47)
];
export const fiftyThirdBattleUnits: UnitData[] = tuneEnemyUnitGroup(fiftyThirdBattleUnitsBase, ['menghuo-sixth-'], {
hpScale: 0.29,
attackScale: 0.46,
overrides: {
'menghuo-sixth-officer-zhurong': { hp: 500, attack: 158, x: 63, y: 60 },
'menghuo-sixth-officer-mulu': { hp: 490, attack: 158, x: 65, y: 44 },
'menghuo-sixth-officer-duosi': { hp: 430, attack: 148, x: 61, y: 58 },
'menghuo-sixth-officer-mengyou': { hp: 420, attack: 146, x: 60, y: 52 },
'menghuo-sixth-officer-dailai': { hp: 450, attack: 150, x: 63, y: 64 },
'menghuo-sixth-leader': { hp: 1650, attack: 180, x: 65, y: 48 }
}
});
const fiftyFourthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'guan-yu': { x: 17, y: 69 },
'zhang-fei': { x: 22, y: 71 },
'jian-yong': { x: 13, y: 76 },
'mi-zhu': { x: 15, y: 74 },
'sun-qian': { x: 19, y: 78 },
'zhao-yun': { x: 27, y: 66 },
'zhuge-liang': { x: 16, y: 66 },
'ma-liang': { x: 20, y: 63 },
'yi-ji': { x: 13, y: 81 },
'gong-zhi': { x: 23, y: 79 },
'huang-zhong': { x: 30, y: 67 },
'wei-yan': { x: 35, y: 71 },
'pang-tong': { x: 18, y: 60 },
'fa-zheng': { x: 24, y: 61 },
'wu-yi': { x: 37, y: 76 },
'yan-yan': { x: 40, y: 69 },
'li-yan': { x: 29, y: 59 },
'huang-quan': { x: 13, y: 64 },
'ma-chao': { x: 42, y: 66 },
'ma-dai': { x: 45, y: 71 },
'wang-ping': { x: 32, y: 62 }
};
const fiftyFourthBattleUnitsBase: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally' && unit.id !== 'liu-bei'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits
].map((unit) => placeScenarioUnit(unit, fiftyFourthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('menghuo-final-scout-a', '남만 최후 척후', '서쪽 회의장 정찰', 'bandit', 166, 748, 222, 50, 42),
createThirtyFirstEnemyUnit('menghuo-final-scout-b', '남만 최후 척후', '물길 정찰', 'bandit', 166, 748, 222, 66, 40),
createThirtyFirstEnemyUnit('menghuo-final-scout-c', '남만 최후 척후', '마을 감시', 'bandit', 167, 756, 224, 82, 57),
createThirtyFirstEnemyUnit('menghuo-final-scout-d', '남만 최후 척후', '동쪽 산문 감시', 'bandit', 167, 756, 224, 98, 72),
createThirtyFirstEnemyUnit('menghuo-final-scout-e', '남만 최후 척후', '북쪽 절벽 감시', 'bandit', 168, 764, 226, 59, 30),
createThirtyFirstEnemyUnit('menghuo-final-scout-f', '남만 최후 척후', '항복로 감시', 'bandit', 168, 764, 226, 74, 78),
createThirtyFirstEnemyUnit('menghuo-final-vine-a', '최후 등갑병', '회의장 등갑병', 'yellowTurban', 167, 1044, 260, 56, 51),
createThirtyFirstEnemyUnit('menghuo-final-vine-b', '최후 등갑병', '불씨 등갑병', 'yellowTurban', 168, 1056, 262, 69, 54),
createThirtyFirstEnemyUnit('menghuo-final-vine-c', '최후 등갑병', '마을 등갑병', 'yellowTurban', 168, 1056, 262, 82, 64),
createThirtyFirstEnemyUnit('menghuo-final-vine-d', '최후 등갑병', '본영 등갑병', 'yellowTurban', 169, 1068, 264, 94, 56),
createThirtyFirstEnemyUnit('menghuo-final-vine-e', '최후 등갑병', '후위 등갑병', 'yellowTurban', 169, 1068, 264, 102, 48),
createThirtyFirstEnemyUnit('menghuo-final-vine-f', '최후 등갑병', '산문 등갑병', 'yellowTurban', 170, 1080, 266, 90, 37),
createThirtyFirstEnemyUnit('menghuo-final-archer-a', '남만 회의장 궁병', '독천 궁병', 'archer', 166, 800, 234, 52, 34),
createThirtyFirstEnemyUnit('menghuo-final-archer-b', '남만 회의장 궁병', '절벽 궁병', 'archer', 167, 808, 236, 68, 32),
createThirtyFirstEnemyUnit('menghuo-final-archer-c', '남만 회의장 궁병', '마을 궁병', 'archer', 167, 808, 236, 80, 50),
createThirtyFirstEnemyUnit('menghuo-final-archer-d', '남만 회의장 궁병', '물길 궁병', 'archer', 168, 816, 238, 92, 68),
createThirtyFirstEnemyUnit('menghuo-final-archer-e', '남만 회의장 궁병', '본영 궁병', 'archer', 168, 816, 238, 101, 61),
createThirtyFirstEnemyUnit('menghuo-final-beast-a', '남만 최후 맹수대', '강가 맹수대', 'cavalry', 168, 1060, 264, 62, 44),
createThirtyFirstEnemyUnit('menghuo-final-beast-b', '남만 최후 맹수대', '물길 맹수대', 'cavalry', 168, 1060, 264, 75, 46),
createThirtyFirstEnemyUnit('menghuo-final-beast-c', '남만 최후 맹수대', '산채 맹수대', 'cavalry', 169, 1072, 266, 87, 59),
createThirtyFirstEnemyUnit('menghuo-final-beast-d', '남만 최후 맹수대', '추격 맹수대', 'cavalry', 169, 1072, 266, 99, 65),
createThirtyFirstEnemyUnit('menghuo-final-beast-e', '남만 최후 맹수대', '항복로 차단대', 'cavalry', 170, 1084, 268, 73, 74),
createThirtyFirstEnemyUnit('menghuo-final-ambusher-a', '최후 매복병', '회의장 매복병', 'bandit', 167, 768, 228, 43, 57),
createThirtyFirstEnemyUnit('menghuo-final-ambusher-b', '최후 매복병', '숲속 매복병', 'bandit', 168, 776, 230, 59, 60),
createThirtyFirstEnemyUnit('menghuo-final-ambusher-c', '최후 매복병', '강가 매복병', 'bandit', 168, 776, 230, 72, 73),
createThirtyFirstEnemyUnit('menghuo-final-ambusher-d', '최후 매복병', '후방 차단대', 'bandit', 169, 784, 232, 92, 80),
createThirtyFirstEnemyUnit('menghuo-final-ambusher-e', '최후 매복병', '서쪽 차단대', 'bandit', 169, 784, 232, 38, 70),
createThirtyFirstEnemyUnit('menghuo-final-ambusher-f', '최후 매복병', '항복로 감시대', 'bandit', 170, 792, 234, 79, 78),
createThirtyFirstEnemyUnit('menghuo-final-guard-a', '맹획 최후 친위', '포로장 친위대', 'yellowTurban', 170, 1096, 270, 76, 48),
createThirtyFirstEnemyUnit('menghuo-final-guard-b', '맹획 최후 친위', '산채 친위대', 'yellowTurban', 170, 1096, 270, 89, 54),
createThirtyFirstEnemyUnit('menghuo-final-guard-c', '맹획 최후 친위', '본영 친위대', 'yellowTurban', 171, 1108, 272, 100, 51),
createThirtyFirstEnemyUnit('menghuo-final-guard-d', '맹획 최후 친위', '회의장 친위대', 'yellowTurban', 171, 1108, 272, 95, 41),
createThirtyFirstEnemyUnit('menghuo-final-shaman-a', '마지막 독천 제사장', '물길 제사장', 'strategist', 169, 848, 246, 68, 42),
createThirtyFirstEnemyUnit('menghuo-final-shaman-b', '마지막 독천 제사장', '강가 제사장', 'strategist', 170, 856, 248, 83, 55),
createThirtyFirstEnemyUnit('menghuo-final-shaman-c', '마지막 독천 제사장', '산채 제사장', 'strategist', 170, 856, 248, 94, 44),
createThirtyFirstEnemyUnit('menghuo-final-shaman-d', '마지막 독천 제사장', '회의장 제사장', 'strategist', 171, 864, 250, 88, 63),
createThirtyFirstEnemyUnit('menghuo-final-officer-zhurong', '축융 부인', '남중 화전장', 'rebelLeader', 172, 1138, 280, 86, 71),
createThirtyFirstEnemyUnit('menghuo-final-officer-mulu', '목록대왕', '맹수대왕', 'rebelLeader', 172, 1138, 280, 92, 43),
createThirtyFirstEnemyUnit('menghuo-final-officer-duosi', '타사대왕', '독천 호족장', 'rebelLeader', 171, 1118, 274, 76, 66),
createThirtyFirstEnemyUnit('menghuo-final-officer-mengyou', '맹우', '맹획의 아우', 'rebelLeader', 171, 1118, 274, 72, 58),
createThirtyFirstEnemyUnit('menghuo-final-officer-dailai', '대래동주', '깊은 산채 호족', 'rebelLeader', 171, 1118, 274, 85, 73),
createThirtyFirstEnemyUnit('menghuo-final-officer-ahuinan', '아회남', '흔들린 호족 대표', 'rebelLeader', 170, 1098, 270, 74, 70),
createThirtyFirstEnemyUnit('menghuo-final-leader', '맹획', '남만왕', 'rebelLeader', 174, 1180, 288, 102, 49)
];
export const fiftyFourthBattleUnits: UnitData[] = tuneEnemyUnitGroup(fiftyFourthBattleUnitsBase, ['menghuo-final-'], {
hpScale: 0.28,
attackScale: 0.44,
overrides: {
'menghuo-final-officer-zhurong': { hp: 520, attack: 164, x: 64, y: 62 },
'menghuo-final-officer-mulu': { hp: 520, attack: 164, x: 66, y: 46 },
'menghuo-final-officer-duosi': { hp: 460, attack: 152, x: 62, y: 60 },
'menghuo-final-officer-mengyou': { hp: 440, attack: 150, x: 61, y: 54 },
'menghuo-final-officer-dailai': { hp: 480, attack: 156, x: 64, y: 66 },
'menghuo-final-officer-ahuinan': { hp: 440, attack: 148, x: 62, y: 68 },
'menghuo-final-leader': { hp: 1800, attack: 190, x: 66, y: 50 }
}
});
const fiftyFifthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'guan-yu': { x: 18, y: 76 },
'zhang-fei': { x: 23, y: 78 },
'jian-yong': { x: 13, y: 82 },
'mi-zhu': { x: 16, y: 84 },
'sun-qian': { x: 21, y: 84 },
'zhao-yun': { x: 27, y: 72 },
'zhuge-liang': { x: 17, y: 72 },
'ma-liang': { x: 21, y: 69 },
'yi-ji': { x: 13, y: 86 },
'gong-zhi': { x: 25, y: 84 },
'huang-zhong': { x: 32, y: 72 },
'wei-yan': { x: 38, y: 76 },
'pang-tong': { x: 18, y: 66 },
'fa-zheng': { x: 25, y: 67 },
'wu-yi': { x: 39, y: 82 },
'yan-yan': { x: 43, y: 75 },
'li-yan': { x: 31, y: 66 },
'huang-quan': { x: 13, y: 70 },
'ma-chao': { x: 46, y: 72 },
'ma-dai': { x: 49, y: 78 },
'wang-ping': { x: 34, y: 68 }
};
const fiftyFifthBattleUnitsBase: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally' && unit.id !== 'liu-bei'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits
].map((unit) => placeScenarioUnit(unit, fiftyFifthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('northern-first-scout-a', '위군 산길 정찰병', '서쪽 능선 정찰', 'bandit', 172, 780, 230, 48, 72),
createThirtyFirstEnemyUnit('northern-first-scout-b', '위군 산길 정찰병', '한중 길목 정찰', 'bandit', 172, 780, 230, 56, 68),
createThirtyFirstEnemyUnit('northern-first-scout-c', '위군 산길 정찰병', '기산 마을 감시', 'bandit', 173, 792, 232, 67, 64),
createThirtyFirstEnemyUnit('northern-first-scout-d', '위군 산길 정찰병', '동쪽 고갯길 감시', 'bandit', 173, 792, 232, 74, 59),
createThirtyFirstEnemyUnit('northern-first-scout-e', '위군 산길 정찰병', '북쪽 봉화 정찰', 'bandit', 174, 804, 234, 86, 51),
createThirtyFirstEnemyUnit('northern-first-scout-f', '위군 산길 정찰병', '조진 본영 정찰', 'bandit', 174, 804, 234, 95, 45),
createThirtyFirstEnemyUnit('northern-first-infantry-a', '위군 전초 보병', '기산 초입 보병', 'yellowTurban', 173, 1080, 270, 54, 58),
createThirtyFirstEnemyUnit('northern-first-infantry-b', '위군 전초 보병', '한중로 차단 보병', 'yellowTurban', 173, 1080, 270, 61, 55),
createThirtyFirstEnemyUnit('northern-first-infantry-c', '위군 전초 보병', '마을 길목 보병', 'yellowTurban', 174, 1100, 274, 69, 50),
createThirtyFirstEnemyUnit('northern-first-infantry-d', '위군 전초 보병', '능선 초소 보병', 'yellowTurban', 174, 1100, 274, 76, 47),
createThirtyFirstEnemyUnit('northern-first-infantry-e', '위군 전초 보병', '동쪽 초소 보병', 'yellowTurban', 175, 1120, 276, 85, 40),
createThirtyFirstEnemyUnit('northern-first-infantry-f', '위군 전초 보병', '북쪽 영채 보병', 'yellowTurban', 175, 1120, 276, 94, 34),
createThirtyFirstEnemyUnit('northern-first-infantry-g', '위군 전초 보병', '조진 본영 보병', 'yellowTurban', 176, 1140, 278, 101, 27),
createThirtyFirstEnemyUnit('northern-first-infantry-h', '위군 전초 보병', '보급로 압박 보병', 'yellowTurban', 176, 1140, 278, 91, 69),
createThirtyFirstEnemyUnit('northern-first-archer-a', '위군 원거리 궁병', '기산 입구 궁병', 'archer', 172, 824, 242, 58, 52),
createThirtyFirstEnemyUnit('northern-first-archer-b', '위군 원거리 궁병', '한중로 궁병', 'archer', 173, 832, 244, 66, 48),
createThirtyFirstEnemyUnit('northern-first-archer-c', '위군 원거리 궁병', '마을 언덕 궁병', 'archer', 173, 832, 244, 74, 42),
createThirtyFirstEnemyUnit('northern-first-archer-d', '위군 원거리 궁병', '능선 궁병', 'archer', 174, 840, 246, 83, 35),
createThirtyFirstEnemyUnit('northern-first-archer-e', '위군 원거리 궁병', '북쪽 영채 궁병', 'archer', 174, 840, 246, 92, 30),
createThirtyFirstEnemyUnit('northern-first-archer-f', '위군 원거리 궁병', '조진 본영 궁병', 'archer', 175, 848, 248, 99, 23),
createThirtyFirstEnemyUnit('northern-first-cavalry-a', '위군 추격 기병', '서쪽 추격 기병', 'cavalry', 173, 1088, 274, 47, 64),
createThirtyFirstEnemyUnit('northern-first-cavalry-b', '위군 추격 기병', '한중로 추격 기병', 'cavalry', 173, 1088, 274, 58, 62),
createThirtyFirstEnemyUnit('northern-first-cavalry-c', '위군 추격 기병', '기산 기동 기병', 'cavalry', 174, 1110, 278, 70, 56),
createThirtyFirstEnemyUnit('northern-first-cavalry-d', '위군 추격 기병', '능선 우회 기병', 'cavalry', 175, 1132, 282, 82, 49),
createThirtyFirstEnemyUnit('northern-first-cavalry-e', '위군 추격 기병', '동쪽 역습 기병', 'cavalry', 175, 1132, 282, 94, 42),
createThirtyFirstEnemyUnit('northern-first-cavalry-f', '위군 추격 기병', '조진 친위 기병', 'cavalry', 176, 1154, 286, 103, 36),
createThirtyFirstEnemyUnit('northern-first-ridge-guard-a', '기산 능선 수비대', '서쪽 고개 수비', 'yellowTurban', 174, 1110, 276, 37, 50),
createThirtyFirstEnemyUnit('northern-first-ridge-guard-b', '기산 능선 수비대', '첫 능선 수비', 'yellowTurban', 174, 1110, 276, 45, 42),
createThirtyFirstEnemyUnit('northern-first-ridge-guard-c', '기산 능선 수비대', '중앙 산길 수비', 'yellowTurban', 175, 1130, 280, 56, 36),
createThirtyFirstEnemyUnit('northern-first-ridge-guard-d', '기산 능선 수비대', '북쪽 산길 수비', 'yellowTurban', 175, 1130, 280, 69, 31),
createThirtyFirstEnemyUnit('northern-first-ridge-guard-e', '기산 능선 수비대', '동쪽 절벽 수비', 'yellowTurban', 176, 1150, 282, 81, 25),
createThirtyFirstEnemyUnit('northern-first-ridge-guard-f', '기산 능선 수비대', '조진 영채 수비', 'yellowTurban', 176, 1150, 282, 96, 18),
createThirtyFirstEnemyUnit('northern-first-strategist-a', '위군 군리', '보급 차단 참모', 'strategist', 174, 880, 252, 64, 45),
createThirtyFirstEnemyUnit('northern-first-strategist-b', '위군 군리', '봉화 연락 참모', 'strategist', 175, 892, 254, 82, 32),
createThirtyFirstEnemyUnit('northern-first-strategist-c', '위군 군리', '마을 회유 참모', 'strategist', 175, 892, 254, 90, 54),
createThirtyFirstEnemyUnit('northern-first-strategist-d', '위군 군리', '본영 기록 참모', 'strategist', 176, 904, 256, 101, 20),
createThirtyFirstEnemyUnit('northern-first-officer-xiahou-mao', '하후무', '기산 전초 장수', 'rebelLeader', 176, 1160, 284, 62, 58),
createThirtyFirstEnemyUnit('northern-first-officer-guo-huai', '곽회', '서량 방면 장수', 'rebelLeader', 176, 1160, 286, 78, 43),
createThirtyFirstEnemyUnit('northern-first-officer-zhang-he', '장합', '위군 역습 장수', 'rebelLeader', 177, 1180, 290, 91, 31),
createThirtyFirstEnemyUnit('northern-first-officer-fei-yao', '비요', '조진 휘하 장수', 'rebelLeader', 176, 1160, 284, 99, 61),
createThirtyFirstEnemyUnit('northern-first-officer-supply', '위군 둔전 장교', '보급로 관측 장수', 'rebelLeader', 175, 1140, 282, 72, 68),
createThirtyFirstEnemyUnit('northern-first-leader-cao-zhen', '조진', '위군 대장', 'rebelLeader', 178, 1240, 296, 102, 24)
];
export const fiftyFifthBattleUnits: UnitData[] = tuneEnemyUnitGroup(fiftyFifthBattleUnitsBase, ['northern-first-'], {
hpScale: 0.5,
attackScale: 0.55,
overrides: {
'northern-first-infantry-g': { hp: 520, attack: 160, x: 90, y: 34 },
'northern-first-archer-f': { hp: 420, attack: 150, x: 89, y: 31 },
'northern-first-cavalry-f': { hp: 540, attack: 164, x: 91, y: 41 },
'northern-first-ridge-guard-f': { hp: 520, attack: 158, x: 86, y: 30 },
'northern-first-strategist-d': { hp: 420, attack: 148, x: 88, y: 28 },
'northern-first-officer-fei-yao': { hp: 420, attack: 142, x: 84, y: 50 },
'northern-first-leader-cao-zhen': { hp: 420, attack: 148, x: 82, y: 38 }
}
}).map((unit) =>
unit.faction === 'ally'
? {
...unit,
hp: Math.max(unit.hp, 2200),
maxHp: Math.max(unit.maxHp, 2200),
attack: Math.max(unit.attack, 340)
}
: unit
);
const fiftySixthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'guan-yu': { x: 16, y: 80 },
'zhang-fei': { x: 22, y: 82 },
'jian-yong': { x: 10, y: 86 },
'mi-zhu': { x: 14, y: 88 },
'sun-qian': { x: 19, y: 88 },
'zhao-yun': { x: 42, y: 72 },
'zhuge-liang': { x: 36, y: 74 },
'ma-liang': { x: 39, y: 68 },
'yi-ji': { x: 9, y: 90 },
'gong-zhi': { x: 25, y: 88 },
'huang-zhong': { x: 34, y: 75 },
'wei-yan': { x: 44, y: 75 },
'pang-tong': { x: 14, y: 70 },
'fa-zheng': { x: 25, y: 70 },
'wu-yi': { x: 41, y: 86 },
'yan-yan': { x: 45, y: 79 },
'li-yan': { x: 32, y: 69 },
'huang-quan': { x: 35, y: 71 },
'ma-chao': { x: 48, y: 75 },
'ma-dai': { x: 48, y: 72 },
'wang-ping': { x: 45, y: 69 }
};
const fiftySixthBattleUnitsBase: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally' && unit.id !== 'liu-bei'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits
].map((unit) => placeScenarioUnit(unit, fiftySixthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('northern-second-scout-a', '천수 척후병', '서쪽 사면 정찰', 'bandit', 176, 824, 238, 48, 72),
createThirtyFirstEnemyUnit('northern-second-scout-b', '천수 척후병', '하곡 정찰', 'bandit', 176, 824, 238, 57, 69),
createThirtyFirstEnemyUnit('northern-second-scout-c', '천수 척후병', '중앙 마을 감시', 'bandit', 177, 836, 240, 68, 62),
createThirtyFirstEnemyUnit('northern-second-scout-d', '천수 척후병', '동쪽 물목 감시', 'bandit', 177, 836, 240, 79, 55),
createThirtyFirstEnemyUnit('northern-second-scout-e', '천수 척후병', '가정 고개 정찰', 'bandit', 178, 848, 242, 91, 48),
createThirtyFirstEnemyUnit('northern-second-scout-f', '천수 척후병', '곽회 본영 정찰', 'bandit', 178, 848, 242, 101, 36),
createThirtyFirstEnemyUnit('northern-second-infantry-a', '위군 천수 보병', '서쪽 보병', 'yellowTurban', 177, 1140, 282, 52, 66),
createThirtyFirstEnemyUnit('northern-second-infantry-b', '위군 천수 보병', '하곡 보병', 'yellowTurban', 177, 1140, 282, 60, 62),
createThirtyFirstEnemyUnit('northern-second-infantry-c', '위군 천수 보병', '마을 길목 보병', 'yellowTurban', 178, 1160, 286, 70, 57),
createThirtyFirstEnemyUnit('northern-second-infantry-d', '위군 천수 보병', '중앙 고개 보병', 'yellowTurban', 178, 1160, 286, 78, 50),
createThirtyFirstEnemyUnit('northern-second-infantry-e', '위군 천수 보병', '동쪽 보병', 'yellowTurban', 179, 1180, 290, 88, 45),
createThirtyFirstEnemyUnit('northern-second-infantry-f', '위군 천수 보병', '가정로 보병', 'yellowTurban', 179, 1180, 290, 96, 38),
createThirtyFirstEnemyUnit('northern-second-infantry-g', '위군 천수 보병', '곽회 본영 보병', 'yellowTurban', 180, 1200, 294, 104, 30),
createThirtyFirstEnemyUnit('northern-second-infantry-h', '위군 천수 보병', '보급 차단 보병', 'yellowTurban', 180, 1200, 294, 92, 70),
createThirtyFirstEnemyUnit('northern-second-archer-a', '위군 천수 궁병', '서쪽 고지 궁병', 'archer', 176, 860, 250, 55, 57),
createThirtyFirstEnemyUnit('northern-second-archer-b', '위군 천수 궁병', '하곡 궁병', 'archer', 177, 872, 252, 64, 53),
createThirtyFirstEnemyUnit('northern-second-archer-c', '위군 천수 궁병', '중앙 마을 궁병', 'archer', 177, 872, 252, 73, 48),
createThirtyFirstEnemyUnit('northern-second-archer-d', '위군 천수 궁병', '물목 궁병', 'archer', 178, 884, 254, 84, 41),
createThirtyFirstEnemyUnit('northern-second-archer-e', '위군 천수 궁병', '가정 고개 궁병', 'archer', 178, 884, 254, 94, 34),
createThirtyFirstEnemyUnit('northern-second-archer-f', '위군 천수 궁병', '곽회 본영 궁병', 'archer', 179, 896, 256, 105, 24),
createThirtyFirstEnemyUnit('northern-second-cavalry-a', '위군 역습 기병', '서쪽 기병', 'cavalry', 177, 1148, 288, 47, 61),
createThirtyFirstEnemyUnit('northern-second-cavalry-b', '위군 역습 기병', '하곡 기병', 'cavalry', 177, 1148, 288, 59, 58),
createThirtyFirstEnemyUnit('northern-second-cavalry-c', '위군 역습 기병', '중앙 역습 기병', 'cavalry', 178, 1170, 292, 72, 51),
createThirtyFirstEnemyUnit('northern-second-cavalry-d', '위군 역습 기병', '물목 우회 기병', 'cavalry', 179, 1192, 296, 84, 45),
createThirtyFirstEnemyUnit('northern-second-cavalry-e', '위군 역습 기병', '가정로 기병', 'cavalry', 179, 1192, 296, 96, 39),
createThirtyFirstEnemyUnit('northern-second-cavalry-f', '위군 역습 기병', '곽회 친위 기병', 'cavalry', 180, 1214, 300, 106, 32),
createThirtyFirstEnemyUnit('northern-second-jieting-guard-a', '가정 고개 수비대', '서쪽 고개 수비', 'yellowTurban', 178, 1180, 290, 43, 49),
createThirtyFirstEnemyUnit('northern-second-jieting-guard-b', '가정 고개 수비대', '중앙 고개 수비', 'yellowTurban', 178, 1180, 290, 55, 43),
createThirtyFirstEnemyUnit('northern-second-jieting-guard-c', '가정 고개 수비대', '물목 고개 수비', 'yellowTurban', 179, 1200, 294, 69, 36),
createThirtyFirstEnemyUnit('northern-second-jieting-guard-d', '가정 고개 수비대', '가정 길목 수비', 'yellowTurban', 179, 1200, 294, 82, 29),
createThirtyFirstEnemyUnit('northern-second-jieting-guard-e', '가정 고개 수비대', '곽회 영채 수비', 'yellowTurban', 180, 1220, 298, 98, 20),
createThirtyFirstEnemyUnit('northern-second-jieting-guard-f', '가정 고개 수비대', '북쪽 절벽 수비', 'yellowTurban', 180, 1220, 298, 106, 18),
createThirtyFirstEnemyUnit('northern-second-strategist-a', '위군 천수 군리', '마을 회유 군리', 'strategist', 178, 928, 262, 67, 46),
createThirtyFirstEnemyUnit('northern-second-strategist-b', '위군 천수 군리', '물목 기록 군리', 'strategist', 179, 940, 264, 82, 38),
createThirtyFirstEnemyUnit('northern-second-strategist-c', '위군 천수 군리', '가정 보급 군리', 'strategist', 179, 940, 264, 94, 52),
createThirtyFirstEnemyUnit('northern-second-strategist-d', '위군 천수 군리', '곽회 본영 군리', 'strategist', 180, 952, 266, 104, 26),
createThirtyFirstEnemyUnit('northern-second-officer-xiahou-mao', '하후무', '천수 방면 장수', 'rebelLeader', 180, 1220, 300, 74, 58),
createThirtyFirstEnemyUnit('northern-second-officer-fei-yao', '비요', '가정 지원 장수', 'rebelLeader', 180, 1220, 300, 95, 58),
createThirtyFirstEnemyUnit('northern-second-officer-jiang-wei', '강유', '천수 젊은 장수', 'rebelLeader', 181, 1260, 306, 86, 43),
createThirtyFirstEnemyUnit('northern-second-officer-ma-zun', '마준', '천수 태수', 'rebelLeader', 180, 1220, 300, 101, 64),
createThirtyFirstEnemyUnit('northern-second-officer-supply', '위군 둔전 장교', '물목 보급 장수', 'rebelLeader', 179, 1200, 296, 75, 70),
createThirtyFirstEnemyUnit('northern-second-leader-guo-huai', '곽회', '위군 북방 지휘관', 'rebelLeader', 182, 1320, 316, 104, 24)
];
export const fiftySixthBattleUnits: UnitData[] = tuneEnemyUnitGroup(fiftySixthBattleUnitsBase, ['northern-second-'], {
hpScale: 0.62,
attackScale: 0.72
});
const fiftySeventhBattleAllyPositions: Record<string, { x: number; y: number }> = {
'guan-yu': { x: 18, y: 83 },
'zhang-fei': { x: 24, y: 84 },
'jian-yong': { x: 11, y: 90 },
'mi-zhu': { x: 15, y: 91 },
'sun-qian': { x: 20, y: 91 },
'zhao-yun': { x: 42, y: 80 },
'zhuge-liang': { x: 38, y: 79 },
'ma-liang': { x: 39, y: 76 },
'yi-ji': { x: 10, y: 93 },
'gong-zhi': { x: 26, y: 91 },
'huang-zhong': { x: 37, y: 79 },
'wei-yan': { x: 48, y: 75 },
'pang-tong': { x: 14, y: 75 },
'fa-zheng': { x: 26, y: 74 },
'wu-yi': { x: 44, y: 89 },
'yan-yan': { x: 48, y: 82 },
'li-yan': { x: 34, y: 73 },
'huang-quan': { x: 38, y: 81 },
'ma-chao': { x: 51, y: 78 },
'ma-dai': { x: 55, y: 80 },
'wang-ping': { x: 58, y: 72 }
};
const fiftySeventhBattleUnitsBase: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally' && unit.id !== 'liu-bei'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits
].map((unit) => placeScenarioUnit(unit, fiftySeventhBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('northern-third-scout-a', '가정 척후병', '서쪽 물길 정찰', 'bandit', 181, 872, 250, 52, 74),
createThirtyFirstEnemyUnit('northern-third-scout-b', '가정 척후병', '하곡 정찰', 'bandit', 181, 872, 250, 61, 70),
createThirtyFirstEnemyUnit('northern-third-scout-c', '가정 척후병', '중앙 고개 정찰', 'bandit', 182, 884, 252, 74, 63),
createThirtyFirstEnemyUnit('northern-third-scout-d', '가정 척후병', '동쪽 고지 정찰', 'bandit', 182, 884, 252, 86, 56),
createThirtyFirstEnemyUnit('northern-third-scout-e', '가정 척후병', '장합 선봉 정찰', 'bandit', 183, 896, 254, 99, 48),
createThirtyFirstEnemyUnit('northern-third-scout-f', '가정 척후병', '북쪽 절벽 정찰', 'bandit', 183, 896, 254, 109, 36),
createThirtyFirstEnemyUnit('northern-third-infantry-a', '위군 가정 보병', '서쪽 하곡 보병', 'yellowTurban', 182, 1200, 294, 54, 68),
createThirtyFirstEnemyUnit('northern-third-infantry-b', '위군 가정 보병', '물길 보병', 'yellowTurban', 182, 1200, 294, 63, 64),
createThirtyFirstEnemyUnit('northern-third-infantry-c', '위군 가정 보병', '중앙 고개 보병', 'yellowTurban', 183, 1220, 298, 74, 58),
createThirtyFirstEnemyUnit('northern-third-infantry-d', '위군 가정 보병', '고지 아래 보병', 'yellowTurban', 183, 1220, 298, 84, 52),
createThirtyFirstEnemyUnit('northern-third-infantry-e', '위군 가정 보병', '동쪽 수레길 보병', 'yellowTurban', 184, 1240, 302, 94, 46),
createThirtyFirstEnemyUnit('northern-third-infantry-f', '위군 가정 보병', '장합 본대 보병', 'yellowTurban', 184, 1240, 302, 104, 38),
createThirtyFirstEnemyUnit('northern-third-infantry-g', '위군 가정 보병', '북쪽 길목 보병', 'yellowTurban', 185, 1260, 306, 110, 28),
createThirtyFirstEnemyUnit('northern-third-infantry-h', '위군 가정 보병', '보급 차단 보병', 'yellowTurban', 185, 1260, 306, 93, 72),
createThirtyFirstEnemyUnit('northern-third-archer-a', '위군 가정 궁병', '하곡 궁병', 'archer', 182, 908, 262, 58, 59),
createThirtyFirstEnemyUnit('northern-third-archer-b', '위군 가정 궁병', '물길 궁병', 'archer', 182, 908, 262, 68, 55),
createThirtyFirstEnemyUnit('northern-third-archer-c', '위군 가정 궁병', '중앙 고지 궁병', 'archer', 183, 920, 264, 80, 49),
createThirtyFirstEnemyUnit('northern-third-archer-d', '위군 가정 궁병', '수레길 궁병', 'archer', 184, 932, 266, 91, 42),
createThirtyFirstEnemyUnit('northern-third-archer-e', '위군 가정 궁병', '장합 본영 궁병', 'archer', 184, 932, 266, 103, 34),
createThirtyFirstEnemyUnit('northern-third-archer-f', '위군 가정 궁병', '북쪽 절벽 궁병', 'archer', 185, 944, 268, 111, 24),
createThirtyFirstEnemyUnit('northern-third-cavalry-a', '장합 추격 기병', '서쪽 추격 기병', 'cavalry', 183, 1236, 306, 50, 61),
createThirtyFirstEnemyUnit('northern-third-cavalry-b', '장합 추격 기병', '물길 차단 기병', 'cavalry', 183, 1236, 306, 64, 58),
createThirtyFirstEnemyUnit('northern-third-cavalry-c', '장합 추격 기병', '중앙 우회 기병', 'cavalry', 184, 1258, 310, 78, 51),
createThirtyFirstEnemyUnit('northern-third-cavalry-d', '장합 추격 기병', '고지 우회 기병', 'cavalry', 185, 1280, 314, 91, 45),
createThirtyFirstEnemyUnit('northern-third-cavalry-e', '장합 추격 기병', '동쪽 역습 기병', 'cavalry', 185, 1280, 314, 103, 39),
createThirtyFirstEnemyUnit('northern-third-cavalry-f', '장합 추격 기병', '장합 친위 기병', 'cavalry', 186, 1302, 318, 110, 31),
createThirtyFirstEnemyUnit('northern-third-ridge-guard-a', '가정 고지 수비대', '서쪽 고개 수비', 'yellowTurban', 183, 1240, 304, 45, 50),
createThirtyFirstEnemyUnit('northern-third-ridge-guard-b', '가정 고지 수비대', '물길 고개 수비', 'yellowTurban', 183, 1240, 304, 57, 44),
createThirtyFirstEnemyUnit('northern-third-ridge-guard-c', '가정 고지 수비대', '중앙 고지 수비', 'yellowTurban', 184, 1260, 308, 72, 37),
createThirtyFirstEnemyUnit('northern-third-ridge-guard-d', '가정 고지 수비대', '고지 진영 수비', 'yellowTurban', 184, 1260, 308, 86, 30),
createThirtyFirstEnemyUnit('northern-third-ridge-guard-e', '가정 고지 수비대', '장합 압박 수비', 'yellowTurban', 185, 1280, 312, 101, 22),
createThirtyFirstEnemyUnit('northern-third-ridge-guard-f', '가정 고지 수비대', '북쪽 절벽 수비', 'yellowTurban', 185, 1280, 312, 110, 18),
createThirtyFirstEnemyUnit('northern-third-strategist-a', '위군 가정 군리', '물길 차단 군리', 'strategist', 183, 976, 274, 70, 48),
createThirtyFirstEnemyUnit('northern-third-strategist-b', '위군 가정 군리', '고지 기록 군리', 'strategist', 184, 988, 276, 84, 39),
createThirtyFirstEnemyUnit('northern-third-strategist-c', '위군 가정 군리', '보급 차단 군리', 'strategist', 184, 988, 276, 96, 54),
createThirtyFirstEnemyUnit('northern-third-strategist-d', '위군 가정 군리', '장합 본영 군리', 'strategist', 185, 1000, 278, 108, 26),
createThirtyFirstEnemyUnit('northern-third-officer-jiang-wei', '강유', '흔들리는 천수 장수', 'rebelLeader', 186, 1320, 322, 84, 45),
createThirtyFirstEnemyUnit('northern-third-officer-fei-yao', '비요', '장합 지원 장수', 'rebelLeader', 185, 1300, 318, 99, 57),
createThirtyFirstEnemyUnit('northern-third-officer-ma-zun', '마준', '천수 태수', 'rebelLeader', 185, 1300, 316, 105, 64),
createThirtyFirstEnemyUnit('northern-third-officer-supply', '위군 보급 장교', '물길 차단 장수', 'rebelLeader', 184, 1280, 312, 77, 71),
createThirtyFirstEnemyUnit('northern-third-officer-masu-pressure', '가정 압박대', '마속 진영 압박', 'rebelLeader', 184, 1280, 312, 92, 35),
createThirtyFirstEnemyUnit('northern-third-leader-zhang-he', '장합', '위군 역습 총대장', 'rebelLeader', 187, 1400, 332, 102, 34)
];
export const fiftySeventhBattleUnits: UnitData[] = tuneEnemyUnitGroup(fiftySeventhBattleUnitsBase, ['northern-third-'], {
hpScale: 0.72,
attackScale: 0.72
});
const fiftyEighthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'guan-yu': { x: 20, y: 85 },
'zhang-fei': { x: 26, y: 86 },
'jian-yong': { x: 10, y: 92 },
'mi-zhu': { x: 14, y: 93 },
'sun-qian': { x: 19, y: 93 },
'zhao-yun': { x: 32, y: 82 },
'zhuge-liang': { x: 18, y: 81 },
'ma-liang': { x: 23, y: 78 },
'yi-ji': { x: 9, y: 95 },
'gong-zhi': { x: 27, y: 93 },
'huang-zhong': { x: 38, y: 81 },
'wei-yan': { x: 44, y: 84 },
'pang-tong': { x: 15, y: 77 },
'fa-zheng': { x: 27, y: 76 },
'wu-yi': { x: 45, y: 91 },
'yan-yan': { x: 49, y: 84 },
'li-yan': { x: 35, y: 75 },
'huang-quan': { x: 12, y: 80 },
'ma-chao': { x: 52, y: 80 },
'ma-dai': { x: 56, y: 87 },
'wang-ping': { x: 40, y: 75 },
'jiang-wei': { x: 33, y: 78 }
};
export const fiftyEighthBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally' && unit.id !== 'liu-bei'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits,
...jiangWeiRecruitUnits
].map((unit) => placeScenarioUnit(unit, fiftyEighthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('northern-fourth-scout-a', '위군 퇴로 정찰병', '서쪽 물길 정찰', 'bandit', 186, 920, 262, 47, 76),
createThirtyFirstEnemyUnit('northern-fourth-scout-b', '위군 퇴로 정찰병', '기산 수레 길 정찰', 'bandit', 186, 920, 262, 58, 73),
createThirtyFirstEnemyUnit('northern-fourth-scout-c', '위군 퇴로 정찰병', '중앙 낮은 길 정찰', 'bandit', 187, 932, 264, 70, 66),
createThirtyFirstEnemyUnit('northern-fourth-scout-d', '위군 퇴로 정찰병', '동쪽 강변 정찰', 'bandit', 187, 932, 264, 83, 58),
createThirtyFirstEnemyUnit('northern-fourth-scout-e', '위군 퇴로 정찰병', '사마의 본영 정찰', 'bandit', 188, 944, 266, 99, 44),
createThirtyFirstEnemyUnit('northern-fourth-scout-f', '위군 퇴로 정찰병', '북쪽 능선 정찰', 'bandit', 188, 944, 266, 111, 29),
createThirtyFirstEnemyUnit('northern-fourth-infantry-a', '위군 퇴로 봉쇄병', '서쪽 길목 봉쇄', 'yellowTurban', 187, 1280, 312, 52, 72),
createThirtyFirstEnemyUnit('northern-fourth-infantry-b', '위군 퇴로 봉쇄병', '수레 길 봉쇄', 'yellowTurban', 187, 1280, 312, 62, 68),
createThirtyFirstEnemyUnit('northern-fourth-infantry-c', '위군 퇴로 봉쇄병', '중앙 낮은 길 봉쇄', 'yellowTurban', 188, 1300, 316, 74, 61),
createThirtyFirstEnemyUnit('northern-fourth-infantry-d', '위군 퇴로 봉쇄병', '물길 앞 봉쇄', 'yellowTurban', 188, 1300, 316, 86, 55),
createThirtyFirstEnemyUnit('northern-fourth-infantry-e', '위군 퇴로 봉쇄병', '동쪽 고개 봉쇄', 'yellowTurban', 189, 1320, 320, 98, 48),
createThirtyFirstEnemyUnit('northern-fourth-infantry-f', '위군 퇴로 봉쇄병', '사마의 본영 보병', 'yellowTurban', 189, 1320, 320, 108, 34),
createThirtyFirstEnemyUnit('northern-fourth-infantry-g', '위군 퇴로 봉쇄병', '군량 차단 보병', 'yellowTurban', 190, 1340, 324, 93, 73),
createThirtyFirstEnemyUnit('northern-fourth-infantry-h', '위군 퇴로 봉쇄병', '북쪽 능선 보병', 'yellowTurban', 190, 1340, 324, 111, 21),
createThirtyFirstEnemyUnit('northern-fourth-archer-a', '위군 추격 궁병', '서쪽 물길 궁병', 'archer', 187, 968, 274, 56, 64),
createThirtyFirstEnemyUnit('northern-fourth-archer-b', '위군 추격 궁병', '수레 길 궁병', 'archer', 187, 968, 274, 68, 59),
createThirtyFirstEnemyUnit('northern-fourth-archer-c', '위군 추격 궁병', '중앙 언덕 궁병', 'archer', 188, 980, 276, 82, 51),
createThirtyFirstEnemyUnit('northern-fourth-archer-d', '위군 추격 궁병', '강변 궁병', 'archer', 189, 992, 278, 94, 43),
createThirtyFirstEnemyUnit('northern-fourth-archer-e', '위군 추격 궁병', '사마의 본영 궁병', 'archer', 189, 992, 278, 106, 31),
createThirtyFirstEnemyUnit('northern-fourth-archer-f', '위군 추격 궁병', '북쪽 능선 궁병', 'archer', 190, 1004, 280, 112, 18),
createThirtyFirstEnemyUnit('northern-fourth-cavalry-a', '장합 추격 기병', '서쪽 추격 기병', 'cavalry', 188, 1328, 326, 48, 66),
createThirtyFirstEnemyUnit('northern-fourth-cavalry-b', '장합 추격 기병', '수레 길 추격 기병', 'cavalry', 188, 1328, 326, 62, 63),
createThirtyFirstEnemyUnit('northern-fourth-cavalry-c', '장합 추격 기병', '중앙 돌파 기병', 'cavalry', 189, 1350, 330, 76, 56),
createThirtyFirstEnemyUnit('northern-fourth-cavalry-d', '장합 추격 기병', '동쪽 우회 기병', 'cavalry', 190, 1372, 334, 90, 49),
createThirtyFirstEnemyUnit('northern-fourth-cavalry-e', '장합 추격 기병', '사마의 본영 기병', 'cavalry', 190, 1372, 334, 103, 41),
createThirtyFirstEnemyUnit('northern-fourth-cavalry-f', '장합 추격 기병', '북쪽 추격 기병', 'cavalry', 191, 1394, 338, 112, 25),
createThirtyFirstEnemyUnit('northern-fourth-ridge-guard-a', '기산 능선 수비대', '서쪽 능선 수비', 'yellowTurban', 188, 1300, 318, 43, 52),
createThirtyFirstEnemyUnit('northern-fourth-ridge-guard-b', '기산 능선 수비대', '중앙 능선 수비', 'yellowTurban', 188, 1300, 318, 57, 45),
createThirtyFirstEnemyUnit('northern-fourth-ridge-guard-c', '기산 능선 수비대', '물길 위 수비', 'yellowTurban', 189, 1320, 322, 73, 37),
createThirtyFirstEnemyUnit('northern-fourth-ridge-guard-d', '기산 능선 수비대', '동쪽 능선 수비', 'yellowTurban', 189, 1320, 322, 88, 30),
createThirtyFirstEnemyUnit('northern-fourth-ridge-guard-e', '기산 능선 수비대', '본영 앞 수비', 'yellowTurban', 190, 1340, 326, 101, 23),
createThirtyFirstEnemyUnit('northern-fourth-ridge-guard-f', '기산 능선 수비대', '북쪽 절벽 수비', 'yellowTurban', 190, 1340, 326, 113, 16),
createThirtyFirstEnemyUnit('northern-fourth-strategist-a', '위군 퇴로 군리', '수레 길 계산 군리', 'strategist', 188, 1032, 286, 70, 53),
createThirtyFirstEnemyUnit('northern-fourth-strategist-b', '위군 퇴로 군리', '물길 기록 군리', 'strategist', 189, 1044, 288, 84, 44),
createThirtyFirstEnemyUnit('northern-fourth-strategist-c', '위군 퇴로 군리', '사마의 본영 군리', 'strategist', 189, 1044, 288, 98, 36),
createThirtyFirstEnemyUnit('northern-fourth-strategist-d', '위군 퇴로 군리', '군량 차단 군리', 'strategist', 190, 1056, 290, 104, 61),
createThirtyFirstEnemyUnit('northern-fourth-officer-zhang-he', '장합', '퇴로 추격 선봉장', 'rebelLeader', 192, 1440, 342, 94, 38),
createThirtyFirstEnemyUnit('northern-fourth-officer-fei-yao', '비요', '수레 길 압박 장수', 'rebelLeader', 190, 1400, 334, 102, 54),
createThirtyFirstEnemyUnit('northern-fourth-officer-guo-huai', '곽회', '가정 방면 장수', 'rebelLeader', 190, 1400, 334, 108, 66),
createThirtyFirstEnemyUnit('northern-fourth-officer-supply', '위군 보급 차단장', '군량 수레 차단 장수', 'rebelLeader', 189, 1380, 330, 78, 72),
createThirtyFirstEnemyUnit('northern-fourth-officer-ridge', '위군 능선 장수', '북쪽 능선 장수', 'rebelLeader', 190, 1400, 334, 110, 19),
createThirtyFirstEnemyUnit('northern-fourth-leader-sima-yi', '사마의', '위군 본대 총지휘관', 'rebelLeader', 193, 1500, 352, 112, 27)
];
const fiftyNinthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'guan-yu': { x: 18, y: 88 },
'zhang-fei': { x: 24, y: 90 },
'jian-yong': { x: 10, y: 95 },
'mi-zhu': { x: 14, y: 96 },
'sun-qian': { x: 19, y: 96 },
'zhao-yun': { x: 43, y: 84 },
'zhuge-liang': { x: 44, y: 82 },
'ma-liang': { x: 43, y: 79 },
'yi-ji': { x: 9, y: 98 },
'gong-zhi': { x: 27, y: 96 },
'huang-zhong': { x: 37, y: 84 },
'wei-yan': { x: 52, y: 82 },
'pang-tong': { x: 15, y: 81 },
'fa-zheng': { x: 46, y: 78 },
'wu-yi': { x: 45, y: 94 },
'yan-yan': { x: 49, y: 87 },
'li-yan': { x: 35, y: 79 },
'huang-quan': { x: 44, y: 84 },
'ma-chao': { x: 52, y: 83 },
'ma-dai': { x: 56, y: 86 },
'wang-ping': { x: 50, y: 78 },
'jiang-wei': { x: 48, y: 80 }
};
const fiftyNinthBattleUnitsBase: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally' && unit.id !== 'liu-bei'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits,
...jiangWeiRecruitUnits
].map((unit) => placeScenarioUnit(unit, fiftyNinthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('northern-fifth-scout-a', '진창 외곽 척후병', '서쪽 수레길 정찰', 'bandit', 190, 960, 270, 49, 78),
createThirtyFirstEnemyUnit('northern-fifth-scout-b', '진창 외곽 척후병', '공성 진영 정찰', 'bandit', 190, 960, 270, 60, 74),
createThirtyFirstEnemyUnit('northern-fifth-scout-c', '진창 외곽 척후병', '중앙 낮은 길 정찰', 'bandit', 191, 972, 272, 72, 67),
createThirtyFirstEnemyUnit('northern-fifth-scout-d', '진창 외곽 척후병', '동쪽 성문 정찰', 'bandit', 191, 972, 272, 84, 60),
createThirtyFirstEnemyUnit('northern-fifth-scout-e', '진창 외곽 척후병', '학소 성벽 정찰', 'bandit', 192, 984, 274, 101, 42),
createThirtyFirstEnemyUnit('northern-fifth-scout-f', '진창 외곽 척후병', '북쪽 봉화 정찰', 'bandit', 192, 984, 274, 114, 25),
createThirtyFirstEnemyUnit('northern-fifth-infantry-a', '위군 진창 보병', '서쪽 공성로 보병', 'yellowTurban', 191, 1340, 324, 54, 73),
createThirtyFirstEnemyUnit('northern-fifth-infantry-b', '위군 진창 보병', '수레길 보병', 'yellowTurban', 191, 1340, 324, 64, 68),
createThirtyFirstEnemyUnit('northern-fifth-infantry-c', '위군 진창 보병', '중앙 보병', 'yellowTurban', 192, 1360, 328, 76, 62),
createThirtyFirstEnemyUnit('northern-fifth-infantry-d', '위군 진창 보병', '동문 앞 보병', 'yellowTurban', 192, 1360, 328, 88, 55),
createThirtyFirstEnemyUnit('northern-fifth-infantry-e', '위군 진창 보병', '성벽 아래 보병', 'yellowTurban', 193, 1380, 332, 100, 48),
createThirtyFirstEnemyUnit('northern-fifth-infantry-f', '위군 진창 보병', '학소 본영 보병', 'yellowTurban', 193, 1380, 332, 110, 36),
createThirtyFirstEnemyUnit('northern-fifth-infantry-g', '위군 진창 보병', '보급 차단 보병', 'yellowTurban', 194, 1400, 336, 92, 76),
createThirtyFirstEnemyUnit('northern-fifth-infantry-h', '위군 진창 보병', '북쪽 성벽 보병', 'yellowTurban', 194, 1400, 336, 115, 18),
createThirtyFirstEnemyUnit('northern-fifth-archer-a', '진창 성벽 궁병', '서쪽 성벽 궁병', 'archer', 191, 1010, 282, 60, 63),
createThirtyFirstEnemyUnit('northern-fifth-archer-b', '진창 성벽 궁병', '공성로 궁병', 'archer', 191, 1010, 282, 71, 58),
createThirtyFirstEnemyUnit('northern-fifth-archer-c', '진창 성벽 궁병', '중앙 성벽 궁병', 'archer', 192, 1022, 284, 84, 51),
createThirtyFirstEnemyUnit('northern-fifth-archer-d', '진창 성벽 궁병', '동문 궁병', 'archer', 193, 1034, 286, 96, 44),
createThirtyFirstEnemyUnit('northern-fifth-archer-e', '진창 성벽 궁병', '학소 본영 궁병', 'archer', 193, 1034, 286, 108, 31),
createThirtyFirstEnemyUnit('northern-fifth-archer-f', '진창 성벽 궁병', '봉화대 궁병', 'archer', 194, 1046, 288, 116, 16),
createThirtyFirstEnemyUnit('northern-fifth-cavalry-a', '왕쌍 추격 기병', '서쪽 추격 기병', 'cavalry', 192, 1388, 338, 50, 66),
createThirtyFirstEnemyUnit('northern-fifth-cavalry-b', '왕쌍 추격 기병', '수레길 추격 기병', 'cavalry', 192, 1388, 338, 63, 63),
createThirtyFirstEnemyUnit('northern-fifth-cavalry-c', '왕쌍 추격 기병', '중앙 돌파 기병', 'cavalry', 193, 1410, 342, 77, 56),
createThirtyFirstEnemyUnit('northern-fifth-cavalry-d', '왕쌍 추격 기병', '동쪽 우회 기병', 'cavalry', 194, 1432, 346, 91, 49),
createThirtyFirstEnemyUnit('northern-fifth-cavalry-e', '왕쌍 추격 기병', '성문 지원 기병', 'cavalry', 194, 1432, 346, 103, 41),
createThirtyFirstEnemyUnit('northern-fifth-cavalry-f', '왕쌍 추격 기병', '북쪽 추격 기병', 'cavalry', 195, 1454, 350, 114, 27),
createThirtyFirstEnemyUnit('northern-fifth-wall-guard-a', '진창 성벽 수비대', '서쪽 성벽 수비', 'yellowTurban', 192, 1360, 330, 44, 53),
createThirtyFirstEnemyUnit('northern-fifth-wall-guard-b', '진창 성벽 수비대', '중앙 성벽 수비', 'yellowTurban', 192, 1360, 330, 58, 47),
createThirtyFirstEnemyUnit('northern-fifth-wall-guard-c', '진창 성벽 수비대', '동문 수비', 'yellowTurban', 193, 1380, 334, 74, 39),
createThirtyFirstEnemyUnit('northern-fifth-wall-guard-d', '진창 성벽 수비대', '내성 수비', 'yellowTurban', 193, 1380, 334, 90, 32),
createThirtyFirstEnemyUnit('northern-fifth-wall-guard-e', '진창 성벽 수비대', '학소 본영 수비', 'yellowTurban', 194, 1400, 338, 104, 24),
createThirtyFirstEnemyUnit('northern-fifth-wall-guard-f', '진창 성벽 수비대', '북쪽 절벽 수비', 'yellowTurban', 194, 1400, 338, 116, 13),
createThirtyFirstEnemyUnit('northern-fifth-strategist-a', '위군 공성 대응 군리', '성벽 수리 군리', 'strategist', 192, 1080, 296, 72, 54),
createThirtyFirstEnemyUnit('northern-fifth-strategist-b', '위군 공성 대응 군리', '봉화 연락 군리', 'strategist', 193, 1092, 298, 86, 45),
createThirtyFirstEnemyUnit('northern-fifth-strategist-c', '위군 공성 대응 군리', '학소 본영 군리', 'strategist', 193, 1092, 298, 100, 36),
createThirtyFirstEnemyUnit('northern-fifth-strategist-d', '위군 공성 대응 군리', '군량 차단 군리', 'strategist', 194, 1104, 300, 106, 63),
createThirtyFirstEnemyUnit('northern-fifth-officer-wang-shuang', '왕쌍', '위군 추격 장수', 'rebelLeader', 196, 1480, 356, 78, 72),
createThirtyFirstEnemyUnit('northern-fifth-officer-fei-yao', '비요', '진창 지원 장수', 'rebelLeader', 194, 1440, 348, 101, 58),
createThirtyFirstEnemyUnit('northern-fifth-officer-guo-huai', '곽회', '북방 지원 장수', 'rebelLeader', 194, 1440, 348, 110, 68),
createThirtyFirstEnemyUnit('northern-fifth-officer-supply', '위군 군량 차단장', '공성 진영 압박 장수', 'rebelLeader', 193, 1420, 344, 78, 76),
createThirtyFirstEnemyUnit('northern-fifth-officer-wall', '진창 성벽 장수', '성문 수비 장수', 'rebelLeader', 194, 1440, 348, 112, 27),
createThirtyFirstEnemyUnit('northern-fifth-leader-hao-zhao', '학소', '진창 수비장', 'rebelLeader', 197, 1540, 362, 104, 36)
];
export const fiftyNinthBattleUnits: UnitData[] = tuneEnemyUnitGroup(fiftyNinthBattleUnitsBase, ['northern-fifth-'], {
hpScale: 0.72,
attackScale: 0.72
});
const sixtiethBattleAllyPositions: Record<string, { x: number; y: number }> = {
'guan-yu': { x: 18, y: 90 },
'zhang-fei': { x: 24, y: 92 },
'jian-yong': { x: 10, y: 97 },
'mi-zhu': { x: 14, y: 98 },
'sun-qian': { x: 19, y: 98 },
'zhao-yun': { x: 31, y: 88 },
'zhuge-liang': { x: 17, y: 87 },
'ma-liang': { x: 22, y: 84 },
'yi-ji': { x: 9, y: 100 },
'gong-zhi': { x: 27, y: 98 },
'huang-zhong': { x: 37, y: 86 },
'wei-yan': { x: 43, y: 88 },
'pang-tong': { x: 15, y: 83 },
'fa-zheng': { x: 27, y: 82 },
'wu-yi': { x: 45, y: 96 },
'yan-yan': { x: 49, y: 89 },
'li-yan': { x: 35, y: 81 },
'huang-quan': { x: 12, y: 86 },
'ma-chao': { x: 52, y: 85 },
'ma-dai': { x: 56, y: 92 },
'wang-ping': { x: 40, y: 81 },
'jiang-wei': { x: 33, y: 84 }
};
export const sixtiethBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally' && unit.id !== 'liu-bei'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits,
...jiangWeiRecruitUnits
].map((unit) => placeScenarioUnit(unit, sixtiethBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('northern-sixth-scout-a', '무도 산길 척후병', '서쪽 고개 정찰', 'bandit', 198, 1000, 278, 50, 80),
createThirtyFirstEnemyUnit('northern-sixth-scout-b', '음평 하곡 척후병', '하곡 정찰', 'bandit', 198, 1000, 278, 61, 76),
createThirtyFirstEnemyUnit('northern-sixth-scout-c', '무도 산길 척후병', '중앙 갈림길 정찰', 'bandit', 199, 1012, 280, 74, 69),
createThirtyFirstEnemyUnit('northern-sixth-scout-d', '음평 하곡 척후병', '동쪽 하천 정찰', 'bandit', 199, 1012, 280, 87, 61),
createThirtyFirstEnemyUnit('northern-sixth-scout-e', '곽회 전초 척후병', '곽회 본영 정찰', 'bandit', 200, 1024, 282, 103, 47),
createThirtyFirstEnemyUnit('northern-sixth-scout-f', '북쪽 봉화 척후병', '북쪽 봉화 정찰', 'bandit', 200, 1024, 282, 116, 30),
createThirtyFirstEnemyUnit('northern-sixth-infantry-a', '위군 무도 보병', '서쪽 고개 보병', 'yellowTurban', 199, 1400, 336, 55, 75),
createThirtyFirstEnemyUnit('northern-sixth-infantry-b', '위군 음평 보병', '하곡 보병', 'yellowTurban', 199, 1400, 336, 65, 70),
createThirtyFirstEnemyUnit('northern-sixth-infantry-c', '위군 무도 보병', '중앙 보병', 'yellowTurban', 200, 1420, 340, 77, 64),
createThirtyFirstEnemyUnit('northern-sixth-infantry-d', '위군 음평 보병', '동쪽 물목 보병', 'yellowTurban', 200, 1420, 340, 90, 57),
createThirtyFirstEnemyUnit('northern-sixth-infantry-e', '위군 무도 보병', '방어선 보병', 'yellowTurban', 201, 1440, 344, 102, 50),
createThirtyFirstEnemyUnit('northern-sixth-infantry-f', '위군 음평 보병', '곽회 본영 보병', 'yellowTurban', 201, 1440, 344, 112, 38),
createThirtyFirstEnemyUnit('northern-sixth-infantry-g', '위군 보급 차단병', '군량로 차단 보병', 'yellowTurban', 202, 1460, 348, 95, 78),
createThirtyFirstEnemyUnit('northern-sixth-infantry-h', '북쪽 능선 보병', '북쪽 능선 보병', 'yellowTurban', 202, 1460, 348, 117, 20),
createThirtyFirstEnemyUnit('northern-sixth-archer-a', '무도 능선 궁병', '서쪽 능선 궁병', 'archer', 199, 1050, 290, 60, 65),
createThirtyFirstEnemyUnit('northern-sixth-archer-b', '음평 물목 궁병', '하곡 궁병', 'archer', 199, 1050, 290, 72, 60),
createThirtyFirstEnemyUnit('northern-sixth-archer-c', '무도 능선 궁병', '중앙 능선 궁병', 'archer', 200, 1062, 292, 86, 53),
createThirtyFirstEnemyUnit('northern-sixth-archer-d', '음평 물목 궁병', '동쪽 물목 궁병', 'archer', 201, 1074, 294, 98, 45),
createThirtyFirstEnemyUnit('northern-sixth-archer-e', '곽회 본영 궁병', '곽회 본영 궁병', 'archer', 201, 1074, 294, 110, 33),
createThirtyFirstEnemyUnit('northern-sixth-archer-f', '북쪽 봉화 궁병', '봉화대 궁병', 'archer', 202, 1086, 296, 118, 17),
createThirtyFirstEnemyUnit('northern-sixth-cavalry-a', '곽회 구원 기병', '서쪽 구원 기병', 'cavalry', 200, 1458, 354, 51, 68),
createThirtyFirstEnemyUnit('northern-sixth-cavalry-b', '곽회 구원 기병', '하곡 구원 기병', 'cavalry', 200, 1458, 354, 64, 65),
createThirtyFirstEnemyUnit('northern-sixth-cavalry-c', '곽회 구원 기병', '중앙 우회 기병', 'cavalry', 201, 1480, 358, 78, 58),
createThirtyFirstEnemyUnit('northern-sixth-cavalry-d', '곽회 구원 기병', '동쪽 우회 기병', 'cavalry', 202, 1502, 362, 92, 51),
createThirtyFirstEnemyUnit('northern-sixth-cavalry-e', '곽회 구원 기병', '본영 지원 기병', 'cavalry', 202, 1502, 362, 105, 43),
createThirtyFirstEnemyUnit('northern-sixth-cavalry-f', '곽회 구원 기병', '북쪽 차단 기병', 'cavalry', 203, 1524, 366, 116, 27),
createThirtyFirstEnemyUnit('northern-sixth-ridge-guard-a', '무도 고개 수비대', '서쪽 고개 수비', 'yellowTurban', 200, 1420, 342, 46, 55),
createThirtyFirstEnemyUnit('northern-sixth-ridge-guard-b', '음평 물길 수비대', '하곡 물길 수비', 'yellowTurban', 200, 1420, 342, 60, 49),
createThirtyFirstEnemyUnit('northern-sixth-ridge-guard-c', '무도 고개 수비대', '중앙 고개 수비', 'yellowTurban', 201, 1440, 346, 76, 41),
createThirtyFirstEnemyUnit('northern-sixth-ridge-guard-d', '음평 물길 수비대', '동쪽 물목 수비', 'yellowTurban', 201, 1440, 346, 92, 34),
createThirtyFirstEnemyUnit('northern-sixth-ridge-guard-e', '곽회 본영 수비대', '곽회 본영 수비', 'yellowTurban', 202, 1460, 350, 106, 26),
createThirtyFirstEnemyUnit('northern-sixth-ridge-guard-f', '북쪽 절벽 수비대', '북쪽 절벽 수비', 'yellowTurban', 202, 1460, 350, 118, 14),
createThirtyFirstEnemyUnit('northern-sixth-strategist-a', '위군 무도 군리', '무도 장부 군리', 'strategist', 200, 1120, 304, 74, 56),
createThirtyFirstEnemyUnit('northern-sixth-strategist-b', '위군 음평 군리', '음평 장부 군리', 'strategist', 201, 1132, 306, 88, 47),
createThirtyFirstEnemyUnit('northern-sixth-strategist-c', '곽회 본영 군리', '곽회 본영 군리', 'strategist', 201, 1132, 306, 102, 38),
createThirtyFirstEnemyUnit('northern-sixth-strategist-d', '위군 보급 군리', '군량 차단 군리', 'strategist', 202, 1144, 308, 108, 66),
createThirtyFirstEnemyUnit('northern-sixth-officer-wudu', '무도 수비장', '무도 고개 장수', 'rebelLeader', 203, 1500, 360, 86, 72),
createThirtyFirstEnemyUnit('northern-sixth-officer-yinping', '음평 수비장', '음평 물목 장수', 'rebelLeader', 203, 1500, 360, 101, 60),
createThirtyFirstEnemyUnit('northern-sixth-officer-fei-yao', '비요', '곽회 지원 장수', 'rebelLeader', 202, 1480, 356, 109, 70),
createThirtyFirstEnemyUnit('northern-sixth-officer-supply', '위군 군량 차단장', '두 고을 보급 차단 장수', 'rebelLeader', 201, 1460, 352, 80, 80),
createThirtyFirstEnemyUnit('northern-sixth-officer-relay', '위군 봉화 장수', '북쪽 봉화 장수', 'rebelLeader', 202, 1480, 356, 115, 25),
createThirtyFirstEnemyUnit('northern-sixth-leader-guo-huai', '곽회', '위군 북방 구원 총대장', 'rebelLeader', 204, 1580, 372, 112, 36)
];
const sixtyFirstBattleAllyPositions: Record<string, { x: number; y: number }> = {
'guan-yu': { x: 17, y: 92 },
'zhang-fei': { x: 23, y: 94 },
'jian-yong': { x: 9, y: 99 },
'mi-zhu': { x: 13, y: 100 },
'sun-qian': { x: 18, y: 100 },
'zhao-yun': { x: 30, y: 91 },
'zhuge-liang': { x: 18, y: 88 },
'ma-liang': { x: 24, y: 85 },
'yi-ji': { x: 8, y: 102 },
'gong-zhi': { x: 28, y: 100 },
'huang-zhong': { x: 38, y: 88 },
'wei-yan': { x: 45, y: 90 },
'pang-tong': { x: 15, y: 84 },
'fa-zheng': { x: 28, y: 83 },
'wu-yi': { x: 46, y: 98 },
'yan-yan': { x: 50, y: 91 },
'li-yan': { x: 34, y: 82 },
'huang-quan': { x: 12, y: 87 },
'ma-chao': { x: 53, y: 87 },
'ma-dai': { x: 58, y: 94 },
'wang-ping': { x: 41, y: 82 },
'jiang-wei': { x: 34, y: 85 }
};
export const sixtyFirstBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally' && unit.id !== 'liu-bei'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits,
...jiangWeiRecruitUnits
].map((unit) => placeScenarioUnit(unit, sixtyFirstBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('northern-seventh-scout-a', '자오곡 우중 척후병', '서쪽 빗길 정찰', 'bandit', 205, 1030, 286, 50, 82),
createThirtyFirstEnemyUnit('northern-seventh-scout-b', '무도 보급로 척후병', '보급로 정찰', 'bandit', 205, 1030, 286, 62, 79),
createThirtyFirstEnemyUnit('northern-seventh-scout-c', '한중 북문 척후병', '중앙 고개 정찰', 'bandit', 206, 1042, 288, 76, 72),
createThirtyFirstEnemyUnit('northern-seventh-scout-d', '음평 물목 척후병', '동쪽 물목 정찰', 'bandit', 206, 1042, 288, 90, 64),
createThirtyFirstEnemyUnit('northern-seventh-scout-e', '조진 전초 척후병', '조진 본영 정찰', 'bandit', 207, 1054, 290, 106, 49),
createThirtyFirstEnemyUnit('northern-seventh-scout-f', '북문 봉화 척후병', '북쪽 봉화 정찰', 'bandit', 207, 1054, 290, 118, 30),
createThirtyFirstEnemyUnit('northern-seventh-infantry-a', '위군 자오곡 보병', '서쪽 고개 보병', 'yellowTurban', 206, 1460, 352, 54, 76),
createThirtyFirstEnemyUnit('northern-seventh-infantry-b', '위군 무도 보병', '보급로 보병', 'yellowTurban', 206, 1460, 352, 66, 72),
createThirtyFirstEnemyUnit('northern-seventh-infantry-c', '위군 한중 보병', '중앙 보병', 'yellowTurban', 207, 1480, 356, 79, 66),
createThirtyFirstEnemyUnit('northern-seventh-infantry-d', '위군 음평 보병', '동쪽 물목 보병', 'yellowTurban', 207, 1480, 356, 92, 59),
createThirtyFirstEnemyUnit('northern-seventh-infantry-e', '위군 북문 보병', '방어선 보병', 'yellowTurban', 208, 1500, 360, 104, 52),
createThirtyFirstEnemyUnit('northern-seventh-infantry-f', '조진 본영 보병', '조진 본영 보병', 'yellowTurban', 208, 1500, 360, 114, 40),
createThirtyFirstEnemyUnit('northern-seventh-infantry-g', '위군 보급 차단병', '수레길 차단 보병', 'yellowTurban', 209, 1520, 364, 98, 80),
createThirtyFirstEnemyUnit('northern-seventh-infantry-h', '사마의 별동 보병', '별동대 보병', 'yellowTurban', 209, 1520, 364, 119, 22),
createThirtyFirstEnemyUnit('northern-seventh-archer-a', '자오곡 우중 궁병', '서쪽 능선 궁병', 'archer', 206, 1090, 300, 61, 67),
createThirtyFirstEnemyUnit('northern-seventh-archer-b', '무도 보급로 궁병', '보급로 궁병', 'archer', 206, 1090, 300, 73, 62),
createThirtyFirstEnemyUnit('northern-seventh-archer-c', '한중 북문 궁병', '중앙 능선 궁병', 'archer', 207, 1102, 302, 88, 55),
createThirtyFirstEnemyUnit('northern-seventh-archer-d', '음평 물목 궁병', '동쪽 물목 궁병', 'archer', 208, 1114, 304, 100, 47),
createThirtyFirstEnemyUnit('northern-seventh-archer-e', '조진 본영 궁병', '조진 본영 궁병', 'archer', 208, 1114, 304, 112, 35),
createThirtyFirstEnemyUnit('northern-seventh-archer-f', '사마의 봉화 궁병', '봉화대 궁병', 'archer', 209, 1126, 306, 120, 18),
createThirtyFirstEnemyUnit('northern-seventh-cavalry-a', '조진 역공 기병', '서쪽 역공 기병', 'cavalry', 207, 1520, 370, 52, 70),
createThirtyFirstEnemyUnit('northern-seventh-cavalry-b', '조진 역공 기병', '무도 역공 기병', 'cavalry', 207, 1520, 370, 65, 67),
createThirtyFirstEnemyUnit('northern-seventh-cavalry-c', '조진 역공 기병', '중앙 역공 기병', 'cavalry', 208, 1542, 374, 80, 60),
createThirtyFirstEnemyUnit('northern-seventh-cavalry-d', '조진 역공 기병', '음평 역공 기병', 'cavalry', 209, 1564, 378, 94, 53),
createThirtyFirstEnemyUnit('northern-seventh-cavalry-e', '사마의 별동 기병', '별동대 기병', 'cavalry', 209, 1564, 378, 108, 45),
createThirtyFirstEnemyUnit('northern-seventh-cavalry-f', '북문 차단 기병', '북쪽 차단 기병', 'cavalry', 210, 1586, 382, 119, 28),
createThirtyFirstEnemyUnit('northern-seventh-rain-guard-a', '자오곡 빗길 수비대', '서쪽 빗길 수비', 'yellowTurban', 207, 1480, 358, 47, 56),
createThirtyFirstEnemyUnit('northern-seventh-rain-guard-b', '무도 보급로 수비대', '보급로 수비', 'yellowTurban', 207, 1480, 358, 62, 51),
createThirtyFirstEnemyUnit('northern-seventh-rain-guard-c', '한중 북문 수비대', '중앙 고개 수비', 'yellowTurban', 208, 1500, 362, 78, 43),
createThirtyFirstEnemyUnit('northern-seventh-rain-guard-d', '음평 물목 수비대', '동쪽 물목 수비', 'yellowTurban', 208, 1500, 362, 94, 36),
createThirtyFirstEnemyUnit('northern-seventh-rain-guard-e', '조진 본영 수비대', '조진 본영 수비', 'yellowTurban', 209, 1520, 366, 108, 28),
createThirtyFirstEnemyUnit('northern-seventh-rain-guard-f', '북쪽 봉화 수비대', '북쪽 봉화 수비', 'yellowTurban', 209, 1520, 366, 120, 14),
createThirtyFirstEnemyUnit('northern-seventh-strategist-a', '위군 우로 군리', '빗길 장부 군리', 'strategist', 207, 1160, 316, 76, 58),
createThirtyFirstEnemyUnit('northern-seventh-strategist-b', '위군 보급 군리', '보급 차단 군리', 'strategist', 208, 1172, 318, 90, 49),
createThirtyFirstEnemyUnit('northern-seventh-strategist-c', '조진 본영 군리', '조진 본영 군리', 'strategist', 208, 1172, 318, 104, 40),
createThirtyFirstEnemyUnit('northern-seventh-strategist-d', '사마의 별동 군리', '별동대 장부 군리', 'strategist', 209, 1184, 320, 110, 68),
createThirtyFirstEnemyUnit('northern-seventh-officer-hanzhong', '한중 북문 장수', '한중 북문 압박 장수', 'rebelLeader', 211, 1580, 378, 88, 74),
createThirtyFirstEnemyUnit('northern-seventh-officer-supply', '보급 차단장', '무도·음평 보급 차단 장수', 'rebelLeader', 211, 1580, 378, 101, 62),
createThirtyFirstEnemyUnit('northern-seventh-officer-guo-huai', '곽회', '북방 보조 장수', 'rebelLeader', 210, 1560, 374, 110, 72),
createThirtyFirstEnemyUnit('northern-seventh-officer-rain-road', '우로 감군', '빗길 감군 장수', 'rebelLeader', 210, 1560, 374, 82, 82),
createThirtyFirstEnemyUnit('northern-seventh-officer-sima-yi', '사마의', '별동대 총지휘', 'rebelLeader', 212, 1620, 386, 116, 24),
createThirtyFirstEnemyUnit('northern-seventh-leader-cao-zhen', '조진', '위군 역공 총대장', 'rebelLeader', 213, 1660, 392, 114, 38)
];
const sixtySecondBattleAllyPositions: Record<string, { x: number; y: number }> = {
'guan-yu': { x: 15, y: 94 },
'zhang-fei': { x: 22, y: 96 },
'jian-yong': { x: 8, y: 101 },
'mi-zhu': { x: 13, y: 102 },
'sun-qian': { x: 18, y: 102 },
'zhao-yun': { x: 30, y: 93 },
'zhuge-liang': { x: 18, y: 89 },
'ma-liang': { x: 24, y: 86 },
'yi-ji': { x: 8, y: 103 },
'gong-zhi': { x: 28, y: 101 },
'huang-zhong': { x: 38, y: 90 },
'wei-yan': { x: 45, y: 91 },
'pang-tong': { x: 15, y: 85 },
'fa-zheng': { x: 28, y: 84 },
'wu-yi': { x: 47, y: 99 },
'yan-yan': { x: 51, y: 92 },
'li-yan': { x: 34, y: 83 },
'huang-quan': { x: 12, y: 88 },
'ma-chao': { x: 54, y: 88 },
'ma-dai': { x: 59, y: 95 },
'wang-ping': { x: 41, y: 83 },
'jiang-wei': { x: 35, y: 86 }
};
export const sixtySecondBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally' && unit.id !== 'liu-bei'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits,
...jiangWeiRecruitUnits
].map((unit) => placeScenarioUnit(unit, sixtySecondBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
createThirtyFirstEnemyUnit('northern-eighth-scout-a', '노성 서로 척후병', '서쪽 고개 정찰', 'bandit', 214, 1060, 292, 52, 84),
createThirtyFirstEnemyUnit('northern-eighth-scout-b', '기산 보급로 척후병', '보급로 정찰', 'bandit', 214, 1060, 292, 64, 81),
createThirtyFirstEnemyUnit('northern-eighth-scout-c', '노성 앞 척후병', '중앙 고개 정찰', 'bandit', 215, 1072, 294, 78, 74),
createThirtyFirstEnemyUnit('northern-eighth-scout-d', '동쪽 물목 척후병', '동쪽 물목 정찰', 'bandit', 215, 1072, 294, 92, 66),
createThirtyFirstEnemyUnit('northern-eighth-scout-e', '사마의 전초 척후병', '본영 정찰', 'bandit', 216, 1084, 296, 108, 50),
createThirtyFirstEnemyUnit('northern-eighth-scout-f', '북쪽 봉화 척후병', '봉화대 정찰', 'bandit', 216, 1084, 296, 121, 30),
createThirtyFirstEnemyUnit('northern-eighth-infantry-a', '위군 기산 보병', '서쪽 고개 보병', 'yellowTurban', 215, 1540, 368, 55, 78),
createThirtyFirstEnemyUnit('northern-eighth-infantry-b', '위군 보급로 보병', '보급로 보병', 'yellowTurban', 215, 1540, 368, 68, 74),
createThirtyFirstEnemyUnit('northern-eighth-infantry-c', '위군 노성 보병', '중앙 보병', 'yellowTurban', 216, 1560, 372, 81, 68),
createThirtyFirstEnemyUnit('northern-eighth-infantry-d', '위군 물목 보병', '동쪽 물목 보병', 'yellowTurban', 216, 1560, 372, 94, 61),
createThirtyFirstEnemyUnit('northern-eighth-infantry-e', '위군 지연 보병', '지연선 보병', 'yellowTurban', 217, 1580, 376, 106, 53),
createThirtyFirstEnemyUnit('northern-eighth-infantry-f', '사마의 본영 보병', '본영 보병', 'yellowTurban', 217, 1580, 376, 116, 41),
createThirtyFirstEnemyUnit('northern-eighth-infantry-g', '위군 보급 차단병', '수레길 차단 보병', 'yellowTurban', 218, 1600, 380, 100, 82),
createThirtyFirstEnemyUnit('northern-eighth-infantry-h', '장합 별동 보병', '별동대 보병', 'yellowTurban', 218, 1600, 380, 121, 23),
createThirtyFirstEnemyUnit('northern-eighth-archer-a', '기산 서로 궁병', '서쪽 능선 궁병', 'archer', 215, 1130, 310, 62, 69),
createThirtyFirstEnemyUnit('northern-eighth-archer-b', '보급로 궁병', '보급로 궁병', 'archer', 215, 1130, 310, 74, 64),
createThirtyFirstEnemyUnit('northern-eighth-archer-c', '노성 능선 궁병', '중앙 능선 궁병', 'archer', 216, 1142, 312, 89, 57),
createThirtyFirstEnemyUnit('northern-eighth-archer-d', '동쪽 물목 궁병', '동쪽 물목 궁병', 'archer', 217, 1154, 314, 102, 49),
createThirtyFirstEnemyUnit('northern-eighth-archer-e', '사마의 본영 궁병', '본영 궁병', 'archer', 217, 1154, 314, 114, 37),
createThirtyFirstEnemyUnit('northern-eighth-archer-f', '북쪽 봉화 궁병', '봉화대 궁병', 'archer', 218, 1166, 316, 122, 18),
createThirtyFirstEnemyUnit('northern-eighth-cavalry-a', '장합 추격 기병', '서쪽 추격 기병', 'cavalry', 216, 1600, 388, 53, 72),
createThirtyFirstEnemyUnit('northern-eighth-cavalry-b', '장합 추격 기병', '보급로 추격 기병', 'cavalry', 216, 1600, 388, 66, 69),
createThirtyFirstEnemyUnit('northern-eighth-cavalry-c', '장합 추격 기병', '중앙 추격 기병', 'cavalry', 217, 1622, 392, 82, 62),
createThirtyFirstEnemyUnit('northern-eighth-cavalry-d', '곽회 차단 기병', '동쪽 차단 기병', 'cavalry', 218, 1644, 396, 96, 55),
createThirtyFirstEnemyUnit('northern-eighth-cavalry-e', '사마의 예비 기병', '본영 예비 기병', 'cavalry', 218, 1644, 396, 110, 47),
createThirtyFirstEnemyUnit('northern-eighth-cavalry-f', '북쪽 봉화 기병', '봉화 차단 기병', 'cavalry', 219, 1666, 400, 121, 28),
createThirtyFirstEnemyUnit('northern-eighth-ridge-guard-a', '기산 서로 수비대', '서쪽 고개 수비', 'yellowTurban', 216, 1560, 374, 48, 58),
createThirtyFirstEnemyUnit('northern-eighth-ridge-guard-b', '보급로 수비대', '보급로 수비', 'yellowTurban', 216, 1560, 374, 64, 53),
createThirtyFirstEnemyUnit('northern-eighth-ridge-guard-c', '노성 앞 수비대', '중앙 고개 수비', 'yellowTurban', 217, 1580, 378, 80, 45),
createThirtyFirstEnemyUnit('northern-eighth-ridge-guard-d', '동쪽 물목 수비대', '동쪽 물목 수비', 'yellowTurban', 217, 1580, 378, 96, 38),
createThirtyFirstEnemyUnit('northern-eighth-ridge-guard-e', '사마의 본영 수비대', '본영 수비', 'yellowTurban', 218, 1600, 382, 110, 30),
createThirtyFirstEnemyUnit('northern-eighth-ridge-guard-f', '북쪽 봉화 수비대', '북쪽 봉화 수비', 'yellowTurban', 218, 1600, 382, 122, 14),
createThirtyFirstEnemyUnit('northern-eighth-strategist-a', '위군 지연 군리', '지연 장부 군리', 'strategist', 216, 1200, 328, 78, 60),
createThirtyFirstEnemyUnit('northern-eighth-strategist-b', '위군 보급 군리', '보급 차단 군리', 'strategist', 217, 1212, 330, 92, 51),
createThirtyFirstEnemyUnit('northern-eighth-strategist-c', '사마의 본영 군리', '본영 장부 군리', 'strategist', 217, 1212, 330, 106, 42),
createThirtyFirstEnemyUnit('northern-eighth-strategist-d', '곽회 차단 군리', '차단로 장부 군리', 'strategist', 218, 1224, 332, 112, 70),
createThirtyFirstEnemyUnit('northern-eighth-officer-lucheng', '노성 전초장', '노성 압박 장수', 'rebelLeader', 220, 1660, 398, 90, 76),
createThirtyFirstEnemyUnit('northern-eighth-officer-supply', '보급 차단장', '기산 보급 차단 장수', 'rebelLeader', 220, 1660, 398, 103, 64),
createThirtyFirstEnemyUnit('northern-eighth-officer-guo-huai', '곽회', '측면 차단 장수', 'rebelLeader', 219, 1640, 394, 112, 74),
createThirtyFirstEnemyUnit('northern-eighth-officer-relay', '봉화 연락장', '노성 봉화 장수', 'rebelLeader', 219, 1640, 394, 108, 58),
createThirtyFirstEnemyUnit('northern-eighth-officer-zhang-he', '장합', '추격 별동대장', 'rebelLeader', 221, 1700, 404, 118, 27),
createThirtyFirstEnemyUnit('northern-eighth-leader-sima-yi', '사마의', '위군 지연 총지휘', 'rebelLeader', 222, 1740, 410, 116, 40)
];
const sixtyThirdBattleAllyPositions: Record<string, { x: number; y: number }> = {
'guan-yu': { x: 16, y: 96 },
'zhang-fei': { x: 24, y: 99 },
'jian-yong': { x: 8, y: 104 },
'mi-zhu': { x: 13, y: 105 },
'sun-qian': { x: 19, y: 105 },
'zhao-yun': { x: 31, y: 94 },
'zhuge-liang': { x: 18, y: 91 },
'ma-liang': { x: 25, y: 88 },
'yi-ji': { x: 8, y: 106 },
'gong-zhi': { x: 29, y: 103 },
'huang-zhong': { x: 39, y: 92 },
'wei-yan': { x: 45, y: 93 },
'pang-tong': { x: 15, y: 87 },
'fa-zheng': { x: 29, y: 86 },
'wu-yi': { x: 48, y: 101 },
'yan-yan': { x: 52, y: 94 },
'li-yan': { x: 34, y: 85 },
'huang-quan': { x: 12, y: 90 },
'ma-chao': { x: 55, y: 90 },
'ma-dai': { x: 60, y: 97 },
'wang-ping': { x: 41, y: 85 },
'jiang-wei': { x: 35, y: 88 }
};
const sixtyThirdEnemySpecs: ReadonlyArray<
readonly [string, string, string, UnitClassKey, number, number, number, number, number]
> = [
['northern-ninth-scout-a', '노성 추격 척후병', '서쪽 추격 정찰', 'bandit', 223, 1090, 300, 48, 88],
['northern-ninth-scout-b', '회수선 척후병', '회수선 정찰', 'bandit', 223, 1090, 300, 61, 84],
['northern-ninth-scout-c', '낮은 길 척후병', '중앙 고개 정찰', 'bandit', 224, 1102, 302, 74, 78],
['northern-ninth-scout-d', '동쪽 봉화 척후병', '동쪽 봉화 정찰', 'bandit', 224, 1102, 302, 88, 70],
['northern-ninth-scout-e', '곽회 전초 척후병', '차단로 정찰', 'bandit', 225, 1114, 304, 103, 58],
['northern-ninth-scout-f', '노성 뒤 척후병', '북쪽 절벽 정찰', 'bandit', 225, 1114, 304, 122, 36],
['northern-ninth-infantry-a', '위군 추격 보병', '서쪽 추격 보병', 'yellowTurban', 224, 1620, 386, 55, 83],
['northern-ninth-infantry-b', '위군 회수선 보병', '회수선 보병', 'yellowTurban', 224, 1620, 386, 68, 80],
['northern-ninth-infantry-c', '위군 낮은 길 보병', '중앙 고개 보병', 'yellowTurban', 225, 1640, 390, 82, 73],
['northern-ninth-infantry-d', '위군 봉화 보병', '봉화대 보병', 'yellowTurban', 225, 1640, 390, 96, 66],
['northern-ninth-infantry-e', '곽회 차단 보병', '차단로 보병', 'yellowTurban', 226, 1660, 394, 108, 53],
['northern-ninth-infantry-f', '노성 본영 보병', '본영 보병', 'yellowTurban', 226, 1660, 394, 118, 43],
['northern-ninth-infantry-g', '수레길 차단병', '수레길 차단 보병', 'yellowTurban', 227, 1680, 398, 92, 88],
['northern-ninth-infantry-h', '북쪽 문 보병', '북문 보병', 'yellowTurban', 227, 1680, 398, 124, 25],
['northern-ninth-archer-a', '회수선 궁병', '서쪽 능선 궁병', 'archer', 224, 1180, 322, 64, 75],
['northern-ninth-archer-b', '낮은 길 궁병', '중앙 능선 궁병', 'archer', 224, 1180, 322, 77, 69],
['northern-ninth-archer-c', '봉화대 궁병', '봉화 능선 궁병', 'archer', 225, 1192, 324, 91, 60],
['northern-ninth-archer-d', '차단로 궁병', '차단로 궁병', 'archer', 226, 1204, 326, 104, 49],
['northern-ninth-archer-e', '본영 궁병', '노성 본영 궁병', 'archer', 226, 1204, 326, 116, 33],
['northern-ninth-archer-f', '북쪽 절벽 궁병', '절벽 궁병', 'archer', 227, 1216, 328, 124, 17],
['northern-ninth-cavalry-a', '장합 추격 기병', '서쪽 추격 기병', 'cavalry', 225, 1700, 410, 50, 76],
['northern-ninth-cavalry-b', '장합 추격 기병', '회수선 추격 기병', 'cavalry', 225, 1700, 410, 63, 73],
['northern-ninth-cavalry-c', '장합 추격 기병', '중앙 추격 기병', 'cavalry', 226, 1722, 414, 79, 65],
['northern-ninth-cavalry-d', '곽회 차단 기병', '동쪽 차단 기병', 'cavalry', 227, 1744, 418, 96, 57],
['northern-ninth-cavalry-e', '사마의 예비 기병', '본영 예비 기병', 'cavalry', 227, 1744, 418, 111, 43],
['northern-ninth-cavalry-f', '북쪽 절벽 기병', '절벽 차단 기병', 'cavalry', 228, 1766, 422, 122, 28],
['northern-ninth-ridge-guard-a', '노성 서로 수비대', '서쪽 고개 수비', 'yellowTurban', 225, 1640, 392, 42, 62],
['northern-ninth-ridge-guard-b', '회수 표식 수비대', '표식 수비', 'yellowTurban', 225, 1640, 392, 59, 58],
['northern-ninth-ridge-guard-c', '낮은 길 수비대', '중앙 고개 수비', 'yellowTurban', 226, 1660, 396, 76, 51],
['northern-ninth-ridge-guard-d', '봉화 길 수비대', '봉화 길 수비', 'yellowTurban', 226, 1660, 396, 94, 42],
['northern-ninth-ridge-guard-e', '사마의 본영 수비대', '본영 수비', 'yellowTurban', 227, 1680, 400, 110, 34],
['northern-ninth-ridge-guard-f', '북쪽 절벽 수비대', '북쪽 절벽 수비', 'yellowTurban', 227, 1680, 400, 124, 22],
['northern-ninth-strategist-a', '위군 추격 군리', '추격 장부 군리', 'strategist', 225, 1260, 342, 80, 58],
['northern-ninth-strategist-b', '위군 보급 군리', '수레 차단 군리', 'strategist', 226, 1272, 344, 96, 46],
['northern-ninth-strategist-c', '사마의 본영 군리', '본영 장부 군리', 'strategist', 226, 1272, 344, 112, 36],
['northern-ninth-strategist-d', '곽회 봉화 군리', '봉화 장부 군리', 'strategist', 227, 1284, 346, 119, 66],
['northern-ninth-officer-lucheng', '노성 추격장', '노성 추격 장수', 'rebelLeader', 229, 1760, 424, 84, 80],
['northern-ninth-officer-supply', '수레 차단장', '수레 차단 장수', 'rebelLeader', 229, 1760, 424, 104, 72],
['northern-ninth-officer-guo-huai', '곽회', '봉화 차단 장수', 'rebelLeader', 228, 1740, 420, 114, 70],
['northern-ninth-officer-relay', '봉화 연락장', '노성 뒤 봉화 장수', 'rebelLeader', 228, 1740, 420, 118, 52],
['northern-ninth-officer-zhang-he', '장합', '회수선 추격대장', 'rebelLeader', 230, 1800, 430, 120, 31],
['northern-ninth-leader-sima-yi', '사마의', '노성 방어 총지휘', 'rebelLeader', 231, 1840, 436, 116, 43]
];
export const sixtyThirdBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally' && unit.id !== 'liu-bei'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits,
...jiangWeiRecruitUnits
].map((unit) => placeScenarioUnit(unit, sixtyThirdBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
...sixtyThirdEnemySpecs.map((spec) => createThirtyFirstEnemyUnit(...spec))
];
const sixtyFourthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'guan-yu': { x: 17, y: 98 },
'zhang-fei': { x: 25, y: 101 },
'jian-yong': { x: 8, y: 106 },
'mi-zhu': { x: 14, y: 107 },
'sun-qian': { x: 20, y: 107 },
'zhao-yun': { x: 32, y: 96 },
'zhuge-liang': { x: 19, y: 93 },
'ma-liang': { x: 26, y: 90 },
'yi-ji': { x: 8, y: 108 },
'gong-zhi': { x: 30, y: 105 },
'huang-zhong': { x: 40, y: 94 },
'wei-yan': { x: 46, y: 95 },
'pang-tong': { x: 16, y: 89 },
'fa-zheng': { x: 30, y: 88 },
'wu-yi': { x: 49, y: 103 },
'yan-yan': { x: 53, y: 96 },
'li-yan': { x: 35, y: 87 },
'huang-quan': { x: 13, y: 92 },
'ma-chao': { x: 56, y: 92 },
'ma-dai': { x: 61, y: 99 },
'wang-ping': { x: 42, y: 87 },
'jiang-wei': { x: 36, y: 90 }
};
const sixtyFourthEnemySpecs: ReadonlyArray<
readonly [string, string, string, UnitClassKey, number, number, number, number, number]
> = [
['northern-tenth-scout-a', '위수 서안 척후병', '서쪽 강안 정찰', 'bandit', 232, 1120, 306, 50, 90],
['northern-tenth-scout-b', '수레길 척후병', '수레길 정찰', 'bandit', 232, 1120, 306, 63, 86],
['northern-tenth-scout-c', '물목 척후병', '중앙 물목 정찰', 'bandit', 233, 1132, 308, 77, 80],
['northern-tenth-scout-d', '봉화 척후병', '동쪽 봉화 정찰', 'bandit', 233, 1132, 308, 91, 72],
['northern-tenth-scout-e', '곽회 전초 척후병', '차단로 정찰', 'bandit', 234, 1144, 310, 106, 60],
['northern-tenth-scout-f', '위수 뒤 척후병', '북쪽 진영 정찰', 'bandit', 234, 1144, 310, 124, 38],
['northern-tenth-infantry-a', '위군 강안 보병', '서쪽 강안 보병', 'yellowTurban', 233, 1700, 404, 57, 85],
['northern-tenth-infantry-b', '위군 수레길 보병', '수레길 보병', 'yellowTurban', 233, 1700, 404, 70, 82],
['northern-tenth-infantry-c', '위군 물목 보병', '중앙 물목 보병', 'yellowTurban', 234, 1720, 408, 84, 75],
['northern-tenth-infantry-d', '위군 봉화 보병', '봉화대 보병', 'yellowTurban', 234, 1720, 408, 98, 68],
['northern-tenth-infantry-e', '곽회 차단 보병', '차단로 보병', 'yellowTurban', 235, 1740, 412, 110, 55],
['northern-tenth-infantry-f', '위수 본영 보병', '본영 보병', 'yellowTurban', 235, 1740, 412, 121, 45],
['northern-tenth-infantry-g', '강가 수레 차단병', '수레 차단 보병', 'yellowTurban', 236, 1760, 416, 94, 91],
['northern-tenth-infantry-h', '북쪽 진문 보병', '진문 보병', 'yellowTurban', 236, 1760, 416, 126, 27],
['northern-tenth-archer-a', '위수 서안 궁병', '서쪽 능선 궁병', 'archer', 233, 1230, 334, 66, 77],
['northern-tenth-archer-b', '수레길 궁병', '수레길 궁병', 'archer', 233, 1230, 334, 79, 71],
['northern-tenth-archer-c', '물목 궁병', '중앙 물목 궁병', 'archer', 234, 1242, 336, 93, 63],
['northern-tenth-archer-d', '봉화대 궁병', '봉화 궁병', 'archer', 235, 1254, 338, 106, 52],
['northern-tenth-archer-e', '본영 궁병', '위수 본영 궁병', 'archer', 235, 1254, 338, 118, 35],
['northern-tenth-archer-f', '북쪽 절벽 궁병', '절벽 궁병', 'archer', 236, 1266, 340, 126, 19],
['northern-tenth-cavalry-a', '장합 물목 기병', '서쪽 물목 기병', 'cavalry', 234, 1780, 428, 52, 78],
['northern-tenth-cavalry-b', '장합 물목 기병', '수레길 추격 기병', 'cavalry', 234, 1780, 428, 65, 75],
['northern-tenth-cavalry-c', '장합 물목 기병', '중앙 추격 기병', 'cavalry', 235, 1802, 432, 82, 67],
['northern-tenth-cavalry-d', '곽회 차단 기병', '동쪽 차단 기병', 'cavalry', 236, 1824, 436, 98, 59],
['northern-tenth-cavalry-e', '사마의 예비 기병', '본영 예비 기병', 'cavalry', 236, 1824, 436, 114, 45],
['northern-tenth-cavalry-f', '북쪽 절벽 기병', '절벽 차단 기병', 'cavalry', 237, 1846, 440, 126, 30],
['northern-tenth-camp-guard-a', '위수 서안 수비대', '서쪽 진영 수비', 'yellowTurban', 234, 1720, 410, 44, 64],
['northern-tenth-camp-guard-b', '수레 표식 수비대', '표식 수비', 'yellowTurban', 234, 1720, 410, 61, 60],
['northern-tenth-camp-guard-c', '물목 수비대', '중앙 물목 수비', 'yellowTurban', 235, 1740, 414, 79, 53],
['northern-tenth-camp-guard-d', '봉화 길 수비대', '봉화 길 수비', 'yellowTurban', 235, 1740, 414, 97, 44],
['northern-tenth-camp-guard-e', '사마의 본영 수비대', '본영 수비', 'yellowTurban', 236, 1760, 418, 113, 36],
['northern-tenth-camp-guard-f', '북쪽 절벽 수비대', '절벽 수비', 'yellowTurban', 236, 1760, 418, 126, 23],
['northern-tenth-strategist-a', '위군 위수 군리', '강안 장부 군리', 'strategist', 234, 1320, 354, 82, 60],
['northern-tenth-strategist-b', '위군 보급 군리', '수레 차단 군리', 'strategist', 235, 1332, 356, 98, 48],
['northern-tenth-strategist-c', '사마의 본영 군리', '본영 장부 군리', 'strategist', 235, 1332, 356, 114, 38],
['northern-tenth-strategist-d', '곽회 봉화 군리', '봉화 장부 군리', 'strategist', 236, 1344, 358, 121, 68],
['northern-tenth-officer-river', '위수 진영장', '위수 진영 장수', 'rebelLeader', 238, 1840, 440, 88, 82],
['northern-tenth-officer-supply', '강가 수레 차단장', '수레 차단 장수', 'rebelLeader', 238, 1840, 440, 108, 74],
['northern-tenth-officer-guo-huai', '곽회', '봉화 차단 장수', 'rebelLeader', 237, 1820, 436, 118, 72],
['northern-tenth-officer-relay', '봉화 연락장', '위수 뒤 봉화 장수', 'rebelLeader', 237, 1820, 436, 121, 54],
['northern-tenth-officer-zhang-he', '장합', '위수 물목 추격대장', 'rebelLeader', 239, 1880, 446, 124, 33],
['northern-tenth-leader-sima-yi', '사마의', '위수 진영 총지휘', 'rebelLeader', 240, 1920, 452, 120, 45]
];
export const sixtyFourthBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally' && unit.id !== 'liu-bei'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits,
...jiangWeiRecruitUnits
].map((unit) => placeScenarioUnit(unit, sixtyFourthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
...sixtyFourthEnemySpecs.map((spec) => createThirtyFirstEnemyUnit(...spec))
];
const sixtyFifthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'guan-yu': { x: 18, y: 100 },
'zhang-fei': { x: 26, y: 103 },
'jian-yong': { x: 9, y: 108 },
'mi-zhu': { x: 15, y: 109 },
'sun-qian': { x: 21, y: 109 },
'zhao-yun': { x: 33, y: 98 },
'zhuge-liang': { x: 20, y: 95 },
'ma-liang': { x: 27, y: 92 },
'yi-ji': { x: 9, y: 110 },
'gong-zhi': { x: 31, y: 107 },
'huang-zhong': { x: 41, y: 96 },
'wei-yan': { x: 48, y: 96 },
'pang-tong': { x: 17, y: 91 },
'fa-zheng': { x: 31, y: 90 },
'wu-yi': { x: 50, y: 105 },
'yan-yan': { x: 54, y: 98 },
'li-yan': { x: 36, y: 89 },
'huang-quan': { x: 14, y: 94 },
'ma-chao': { x: 57, y: 94 },
'ma-dai': { x: 63, y: 101 },
'wang-ping': { x: 43, y: 89 },
'jiang-wei': { x: 37, y: 92 }
};
const sixtyFifthEnemySpecs: ReadonlyArray<
readonly [string, string, string, UnitClassKey, number, number, number, number, number]
> = [
['northern-eleventh-scout-a', '북안 서쪽 척후병', '서쪽 강북 정찰', 'bandit', 241, 1160, 314, 52, 92],
['northern-eleventh-scout-b', '회수선 척후병', '회수선 정찰', 'bandit', 241, 1160, 314, 66, 88],
['northern-eleventh-scout-c', '북안 물목 척후병', '중앙 물목 정찰', 'bandit', 242, 1172, 316, 80, 82],
['northern-eleventh-scout-d', '봉화 척후병', '동쪽 봉화 정찰', 'bandit', 242, 1172, 316, 94, 74],
['northern-eleventh-scout-e', '곽회 전초 척후병', '차단로 정찰', 'bandit', 243, 1184, 318, 110, 62],
['northern-eleventh-scout-f', '북안 뒤 척후병', '북쪽 진문 정찰', 'bandit', 243, 1184, 318, 128, 40],
['northern-eleventh-infantry-a', '위군 북안 보병', '서쪽 강북 보병', 'yellowTurban', 242, 1780, 420, 59, 87],
['northern-eleventh-infantry-b', '위군 회수선 보병', '회수선 보병', 'yellowTurban', 242, 1780, 420, 72, 84],
['northern-eleventh-infantry-c', '위군 물목 보병', '중앙 물목 보병', 'yellowTurban', 243, 1800, 424, 86, 77],
['northern-eleventh-infantry-d', '위군 봉화 보병', '봉화대 보병', 'yellowTurban', 243, 1800, 424, 101, 70],
['northern-eleventh-infantry-e', '곽회 차단 보병', '차단로 보병', 'yellowTurban', 244, 1820, 428, 114, 57],
['northern-eleventh-infantry-f', '사마의 북안 보병', '북안 본영 보병', 'yellowTurban', 244, 1820, 428, 125, 47],
['northern-eleventh-infantry-g', '수레 차단병', '강북 수레 차단 보병', 'yellowTurban', 245, 1840, 432, 97, 93],
['northern-eleventh-infantry-h', '북쪽 진문 보병', '진문 보병', 'yellowTurban', 245, 1840, 432, 128, 29],
['northern-eleventh-archer-a', '북안 서쪽 궁병', '서쪽 능선 궁병', 'archer', 242, 1290, 346, 68, 79],
['northern-eleventh-archer-b', '회수선 궁병', '회수선 궁병', 'archer', 242, 1290, 346, 82, 73],
['northern-eleventh-archer-c', '물목 궁병', '중앙 물목 궁병', 'archer', 243, 1302, 348, 96, 65],
['northern-eleventh-archer-d', '봉화대 궁병', '봉화 궁병', 'archer', 244, 1314, 350, 110, 54],
['northern-eleventh-archer-e', '북안 본영 궁병', '본영 궁병', 'archer', 244, 1314, 350, 122, 37],
['northern-eleventh-archer-f', '북쪽 절벽 궁병', '절벽 궁병', 'archer', 245, 1326, 352, 128, 21],
['northern-eleventh-cavalry-a', '장합 재추격 기병', '서쪽 재추격 기병', 'cavalry', 243, 1860, 444, 54, 80],
['northern-eleventh-cavalry-b', '장합 재추격 기병', '회수선 재추격 기병', 'cavalry', 243, 1860, 444, 68, 77],
['northern-eleventh-cavalry-c', '장합 재추격 기병', '중앙 재추격 기병', 'cavalry', 244, 1882, 448, 84, 69],
['northern-eleventh-cavalry-d', '곽회 차단 기병', '동쪽 차단 기병', 'cavalry', 245, 1904, 452, 101, 61],
['northern-eleventh-cavalry-e', '사마의 예비 기병', '본영 예비 기병', 'cavalry', 245, 1904, 452, 117, 47],
['northern-eleventh-cavalry-f', '북쪽 절벽 기병', '절벽 차단 기병', 'cavalry', 246, 1926, 456, 128, 32],
['northern-eleventh-camp-guard-a', '북안 서쪽 수비대', '서쪽 전진 진영 수비', 'yellowTurban', 243, 1800, 426, 46, 66],
['northern-eleventh-camp-guard-b', '회수 표식 수비대', '표식 수비', 'yellowTurban', 243, 1800, 426, 64, 62],
['northern-eleventh-camp-guard-c', '물목 수비대', '중앙 물목 수비', 'yellowTurban', 244, 1820, 430, 82, 55],
['northern-eleventh-camp-guard-d', '봉화 길 수비대', '봉화 길 수비', 'yellowTurban', 244, 1820, 430, 100, 46],
['northern-eleventh-camp-guard-e', '사마의 북안 수비대', '본영 수비', 'yellowTurban', 245, 1840, 434, 116, 38],
['northern-eleventh-camp-guard-f', '북쪽 절벽 수비대', '절벽 수비', 'yellowTurban', 245, 1840, 434, 128, 25],
['northern-eleventh-strategist-a', '위군 북안 군리', '강북 장부 군리', 'strategist', 243, 1380, 366, 84, 62],
['northern-eleventh-strategist-b', '위군 보급 군리', '수레 차단 군리', 'strategist', 244, 1392, 368, 100, 50],
['northern-eleventh-strategist-c', '사마의 지연 군리', '지연선 장부 군리', 'strategist', 244, 1392, 368, 116, 40],
['northern-eleventh-strategist-d', '곽회 봉화 군리', '봉화 장부 군리', 'strategist', 245, 1404, 370, 124, 70],
['northern-eleventh-officer-northbank', '북안 전진장', '북안 전진 진영 장수', 'rebelLeader', 247, 1920, 456, 90, 84],
['northern-eleventh-officer-supply', '강북 수레 차단장', '수레 차단 장수', 'rebelLeader', 247, 1920, 456, 111, 76],
['northern-eleventh-officer-guo-huai', '곽회', '북안 봉화 장수', 'rebelLeader', 246, 1900, 452, 121, 74],
['northern-eleventh-officer-relay', '봉화 연락장', '북안 뒤 봉화 장수', 'rebelLeader', 246, 1900, 452, 125, 56],
['northern-eleventh-officer-zhang-he', '장합', '재추격 대장', 'rebelLeader', 248, 1960, 462, 112, 52],
['northern-eleventh-leader-sima-yi', '사마의', '북안 지연 총지휘', 'rebelLeader', 249, 2000, 468, 122, 47]
];
export const sixtyFifthBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally' && unit.id !== 'liu-bei'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits,
...jiangWeiRecruitUnits
].map((unit) => placeScenarioUnit(unit, sixtyFifthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
...sixtyFifthEnemySpecs.map((spec) => createThirtyFirstEnemyUnit(...spec))
];
const sixtySixthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'guan-yu': { x: 15, y: 104 },
'zhang-fei': { x: 24, y: 106 },
'jian-yong': { x: 8, y: 110 },
'mi-zhu': { x: 14, y: 111 },
'sun-qian': { x: 20, y: 111 },
'zhao-yun': { x: 31, y: 100 },
'zhuge-liang': { x: 20, y: 98 },
'ma-liang': { x: 27, y: 95 },
'yi-ji': { x: 9, y: 112 },
'gong-zhi': { x: 31, y: 109 },
'huang-zhong': { x: 39, y: 98 },
'wei-yan': { x: 47, y: 96 },
'pang-tong': { x: 17, y: 94 },
'fa-zheng': { x: 30, y: 92 },
'wu-yi': { x: 50, y: 107 },
'yan-yan': { x: 54, y: 100 },
'li-yan': { x: 36, y: 92 },
'huang-quan': { x: 14, y: 97 },
'ma-chao': { x: 57, y: 96 },
'ma-dai': { x: 63, y: 103 },
'wang-ping': { x: 43, y: 92 },
'jiang-wei': { x: 37, y: 95 }
};
const sixtySixthEnemySpecs: ReadonlyArray<
readonly [string, string, string, UnitClassKey, number, number, number, number, number]
> = [
['northern-twelfth-scout-a', '오장원 서측 척후병', '서측 언덕 정찰', 'bandit', 247, 1200, 320, 54, 91],
['northern-twelfth-scout-b', '오장원 중앙 척후병', '중앙 진입 정찰', 'bandit', 247, 1200, 320, 68, 86],
['northern-twelfth-scout-c', '오장원 동측 척후병', '동측 봉화 정찰', 'bandit', 248, 1212, 322, 84, 78],
['northern-twelfth-scout-d', '위수 북로 척후병', '북로 차단 정찰', 'bandit', 248, 1212, 322, 100, 66],
['northern-twelfth-scout-e', '사마의 전초 척후병', '본영 전초 정찰', 'bandit', 249, 1224, 324, 116, 51],
['northern-twelfth-scout-f', '장합 추격 척후병', '추격로 정찰', 'bandit', 249, 1224, 324, 126, 36],
['northern-twelfth-infantry-a', '위군 서측 보병', '서측 압박 보병', 'yellowTurban', 248, 1840, 434, 58, 88],
['northern-twelfth-infantry-b', '위군 중앙 보병', '중앙 진입 보병', 'yellowTurban', 248, 1840, 434, 72, 82],
['northern-twelfth-infantry-c', '위군 둔전 보병', '둔전 차단 보병', 'yellowTurban', 249, 1860, 438, 88, 74],
['northern-twelfth-infantry-d', '위군 봉화 보병', '봉화대 보병', 'yellowTurban', 249, 1860, 438, 104, 61],
['northern-twelfth-infantry-e', '위군 본영 보병', '본영 전면 보병', 'yellowTurban', 250, 1880, 442, 118, 47],
['northern-twelfth-infantry-f', '위군 북안 보병', '북안 압박 보병', 'yellowTurban', 250, 1880, 442, 126, 30],
['northern-twelfth-infantry-g', '위군 회랑 보병', '퇴로 회랑 보병', 'yellowTurban', 251, 1900, 446, 96, 92],
['northern-twelfth-infantry-h', '위군 산문 보병', '산문 봉쇄 보병', 'yellowTurban', 251, 1900, 446, 128, 20],
['northern-twelfth-archer-a', '오장원 서측 궁병', '서측 능선 궁병', 'archer', 248, 1340, 356, 66, 81],
['northern-twelfth-archer-b', '오장원 중앙 궁병', '중앙 사격 궁병', 'archer', 248, 1340, 356, 82, 74],
['northern-twelfth-archer-c', '둔전 차단 궁병', '둔전 사격 궁병', 'archer', 249, 1352, 358, 98, 64],
['northern-twelfth-archer-d', '봉화대 궁병', '봉화 엄호 궁병', 'archer', 250, 1364, 360, 112, 52],
['northern-twelfth-archer-e', '본영 압박 궁병', '본영 사격 궁병', 'archer', 250, 1364, 360, 124, 38],
['northern-twelfth-archer-f', '북안 잔류 궁병', '북안 차단 궁병', 'archer', 251, 1376, 362, 130, 22],
['northern-twelfth-cavalry-a', '장합 추격 기병', '서측 추격 기병', 'cavalry', 249, 1940, 460, 54, 78],
['northern-twelfth-cavalry-b', '장합 추격 기병', '중앙 추격 기병', 'cavalry', 249, 1940, 460, 70, 73],
['northern-twelfth-cavalry-c', '위군 돌파 기병', '둔전 돌파 기병', 'cavalry', 250, 1962, 464, 86, 67],
['northern-twelfth-cavalry-d', '곽회 차단 기병', '봉화 차단 기병', 'cavalry', 251, 1984, 468, 104, 56],
['northern-twelfth-cavalry-e', '사마의 예비 기병', '본영 예비 기병', 'cavalry', 251, 1984, 468, 120, 44],
['northern-twelfth-cavalry-f', '북안 기습 기병', '북안 차단 기병', 'cavalry', 252, 2006, 472, 130, 30],
['northern-twelfth-camp-guard-a', '오장원 서측 수비대', '서측 진문 수비', 'yellowTurban', 249, 1860, 438, 46, 69],
['northern-twelfth-camp-guard-b', '오장원 둔전 수비대', '둔전 수비', 'yellowTurban', 249, 1860, 438, 64, 64],
['northern-twelfth-camp-guard-c', '중앙 장부 수비대', '중앙 장부 수비', 'yellowTurban', 250, 1880, 442, 84, 56],
['northern-twelfth-camp-guard-d', '봉화 길 수비대', '봉화 길 수비', 'yellowTurban', 250, 1880, 442, 102, 46],
['northern-twelfth-camp-guard-e', '사마의 본영 수비대', '본영 수비', 'yellowTurban', 251, 1900, 446, 118, 35],
['northern-twelfth-camp-guard-f', '북안 후위 수비대', '후위 수비', 'yellowTurban', 251, 1900, 446, 130, 19],
['northern-twelfth-strategist-a', '위군 장부 관리', '둔전 장부 관리', 'strategist', 249, 1420, 374, 84, 62],
['northern-twelfth-strategist-b', '위군 보급 관리', '퇴로 차단 관리', 'strategist', 250, 1432, 376, 100, 50],
['northern-twelfth-strategist-c', '사마의 지시 관리', '본영 명령 관리', 'strategist', 250, 1432, 376, 116, 40],
['northern-twelfth-strategist-d', '곽회 봉화 관리', '봉화 지휘 관리', 'strategist', 251, 1444, 378, 126, 64],
['northern-twelfth-officer-wuzhang', '오장원 전진장', '전진 진영 무장', 'rebelLeader', 252, 2000, 472, 90, 84],
['northern-twelfth-officer-ledger', '장부 차단장', '장부 차단 무장', 'rebelLeader', 252, 2000, 472, 111, 74],
['northern-twelfth-officer-guo-huai', '곽회', '봉화 차단 무장', 'rebelLeader', 252, 1980, 468, 122, 70],
['northern-twelfth-officer-zhang-he', '장합', '추격 총대장', 'rebelLeader', 253, 2040, 478, 108, 58],
['northern-twelfth-leader-sima-yi', '사마의', '오장원 총지휘관', 'rebelLeader', 254, 2100, 486, 124, 52]
];
const sixtySixthBattleUnitsBase: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally' && unit.id !== 'liu-bei'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits,
...jiangWeiRecruitUnits
].map((unit) => placeScenarioUnit(unit, sixtySixthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
...sixtySixthEnemySpecs.map((spec) => createThirtyFirstEnemyUnit(...spec))
];
export const sixtySixthBattleUnits: UnitData[] = tuneEnemyUnitGroup(sixtySixthBattleUnitsBase, ['northern-twelfth-'], {
hpScale: 0.45,
attackScale: 0.52,
overrides: {
'northern-twelfth-infantry-d': { hp: 420, attack: 142, x: 104, y: 60 },
'northern-twelfth-infantry-e': { hp: 620, attack: 176, x: 108, y: 50 },
'northern-twelfth-infantry-f': { hp: 620, attack: 176, x: 112, y: 42 },
'northern-twelfth-camp-guard-e': { hp: 560, attack: 140, x: 106, y: 54 },
'northern-twelfth-camp-guard-f': { hp: 560, attack: 140, x: 112, y: 46 },
'northern-twelfth-strategist-c': { hp: 380, attack: 132, x: 108, y: 44 },
'northern-twelfth-strategist-d': { hp: 380, attack: 132, x: 112, y: 62 },
'northern-twelfth-officer-ledger': { hp: 700, attack: 150, x: 100, y: 70 },
'northern-twelfth-officer-guo-huai': { hp: 760, attack: 152, x: 106, y: 68 },
'northern-twelfth-officer-zhang-he': { hp: 760, attack: 154, x: 92, y: 72 },
'northern-twelfth-leader-sima-yi': { hp: 900, attack: 156, x: 106, y: 58 }
}
}).map((unit) =>
unit.faction === 'ally'
? {
...unit,
hp: Math.max(unit.hp, 2600),
maxHp: Math.max(unit.maxHp, 2600),
attack: Math.max(unit.attack, 420)
}
: unit
);
export const firstBattleBonds: BattleBond[] = [
{
id: 'liu-bei__guan-yu',
unitIds: ['liu-bei', 'guan-yu'],
title: '도원결의',
level: 72,
exp: 20,
description: '같은 적을 노릴 때 공격 피해 보너스와 연계 공격 확률이 오른다.'
},
{
id: 'liu-bei__zhang-fei',
unitIds: ['liu-bei', 'zhang-fei'],
title: '의형제',
level: 68,
exp: 12,
description: '공격 목표가 겹치면 공명 경험치가 빠르게 쌓인다.'
},
{
id: 'guan-yu__zhang-fei',
unitIds: ['guan-yu', 'zhang-fei'],
title: '맹장 공명',
level: 64,
exp: 8,
description: '둘이 같은 전선을 압박하면 연계 공격의 기초 확률이 오른다.'
}
];
export const xuzhouRecruitBonds: BattleBond[] = [
{
id: 'liu-bei__jian-yong',
unitIds: ['liu-bei', 'jian-yong'],
title: '오랜 벗',
level: 48,
exp: 0,
description: '간옹은 유비가 흔들릴 때 현실적인 말로 길을 정리해 주는 오랜 벗이다.'
},
{
id: 'liu-bei__mi-zhu',
unitIds: ['liu-bei', 'mi-zhu'],
title: '서주 후원',
level: 42,
exp: 0,
description: '미축은 서주의 민심과 군량을 묶어 유비군이 오래 버틸 수 있게 돕는다.'
}
];
export const caoBreakRecruitBonds: BattleBond[] = [
{
id: 'liu-bei__sun-qian',
unitIds: ['liu-bei', 'sun-qian'],
title: '문서와 명분',
level: 40,
exp: 0,
description: '손건은 조조의 감시망 속에서 유비군이 움직일 명분과 길을 정리해 주는 책사입니다.'
},
{
id: 'jian-yong__sun-qian',
unitIds: ['jian-yong', 'sun-qian'],
title: '말과 글',
level: 34,
exp: 0,
description: '간옹의 말과 손건의 문서는 유비군이 난세의 틈을 지나갈 때 서로를 보완합니다.'
}
];
export const liuBiaoRecruitBonds: BattleBond[] = [
{
id: 'liu-bei__zhao-yun',
unitIds: ['liu-bei', 'zhao-yun'],
title: '백마의 의리',
level: 52,
exp: 0,
description: '조운은 난세 속에서도 유비의 백성을 향한 뜻을 믿고 다시 창을 맡깁니다.'
},
{
id: 'guan-yu__zhao-yun',
unitIds: ['guan-yu', 'zhao-yun'],
title: '충의의 칼끝',
level: 38,
exp: 0,
description: '관우와 조운은 서로의 충의를 알아보고 같은 전선에서 흔들림 없는 압박을 만듭니다.'
}
];
export const zhugeRecruitBonds: BattleBond[] = [
{
id: 'liu-bei__zhuge-liang',
unitIds: ['liu-bei', 'zhuge-liang'],
title: '군신의 만남',
level: 58,
exp: 0,
description: '유비의 뜻과 제갈량의 계책이 만나 천하를 향한 큰 그림을 열기 시작합니다.'
},
{
id: 'zhao-yun__zhuge-liang',
unitIds: ['zhao-yun', 'zhuge-liang'],
title: '창과 책략',
level: 36,
exp: 0,
description: '조운의 기동력과 제갈량의 판단은 빠른 구원과 정확한 돌파를 함께 만듭니다.'
},
{
id: 'guan-yu__zhuge-liang',
unitIds: ['guan-yu', 'zhuge-liang'],
title: '의와 계책',
level: 34,
exp: 0,
description: '관우의 의로운 전열과 제갈량의 큰 계책이 서로를 인정하며 군의 중심을 단단히 세웁니다.'
},
{
id: 'zhang-fei__zhuge-liang',
unitIds: ['zhang-fei', 'zhuge-liang'],
title: '호령과 계책',
level: 30,
exp: 0,
description: '장비의 거친 돌파와 제갈량의 매복 판단이 맞물리면 적의 전열을 크게 흔듭니다.'
},
{
id: 'sun-qian__zhuge-liang',
unitIds: ['sun-qian', 'zhuge-liang'],
title: '문서와 대계',
level: 32,
exp: 0,
description: '손건의 외교 문서와 제갈량의 형세 판단은 강동과의 접점을 여는 힘이 됩니다.'
}
];
export const jingzhouRecruitBonds: BattleBond[] = [
{
id: 'liu-bei__ma-liang',
unitIds: ['liu-bei', 'ma-liang'],
title: '백미의 조언',
level: 36,
exp: 0,
description: '유비의 인의와 마량의 형주 식견이 만나 남부 군현의 민심을 차분히 묶어 냅니다.'
},
{
id: 'zhuge-liang__ma-liang',
unitIds: ['zhuge-liang', 'ma-liang'],
title: '형주 문맥',
level: 34,
exp: 0,
description: '제갈량의 큰 계책과 마량의 현지 정보가 맞물려 형주 남부의 길과 사람을 읽어냅니다.'
},
{
id: 'sun-qian__ma-liang',
unitIds: ['sun-qian', 'ma-liang'],
title: '군현 문서',
level: 30,
exp: 0,
description: '손건의 외교 문서와 마량의 남부 군현 기록이 합쳐져 설득과 보급의 실마리를 만듭니다.'
}
];
export const guiyangRecruitBonds: BattleBond[] = [
{
id: 'liu-bei__yi-ji',
unitIds: ['liu-bei', 'yi-ji'],
title: '예로 여는 문',
level: 34,
exp: 0,
description: '유비의 인의와 이적의 예법이 맞물려 형주의 닫힌 성문을 말과 글로 열어 갑니다.'
},
{
id: 'ma-liang__yi-ji',
unitIds: ['ma-liang', 'yi-ji'],
title: '백미와 문사',
level: 32,
exp: 0,
description: '마량의 현지 기록과 이적의 의전 감각이 더해져 남부 군현의 설득력이 깊어집니다.'
},
{
id: 'sun-qian__yi-ji',
unitIds: ['sun-qian', 'yi-ji'],
title: '외교 문안',
level: 30,
exp: 0,
description: '손건의 외교 문서와 이적의 형주 예법이 만나 싸우지 않고 길을 여는 선택지를 늘립니다.'
}
];
export const wulingRecruitBonds: BattleBond[] = [
{
id: 'liu-bei__gong-zhi',
unitIds: ['liu-bei', 'gong-zhi'],
title: '산길의 귀순',
level: 32,
exp: 0,
description: '유비의 군율과 공지의 무릉 지리가 맞물려 산길 마을을 해치지 않는 진군로를 엽니다.'
},
{
id: 'ma-liang__gong-zhi',
unitIds: ['ma-liang', 'gong-zhi'],
title: '무릉 기록',
level: 30,
exp: 0,
description: '마량의 형주 기록과 공지의 현지 경험이 더해져 험한 길의 위험을 미리 읽어냅니다.'
},
{
id: 'yi-ji__gong-zhi',
unitIds: ['yi-ji', 'gong-zhi'],
title: '예와 귀순',
level: 30,
exp: 0,
description: '이적의 예법과 공지의 내부 설득이 이어져 무릉의 닫힌 문을 부드럽게 열어 갑니다.'
}
];
export const changshaRecruitBonds: BattleBond[] = [
{
id: 'liu-bei__huang-zhong',
unitIds: ['liu-bei', 'huang-zhong'],
title: '노장을 예우하다',
level: 38,
exp: 0,
description: '유비의 예우와 황충의 노련한 활이 만나, 오래 버틴 장수의 마음을 군의 힘으로 바꿉니다.'
},
{
id: 'guan-yu__huang-zhong',
unitIds: ['guan-yu', 'huang-zhong'],
title: '무인의 존중',
level: 34,
exp: 0,
description: '관우와 황충은 서로의 무예와 체면을 인정하며 전열과 원거리 압박을 함께 세웁니다.'
},
{
id: 'liu-bei__wei-yan',
unitIds: ['liu-bei', 'wei-yan'],
title: '닫힌 문을 여는 창',
level: 32,
exp: 0,
description: '유비의 큰 뜻과 위연의 거친 돌파가 만나, 막힌 성문과 전열을 과감히 흔듭니다.'
},
{
id: 'huang-zhong__wei-yan',
unitIds: ['huang-zhong', 'wei-yan'],
title: '장사의 전환',
level: 30,
exp: 0,
description: '황충의 노련함과 위연의 결단이 장사의 흔들린 군심을 새 방향으로 묶어 냅니다.'
}
];
export const yizhouRecruitBonds: BattleBond[] = [
{
id: 'liu-bei__pang-tong',
unitIds: ['liu-bei', 'pang-tong'],
title: '봉추가 보는 인의',
level: 36,
exp: 0,
description: '유비의 인의와 방통의 날카로운 지략이 만나, 익주의 산문을 명분과 속도로 함께 열어 갑니다.'
},
{
id: 'zhuge-liang__pang-tong',
unitIds: ['zhuge-liang', 'pang-tong'],
title: '와룡과 봉추',
level: 34,
exp: 0,
description: '제갈량의 큰 판과 방통의 과감한 계책이 맞물려, 어려운 지형에서도 새로운 돌파구를 찾아냅니다.'
},
{
id: 'huang-zhong__pang-tong',
unitIds: ['huang-zhong', 'pang-tong'],
title: '노궁과 기책',
level: 30,
exp: 0,
description: '황충의 침착한 활과 방통의 기책이 이어져, 멀리 버틴 적의 전열을 흔드는 선택지가 늘어납니다.'
}
];
export const fuPassRecruitBonds: BattleBond[] = [
{
id: 'liu-bei__fa-zheng',
unitIds: ['liu-bei', 'fa-zheng'],
title: '익주 내부의 길',
level: 34,
exp: 0,
description: '유비의 명분과 법정의 내부 정보가 만나, 익주의 닫힌 마음과 관문을 함께 열어 갑니다.'
},
{
id: 'pang-tong__fa-zheng',
unitIds: ['pang-tong', 'fa-zheng'],
title: '봉추와 내부책',
level: 32,
exp: 0,
description: '방통의 과감한 기책과 법정의 익주 사정이 맞물려, 적이 숨긴 길목을 먼저 흔듭니다.'
},
{
id: 'zhuge-liang__fa-zheng',
unitIds: ['zhuge-liang', 'fa-zheng'],
title: '큰 판과 속내',
level: 30,
exp: 0,
description: '제갈량의 큰 전략과 법정의 내부 정세 판단이 더해져, 익주 공략의 무리한 피를 줄입니다.'
}
];
export const luoCastleRecruitBonds: BattleBond[] = [
{
id: 'liu-bei__wu-yi',
unitIds: ['liu-bei', 'wu-yi'],
title: '낙성의 새 길',
level: 34,
exp: 0,
description: '유비의 절제된 진군과 오의의 성문 지식이 만나 낙성으로 들어가는 길을 열어 갑니다.'
},
{
id: 'fa-zheng__wu-yi',
unitIds: ['fa-zheng', 'wu-yi'],
title: '익주 내부 설득',
level: 32,
exp: 0,
description: '법정의 내부 정세 판단과 오의의 현장 인맥이 맞물려 익주 장수들의 마음을 흔듭니다.'
},
{
id: 'pang-tong__wu-yi',
unitIds: ['pang-tong', 'wu-yi'],
title: '봉추와 성문 장수',
level: 30,
exp: 0,
description: '방통의 빠른 계책과 오의의 성문 방비 지식이 합쳐져 좁은 길에서도 새로운 돌파구를 찾습니다.'
}
];
export const luoCastleProperRecruitBonds: BattleBond[] = [
{
id: 'liu-bei__yan-yan',
unitIds: ['liu-bei', 'yan-yan'],
title: '노장의 항복',
level: 32,
exp: 0,
description: '유비의 명분과 엄안의 노련한 절개가 만나, 익주의 성문과 백성을 함께 지키는 신뢰로 이어집니다.'
},
{
id: 'huang-zhong__yan-yan',
unitIds: ['huang-zhong', 'yan-yan'],
title: '노장 쌍궁',
level: 30,
exp: 0,
description: '황충의 침착한 활과 엄안의 성벽 방어 경험이 맞물려, 고지와 성문에서 강한 원거리 공명을 만듭니다.'
},
{
id: 'zhang-fei__yan-yan',
unitIds: ['zhang-fei', 'yan-yan'],
title: '호통과 절개',
level: 28,
exp: 0,
description: '장비의 거친 돌파력과 엄안의 굽히지 않는 절개가 부딪치며, 서로의 강함을 인정하는 관계로 자랍니다.'
}
];
export const chengduPressureRecruitBonds: BattleBond[] = [
{
id: 'liu-bei__li-yan',
unitIds: ['liu-bei', 'li-yan'],
title: '성도 앞의 군율',
level: 30,
exp: 0,
description: '유비의 군율과 이엄의 수비 책임이 맞닿아, 익주 백성을 해치지 않는 항복 명분을 더 단단하게 만듭니다.'
},
{
id: 'zhuge-liang__li-yan',
unitIds: ['zhuge-liang', 'li-yan'],
title: '내정과 책략',
level: 28,
exp: 0,
description: '제갈량의 큰 판과 이엄의 창고·관문 지식이 만나, 전투 이후 익주를 다스릴 준비를 앞당깁니다.'
},
{
id: 'yan-yan__li-yan',
unitIds: ['yan-yan', 'li-yan'],
title: '익주 장수의 결단',
level: 28,
exp: 0,
description: '엄안의 선례와 이엄의 신중함이 서로를 비추며, 익주 장수들이 유비군을 받아들이는 길을 넓힙니다.'
}
];
export const chengduSurrenderRecruitBonds: BattleBond[] = [
{
id: 'liu-bei__huang-quan',
unitIds: ['liu-bei', 'huang-quan'],
title: '항복과 보전',
level: 31,
exp: 0,
description: '유비의 보전 약속과 황권의 현실적인 판단이 맞닿아, 성도 항복 뒤 백성과 장수의 불안을 낮춥니다.'
},
{
id: 'zhuge-liang__huang-quan',
unitIds: ['zhuge-liang', 'huang-quan'],
title: '성도 수습책',
level: 29,
exp: 0,
description: '제갈량의 큰 내정 구상과 황권의 현지 행정 감각이 만나, 익주 통치의 첫 질서를 세웁니다.'
},
{
id: 'fa-zheng__huang-quan',
unitIds: ['fa-zheng', 'huang-quan'],
title: '익주 책사들의 균형',
level: 28,
exp: 0,
description: '법정의 결단력과 황권의 신중함이 서로를 보완하며, 익주 장수들을 다루는 말길을 넓힙니다.'
}
];
export const hanzhongOpeningRecruitBonds: BattleBond[] = [
{
id: 'liu-bei__ma-chao',
unitIds: ['liu-bei', 'ma-chao'],
title: '떠도는 창과 새 깃발',
level: 30,
exp: 0,
description: '유비의 포용과 마초의 돌격심이 맞물려, 서량 기병의 창끝이 촉한의 깃발 아래로 향합니다.'
},
{
id: 'zhao-yun__ma-chao',
unitIds: ['zhao-yun', 'ma-chao'],
title: '백마와 금마초',
level: 28,
exp: 0,
description: '조운의 절제된 기동과 마초의 거친 돌격이 서로를 자극하며, 기병 운용의 폭을 넓힙니다.'
},
{
id: 'zhang-fei__ma-chao',
unitIds: ['zhang-fei', 'ma-chao'],
title: '호통과 돌격',
level: 28,
exp: 0,
description: '장비의 호통과 마초의 돌격이 부딪치며, 전열을 단숨에 흔드는 강한 연계로 자랍니다.'
}
];
export const hanzhongScoutRecruitBonds: BattleBond[] = [
{
id: 'ma-chao__ma-dai',
unitIds: ['ma-chao', 'ma-dai'],
title: '서량의 두 창',
level: 30,
exp: 0,
description: '마초의 기세와 마대의 침착함이 함께 움직이며 서량 기병의 돌파와 회수를 안정시킵니다.'
},
{
id: 'liu-bei__ma-dai',
unitIds: ['liu-bei', 'ma-dai'],
title: '새 깃발의 기병',
level: 24,
exp: 0,
description: '유비가 흩어진 서량 기병을 받아들이며 마대가 새 깃발 아래서 싸울 명분을 얻습니다.'
},
{
id: 'zhao-yun__ma-dai',
unitIds: ['zhao-yun', 'ma-dai'],
title: '침착한 말발굽',
level: 22,
exp: 0,
description: '조운의 절제와 마대의 안정된 기동이 맞물려 기병대의 후속 움직임을 다듬습니다.'
}
];
export const hanzhongMainRecruitBonds: BattleBond[] = [
{
id: 'huang-zhong__wang-ping',
unitIds: ['huang-zhong', 'wang-ping'],
title: '노장과 산길',
level: 28,
exp: 0,
description: '황충의 과감한 고지 돌파와 왕평의 산길 판단이 맞물려 정군산 전투의 흐름을 안정시킵니다.'
},
{
id: 'zhuge-liang__wang-ping',
unitIds: ['zhuge-liang', 'wang-ping'],
title: '한중 지형책',
level: 26,
exp: 0,
description: '제갈량의 큰 전선 설계와 왕평의 실제 산길 지식이 만나 한중 공략의 정확도를 높입니다.'
},
{
id: 'ma-dai__wang-ping',
unitIds: ['ma-dai', 'wang-ping'],
title: '기병과 산길잡이',
level: 24,
exp: 0,
description: '마대의 안정된 기병 운용과 왕평의 지형 감각이 합쳐져 좁은 능선에서도 퇴로를 잃지 않습니다.'
}
];
export const jiangWeiRecruitBonds: BattleBond[] = [
{
id: 'zhuge-liang__jiang-wei',
unitIds: ['zhuge-liang', 'jiang-wei'],
title: '천수의 새 별',
level: 34,
exp: 0,
description: '제갈량이 강유의 재능을 받아들이면 북벌의 계책과 기동 판단이 더 넓어집니다.'
},
{
id: 'ma-liang__jiang-wei',
unitIds: ['ma-liang', 'jiang-wei'],
title: '설득의 문장',
level: 30,
exp: 0,
description: '마량이 남긴 글과 강유의 결단이 이어져 새 장수가 촉한의 명분을 빠르게 이해합니다.'
},
{
id: 'wang-ping__jiang-wei',
unitIds: ['wang-ping', 'jiang-wei'],
title: '길을 아는 두 장수',
level: 28,
exp: 0,
description: '왕평의 실제 산길 판단과 강유의 천수 지식이 만나 북방 전선의 지형 대응력이 높아집니다.'
}
];
export const hanzhongDecisiveBonds: BattleBond[] = [
{
id: 'liu-bei__wang-ping',
unitIds: ['liu-bei', 'wang-ping'],
title: '한중의 새 주인',
level: 25,
exp: 0,
description: '유비의 명분과 왕평의 산길 판단이 맞물려 한중 병사들이 새 깃발을 받아들이는 속도를 높입니다.'
},
{
id: 'fa-zheng__wang-ping',
unitIds: ['fa-zheng', 'wang-ping'],
title: '산길 계책',
level: 27,
exp: 0,
description: '법정의 유인책과 왕평의 실제 길 지식이 합쳐져 적의 보급로와 퇴로를 동시에 흔듭니다.'
},
{
id: 'huang-zhong__fa-zheng',
unitIds: ['huang-zhong', 'fa-zheng'],
title: '정군산의 여세',
level: 32,
exp: 0,
description: '황충의 고지 돌파와 법정의 결단이 다시 맞물리며 한중 결전의 첫 압박을 강하게 만듭니다.'
}
];
export const jingDefenseBonds: BattleBond[] = [
{
id: 'guan-yu__ma-liang',
unitIds: ['guan-yu', 'ma-liang'],
title: '형주 문무',
level: 30,
exp: 0,
description: '관우의 강한 방위와 마량의 민심 판단이 맞물려 형주의 강변 마을을 오래 붙잡습니다.'
},
{
id: 'guan-yu__mi-zhu',
unitIds: ['guan-yu', 'mi-zhu'],
title: '강릉 보급',
level: 26,
exp: 0,
description: '관우의 전선 유지와 미축의 보급 감각이 이어져 강릉과 나루 사이의 군량 흐름을 안정시킵니다.'
},
{
id: 'guan-yu__wang-ping',
unitIds: ['guan-yu', 'wang-ping'],
title: '강과 산의 방어',
level: 24,
exp: 0,
description: '관우의 성채 방어와 왕평의 지형 판단이 만나, 강변과 숲길에서 동시에 오는 압박을 읽어 냅니다.'
}
];
export const fanCastleBonds: BattleBond[] = [
{
id: 'guan-yu__fa-zheng',
unitIds: ['guan-yu', 'fa-zheng'],
title: '번성 책략선',
level: 27,
exp: 0,
description: '관우의 정면 압박과 법정의 물길 판단이 맞물리면, 번성 외곽의 보루와 나루를 동시에 흔드는 공명 효과가 강해집니다.'
},
{
id: 'guan-yu__ma-chao',
unitIds: ['guan-yu', 'ma-chao'],
title: '청룡과 서량 기병',
level: 26,
exp: 0,
description: '관우의 묵직한 전선 유지와 마초의 거친 기동력이 이어지면, 방덕 기병대의 돌파를 맞받아치는 연계 공격 확률이 높아집니다.'
}
];
export const hanRiverFloodBonds: BattleBond[] = [
{
id: 'guan-yu__huang-quan',
unitIds: ['guan-yu', 'huang-quan'],
title: '한수 물길 판단',
level: 25,
exp: 0,
description: '관우의 결단과 황권의 신중한 물길 판단이 맞물리면, 강과 둑을 활용한 포위 공격의 안정성이 높아집니다.'
},
{
id: 'guan-yu__li-yan',
unitIds: ['guan-yu', 'li-yan'],
title: '제방 보급선',
level: 24,
exp: 0,
description: '관우의 전선 압박과 이엄의 보급 관리가 이어지면, 진흙과 물길 사이에서도 병력 회복과 장기전 준비가 단단해집니다.'
}
];
export const fanCastleSiegeBonds: BattleBond[] = [
{
id: 'guan-yu__huang-zhong',
unitIds: ['guan-yu', 'huang-zhong'],
title: '성벽을 겨누는 노장',
level: 27,
exp: 0,
description: '관우의 정면 압박과 황충의 성벽 견제가 맞물리면, 성문을 지키는 궁병과 친위대에 대한 연계 공격 확률이 높아집니다.'
},
{
id: 'guan-yu__ma-liang',
unitIds: ['guan-yu', 'ma-liang'],
title: '형주 민심의 군령',
level: 26,
exp: 0,
description: '관우의 포위전 지휘와 마량의 형주 민심 판단이 이어지면, 마을과 나루를 해치지 않는 장기전 준비가 단단해집니다.'
},
{
id: 'liu-bei__guan-yu_fan-siege',
unitIds: ['liu-bei', 'guan-yu'],
title: '왕업과 의형제',
level: 28,
exp: 0,
description: '유비의 큰 명분과 관우의 번성 전선이 맞물리면, 성문 공략 중 사기와 공명 피해 보너스가 더 크게 살아납니다.'
}
];
export const jingRearCrisisBonds: BattleBond[] = [
{
id: 'guan-yu__mi-zhu_rear',
unitIds: ['guan-yu', 'mi-zhu'],
title: '후방 창고의 신뢰',
level: 27,
exp: 0,
description: '관우의 엄정한 군령과 미축의 보급 감각이 이어지면, 강릉 창고와 나루를 노리는 침투에 더 빠르게 대응합니다.'
},
{
id: 'guan-yu__ma-liang_rear',
unitIds: ['guan-yu', 'ma-liang'],
title: '형주 후방 경계',
level: 28,
exp: 0,
description: '관우의 전선 압박과 마량의 형주 민심 판단이 맞물리면, 강동의 부드러운 말과 숨은 정찰을 더 빨리 읽어 냅니다.'
},
{
id: 'liu-bei__mi-zhu_rear',
unitIds: ['liu-bei', 'mi-zhu'],
title: '백성과 창고',
level: 25,
exp: 0,
description: '유비의 민심과 미축의 보급선이 이어지면, 전투 사이 상인·백성 이벤트에서 후방 안정 보너스가 커집니다.'
}
];
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);
export const sixthBattleBonds: BattleBond[] = firstBattleBonds.map(cloneBattleBondForScenario);
export const seventhBattleBonds: BattleBond[] = firstBattleBonds.map(cloneBattleBondForScenario);
export const eighthBattleBonds: BattleBond[] = [...firstBattleBonds, ...xuzhouRecruitBonds].map(cloneBattleBondForScenario);
export const ninthBattleBonds: BattleBond[] = eighthBattleBonds.map(cloneBattleBondForScenario);
export const tenthBattleBonds: BattleBond[] = ninthBattleBonds.map(cloneBattleBondForScenario);
export const eleventhBattleBonds: BattleBond[] = tenthBattleBonds.map(cloneBattleBondForScenario);
export const twelfthBattleBonds: BattleBond[] = eleventhBattleBonds.map(cloneBattleBondForScenario);
export const thirteenthBattleBonds: BattleBond[] = twelfthBattleBonds.map(cloneBattleBondForScenario);
export const fourteenthBattleBonds: BattleBond[] = [...thirteenthBattleBonds, ...caoBreakRecruitBonds].map(
cloneBattleBondForScenario
);
export const fifteenthBattleBonds: BattleBond[] = fourteenthBattleBonds.map(cloneBattleBondForScenario);
export const sixteenthBattleBonds: BattleBond[] = [...fifteenthBattleBonds, ...liuBiaoRecruitBonds].map(
cloneBattleBondForScenario
);
export const seventeenthBattleBonds: BattleBond[] = sixteenthBattleBonds.map(cloneBattleBondForScenario);
export const eighteenthBattleBonds: BattleBond[] = [...sixteenthBattleBonds, ...zhugeRecruitBonds].map(
cloneBattleBondForScenario
);
export const nineteenthBattleBonds: BattleBond[] = [...eighteenthBattleBonds].map(cloneBattleBondForScenario);
export const twentiethBattleBonds: BattleBond[] = [...nineteenthBattleBonds].map(cloneBattleBondForScenario);
export const twentyFirstBattleBonds: BattleBond[] = [...twentiethBattleBonds].map(cloneBattleBondForScenario);
export const twentySecondBattleBonds: BattleBond[] = [...twentyFirstBattleBonds].map(cloneBattleBondForScenario);
export const twentyThirdBattleBonds: BattleBond[] = [...twentySecondBattleBonds].map(cloneBattleBondForScenario);
export const twentyFourthBattleBonds: BattleBond[] = [...twentyThirdBattleBonds, ...jingzhouRecruitBonds].map(cloneBattleBondForScenario);
export const twentyFifthBattleBonds: BattleBond[] = [...twentyFourthBattleBonds, ...guiyangRecruitBonds].map(cloneBattleBondForScenario);
export const twentySixthBattleBonds: BattleBond[] = [...twentyFifthBattleBonds, ...wulingRecruitBonds].map(cloneBattleBondForScenario);
export const twentySeventhBattleBonds: BattleBond[] = [...twentySixthBattleBonds, ...changshaRecruitBonds].map(cloneBattleBondForScenario);
export const twentyEighthBattleBonds: BattleBond[] = [...twentySeventhBattleBonds, ...yizhouRecruitBonds].map(cloneBattleBondForScenario);
export const twentyNinthBattleBonds: BattleBond[] = [...twentyEighthBattleBonds, ...fuPassRecruitBonds].map(cloneBattleBondForScenario);
export const thirtiethBattleBonds: BattleBond[] = [...twentyNinthBattleBonds, ...luoCastleRecruitBonds].map(cloneBattleBondForScenario);
export const thirtyFirstBattleBonds: BattleBond[] = [...thirtiethBattleBonds].map(cloneBattleBondForScenario);
export const thirtySecondBattleBonds: BattleBond[] = [...thirtyFirstBattleBonds, ...luoCastleProperRecruitBonds].map(
cloneBattleBondForScenario
);
export const thirtyThirdBattleBonds: BattleBond[] = [...thirtySecondBattleBonds, ...chengduPressureRecruitBonds].map(
cloneBattleBondForScenario
);
export const thirtyFourthBattleBonds: BattleBond[] = [...thirtyThirdBattleBonds, ...chengduSurrenderRecruitBonds].map(
cloneBattleBondForScenario
);
export const thirtyFifthBattleBonds: BattleBond[] = [...thirtyFourthBattleBonds, ...hanzhongOpeningRecruitBonds].map(
cloneBattleBondForScenario
);
export const thirtySixthBattleBonds: BattleBond[] = [...thirtyFifthBattleBonds, ...hanzhongScoutRecruitBonds].map(
cloneBattleBondForScenario
);
export const thirtySeventhBattleBonds: BattleBond[] = [
...thirtySixthBattleBonds,
...hanzhongMainRecruitBonds,
...hanzhongDecisiveBonds
].map(cloneBattleBondForScenario);
export const thirtyEighthBattleBonds: BattleBond[] = [...thirtySeventhBattleBonds, ...jingDefenseBonds].map(
cloneBattleBondForScenario
);
export const thirtyNinthBattleBonds: BattleBond[] = [...thirtyEighthBattleBonds, ...fanCastleBonds].map(
cloneBattleBondForScenario
);
export const fortiethBattleBonds: BattleBond[] = [...thirtyNinthBattleBonds, ...hanRiverFloodBonds].map(
cloneBattleBondForScenario
);
export const fortyFirstBattleBonds: BattleBond[] = [...fortiethBattleBonds, ...fanCastleSiegeBonds].map(
cloneBattleBondForScenario
);
export const fortySecondBattleBonds: BattleBond[] = [...fortyFirstBattleBonds, ...jingRearCrisisBonds].map(
cloneBattleBondForScenario
);
export const jingCollapseBonds: BattleBond[] = [
{
id: 'guan-yu__ma-liang_collapse',
unitIds: ['guan-yu', 'ma-liang'],
title: '형주 수습',
level: 42,
exp: 0,
description: '마량은 흔들리는 공안 병사들의 마음을 읽고, 관우는 전선의 군령으로 후방을 다시 묶는다.'
},
{
id: 'mi-zhu__huang-quan_collapse',
unitIds: ['mi-zhu', 'huang-quan'],
title: '장부와 신중함',
level: 36,
exp: 0,
description: '미축의 장부와 황권의 신중한 판단은 배신으로 이어지는 작은 숫자의 틈을 찾아낸다.'
},
{
id: 'zhao-yun__wang-ping_collapse',
unitIds: ['zhao-yun', 'wang-ping'],
title: '나루 차단',
level: 34,
exp: 0,
description: '조운의 기동과 왕평의 지형 판단은 강동 수군이 성문 뒤로 파고드는 길을 끊는다.'
}
];
export const fortyThirdBattleBonds: BattleBond[] = [...fortySecondBattleBonds, ...jingCollapseBonds].map(
cloneBattleBondForScenario
);
export const maichengIsolationBonds: BattleBond[] = [
{
id: 'guan-yu__wang-ping_maicheng',
unitIds: ['guan-yu', 'wang-ping'],
title: '맥성 북문',
level: 40,
exp: 0,
description: '관우의 결단과 왕평의 지형 판단은 맥성 북문의 좁은 퇴로를 찾는 힘이 된다.'
},
{
id: 'zhao-yun__ma-dai_maicheng',
unitIds: ['zhao-yun', 'ma-dai'],
title: '기동 차단',
level: 36,
exp: 0,
description: '조운의 빠른 판단과 마대의 안정된 기병 운용은 포위망의 틈을 빠르게 찢는다.'
},
{
id: 'guan-yu__huang-zhong_maicheng',
unitIds: ['guan-yu', 'huang-zhong'],
title: '노장의 깃발',
level: 34,
exp: 0,
description: '관우의 정면 돌파와 황충의 고지 견제는 좁은 맥성 길목에서 포위군을 늦춘다.'
}
];
export const fortyFourthBattleBonds: BattleBond[] = [...fortyThirdBattleBonds, ...maichengIsolationBonds].map(
cloneBattleBondForScenario
);
export const yilingVanguardBonds: BattleBond[] = [
{
id: 'liu-bei__zhang-fei_yiling',
unitIds: ['liu-bei', 'zhang-fei'],
title: '복수의 맹세',
level: 46,
exp: 0,
description: '유비의 분노와 장비의 돌파력은 이릉 진격로에서 전열을 빠르게 밀어붙인다.'
},
{
id: 'zhuge-liang__huang-quan_yiling',
unitIds: ['zhuge-liang', 'huang-quan'],
title: '분노를 재는 책략',
level: 40,
exp: 0,
description: '제갈량과 황권의 신중한 판단은 긴 보급로와 오군의 기다림을 읽는 힘이 된다.'
},
{
id: 'zhao-yun__ma-chao_yiling',
unitIds: ['zhao-yun', 'ma-chao'],
title: '동진 기동대',
level: 38,
exp: 0,
description: '조운과 마초의 빠른 기동은 강변과 숲길 사이의 오군 선봉을 끊는다.'
}
];
export const fortyFifthBattleBonds: BattleBond[] = [...fortyFourthBattleBonds, ...yilingVanguardBonds].map(
cloneBattleBondForScenario
);
export const yilingFireBonds: BattleBond[] = [
{
id: 'liu-bei__huang-quan_yiling-fire',
unitIds: ['liu-bei', 'huang-quan'],
title: '퇴로의 장부',
level: 44,
exp: 0,
description: '유비의 결단과 황권의 신중함은 불타는 진영에서 퇴로와 보급을 지키는 힘이 된다.'
},
{
id: 'zhao-yun__wang-ping_yiling-fire',
unitIds: ['zhao-yun', 'wang-ping'],
title: '불길 속 길잡이',
level: 40,
exp: 0,
description: '조운의 기동과 왕평의 지형 판단은 불길이 번지는 숲길에서 흩어진 병사를 모은다.'
},
{
id: 'zhuge-liang__ma-liang_yiling-fire',
unitIds: ['zhuge-liang', 'ma-liang'],
title: '남은 뜻의 기록',
level: 38,
exp: 0,
description: '제갈량과 마량은 이릉의 패착을 기록하고 다음 국정으로 이어질 판단을 남긴다.'
}
];
export const fortySixthBattleBonds: BattleBond[] = [...fortyFifthBattleBonds, ...yilingFireBonds].map(
cloneBattleBondForScenario
);
export const nanzhongRecoveryBonds: BattleBond[] = [
{
id: 'zhuge-liang__zhao-yun_nanzhong',
unitIds: ['zhuge-liang', 'zhao-yun'],
title: '섭정의 선봉',
level: 42,
exp: 0,
description: '제갈량의 신중한 남중 방침과 조운의 안정된 선봉은 백제성 이후 흔들린 군심을 붙잡는다.'
},
{
id: 'zhuge-liang__huang-quan_nanzhong',
unitIds: ['zhuge-liang', 'huang-quan'],
title: '나라 안의 장부',
level: 40,
exp: 0,
description: '제갈량과 황권은 남중의 반란을 단순한 토벌이 아니라 촉한 재정비의 장부로 바라본다.'
},
{
id: 'ma-liang__wang-ping_nanzhong',
unitIds: ['ma-liang', 'wang-ping'],
title: '마을과 산길',
level: 36,
exp: 0,
description: '마량의 민심 판단과 왕평의 지형 판단은 남중의 마을을 적으로 돌리지 않고 길을 여는 힘이 된다.'
}
];
export const fortySeventhBattleBonds: BattleBond[] = [...fortySixthBattleBonds, ...nanzhongRecoveryBonds].map(
cloneBattleBondForScenario
);
export const mengHuoPacificationBonds: BattleBond[] = [
{
id: 'zhuge-liang__ma-liang_menghuo',
unitIds: ['zhuge-liang', 'ma-liang'],
title: '회유의 문장',
level: 43,
exp: 0,
description: '제갈량의 큰 방침과 마량의 부드러운 문장은 맹획을 베기보다 돌려보낼 명분을 세운다.'
},
{
id: 'zhao-yun__ma-chao_menghuo',
unitIds: ['zhao-yun', 'ma-chao'],
title: '남중 돌격 차단',
level: 38,
exp: 0,
description: '조운의 안정된 기동과 마초의 강한 돌파는 맹수 기병의 첫 충돌을 받아 내는 힘이 된다.'
},
{
id: 'huang-quan__wang-ping_menghuo',
unitIds: ['huang-quan', 'wang-ping'],
title: '포로와 산길',
level: 37,
exp: 0,
description: '황권의 장부와 왕평의 지형 판단은 포로 수용소와 산마을을 불필요한 원한 없이 정리한다.'
}
];
export const fortyEighthBattleBonds: BattleBond[] = [...fortySeventhBattleBonds, ...mengHuoPacificationBonds].map(
cloneBattleBondForScenario
);
export const mengHuoSecondCaptureBonds: BattleBond[] = [
{
id: 'zhuge-liang__huang-quan_second-capture',
unitIds: ['zhuge-liang', 'huang-quan'],
title: '회유 장부',
level: 45,
exp: 0,
description: '제갈량의 회유 방침과 황권의 포로 장부는 맹획을 다시 놓아 보내도 군율이 흔들리지 않게 만든다.'
},
{
id: 'ma-liang__wang-ping_second-capture',
unitIds: ['ma-liang', 'wang-ping'],
title: '마을 길잡이',
level: 41,
exp: 0,
description: '마량이 민심을 살피고 왕평이 산길을 끊어, 맹획이 돌아가는 길마다 촉한군의 질서를 보이게 한다.'
},
{
id: 'zhao-yun__huang-zhong_second-capture',
unitIds: ['zhao-yun', 'huang-zhong'],
title: '돌격과 고지',
level: 39,
exp: 0,
description: '조운은 맹수 돌격을 받쳐 세우고 황충은 고지 궁병을 억눌러, 생포망이 무너지지 않게 한다.'
}
];
export const fortyNinthBattleBonds: BattleBond[] = [...fortyEighthBattleBonds, ...mengHuoSecondCaptureBonds].map(
cloneBattleBondForScenario
);
export const mengHuoThirdCaptureBonds: BattleBond[] = [
{
id: 'zhuge-liang__ma-liang_third-capture',
unitIds: ['zhuge-liang', 'ma-liang'],
title: '호족 설득문',
level: 48,
exp: 0,
description: '제갈량의 회유 방침과 마량의 문장은 흔들리는 호족들이 항복할 명분을 전장 안에 남긴다.'
},
{
id: 'huang-quan__wang-ping_third-capture',
unitIds: ['huang-quan', 'wang-ping'],
title: '장부와 길목',
level: 44,
exp: 0,
description: '황권은 포로와 군량의 기준을 지키고 왕평은 마을 길목을 열어, 남중 호족들이 촉한군의 질서를 직접 보게 한다.'
},
{
id: 'zhao-yun__ma-chao_third-capture',
unitIds: ['zhao-yun', 'ma-chao'],
title: '맹수 돌파 봉쇄',
level: 42,
exp: 0,
description: '조운과 마초는 맹획의 거친 재돌격을 막되 깊이 베지 않아, 세 번째 생포망을 유지한다.'
}
];
export const fiftiethBattleBonds: BattleBond[] = [...fortyNinthBattleBonds, ...mengHuoThirdCaptureBonds].map(
cloneBattleBondForScenario
);
export const mengHuoFourthCaptureBonds: BattleBond[] = [
{
id: 'zhuge-liang__ma-liang_fourth-capture',
unitIds: ['zhuge-liang', 'ma-liang'],
title: '회유 회의의 결실',
level: 51,
exp: 0,
description: '제갈량의 큰 회유책과 마량의 호족 설득문은 전장 안에서 물러날 길과 항복의 명분을 함께 만든다.'
},
{
id: 'huang-quan__wang-ping_fourth-capture',
unitIds: ['huang-quan', 'wang-ping'],
title: '보증 장부와 퇴로',
level: 47,
exp: 0,
description: '황권의 보증 장부와 왕평의 산길 판단은 흔들리는 호족들이 다시 창을 들지 않고 물러날 길을 보장한다.'
},
{
id: 'ma-chao__ma-dai_fourth-capture',
unitIds: ['ma-chao', 'ma-dai'],
title: '남중 추격 차단',
level: 43,
exp: 0,
description: '마초와 마대는 거친 남만 기병을 몰아붙이되, 회유 퇴로를 짓밟지 않도록 돌격의 선을 맞춘다.'
}
];
export const fiftyFirstBattleBonds: BattleBond[] = [...fiftiethBattleBonds, ...mengHuoFourthCaptureBonds].map(
cloneBattleBondForScenario
);
export const mengHuoFifthCaptureBonds: BattleBond[] = [
{
id: 'zhuge-liang__huang-quan_fifth-capture',
unitIds: ['zhuge-liang', 'huang-quan'],
title: '강경파 분리 장부',
level: 53,
exp: 0,
description: '제갈량의 회유 방침과 황권의 장부는 끝까지 싸운 자와 물러난 자를 갈라, 불필요한 원한을 줄인다.'
},
{
id: 'ma-liang__wang-ping_fifth-capture',
unitIds: ['ma-liang', 'wang-ping'],
title: '말과 길의 분리',
level: 49,
exp: 0,
description: '마량이 호족에게 남길 말을 고르고 왕평이 열린 길을 지켜, 전장 안에서도 항복의 길을 보존한다.'
},
{
id: 'zhao-yun__huang-zhong_fifth-capture',
unitIds: ['zhao-yun', 'huang-zhong'],
title: '추격선 억제',
level: 45,
exp: 0,
description: '조운과 황충은 맹수대와 고지 궁병을 눌러, 강경파가 회유 길목을 짓밟지 못하게 한다.'
}
];
export const fiftySecondBattleBonds: BattleBond[] = [...fiftyFirstBattleBonds, ...mengHuoFifthCaptureBonds].map(
cloneBattleBondForScenario
);
export const mengHuoSixthCaptureBonds: BattleBond[] = [
{
id: 'zhuge-liang__ma-liang_sixth-capture',
unitIds: ['zhuge-liang', 'ma-liang'],
title: '자존심을 남기는 말',
level: 55,
exp: 0,
description: '제갈량의 큰 회유와 마량의 부드러운 말은 맹획의 체면을 완전히 짓밟지 않으면서도 남중의 마음을 돌린다.'
},
{
id: 'huang-quan__wang-ping_sixth-capture',
unitIds: ['huang-quan', 'wang-ping'],
title: '신뢰 장부와 계곡 길',
level: 51,
exp: 0,
description: '황권이 신뢰 장부를 정리하고 왕평이 계곡 퇴로를 지키면, 여섯 번째 생포도 보복이 아니라 약속으로 남는다.'
},
{
id: 'zhao-yun__wei-yan_sixth-capture',
unitIds: ['zhao-yun', 'wei-yan'],
title: '빠른 차단과 절제',
level: 47,
exp: 0,
description: '조운의 깨끗한 기동과 위연의 거친 돌파가 균형을 맞추면, 잔당 추격을 막으면서도 마을 신뢰를 잃지 않는다.'
}
];
export const fiftyThirdBattleBonds: BattleBond[] = [...fiftySecondBattleBonds, ...mengHuoSixthCaptureBonds].map(
cloneBattleBondForScenario
);
export const mengHuoFinalCaptureBonds: BattleBond[] = [
{
id: 'zhuge-liang__huang-quan_final-capture',
unitIds: ['zhuge-liang', 'huang-quan'],
title: '일곱 번의 약속',
level: 60,
exp: 0,
description: '제갈량의 마지막 회유와 황권의 약속 장부는 맹획의 항복이 굴욕이 아니라 남중의 새 질서가 되게 한다.'
},
{
id: 'ma-liang__wang-ping_final-capture',
unitIds: ['ma-liang', 'wang-ping'],
title: '마을과 회의장',
level: 56,
exp: 0,
description: '마량의 말과 왕평의 길 표식은 촌장들이 보는 앞에서도 촉한군의 군율이 흔들리지 않게 한다.'
},
{
id: 'zhao-yun__ma-dai_final-capture',
unitIds: ['zhao-yun', 'ma-dai'],
title: '멈추는 추격',
level: 50,
exp: 0,
description: '조운과 마대는 빠른 기동으로 잔당을 끊되, 항복로를 밟지 않는 절제의 선을 함께 지킨다.'
}
];
export const fiftyFourthBattleBonds: BattleBond[] = [...fiftyThirdBattleBonds, ...mengHuoFinalCaptureBonds].map(
cloneBattleBondForScenario
);
export const northernFirstBattleBonds: BattleBond[] = [
{
id: 'zhuge-liang__zhao-yun_northern-first',
unitIds: ['zhuge-liang', 'zhao-yun'],
title: '출진로의 창과 책략',
level: 60,
exp: 0,
description: '제갈량의 진군 판단과 조운의 기동이 맞물리면 기산 산길에서 길을 잃은 부대를 빠르게 수습하고 역습의 틈을 만듭니다.'
},
{
id: 'huang-quan__ma-liang_northern-first',
unitIds: ['huang-quan', 'ma-liang'],
title: '보급 장부와 민심',
level: 54,
exp: 0,
description: '황권의 보급 장부와 마량의 민심 수습이 함께 움직이면 마을과 창고를 지키는 전투에서 공명 효과가 커집니다.'
},
{
id: 'wang-ping__ma-dai_northern-first',
unitIds: ['wang-ping', 'ma-dai'],
title: '산길 수비와 추격',
level: 50,
exp: 0,
description: '왕평이 산길을 읽고 마대가 기병의 틈을 파고들면 적의 우회 공격을 끊고 추격 피해를 높일 수 있습니다.'
},
{
id: 'zhuge-liang__wei-yan_northern-first',
unitIds: ['zhuge-liang', 'wei-yan'],
title: '신중함과 돌파력',
level: 48,
exp: 0,
description: '제갈량의 신중한 지휘와 위연의 강한 돌파력이 균형을 이루면 좁은 산길에서도 과감한 일격을 노릴 수 있습니다.'
}
];
export const fiftyFifthBattleBonds: BattleBond[] = [...fiftyFourthBattleBonds, ...northernFirstBattleBonds].map(
cloneBattleBondForScenario
);
export const northernSecondBattleBonds: BattleBond[] = [
{
id: 'zhuge-liang__wang-ping_northern-second',
unitIds: ['zhuge-liang', 'wang-ping'],
title: '가정의 지형 판단',
level: 56,
exp: 0,
description: '제갈량의 큰 전략과 왕평의 산길 판단이 맞물리면 가정으로 이어지는 고개에서 치명적인 배치 실수를 줄일 수 있습니다.'
},
{
id: 'zhao-yun__ma-dai_northern-second',
unitIds: ['zhao-yun', 'ma-dai'],
title: '우회로의 기동',
level: 54,
exp: 0,
description: '조운의 안정된 기동과 마대의 서량 정찰 감각이 합쳐지면 천수 방면의 우회 기병을 빠르게 끊을 수 있습니다.'
},
{
id: 'huang-quan__wang-ping_northern-second',
unitIds: ['huang-quan', 'wang-ping'],
title: '물길과 보급선',
level: 52,
exp: 0,
description: '황권의 보급 장부와 왕평의 지형 판단은 물길이 먼 고개에서 군량과 진영 위치를 동시에 지키는 힘이 됩니다.'
},
{
id: 'ma-liang__fa-zheng_northern-second',
unitIds: ['ma-liang', 'fa-zheng'],
title: '천수 설득의 글',
level: 48,
exp: 0,
description: '마량의 부드러운 문장과 법정의 날카로운 판단이 더해지면 천수 장수들의 흔들리는 마음을 놓치지 않습니다.'
}
];
export const fiftySixthBattleBonds: BattleBond[] = [...fiftyFifthBattleBonds, ...northernSecondBattleBonds].map(
cloneBattleBondForScenario
);
export const northernThirdBattleBonds: BattleBond[] = [
{
id: 'zhuge-liang__wang-ping_northern-third',
unitIds: ['zhuge-liang', 'wang-ping'],
title: '가정의 실제 길',
level: 60,
exp: 0,
description: '제갈량의 큰 전략과 왕평의 실제 지형 판단이 함께 움직이면 가정의 물길과 퇴로를 동시에 지킬 수 있습니다.'
},
{
id: 'wang-ping__ma-liang_northern-third',
unitIds: ['wang-ping', 'ma-liang'],
title: '말과 길의 설득',
level: 54,
exp: 0,
description: '마량의 설득과 왕평의 길 표식이 맞물리면 흔들리는 병사와 장수에게 물러설 명분을 남길 수 있습니다.'
},
{
id: 'huang-quan__fa-zheng_northern-third',
unitIds: ['huang-quan', 'fa-zheng'],
title: '장부와 계책',
level: 50,
exp: 0,
description: '황권의 보급 장부와 법정의 책략 판단이 합쳐지면 위군의 차단선을 피할 작은 틈을 찾습니다.'
},
{
id: 'zhao-yun__ma-dai_northern-third',
unitIds: ['zhao-yun', 'ma-dai'],
title: '퇴로의 기병',
level: 56,
exp: 0,
description: '조운과 마대가 함께 움직이면 가정 고개에서 지나치게 깊이 들어간 부대를 빠르게 회수할 수 있습니다.'
}
];
export const fiftySeventhBattleBonds: BattleBond[] = [
...fiftySixthBattleBonds,
...northernThirdBattleBonds
].map(cloneBattleBondForScenario);
export const northernFourthBattleBonds: BattleBond[] = [
{
id: 'zhuge-liang__jiang-wei_northern-fourth',
unitIds: ['zhuge-liang', 'jiang-wei'],
title: '새 길을 맡긴 마음',
level: 48,
exp: 0,
description: '제갈량의 큰 계산과 강유의 천수 길 지식이 맞물리면 퇴각전에서도 군량 수레와 병사를 함께 살릴 수 있습니다.'
},
{
id: 'jiang-wei__wang-ping_northern-fourth',
unitIds: ['jiang-wei', 'wang-ping'],
title: '낮은 길과 물길',
level: 44,
exp: 0,
description: '강유가 아는 낮은 길과 왕평의 물길 판단이 합쳐지면 추격을 끊고 안전한 퇴로를 열 확률이 높아집니다.'
},
{
id: 'jiang-wei__zhao-yun_northern-fourth',
unitIds: ['jiang-wei', 'zhao-yun'],
title: '새 장수와 백마',
level: 42,
exp: 0,
description: '강유의 길 안내와 조운의 안정된 회수 기동이 어울리면 빠르게 들어온 위군 기병을 늦출 수 있습니다.'
},
{
id: 'ma-dai__jiang-wei_northern-fourth',
unitIds: ['ma-dai', 'jiang-wei'],
title: '서량 말과 천수 길',
level: 40,
exp: 0,
description: '마대의 서량 기병 감각과 강유의 천수 지형 지식이 맞물리면 좁은 길에서도 추격을 흩어 놓을 수 있습니다.'
}
];
export const fiftyEighthBattleBonds: BattleBond[] = [
...fiftySeventhBattleBonds,
...northernFourthBattleBonds
].map(cloneBattleBondForScenario);
export const northernFifthBattleBonds: BattleBond[] = [
{
id: 'jiang-wei__fa-zheng_northern-fifth',
unitIds: ['jiang-wei', 'fa-zheng'],
title: '새 길과 오래된 계책',
level: 46,
exp: 0,
description: '강유의 진창 길 판단과 법정의 공성 계책이 맞물리면 성벽을 무리하게 치기보다 수비의 빈틈을 재는 힘이 생깁니다.'
},
{
id: 'wei-yan__jiang-wei_northern-fifth',
unitIds: ['wei-yan', 'jiang-wei'],
title: '돌파와 절제',
level: 42,
exp: 0,
description: '위연의 돌파 욕심과 강유의 길 계산을 함께 묶으면 성채 앞에서 밀어붙일 곳과 멈출 곳을 구분할 수 있습니다.'
},
{
id: 'huang-quan__ma-liang_northern-fifth',
unitIds: ['huang-quan', 'ma-liang'],
title: '군량과 문서',
level: 52,
exp: 0,
description: '황권의 군량 장부와 마량의 명분 문서가 함께 움직이면 진창 공성전이 오래 끌릴 때도 후방의 약속이 흔들리지 않습니다.'
},
{
id: 'wang-ping__ma-dai_northern-fifth',
unitIds: ['wang-ping', 'ma-dai'],
title: '진영 표식과 우회 기병',
level: 44,
exp: 0,
description: '왕평의 진영 표식과 마대의 우회 기병이 어울리면 왕쌍의 추격을 받기 전에 공성 진영을 접을 시간을 벌 수 있습니다.'
}
];
export const fiftyNinthBattleBonds: BattleBond[] = [
...fiftyEighthBattleBonds,
...northernFifthBattleBonds
].map(cloneBattleBondForScenario);
export const northernSixthBattleBonds: BattleBond[] = [
{
id: 'jiang-wei__wei-yan_northern-sixth',
unitIds: ['jiang-wei', 'wei-yan'],
title: '길을 여는 돌파',
level: 48,
exp: 0,
description: '강유의 산길 판단과 위연의 돌파력이 맞물리면 무도와 음평의 좁은 갈림길에서도 빠르게 압박할 수 있습니다.'
},
{
id: 'zhao-yun__ma-dai_northern-sixth',
unitIds: ['zhao-yun', 'ma-dai'],
title: '두 기병의 회수선',
level: 56,
exp: 0,
description: '조운의 안정된 회수 기동과 마대의 서량 우회 감각이 함께하면 곽회의 구원 기병을 늦추면서도 본대와 끊어지지 않습니다.'
},
{
id: 'wang-ping__huang-quan_northern-sixth',
unitIds: ['wang-ping', 'huang-quan'],
title: '산길과 장부',
level: 50,
exp: 0,
description: '왕평의 산길 표식과 황권의 보급 장부가 맞물리면 두 고을을 얻은 뒤에도 군량선이 무너지지 않습니다.'
},
{
id: 'ma-liang__jiang-wei_northern-sixth',
unitIds: ['ma-liang', 'jiang-wei'],
title: '새 고을의 약속',
level: 42,
exp: 0,
description: '마량의 민심 문서와 강유의 천수 사람 이해가 함께하면 무도와 음평의 백성이 새 전선을 두려움만으로 보지 않게 됩니다.'
}
];
export const sixtiethBattleBonds: BattleBond[] = [
...fiftyNinthBattleBonds,
...northernSixthBattleBonds
].map(cloneBattleBondForScenario);
export const northernSeventhBattleBonds: BattleBond[] = [
{
id: 'li-yan__huang-quan_northern-seventh',
unitIds: ['li-yan', 'huang-quan'],
title: '빗길 장부',
level: 46,
exp: 0,
description: '이엄의 운송 책임과 황권의 보급 장부가 맞물리면 한중 북문과 무도·음평으로 갈라지는 군량 흐름을 늦더라도 끊기지 않게 붙들 수 있습니다.'
},
{
id: 'jiang-wei__wang-ping_northern-seventh',
unitIds: ['jiang-wei', 'wang-ping'],
title: '새 고을을 지키는 길눈',
level: 50,
exp: 0,
description: '강유의 전방 길눈과 왕평의 진영 표식이 함께 움직이면 빗길 속에서도 어느 길을 버리고 어느 길을 지킬지 빠르게 정할 수 있습니다.'
},
{
id: 'zhuge-liang__wei-yan_northern-seventh',
unitIds: ['zhuge-liang', 'wei-yan'],
title: '돌파와 제동',
level: 48,
exp: 0,
description: '제갈량의 전선 계산과 위연의 돌파력이 서로의 한계를 인정하면, 조진의 역공을 막으면서도 반격할 순간을 잃지 않습니다.'
},
{
id: 'ma-liang__huang-quan_northern-seventh',
unitIds: ['ma-liang', 'huang-quan'],
title: '고시문과 군량표',
level: 44,
exp: 0,
description: '마량의 민심 문서와 황권의 군량표가 함께 움직이면 새 고을의 백성이 방어전 속에서도 촉한의 약속을 실제 배분으로 확인할 수 있습니다.'
}
];
export const sixtyFirstBattleBonds: BattleBond[] = [
...sixtiethBattleBonds,
...northernSeventhBattleBonds
].map(cloneBattleBondForScenario);
export const northernEighthBattleBonds: BattleBond[] = [
{
id: 'jiang-wei__wei-yan_northern-eighth',
unitIds: ['jiang-wei', 'wei-yan'],
title: '앞길과 돌파',
level: 52,
exp: 0,
description: '강유의 길눈과 위연의 돌파 판단이 맞물리면, 노성 앞 지연선을 빠르게 흔들되 돌아올 길을 잃지 않을 수 있습니다.'
},
{
id: 'zhao-yun__wang-ping_northern-eighth',
unitIds: ['zhao-yun', 'wang-ping'],
title: '회수선의 표식',
level: 54,
exp: 0,
description: '조운의 예비대 회수와 왕평의 산길 표식이 이어지면, 깊이 들어간 부대도 사마의의 지연전 속에서 제때 돌아올 수 있습니다.'
},
{
id: 'huang-quan__ma-liang_northern-eighth',
unitIds: ['huang-quan', 'ma-liang'],
title: '장부와 고시문',
level: 48,
exp: 0,
description: '황권의 군량 장부와 마량의 민심 문서가 함께 움직이면, 공격로가 백성의 부담으로만 남지 않게 조정할 수 있습니다.'
},
{
id: 'li-yan__ma-dai_northern-eighth',
unitIds: ['li-yan', 'ma-dai'],
title: '수레와 측면',
level: 44,
exp: 0,
description: '이엄의 운송 기준과 마대의 측면 기동이 맞으면, 보급 수레가 늦어질 때도 기병이 빈틈을 메울 수 있습니다.'
}
];
export const sixtySecondBattleBonds: BattleBond[] = [
...sixtyFirstBattleBonds,
...northernEighthBattleBonds
].map(cloneBattleBondForScenario);
export const northernNinthBattleBonds: BattleBond[] = [
{
id: 'jiang-wei__zhao-yun_northern-ninth',
unitIds: ['jiang-wei', 'zhao-yun'],
title: '길잡이와 회수기',
level: 56,
exp: 0,
description: '강유가 낮은 길을 읽고 조운이 예비대를 회수하면, 추격전에서도 앞선 병사가 길을 잃지 않습니다.'
},
{
id: 'wei-yan__wang-ping_northern-ninth',
unitIds: ['wei-yan', 'wang-ping'],
title: '칼끝과 정지선',
level: 54,
exp: 0,
description: '위연의 돌파와 왕평의 정지선이 함께 움직이면, 노성 추격로를 밀어붙이면서도 돌아올 표식을 남길 수 있습니다.'
},
{
id: 'huang-quan__li-yan_northern-ninth',
unitIds: ['huang-quan', 'li-yan'],
title: '장부와 수레',
level: 50,
exp: 0,
description: '황권의 군량 계산과 이엄의 운송 기준이 맞물리면, 더 깊은 추격도 한중 창고의 숨을 끊지 않습니다.'
},
{
id: 'ma-liang__ma-dai_northern-ninth',
unitIds: ['ma-liang', 'ma-dai'],
title: '고시문과 측면',
level: 46,
exp: 0,
description: '마량의 민심 문서와 마대의 측면 기동은 노성 앞 마을을 안심시키면서 곽회의 우회로를 견제합니다.'
}
];
export const sixtyThirdBattleBonds: BattleBond[] = [
...sixtySecondBattleBonds,
...northernNinthBattleBonds
].map(cloneBattleBondForScenario);
export const northernTenthBattleBonds: BattleBond[] = [
{
id: 'jiang-wei__wang-ping_northern-tenth',
unitIds: ['jiang-wei', 'wang-ping'],
title: '물목과 정지선',
level: 58,
exp: 0,
description: '강유의 낮은 길 판단과 왕평의 정지선이 맞물리면, 위수 물목을 넘볼 때도 돌아올 표식을 잃지 않습니다.'
},
{
id: 'zhuge-liang__huang-quan_northern-tenth',
unitIds: ['zhuge-liang', 'huang-quan'],
title: '강가의 장부',
level: 56,
exp: 0,
description: '제갈량의 전선 계산과 황권의 군량 장부가 함께 움직이면, 강을 낀 장기전에서도 수레가 먼저 무너지지 않습니다.'
},
{
id: 'wei-yan__ma-dai_northern-tenth',
unitIds: ['wei-yan', 'ma-dai'],
title: '돌파와 측면',
level: 52,
exp: 0,
description: '위연의 돌파와 마대의 측면 기동은 위수 진영 사이를 흔들어 장합의 추격 기병을 분산시킵니다.'
},
{
id: 'zhao-yun__li-yan_northern-tenth',
unitIds: ['zhao-yun', 'li-yan'],
title: '예비대와 수레',
level: 50,
exp: 0,
description: '조운의 예비대 회수와 이엄의 운송 기준이 맞으면, 깊어진 진영전에서도 보급 수레를 버리지 않고 물릴 수 있습니다.'
}
];
export const sixtyFourthBattleBonds: BattleBond[] = [
...sixtyThirdBattleBonds,
...northernTenthBattleBonds
].map(cloneBattleBondForScenario);
export const northernEleventhBattleBonds: BattleBond[] = [
{
id: 'jiang-wei__ma-dai_northern-eleventh',
unitIds: ['jiang-wei', 'ma-dai'],
title: '낮은 길과 측면',
level: 60,
exp: 0,
description: '강유가 북안 낮은 길을 읽고 마대가 측면 기병을 묶으면, 장합의 재추격을 먼저 꺾을 수 있습니다.'
},
{
id: 'zhuge-liang__li-yan_northern-eleventh',
unitIds: ['zhuge-liang', 'li-yan'],
title: '군령과 수레',
level: 58,
exp: 0,
description: '제갈량의 전진 명령과 이엄의 수레 배정이 맞물리면, 강북 진영을 얻고도 후방 숨을 잃지 않습니다.'
},
{
id: 'wang-ping__huang-quan_northern-eleventh',
unitIds: ['wang-ping', 'huang-quan'],
title: '정지선과 장부',
level: 56,
exp: 0,
description: '왕평의 멈출 선과 황권의 소모 장부가 함께 움직이면, 북안 압박 뒤에도 지켜야 할 진영을 구분할 수 있습니다.'
},
{
id: 'wei-yan__zhao-yun_northern-eleventh',
unitIds: ['wei-yan', 'zhao-yun'],
title: '돌파와 회수',
level: 54,
exp: 0,
description: '위연이 북안 진영 사이를 흔들고 조운이 예비대를 붙들면, 돌파가 고립으로 바뀌기 전에 군을 되돌릴 수 있습니다.'
}
];
export const sixtyFifthBattleBonds: BattleBond[] = [
...sixtyFourthBattleBonds,
...northernEleventhBattleBonds
].map(cloneBattleBondForScenario);
export const northernTwelfthBattleBonds: BattleBond[] = [
{
id: 'zhuge-liang__jiang-wei_northern-twelfth',
unitIds: ['zhuge-liang', 'jiang-wei'],
title: '계승의 장부',
level: 64,
exp: 0,
description: '제갈량의 본영 명령과 강유의 전진 판단이 맞물리면, 오장원에서 퇴각과 반격의 균형을 잃지 않습니다.'
},
{
id: 'wang-ping__ma-dai_northern-twelfth',
unitIds: ['wang-ping', 'ma-dai'],
title: '퇴로와 측면',
level: 60,
exp: 0,
description: '왕평이 퇴로를 붙들고 마대가 측면 기병을 끊으면, 장합의 마지막 추격을 본영 밖에서 묶어 둘 수 있습니다.'
},
{
id: 'huang-quan__li-yan_northern-twelfth',
unitIds: ['huang-quan', 'li-yan'],
title: '군량과 귀환 장부',
level: 58,
exp: 0,
description: '황권의 전장 기록과 이엄의 보급 장부가 함께 움직이면, 긴 행군 끝에도 병사들이 돌아갈 순서를 잃지 않습니다.'
},
{
id: 'wei-yan__jiang-wei_northern-twelfth',
unitIds: ['wei-yan', 'jiang-wei'],
title: '앞길을 보는 두 검',
level: 56,
exp: 0,
description: '위연의 돌파력과 강유의 신중한 후위 판단이 함께 서면, 사마의의 지연선을 흔들면서도 본영을 비우지 않습니다.'
}
];
export const sixtySixthBattleBonds: BattleBond[] = [
...sixtyFifthBattleBonds,
...northernTwelfthBattleBonds
].map(cloneBattleBondForScenario);
function createEighthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 22 }, (_, y) =>
Array.from({ length: 26 }, (_, x): TerrainType => {
if (x <= 1 && y >= 16 && y <= 20) {
return 'camp';
}
if ((x === 2 && y >= 15 && y <= 20) || (x === 3 && y >= 18 && y <= 20)) {
return 'camp';
}
if ((x >= 20 && x <= 23 && y >= 2 && y <= 5) || (x >= 21 && x <= 24 && y >= 13 && y <= 16)) {
return 'fort';
}
if ((x >= 17 && x <= 18 && y >= 7 && y <= 9) || (x >= 8 && x <= 9 && y >= 12 && y <= 14)) {
return 'village';
}
if ((x === 14 || x === 15) && y <= 18 && y >= 0) {
return 'river';
}
if (x === y - 12 || x === y - 13 || (y >= 7 && y <= 10 && x >= 2 && x <= 18) || (x >= 4 && x <= 22 && y === 10)) {
return 'road';
}
if ((x <= 6 && y <= 4) || (x >= 5 && x <= 10 && y >= 3 && y <= 7) || (x >= 2 && x <= 6 && y >= 8 && y <= 12) || (x >= 18 && x <= 25 && y >= 17)) {
return 'forest';
}
if ((x >= 18 && y <= 2) || (x >= 22 && y >= 7 && y <= 12) || (x >= 10 && x <= 13 && y >= 15 && y <= 20) || (x <= 4 && y >= 4 && y <= 7)) {
return 'hill';
}
return 'plain';
})
);
}
function createNinthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 22 }, (_, y) =>
Array.from({ length: 26 }, (_, x): TerrainType => {
if ((x >= 1 && x <= 4 && y >= 16 && y <= 20) || (x >= 5 && x <= 7 && y >= 18 && y <= 20)) {
return 'camp';
}
if ((x >= 19 && x <= 24 && y >= 3 && y <= 8) || (x >= 18 && x <= 24 && y >= 12 && y <= 16)) {
return 'fort';
}
if ((x >= 20 && x <= 22 && y >= 9 && y <= 11) || (x >= 11 && x <= 12 && y >= 13 && y <= 15)) {
return 'village';
}
if ((x === 14 || x === 15) && y >= 0 && y <= 20) {
return 'river';
}
if ((y === 10 && x >= 2 && x <= 24) || (x === 8 && y >= 5 && y <= 20) || (x === 18 && y >= 2 && y <= 18) || (x + y === 25 && x >= 7 && x <= 17)) {
return 'road';
}
if ((x <= 5 && y <= 5) || (x >= 2 && x <= 7 && y >= 7 && y <= 12) || (x >= 8 && x <= 13 && y >= 1 && y <= 5) || (x >= 4 && x <= 10 && y >= 14 && y <= 17)) {
return 'forest';
}
if ((x >= 21 && y <= 2) || (x >= 22 && y >= 17) || (x >= 10 && x <= 13 && y >= 16) || (x <= 3 && y >= 6 && y <= 9)) {
return 'hill';
}
return 'plain';
})
);
}
function createTenthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 22 }, (_, y) =>
Array.from({ length: 28 }, (_, x): TerrainType => {
if ((x <= 4 && y >= 14 && y <= 20) || (x >= 5 && x <= 7 && y >= 17 && y <= 20)) {
return 'camp';
}
if ((x >= 18 && x <= 25 && y >= 5 && y <= 12) || (x >= 20 && x <= 26 && y >= 13 && y <= 17)) {
return 'fort';
}
if ((x >= 6 && x <= 8 && y >= 9 && y <= 11) || (x >= 13 && x <= 14 && y >= 16 && y <= 18)) {
return 'village';
}
if ((x === 15 || x === 16) && y >= 2 && y <= 21) {
return 'river';
}
if (
(y === 15 && x >= 2 && x <= 26) ||
(x === 6 && y >= 7 && y <= 20) ||
(x === 20 && y >= 4 && y <= 18) ||
(x + y === 28 && x >= 9 && x <= 20)
) {
return 'road';
}
if (
(x <= 5 && y <= 6) ||
(x >= 7 && x <= 12 && y >= 2 && y <= 7) ||
(x >= 2 && x <= 9 && y >= 8 && y <= 13) ||
(x >= 8 && x <= 13 && y >= 18 && y <= 21)
) {
return 'forest';
}
if (
(x >= 21 && y <= 4) ||
(x >= 24 && y >= 18) ||
(x >= 10 && x <= 13 && y >= 11 && y <= 14) ||
(x <= 3 && y >= 7 && y <= 10)
) {
return 'hill';
}
if ((x >= 25 && y >= 6 && y <= 10) || (x >= 18 && x <= 20 && y <= 2)) {
return 'cliff';
}
return 'plain';
})
);
}
function createEleventhBattleTerrain(): TerrainType[][] {
return Array.from({ length: 22 }, (_, y) =>
Array.from({ length: 28 }, (_, x): TerrainType => {
if ((x <= 4 && y >= 14 && y <= 20) || (x >= 5 && x <= 7 && y >= 16 && y <= 20)) {
return 'camp';
}
if ((x >= 22 && x <= 26 && y >= 8 && y <= 13) || (x >= 19 && x <= 21 && y >= 5 && y <= 8)) {
return 'fort';
}
if ((x >= 8 && x <= 10 && y >= 10 && y <= 12) || (x >= 14 && x <= 16 && y >= 15 && y <= 17)) {
return 'village';
}
if ((x === 17 || x === 18) && y >= 0 && y <= 19) {
return 'river';
}
if (
(y === 15 && x >= 2 && x <= 25) ||
(x === 8 && y >= 6 && y <= 20) ||
(x === 22 && y >= 4 && y <= 17) ||
(x + y === 28 && x >= 9 && x <= 21)
) {
return 'road';
}
if (
(x <= 5 && y <= 5) ||
(x >= 6 && x <= 13 && y >= 2 && y <= 7) ||
(x >= 3 && x <= 8 && y >= 8 && y <= 13) ||
(x >= 9 && x <= 14 && y >= 18 && y <= 21)
) {
return 'forest';
}
if (
(x >= 21 && y <= 3) ||
(x >= 24 && y >= 16) ||
(x >= 11 && x <= 14 && y >= 11 && y <= 14) ||
(x <= 4 && y >= 6 && y <= 10)
) {
return 'hill';
}
if ((x >= 25 && y >= 4 && y <= 7) || (x >= 19 && x <= 21 && y <= 2)) {
return 'cliff';
}
return 'plain';
})
);
}
function createTwelfthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 24 }, (_, y) =>
Array.from({ length: 30 }, (_, x): TerrainType => {
if (x <= 2 && y >= 17 && y <= 22) {
return 'camp';
}
if ((x >= 23 && x <= 27 && y >= 8 && y <= 13) || (x >= 20 && x <= 24 && y >= 2 && y <= 4)) {
return 'fort';
}
if ((x >= 10 && x <= 12 && y >= 16 && y <= 18) || (x >= 16 && x <= 18 && y >= 7 && y <= 9)) {
return 'village';
}
if ((x === 14 || x === 15) && y >= 0 && y <= 22) {
return 'river';
}
if ((x === 20 || x === 21) && y >= 4 && y <= 20) {
return 'river';
}
if ((x >= 12 && x <= 22 && y === 12) || (x >= 4 && x <= 13 && y === 18) || (x >= 6 && x <= 24 && y === 10)) {
return 'road';
}
if ((x >= 2 && x <= 26 && y === x - 2) || (x >= 3 && x <= 15 && y === 21 - x)) {
return 'road';
}
if ((x <= 8 && y <= 8) || (x >= 4 && x <= 11 && y >= 9 && y <= 13) || (x >= 22 && y >= 16 && y <= 22)) {
return 'forest';
}
if ((x >= 6 && x <= 10 && y >= 2 && y <= 5) || (x >= 24 && x <= 28 && y >= 4 && y <= 8) || (x >= 9 && x <= 13 && y >= 20)) {
return 'hill';
}
if ((x >= 27 && y <= 4) || (x >= 27 && y >= 15) || (x <= 1 && y <= 4)) {
return 'cliff';
}
return 'plain';
})
);
}
function createThirteenthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 24 }, (_, y) =>
Array.from({ length: 32 }, (_, x): TerrainType => {
if (x <= 2 && y >= 18 && y <= 22) {
return 'camp';
}
if (
(x >= 20 && x <= 29 && y >= 8 && y <= 15) ||
(x >= 23 && x <= 28 && y >= 5 && y <= 7) ||
(x >= 25 && x <= 30 && y >= 16 && y <= 18)
) {
return 'fort';
}
if ((x >= 10 && x <= 12 && y >= 17 && y <= 19) || (x >= 17 && x <= 19 && y >= 13 && y <= 15)) {
return 'village';
}
if ((x === 14 || x === 15) && y >= 0 && y <= 22) {
return 'river';
}
if ((x === 18 || x === 19) && y >= 2 && y <= 20) {
return 'river';
}
if (
(y === 19 && x >= 2 && x <= 19) ||
(y === 14 && x >= 15 && x <= 24) ||
(y === 11 && x >= 19 && x <= 29) ||
(x === 24 && y >= 7 && y <= 18)
) {
return 'road';
}
if ((x >= 4 && x <= 16 && y === 23 - x) || (x >= 10 && x <= 22 && y === x - 3)) {
return 'road';
}
if (
(x <= 8 && y <= 8) ||
(x >= 4 && x <= 12 && y >= 9 && y <= 13) ||
(x >= 2 && x <= 9 && y >= 14 && y <= 17) ||
(x >= 28 && y >= 19 && y <= 22)
) {
return 'forest';
}
if (
(x >= 6 && x <= 10 && y >= 2 && y <= 5) ||
(x >= 27 && x <= 31 && y >= 1 && y <= 5) ||
(x >= 9 && x <= 13 && y >= 20)
) {
return 'hill';
}
if ((x >= 30 && y <= 8) || (x >= 30 && y >= 14) || (x <= 1 && y <= 4)) {
return 'cliff';
}
return 'plain';
})
);
}
function createFourteenthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 24 }, (_, y) =>
Array.from({ length: 32 }, (_, x): TerrainType => {
if (x <= 2 && y >= 18 && y <= 22) {
return 'camp';
}
if (
(x >= 23 && x <= 29 && y >= 8 && y <= 14) ||
(x >= 25 && x <= 30 && y >= 15 && y <= 18)
) {
return 'fort';
}
if ((x >= 10 && x <= 12 && y >= 16 && y <= 18) || (x >= 17 && x <= 19 && y >= 10 && y <= 12)) {
return 'village';
}
if ((x === 15 || x === 16) && y >= 0 && y <= 22) {
return 'river';
}
if ((x === 21 || x === 22) && y >= 4 && y <= 20) {
return 'river';
}
if (
(y === 19 && x >= 2 && x <= 20) ||
(y === 12 && x >= 12 && x <= 27) ||
(x === 24 && y >= 7 && y <= 18)
) {
return 'road';
}
if ((x >= 3 && x <= 16 && y === 22 - x) || (x >= 9 && x <= 24 && y === x - 4)) {
return 'road';
}
if (
(x <= 8 && y <= 7) ||
(x >= 4 && x <= 12 && y >= 8 && y <= 13) ||
(x >= 2 && x <= 9 && y >= 14 && y <= 17) ||
(x >= 27 && y >= 18 && y <= 22)
) {
return 'forest';
}
if (
(x >= 6 && x <= 11 && y >= 2 && y <= 5) ||
(x >= 27 && x <= 31 && y >= 1 && y <= 6) ||
(x >= 9 && x <= 13 && y >= 20)
) {
return 'hill';
}
if ((x >= 30 && y <= 7) || (x >= 30 && y >= 15) || (x <= 1 && y <= 4)) {
return 'cliff';
}
return 'plain';
})
);
}
function createFifteenthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 24 }, (_, y) =>
Array.from({ length: 34 }, (_, x): TerrainType => {
if (x <= 2 && y >= 17 && y <= 21) {
return 'camp';
}
if ((x >= 27 && x <= 32 && y >= 8 && y <= 15) || (x >= 30 && x <= 33 && y >= 5 && y <= 7)) {
return 'fort';
}
if ((x >= 9 && x <= 11 && y >= 15 && y <= 17) || (x >= 20 && x <= 22 && y >= 7 && y <= 9)) {
return 'village';
}
if ((x === 14 || x === 15) && y >= 1 && y <= 22) {
return 'river';
}
if ((x === 24 || x === 25) && y >= 2 && y <= 20) {
return 'river';
}
if (
(y === 18 && x >= 2 && x <= 17) ||
(y === 14 && x >= 13 && x <= 28) ||
(y === 10 && x >= 21 && x <= 32) ||
(x === 29 && y >= 8 && y <= 17)
) {
return 'road';
}
if ((x >= 5 && x <= 17 && y === 23 - x) || (x >= 12 && x <= 28 && y === x - 7)) {
return 'road';
}
if (
(x <= 8 && y <= 7) ||
(x >= 4 && x <= 11 && y >= 9 && y <= 13) ||
(x >= 2 && x <= 8 && y >= 14 && y <= 16) ||
(x >= 27 && y >= 18 && y <= 22)
) {
return 'forest';
}
if (
(x >= 6 && x <= 12 && y >= 2 && y <= 5) ||
(x >= 18 && x <= 22 && y >= 18 && y <= 22) ||
(x >= 29 && x <= 33 && y >= 1 && y <= 4)
) {
return 'hill';
}
if ((x >= 32 && y <= 8) || (x >= 32 && y >= 16) || (x <= 1 && y <= 4)) {
return 'cliff';
}
return 'plain';
})
);
}
function createSixteenthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 26 }, (_, y) =>
Array.from({ length: 34 }, (_, x): TerrainType => {
if ((x <= 2 && y >= 19 && y <= 23) || (x === 3 && y >= 21 && y <= 23)) {
return 'camp';
}
if ((x >= 29 && x <= 33 && y >= 11 && y <= 17) || (x >= 30 && x <= 33 && y >= 8 && y <= 10)) {
return 'fort';
}
if ((x >= 12 && x <= 14 && y >= 17 && y <= 19) || (x >= 21 && x <= 23 && y >= 9 && y <= 11)) {
return 'village';
}
if ((x === 16 || x === 17) && y >= 2 && y <= 23) {
return 'river';
}
if ((x === 25 || x === 26) && y >= 4 && y <= 20) {
return 'river';
}
if (
(y === 20 && x >= 2 && x <= 18) ||
(y === 16 && x >= 14 && x <= 30) ||
(y === 12 && x >= 22 && x <= 32) ||
(x === 30 && y >= 10 && y <= 18)
) {
return 'road';
}
if ((x >= 5 && x <= 16 && y === 25 - x) || (x >= 15 && x <= 29 && y === x - 9)) {
return 'road';
}
if (
(x <= 8 && y <= 8) ||
(x >= 5 && x <= 13 && y >= 10 && y <= 15) ||
(x >= 3 && x <= 9 && y >= 16 && y <= 18) ||
(x >= 24 && x <= 31 && y >= 19 && y <= 24)
) {
return 'forest';
}
if (
(x >= 7 && x <= 13 && y >= 2 && y <= 6) ||
(x >= 18 && x <= 22 && y >= 20 && y <= 24) ||
(x >= 28 && x <= 33 && y >= 1 && y <= 5)
) {
return 'hill';
}
if ((x >= 32 && y <= 8) || (x >= 32 && y >= 18) || (x <= 1 && y <= 5)) {
return 'cliff';
}
return 'plain';
})
);
}
function createSeventeenthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 26 }, (_, y) =>
Array.from({ length: 34 }, (_, x): TerrainType => {
if ((x <= 2 && y >= 20 && y <= 24) || (x === 3 && y >= 22 && y <= 24)) {
return 'camp';
}
if ((x >= 29 && x <= 33 && y >= 10 && y <= 15) || (x >= 27 && x <= 30 && y >= 8 && y <= 10)) {
return 'fort';
}
if ((x >= 24 && x <= 26 && y >= 11 && y <= 13) || (x >= 12 && x <= 14 && y >= 18 && y <= 20)) {
return 'village';
}
if ((x === 18 || x === 19) && y >= 4 && y <= 23) {
return 'river';
}
if (
(y === 21 && x >= 2 && x <= 15) ||
(y === 18 && x >= 13 && x <= 24) ||
(y === 13 && x >= 22 && x <= 32) ||
(x === 29 && y >= 10 && y <= 18)
) {
return 'road';
}
if ((x >= 5 && x <= 15 && y === 25 - x) || (x >= 15 && x <= 29 && y === x - 11)) {
return 'road';
}
if (
(x <= 10 && y <= 9) ||
(x >= 4 && x <= 15 && y >= 10 && y <= 17) ||
(x >= 20 && x <= 28 && y >= 16 && y <= 24) ||
(x >= 25 && y <= 7)
) {
return 'forest';
}
if (
(x >= 8 && x <= 15 && y >= 2 && y <= 7) ||
(x >= 15 && x <= 23 && y >= 20 && y <= 25) ||
(x >= 27 && x <= 33 && y >= 1 && y <= 6)
) {
return 'hill';
}
if ((x >= 32 && y <= 9) || (x >= 32 && y >= 17) || (x <= 1 && y <= 6)) {
return 'cliff';
}
return 'plain';
})
);
}
function createEighteenthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 26 }, (_, y) =>
Array.from({ length: 36 }, (_, x): TerrainType => {
if ((x <= 3 && y >= 16 && y <= 22) || (x <= 1 && y >= 13 && y <= 15)) {
return 'camp';
}
if ((x >= 31 && x <= 35 && y >= 12 && y <= 18) || (x >= 29 && x <= 32 && y >= 10 && y <= 12)) {
return 'fort';
}
if ((x >= 9 && x <= 11 && y >= 18 && y <= 20) || (x >= 24 && x <= 26 && y >= 13 && y <= 15)) {
return 'village';
}
if ((x === 18 || x === 19) && y >= 1 && y <= 23 && y !== 15 && y !== 18) {
return 'river';
}
if ((x === 27 || x === 28) && y >= 4 && y <= 21 && y !== 15) {
return 'river';
}
if (
(y === 18 && x >= 2 && x <= 19) ||
(y === 15 && x >= 18 && x <= 33) ||
(x === 33 && y >= 12 && y <= 19)
) {
return 'road';
}
if ((x >= 5 && x <= 17 && y === 23 - Math.floor(x / 2)) || (x >= 17 && x <= 31 && y === Math.floor(x / 2) + 4)) {
return 'road';
}
if (
(x >= 6 && x <= 17 && y >= 8 && y <= 17) ||
(x >= 20 && x <= 29 && y >= 16 && y <= 24) ||
(x <= 8 && y <= 8) ||
(x >= 25 && x <= 35 && y <= 8)
) {
return 'forest';
}
if (
(x >= 9 && x <= 16 && y >= 2 && y <= 6) ||
(x >= 13 && x <= 23 && y >= 21 && y <= 25) ||
(x >= 30 && x <= 35 && y >= 2 && y <= 6)
) {
return 'hill';
}
if ((x <= 1 && y <= 8) || (x >= 34 && y <= 10) || (x >= 34 && y >= 19)) {
return 'cliff';
}
return 'plain';
})
);
}
function createNineteenthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 28 }, (_, y) =>
Array.from({ length: 38 }, (_, x): TerrainType => {
if ((x <= 3 && y >= 21 && y <= 26) || (x >= 4 && x <= 7 && y >= 23 && y <= 26)) {
return 'camp';
}
if ((x >= 29 && x <= 36 && y >= 15 && y <= 22) || (x >= 32 && x <= 37 && y >= 12 && y <= 14)) {
return 'fort';
}
if ((x >= 8 && x <= 10 && y >= 20 && y <= 22) || (x >= 20 && x <= 22 && y >= 17 && y <= 19)) {
return 'village';
}
if ((x === 15 || x === 16) && y >= 0 && y <= 17) {
return 'river';
}
if ((x === 23 || x === 24) && y >= 7 && y <= 27) {
return 'river';
}
if (
(y === 22 && x >= 3 && x <= 14) ||
(y === 19 && x >= 13 && x <= 23) ||
(y === 17 && x >= 23 && x <= 35) ||
(x === 31 && y >= 13 && y <= 21)
) {
return 'road';
}
if (
(x >= 4 && x <= 14 && y === 25 - Math.floor(x / 2)) ||
(x >= 16 && x <= 30 && y === Math.floor(x / 2) + 8) ||
(x >= 7 && x <= 13 && y === 22)
) {
return 'road';
}
if (
(x >= 5 && x <= 14 && y >= 9 && y <= 18) ||
(x >= 16 && x <= 22 && y >= 20 && y <= 27) ||
(x <= 9 && y <= 8) ||
(x >= 26 && x <= 35 && y <= 9)
) {
return 'forest';
}
if (
(x >= 9 && x <= 14 && y >= 2 && y <= 6) ||
(x >= 25 && x <= 31 && y >= 22 && y <= 27) ||
(x >= 29 && x <= 37 && y >= 3 && y <= 7)
) {
return 'hill';
}
if ((x <= 1 && y <= 13) || (x >= 36 && y <= 11) || (x >= 36 && y >= 23)) {
return 'cliff';
}
return 'plain';
})
);
}
function createTwentiethBattleTerrain(): TerrainType[][] {
return Array.from({ length: 28 }, (_, y) =>
Array.from({ length: 40 }, (_, x): TerrainType => {
if ((x <= 3 && y >= 21 && y <= 26) || (x >= 4 && x <= 7 && y >= 23 && y <= 26)) {
return 'camp';
}
if ((x >= 34 && x <= 39 && y >= 14 && y <= 21) || (x >= 31 && x <= 34 && y >= 15 && y <= 18)) {
return 'fort';
}
if ((x >= 13 && x <= 16 && y >= 18 && y <= 20) || (x >= 29 && x <= 31 && y >= 15 && y <= 17)) {
return 'village';
}
if (
(y === 22 && x >= 3 && x <= 15) ||
(y === 20 && x >= 14 && x <= 26) ||
(y === 17 && x >= 26 && x <= 36) ||
(x === 34 && y >= 14 && y <= 22)
) {
return 'road';
}
if (
(x >= 6 && x <= 16 && y === 24 - Math.floor(x / 2)) ||
(x >= 16 && x <= 31 && y === Math.floor(x / 2) + 8) ||
(x >= 5 && x <= 12 && y === 23)
) {
return 'road';
}
if ((x === 22 || x === 23) && y >= 0 && y <= 27) {
return 'river';
}
if ((x === 28 || x === 29) && y >= 0 && y <= 14) {
return 'river';
}
if (
(x >= 5 && x <= 15 && y >= 8 && y <= 17) ||
(x >= 16 && x <= 21 && y >= 21 && y <= 27) ||
(x <= 9 && y <= 8) ||
(x >= 29 && x <= 38 && y <= 9)
) {
return 'forest';
}
if (
(x >= 10 && x <= 17 && y >= 2 && y <= 6) ||
(x >= 25 && x <= 33 && y >= 22 && y <= 27) ||
(x >= 31 && x <= 39 && y >= 3 && y <= 7)
) {
return 'hill';
}
if ((x <= 1 && y <= 13) || (x >= 38 && y <= 11) || (x >= 38 && y >= 23)) {
return 'cliff';
}
return 'plain';
})
);
}
function createTwentyFirstBattleTerrain(): TerrainType[][] {
return Array.from({ length: 30 }, (_, y) =>
Array.from({ length: 42 }, (_, x): TerrainType => {
if ((x <= 4 && y >= 23 && y <= 28) || (x >= 5 && x <= 8 && y >= 25 && y <= 29)) {
return 'camp';
}
if ((x >= 35 && x <= 41 && y >= 16 && y <= 23) || (x >= 32 && x <= 35 && y >= 17 && y <= 20)) {
return 'fort';
}
if ((x >= 13 && x <= 16 && y >= 21 && y <= 23) || (x >= 29 && x <= 31 && y >= 17 && y <= 19)) {
return 'village';
}
if (
(y === 24 && x >= 3 && x <= 16) ||
(y === 21 && x >= 15 && x <= 27) ||
(y === 18 && x >= 27 && x <= 38) ||
(x === 35 && y >= 16 && y <= 24)
) {
return 'road';
}
if (
(x >= 6 && x <= 17 && y === 27 - Math.floor(x / 2)) ||
(x >= 18 && x <= 33 && y === Math.floor(x / 2) + 8) ||
(x >= 8 && x <= 14 && y === 25)
) {
return 'road';
}
if ((x === 20 || x === 21) && y >= 0 && y <= 29) {
return 'river';
}
if ((x === 28 || x === 29) && y >= 0 && y <= 16) {
return 'river';
}
if ((x === 24 || x === 25) && y >= 22 && y <= 29) {
return 'river';
}
if (
(x >= 5 && x <= 15 && y >= 9 && y <= 18) ||
(x >= 16 && x <= 20 && y >= 23 && y <= 29) ||
(x <= 9 && y <= 8) ||
(x >= 31 && x <= 40 && y <= 9)
) {
return 'forest';
}
if (
(x >= 10 && x <= 18 && y >= 2 && y <= 6) ||
(x >= 27 && x <= 35 && y >= 24 && y <= 29) ||
(x >= 33 && x <= 41 && y >= 3 && y <= 7)
) {
return 'hill';
}
if ((x <= 1 && y <= 14) || (x >= 40 && y <= 12) || (x >= 40 && y >= 24)) {
return 'cliff';
}
return 'plain';
})
);
}
function createTwentySecondBattleTerrain(): TerrainType[][] {
return Array.from({ length: 30 }, (_, y) =>
Array.from({ length: 44 }, (_, x): TerrainType => {
if ((x <= 4 && y >= 21 && y <= 28) || (x >= 5 && x <= 9 && y >= 24 && y <= 29)) {
return 'camp';
}
if ((x >= 36 && x <= 43 && y >= 10 && y <= 18) || (x >= 33 && x <= 37 && y >= 12 && y <= 16)) {
return 'fort';
}
if ((x >= 12 && x <= 15 && y >= 20 && y <= 22) || (x >= 27 && x <= 30 && y >= 11 && y <= 13)) {
return 'village';
}
if (
(y === 23 && x >= 3 && x <= 17) ||
(y === 20 && x >= 15 && x <= 28) ||
(y === 15 && x >= 28 && x <= 40) ||
(x === 36 && y >= 10 && y <= 22)
) {
return 'road';
}
if (
(x >= 7 && x <= 18 && y === 26 - Math.floor(x / 2)) ||
(x >= 19 && x <= 35 && y === 25 - Math.floor(x / 3)) ||
(x >= 30 && x <= 39 && y === 14)
) {
return 'road';
}
if ((x >= 18 && x <= 25 && y >= 0 && y <= 29) || (x >= 29 && x <= 31 && y >= 0 && y <= 22)) {
return 'river';
}
if ((x >= 14 && x <= 16 && y >= 24 && y <= 29) || (x >= 26 && x <= 28 && y >= 20 && y <= 29)) {
return 'river';
}
if (
(x >= 4 && x <= 13 && y >= 8 && y <= 17) ||
(x <= 8 && y <= 7) ||
(x >= 31 && x <= 42 && y <= 8)
) {
return 'forest';
}
if (
(x >= 9 && x <= 18 && y >= 2 && y <= 6) ||
(x >= 32 && x <= 43 && y >= 21 && y <= 29) ||
(x >= 38 && x <= 43 && y >= 3 && y <= 7)
) {
return 'hill';
}
if ((x <= 1 && y <= 13) || (x >= 42 && y <= 9) || (x >= 42 && y >= 20)) {
return 'cliff';
}
return 'plain';
})
);
}
function createTwentyThirdBattleTerrain(): TerrainType[][] {
return Array.from({ length: 32 }, (_, y) =>
Array.from({ length: 46 }, (_, x): TerrainType => {
if ((x <= 4 && y >= 24 && y <= 30) || (x >= 5 && x <= 9 && y >= 27 && y <= 31)) {
return 'camp';
}
if ((x >= 38 && x <= 45 && y >= 14 && y <= 22) || (x >= 34 && x <= 38 && y >= 16 && y <= 20)) {
return 'fort';
}
if (
(x >= 12 && x <= 15 && y >= 23 && y <= 25) ||
(x >= 24 && x <= 27 && y >= 18 && y <= 20) ||
(x >= 33 && x <= 35 && y >= 15 && y <= 17)
) {
return 'village';
}
if (
(y === 25 && x >= 3 && x <= 18) ||
(y === 22 && x >= 16 && x <= 29) ||
(y === 18 && x >= 28 && x <= 40) ||
(x === 38 && y >= 14 && y <= 24)
) {
return 'road';
}
if (
(x >= 7 && x <= 18 && y === 29 - Math.floor(x / 2)) ||
(x >= 19 && x <= 36 && y === Math.floor(x / 2) + 8) ||
(x >= 31 && x <= 39 && y === 18)
) {
return 'road';
}
if ((x === 20 || x === 21) && y >= 0 && y <= 31) {
return 'river';
}
if ((x === 29 || x === 30) && y >= 0 && y <= 20) {
return 'river';
}
if ((x === 25 || x === 26) && y >= 24 && y <= 31) {
return 'river';
}
if (
(x >= 4 && x <= 15 && y >= 8 && y <= 19) ||
(x >= 15 && x <= 21 && y >= 25 && y <= 31) ||
(x <= 9 && y <= 8) ||
(x >= 31 && x <= 44 && y <= 10)
) {
return 'forest';
}
if (
(x >= 10 && x <= 19 && y >= 2 && y <= 7) ||
(x >= 30 && x <= 39 && y >= 24 && y <= 31) ||
(x >= 37 && x <= 45 && y >= 4 && y <= 9)
) {
return 'hill';
}
if ((x <= 1 && y <= 15) || (x >= 44 && y <= 12) || (x >= 44 && y >= 24)) {
return 'cliff';
}
return 'plain';
})
);
}
function createTwentyFourthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 32 }, (_, y) =>
Array.from({ length: 48 }, (_, x): TerrainType => {
if ((x <= 5 && y >= 23 && y <= 30) || (x >= 6 && x <= 10 && y >= 27 && y <= 31)) {
return 'camp';
}
if ((x >= 40 && x <= 47 && y >= 15 && y <= 23) || (x >= 36 && x <= 40 && y >= 17 && y <= 21)) {
return 'fort';
}
if (
(x >= 14 && x <= 17 && y >= 22 && y <= 25) ||
(x >= 27 && x <= 30 && y >= 17 && y <= 19) ||
(x >= 35 && x <= 37 && y >= 13 && y <= 15)
) {
return 'village';
}
if (
(y === 24 && x >= 4 && x <= 20) ||
(y === 21 && x >= 18 && x <= 32) ||
(y === 18 && x >= 31 && x <= 43) ||
(x === 42 && y >= 15 && y <= 25)
) {
return 'road';
}
if (
(x >= 8 && x <= 20 && y === 29 - Math.floor(x / 2)) ||
(x >= 22 && x <= 38 && y === 28 - Math.floor(x / 3)) ||
(x >= 32 && x <= 42 && y === 17)
) {
return 'road';
}
if ((x === 22 || x === 23) && y >= 0 && y <= 31) {
return 'river';
}
if ((x === 32 || x === 33) && y >= 0 && y <= 22) {
return 'river';
}
if ((x === 28 || x === 29) && y >= 25 && y <= 31) {
return 'river';
}
if (
(x >= 4 && x <= 16 && y >= 7 && y <= 18) ||
(x >= 15 && x <= 22 && y >= 25 && y <= 31) ||
(x <= 10 && y <= 8) ||
(x >= 31 && x <= 45 && y <= 10)
) {
return 'forest';
}
if (
(x >= 10 && x <= 20 && y >= 2 && y <= 7) ||
(x >= 31 && x <= 40 && y >= 24 && y <= 31) ||
(x >= 38 && x <= 47 && y >= 4 && y <= 9)
) {
return 'hill';
}
if ((x <= 1 && y <= 15) || (x >= 46 && y <= 12) || (x >= 46 && y >= 24)) {
return 'cliff';
}
return 'plain';
})
);
}
function createTwentyFifthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 34 }, (_, y) =>
Array.from({ length: 50 }, (_, x): TerrainType => {
if (x <= 3 && y >= 27) {
return 'camp';
}
if ((x >= 43 && x <= 48 && y >= 11 && y <= 17) || (x >= 40 && x <= 45 && y >= 8 && y <= 12)) {
return 'fort';
}
if ((x >= 28 && x <= 30 && y >= 25 && y <= 27) || (x >= 17 && x <= 19 && y >= 18 && y <= 20) || (x >= 37 && x <= 39 && y >= 23 && y <= 25)) {
return 'village';
}
if (
(y >= 28 && x >= 3 && x <= 13) ||
(x >= 12 && x <= 16 && y >= 22 && y <= 28) ||
(x >= 16 && x <= 23 && y >= 20 && y <= 22) ||
(x >= 23 && x <= 31 && y >= 23 && y <= 26) ||
(x >= 31 && x <= 39 && y >= 20 && y <= 23) ||
(x >= 38 && x <= 44 && y >= 16 && y <= 20) ||
(x >= 42 && x <= 47 && y >= 12 && y <= 16)
) {
return 'road';
}
if ((x === 9 || x === 10) && y >= 0 && y <= 22) {
return 'river';
}
if ((x === 33 || x === 34) && y >= 1 && y <= 19) {
return 'river';
}
if ((x === 27 || x === 28) && y >= 27 && y <= 33) {
return 'river';
}
if (
(x <= 7 && y <= 14) ||
(x >= 13 && x <= 23 && y >= 4 && y <= 13) ||
(x >= 18 && x <= 31 && y >= 14 && y <= 19) ||
(x >= 35 && x <= 48 && y >= 21 && y <= 32)
) {
return 'forest';
}
if (
(x >= 0 && x <= 12 && y >= 15 && y <= 25) ||
(x >= 21 && x <= 33 && y >= 6 && y <= 15) ||
(x >= 36 && x <= 49 && y <= 10) ||
(x >= 41 && x <= 49 && y >= 18 && y <= 24)
) {
return 'hill';
}
if ((x <= 2 && y <= 25) || (x >= 48 && y <= 20) || (x >= 30 && x <= 32 && y >= 0 && y <= 9)) {
return 'cliff';
}
return 'plain';
})
);
}
function createTwentySixthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 34 }, (_, y) =>
Array.from({ length: 52 }, (_, x): TerrainType => {
if (x <= 3 && y >= 26) {
return 'camp';
}
if ((x >= 42 && x <= 50 && y >= 11 && y <= 20) || (x >= 37 && x <= 43 && y >= 8 && y <= 13)) {
return 'fort';
}
if ((x >= 21 && x <= 24 && y >= 26 && y <= 28) || (x >= 30 && x <= 32 && y >= 19 && y <= 21) || (x >= 15 && x <= 17 && y >= 21 && y <= 23)) {
return 'village';
}
if (
(y >= 27 && x >= 3 && x <= 18) ||
(x >= 18 && x <= 29 && y >= 23 && y <= 27) ||
(x >= 29 && x <= 38 && y >= 19 && y <= 23) ||
(x >= 37 && x <= 45 && y >= 15 && y <= 19) ||
(x >= 44 && x <= 49 && y >= 13 && y <= 17)
) {
return 'road';
}
if ((x === 11 || x === 12) && y >= 0 && y <= 24) {
return 'river';
}
if ((x === 33 || x === 34) && y >= 22 && y <= 33) {
return 'river';
}
if (
(x >= 4 && x <= 14 && y >= 7 && y <= 18) ||
(x >= 18 && x <= 30 && y >= 8 && y <= 17) ||
(x >= 35 && x <= 47 && y >= 23 && y <= 33)
) {
return 'forest';
}
if (
(x >= 0 && x <= 9 && y <= 10) ||
(x >= 21 && x <= 32 && y >= 1 && y <= 9) ||
(x >= 46 && x <= 51 && y >= 0 && y <= 10)
) {
return 'hill';
}
if ((x <= 1 && y <= 25) || (x >= 50 && y >= 21) || (x >= 39 && x <= 41 && y >= 0 && y <= 7)) {
return 'cliff';
}
return 'plain';
})
);
}
function createTwentySeventhBattleTerrain(): TerrainType[][] {
return Array.from({ length: 36 }, (_, y) =>
Array.from({ length: 54 }, (_, x): TerrainType => {
if (x <= 4 && y >= 29) {
return 'camp';
}
if ((x >= 45 && x <= 52 && y >= 12 && y <= 20) || (x >= 41 && x <= 47 && y >= 9 && y <= 14)) {
return 'fort';
}
if ((x >= 18 && x <= 20 && y >= 27 && y <= 29) || (x >= 32 && x <= 34 && y >= 22 && y <= 24) || (x >= 38 && x <= 40 && y >= 16 && y <= 18)) {
return 'village';
}
if (
(y >= 31 && x >= 4 && x <= 15) ||
(x >= 14 && x <= 24 && y >= 27 && y <= 31) ||
(x >= 23 && x <= 33 && y >= 23 && y <= 27) ||
(x >= 32 && x <= 40 && y >= 18 && y <= 23) ||
(x >= 39 && x <= 48 && y >= 14 && y <= 18) ||
(x >= 47 && x <= 51 && y >= 15 && y <= 17)
) {
return 'road';
}
if ((x === 12 || x === 13) && y >= 0 && y <= 25) {
return 'river';
}
if ((x === 29 || x === 30) && y >= 4 && y <= 21) {
return 'river';
}
if ((x === 36 || x === 37) && y >= 25 && y <= 35) {
return 'river';
}
if (
(x >= 4 && x <= 16 && y >= 8 && y <= 20) ||
(x >= 17 && x <= 28 && y >= 10 && y <= 21) ||
(x >= 31 && x <= 42 && y >= 25 && y <= 35) ||
(x >= 41 && x <= 53 && y >= 22 && y <= 33)
) {
return 'forest';
}
if (
(x >= 0 && x <= 10 && y <= 11) ||
(x >= 20 && x <= 28 && y <= 9) ||
(x >= 31 && x <= 43 && y >= 4 && y <= 12) ||
(x >= 47 && x <= 53 && y <= 11) ||
(x >= 22 && x <= 31 && y >= 29 && y <= 35)
) {
return 'hill';
}
if ((x <= 2 && y <= 28) || (x >= 52 && y >= 20) || (x >= 43 && x <= 45 && y <= 8)) {
return 'cliff';
}
return 'plain';
})
);
}
function createTwentyEighthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 38 }, (_, y) =>
Array.from({ length: 56 }, (_, x): TerrainType => {
if (x <= 4 && y >= 31) {
return 'camp';
}
if ((x >= 46 && x <= 54 && y >= 13 && y <= 22) || (x >= 42 && x <= 48 && y >= 10 && y <= 15)) {
return 'fort';
}
if ((x >= 17 && x <= 20 && y >= 28 && y <= 30) || (x >= 32 && x <= 34 && y >= 24 && y <= 26) || (x >= 39 && x <= 41 && y >= 18 && y <= 20)) {
return 'village';
}
if (
(y >= 33 && x >= 4 && x <= 15) ||
(x >= 14 && x <= 25 && y >= 29 && y <= 33) ||
(x >= 24 && x <= 34 && y >= 25 && y <= 29) ||
(x >= 33 && x <= 42 && y >= 20 && y <= 25) ||
(x >= 41 && x <= 50 && y >= 16 && y <= 20) ||
(x >= 49 && x <= 53 && y >= 17 && y <= 19)
) {
return 'road';
}
if ((x === 12 || x === 13) && y >= 0 && y <= 27) {
return 'river';
}
if ((x === 30 || x === 31) && y >= 2 && y <= 23) {
return 'river';
}
if ((x === 38 || x === 39) && y >= 28 && y <= 37) {
return 'river';
}
if (
(x >= 4 && x <= 17 && y >= 8 && y <= 22) ||
(x >= 18 && x <= 29 && y >= 11 && y <= 23) ||
(x >= 31 && x <= 44 && y >= 28 && y <= 37) ||
(x >= 43 && x <= 55 && y >= 24 && y <= 36)
) {
return 'forest';
}
if (
(x >= 0 && x <= 10 && y <= 12) ||
(x >= 19 && x <= 29 && y <= 10) ||
(x >= 31 && x <= 45 && y >= 3 && y <= 13) ||
(x >= 48 && x <= 55 && y <= 12) ||
(x >= 23 && x <= 33 && y >= 31 && y <= 37)
) {
return 'hill';
}
if ((x <= 2 && y <= 30) || (x >= 54 && y >= 22) || (x >= 44 && x <= 46 && y <= 9)) {
return 'cliff';
}
return 'plain';
})
);
}
function createTwentyNinthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 40 }, (_, y) =>
Array.from({ length: 58 }, (_, x): TerrainType => {
if (x <= 4 && y >= 33) {
return 'camp';
}
if ((x >= 48 && x <= 56 && y >= 13 && y <= 23) || (x >= 44 && x <= 50 && y >= 10 && y <= 15)) {
return 'fort';
}
if (
(x >= 18 && x <= 21 && y >= 30 && y <= 32) ||
(x >= 34 && x <= 36 && y >= 25 && y <= 27) ||
(x >= 41 && x <= 43 && y >= 19 && y <= 21)
) {
return 'village';
}
if (
(y >= 35 && x >= 4 && x <= 16) ||
(x >= 15 && x <= 27 && y >= 31 && y <= 35) ||
(x >= 26 && x <= 36 && y >= 27 && y <= 31) ||
(x >= 35 && x <= 45 && y >= 22 && y <= 27) ||
(x >= 44 && x <= 53 && y >= 17 && y <= 22) ||
(x >= 52 && x <= 56 && y >= 18 && y <= 20)
) {
return 'road';
}
if ((x === 12 || x === 13) && y >= 0 && y <= 29) {
return 'river';
}
if ((x === 31 || x === 32) && y >= 2 && y <= 25) {
return 'river';
}
if ((x === 40 || x === 41) && y >= 30 && y <= 39) {
return 'river';
}
if (
(x >= 4 && x <= 18 && y >= 8 && y <= 24) ||
(x >= 19 && x <= 30 && y >= 12 && y <= 25) ||
(x >= 33 && x <= 46 && y >= 30 && y <= 39) ||
(x >= 45 && x <= 57 && y >= 25 && y <= 38)
) {
return 'forest';
}
if (
(x >= 0 && x <= 10 && y <= 13) ||
(x >= 20 && x <= 30 && y <= 11) ||
(x >= 32 && x <= 47 && y >= 3 && y <= 14) ||
(x >= 50 && x <= 57 && y <= 12) ||
(x >= 24 && x <= 34 && y >= 33 && y <= 39)
) {
return 'hill';
}
if ((x <= 2 && y <= 32) || (x >= 56 && y >= 23) || (x >= 45 && x <= 47 && y <= 9)) {
return 'cliff';
}
return 'plain';
})
);
}
function createThirtiethBattleTerrain(): TerrainType[][] {
return Array.from({ length: 42 }, (_, y) =>
Array.from({ length: 60 }, (_, x): TerrainType => {
if (x <= 4 && y >= 35) {
return 'camp';
}
if ((x >= 50 && x <= 58 && y >= 14 && y <= 24) || (x >= 46 && x <= 52 && y >= 10 && y <= 16)) {
return 'fort';
}
if (
(x >= 17 && x <= 20 && y >= 33 && y <= 35) ||
(x >= 36 && x <= 38 && y >= 26 && y <= 28) ||
(x >= 43 && x <= 45 && y >= 20 && y <= 22)
) {
return 'village';
}
if (
(y >= 37 && x >= 4 && x <= 17) ||
(x >= 16 && x <= 29 && y >= 33 && y <= 37) ||
(x >= 28 && x <= 39 && y >= 28 && y <= 33) ||
(x >= 38 && x <= 48 && y >= 23 && y <= 28) ||
(x >= 47 && x <= 56 && y >= 18 && y <= 23) ||
(x >= 54 && x <= 58 && y >= 19 && y <= 21)
) {
return 'road';
}
if ((x === 12 || x === 13) && y >= 0 && y <= 31) {
return 'river';
}
if ((x === 32 || x === 33) && y >= 2 && y <= 26) {
return 'river';
}
if ((x === 42 || x === 43) && y >= 31 && y <= 41) {
return 'river';
}
if (
(x >= 4 && x <= 19 && y >= 8 && y <= 26) ||
(x >= 20 && x <= 31 && y >= 13 && y <= 27) ||
(x >= 34 && x <= 48 && y >= 31 && y <= 41) ||
(x >= 46 && x <= 59 && y >= 26 && y <= 40)
) {
return 'forest';
}
if (
(x >= 0 && x <= 10 && y <= 14) ||
(x >= 20 && x <= 31 && y <= 12) ||
(x >= 33 && x <= 49 && y >= 3 && y <= 15) ||
(x >= 51 && x <= 59 && y <= 13) ||
(x >= 24 && x <= 35 && y >= 34 && y <= 41)
) {
return 'hill';
}
if ((x <= 2 && y <= 34) || (x >= 58 && y >= 24) || (x >= 46 && x <= 49 && y <= 10)) {
return 'cliff';
}
return 'plain';
})
);
}
function createThirtyFirstBattleTerrain(): TerrainType[][] {
return Array.from({ length: 44 }, (_, y) =>
Array.from({ length: 62 }, (_, x): TerrainType => {
if (x <= 4 && y >= 37) {
return 'camp';
}
if (
(x >= 47 && x <= 60 && y >= 13 && y <= 25) ||
(x >= 43 && x <= 52 && y >= 9 && y <= 17) ||
(x >= 52 && x <= 60 && y >= 17 && y <= 28)
) {
return 'fort';
}
if (
(x >= 18 && x <= 21 && y >= 35 && y <= 37) ||
(x >= 35 && x <= 37 && y >= 29 && y <= 31) ||
(x >= 45 && x <= 47 && y >= 24 && y <= 26)
) {
return 'village';
}
if (
(y >= 39 && x >= 4 && x <= 18) ||
(x >= 17 && x <= 30 && y >= 35 && y <= 39) ||
(x >= 29 && x <= 42 && y >= 30 && y <= 35) ||
(x >= 41 && x <= 52 && y >= 24 && y <= 30) ||
(x >= 51 && x <= 59 && y >= 19 && y <= 24) ||
(x >= 56 && x <= 60 && y >= 18 && y <= 20)
) {
return 'road';
}
if ((x === 13 || x === 14) && y >= 0 && y <= 33) {
return 'river';
}
if ((x === 33 || x === 34) && y >= 4 && y <= 28) {
return 'river';
}
if ((x === 44 || x === 45) && y >= 31 && y <= 43) {
return 'river';
}
if (
(x >= 4 && x <= 20 && y >= 8 && y <= 28) ||
(x >= 21 && x <= 32 && y >= 14 && y <= 29) ||
(x >= 35 && x <= 49 && y >= 32 && y <= 43) ||
(x >= 47 && x <= 61 && y >= 28 && y <= 42)
) {
return 'forest';
}
if (
(x >= 0 && x <= 11 && y <= 15) ||
(x >= 21 && x <= 32 && y <= 13) ||
(x >= 34 && x <= 50 && y >= 2 && y <= 14) ||
(x >= 53 && x <= 61 && y <= 12) ||
(x >= 25 && x <= 36 && y >= 36 && y <= 43)
) {
return 'hill';
}
if ((x <= 2 && y <= 36) || (x >= 60 && y >= 26) || (x >= 47 && x <= 50 && y <= 9)) {
return 'cliff';
}
return 'plain';
})
);
}
function createThirtySecondBattleTerrain(): TerrainType[][] {
return Array.from({ length: 46 }, (_, y) =>
Array.from({ length: 64 }, (_, x): TerrainType => {
if (x <= 4 && y >= 39) {
return 'camp';
}
if (
(x >= 49 && x <= 62 && y >= 12 && y <= 26) ||
(x >= 45 && x <= 54 && y >= 8 && y <= 17) ||
(x >= 54 && x <= 62 && y >= 17 && y <= 30) ||
(x >= 52 && x <= 58 && y >= 27 && y <= 32)
) {
return 'fort';
}
if (
(x >= 18 && x <= 21 && y >= 37 && y <= 39) ||
(x >= 36 && x <= 38 && y >= 31 && y <= 33) ||
(x >= 45 && x <= 47 && y >= 26 && y <= 28) ||
(x >= 55 && x <= 57 && y >= 29 && y <= 31)
) {
return 'village';
}
if (
(y >= 41 && x >= 4 && x <= 19) ||
(x >= 18 && x <= 31 && y >= 37 && y <= 41) ||
(x >= 30 && x <= 43 && y >= 32 && y <= 37) ||
(x >= 42 && x <= 54 && y >= 26 && y <= 32) ||
(x >= 53 && x <= 61 && y >= 20 && y <= 26) ||
(x >= 58 && x <= 62 && y >= 18 && y <= 21)
) {
return 'road';
}
if ((x === 14 || x === 15) && y >= 0 && y <= 35) {
return 'river';
}
if ((x === 35 || x === 36) && y >= 4 && y <= 30) {
return 'river';
}
if ((x === 46 || x === 47) && y >= 32 && y <= 45) {
return 'river';
}
if (
(x >= 4 && x <= 21 && y >= 8 && y <= 30) ||
(x >= 22 && x <= 34 && y >= 14 && y <= 31) ||
(x >= 37 && x <= 50 && y >= 33 && y <= 45) ||
(x >= 49 && x <= 63 && y >= 29 && y <= 44)
) {
return 'forest';
}
if (
(x >= 0 && x <= 12 && y <= 16) ||
(x >= 22 && x <= 34 && y <= 13) ||
(x >= 36 && x <= 52 && y >= 2 && y <= 14) ||
(x >= 55 && x <= 63 && y <= 12) ||
(x >= 26 && x <= 38 && y >= 38 && y <= 45)
) {
return 'hill';
}
if ((x <= 2 && y <= 38) || (x >= 62 && y >= 26) || (x >= 49 && x <= 52 && y <= 8)) {
return 'cliff';
}
return 'plain';
})
);
}
function createThirtyThirdBattleTerrain(): TerrainType[][] {
return Array.from({ length: 48 }, (_, y) =>
Array.from({ length: 66 }, (_, x): TerrainType => {
if (x <= 4 && y >= 41) {
return 'camp';
}
if (
(x >= 50 && x <= 64 && y >= 10 && y <= 27) ||
(x >= 46 && x <= 56 && y >= 7 && y <= 18) ||
(x >= 56 && x <= 65 && y >= 18 && y <= 32) ||
(x >= 53 && x <= 61 && y >= 29 && y <= 35)
) {
return 'fort';
}
if (
(x >= 18 && x <= 22 && y >= 39 && y <= 41) ||
(x >= 36 && x <= 39 && y >= 33 && y <= 35) ||
(x >= 46 && x <= 48 && y >= 28 && y <= 30) ||
(x >= 57 && x <= 60 && y >= 31 && y <= 34)
) {
return 'village';
}
if (
(y >= 43 && x >= 4 && x <= 20) ||
(x >= 19 && x <= 32 && y >= 39 && y <= 43) ||
(x >= 31 && x <= 44 && y >= 34 && y <= 39) ||
(x >= 43 && x <= 55 && y >= 28 && y <= 34) ||
(x >= 54 && x <= 63 && y >= 22 && y <= 28) ||
(x >= 59 && x <= 65 && y >= 19 && y <= 23)
) {
return 'road';
}
if ((x === 15 || x === 16) && y >= 0 && y <= 37) {
return 'river';
}
if ((x === 36 || x === 37) && y >= 4 && y <= 32) {
return 'river';
}
if ((x === 48 || x === 49) && y >= 34 && y <= 47) {
return 'river';
}
if (
(x >= 4 && x <= 22 && y >= 8 && y <= 32) ||
(x >= 23 && x <= 35 && y >= 14 && y <= 33) ||
(x >= 38 && x <= 52 && y >= 35 && y <= 47) ||
(x >= 51 && x <= 65 && y >= 31 && y <= 46)
) {
return 'forest';
}
if (
(x >= 0 && x <= 13 && y <= 17) ||
(x >= 23 && x <= 35 && y <= 13) ||
(x >= 37 && x <= 54 && y >= 2 && y <= 14) ||
(x >= 57 && x <= 65 && y <= 12) ||
(x >= 27 && x <= 40 && y >= 40 && y <= 47)
) {
return 'hill';
}
if ((x <= 2 && y <= 40) || (x >= 64 && y >= 28) || (x >= 50 && x <= 53 && y <= 8)) {
return 'cliff';
}
return 'plain';
})
);
}
function createThirtyFourthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 50 }, (_, y) =>
Array.from({ length: 68 }, (_, x): TerrainType => {
if (x <= 4 && y >= 43) {
return 'camp';
}
if (
(x >= 51 && x <= 66 && y >= 11 && y <= 28) ||
(x >= 47 && x <= 58 && y >= 7 && y <= 18) ||
(x >= 57 && x <= 67 && y >= 20 && y <= 34) ||
(x >= 54 && x <= 61 && y >= 31 && y <= 37)
) {
return 'fort';
}
if (
(x >= 18 && x <= 22 && y >= 41 && y <= 43) ||
(x >= 37 && x <= 40 && y >= 35 && y <= 37) ||
(x >= 47 && x <= 49 && y >= 30 && y <= 32) ||
(x >= 58 && x <= 61 && y >= 33 && y <= 36)
) {
return 'village';
}
if (
(y >= 45 && x >= 4 && x <= 22) ||
(x >= 21 && x <= 34 && y >= 41 && y <= 45) ||
(x >= 33 && x <= 46 && y >= 36 && y <= 41) ||
(x >= 45 && x <= 57 && y >= 30 && y <= 36) ||
(x >= 56 && x <= 65 && y >= 24 && y <= 30) ||
(x >= 60 && x <= 67 && y >= 20 && y <= 24)
) {
return 'road';
}
if ((x === 15 || x === 16) && y >= 0 && y <= 39) {
return 'river';
}
if ((x === 37 || x === 38) && y >= 3 && y <= 34) {
return 'river';
}
if ((x === 49 || x === 50) && y >= 36 && y <= 49) {
return 'river';
}
if (
(x >= 4 && x <= 23 && y >= 8 && y <= 34) ||
(x >= 24 && x <= 36 && y >= 15 && y <= 35) ||
(x >= 40 && x <= 54 && y >= 37 && y <= 49) ||
(x >= 52 && x <= 67 && y >= 33 && y <= 48)
) {
return 'forest';
}
if (
(x >= 0 && x <= 14 && y <= 19) ||
(x >= 24 && x <= 36 && y <= 14) ||
(x >= 38 && x <= 55 && y >= 1 && y <= 15) ||
(x >= 57 && x <= 67 && y <= 13) ||
(x >= 28 && x <= 42 && y >= 42 && y <= 49)
) {
return 'hill';
}
if (
(x <= 2 && y <= 42) ||
(x >= 65 && y >= 29) ||
(x >= 51 && x <= 54 && y <= 8) ||
(x >= 23 && x <= 27 && y >= 22 && y <= 32)
) {
return 'cliff';
}
return 'plain';
})
);
}
function createThirtyFifthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 52 }, (_, y) =>
Array.from({ length: 70 }, (_, x): TerrainType => {
if (x <= 4 && y >= 45) {
return 'camp';
}
if (
(x >= 52 && x <= 68 && y >= 12 && y <= 30) ||
(x >= 48 && x <= 60 && y >= 8 && y <= 19) ||
(x >= 58 && x <= 69 && y >= 22 && y <= 36) ||
(x >= 55 && x <= 63 && y >= 32 && y <= 39)
) {
return 'fort';
}
if (
(x >= 18 && x <= 22 && y >= 43 && y <= 45) ||
(x >= 38 && x <= 41 && y >= 37 && y <= 39) ||
(x >= 48 && x <= 50 && y >= 32 && y <= 34) ||
(x >= 60 && x <= 63 && y >= 35 && y <= 38)
) {
return 'village';
}
if (
(y >= 47 && x >= 4 && x <= 23) ||
(x >= 22 && x <= 35 && y >= 43 && y <= 47) ||
(x >= 34 && x <= 48 && y >= 38 && y <= 43) ||
(x >= 47 && x <= 59 && y >= 32 && y <= 38) ||
(x >= 58 && x <= 67 && y >= 26 && y <= 32) ||
(x >= 62 && x <= 69 && y >= 22 && y <= 26)
) {
return 'road';
}
if ((x === 16 || x === 17) && y >= 0 && y <= 41) {
return 'river';
}
if ((x === 39 || x === 40) && y >= 3 && y <= 36) {
return 'river';
}
if ((x === 50 || x === 51) && y >= 37 && y <= 51) {
return 'river';
}
if (
(x >= 4 && x <= 24 && y >= 8 && y <= 36) ||
(x >= 25 && x <= 38 && y >= 15 && y <= 37) ||
(x >= 41 && x <= 55 && y >= 39 && y <= 51) ||
(x >= 53 && x <= 69 && y >= 35 && y <= 50)
) {
return 'forest';
}
if (
(x >= 0 && x <= 15 && y <= 20) ||
(x >= 25 && x <= 38 && y <= 14) ||
(x >= 39 && x <= 56 && y >= 1 && y <= 16) ||
(x >= 58 && x <= 69 && y <= 14) ||
(x >= 29 && x <= 43 && y >= 44 && y <= 51)
) {
return 'hill';
}
if (
(x <= 2 && y <= 44) ||
(x >= 67 && y >= 31) ||
(x >= 52 && x <= 55 && y <= 8) ||
(x >= 24 && x <= 28 && y >= 23 && y <= 34)
) {
return 'cliff';
}
return 'plain';
})
);
}
function createThirtySixthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 54 }, (_, y) =>
Array.from({ length: 72 }, (_, x): TerrainType => {
if (x <= 4 && y >= 47) {
return 'camp';
}
if (
(x >= 54 && x <= 70 && y >= 12 && y <= 31) ||
(x >= 50 && x <= 62 && y >= 8 && y <= 20) ||
(x >= 60 && x <= 71 && y >= 23 && y <= 38) ||
(x >= 57 && x <= 65 && y >= 34 && y <= 41)
) {
return 'fort';
}
if (
(x >= 19 && x <= 23 && y >= 45 && y <= 47) ||
(x >= 39 && x <= 42 && y >= 39 && y <= 41) ||
(x >= 50 && x <= 52 && y >= 34 && y <= 36) ||
(x >= 62 && x <= 65 && y >= 37 && y <= 40)
) {
return 'village';
}
if (
(y >= 49 && x >= 4 && x <= 24) ||
(x >= 23 && x <= 36 && y >= 45 && y <= 49) ||
(x >= 35 && x <= 50 && y >= 40 && y <= 45) ||
(x >= 49 && x <= 61 && y >= 34 && y <= 40) ||
(x >= 60 && x <= 69 && y >= 28 && y <= 34) ||
(x >= 64 && x <= 71 && y >= 24 && y <= 28)
) {
return 'road';
}
if ((x === 17 || x === 18) && y >= 0 && y <= 43) {
return 'river';
}
if ((x === 40 || x === 41) && y >= 3 && y <= 38) {
return 'river';
}
if ((x === 52 || x === 53) && y >= 39 && y <= 53) {
return 'river';
}
if (
(x >= 4 && x <= 25 && y >= 8 && y <= 38) ||
(x >= 26 && x <= 39 && y >= 15 && y <= 39) ||
(x >= 43 && x <= 57 && y >= 41 && y <= 53) ||
(x >= 55 && x <= 71 && y >= 37 && y <= 52)
) {
return 'forest';
}
if (
(x >= 0 && x <= 16 && y <= 22) ||
(x >= 26 && x <= 39 && y <= 14) ||
(x >= 40 && x <= 58 && y >= 1 && y <= 17) ||
(x >= 60 && x <= 71 && y <= 15) ||
(x >= 30 && x <= 44 && y >= 46 && y <= 53)
) {
return 'hill';
}
if (
(x <= 2 && y <= 46) ||
(x >= 69 && y >= 33) ||
(x >= 54 && x <= 57 && y <= 8) ||
(x >= 25 && x <= 29 && y >= 24 && y <= 36)
) {
return 'cliff';
}
return 'plain';
})
);
}
function createThirtySeventhBattleTerrain(): TerrainType[][] {
return Array.from({ length: 56 }, (_, y) =>
Array.from({ length: 74 }, (_, x): TerrainType => {
if (x <= 4 && y >= 49) {
return 'camp';
}
if (
(x >= 56 && x <= 72 && y >= 9 && y <= 30) ||
(x >= 50 && x <= 64 && y >= 6 && y <= 19) ||
(x >= 61 && x <= 73 && y >= 24 && y <= 39) ||
(x >= 64 && x <= 72 && y >= 16 && y <= 23)
) {
return 'fort';
}
if (
(x >= 18 && x <= 22 && y >= 47 && y <= 50) ||
(x >= 40 && x <= 44 && y >= 40 && y <= 43) ||
(x >= 53 && x <= 56 && y >= 34 && y <= 37) ||
(x >= 66 && x <= 69 && y >= 36 && y <= 39)
) {
return 'village';
}
if (
(y >= 51 && x >= 4 && x <= 24) ||
(x >= 23 && x <= 38 && y >= 46 && y <= 51) ||
(x >= 37 && x <= 52 && y >= 41 && y <= 46) ||
(x >= 51 && x <= 64 && y >= 35 && y <= 41) ||
(x >= 63 && x <= 72 && y >= 29 && y <= 35) ||
(x >= 67 && x <= 73 && y >= 22 && y <= 29) ||
(x >= 58 && x <= 72 && y >= 16 && y <= 20)
) {
return 'road';
}
if ((x === 17 || x === 18) && y >= 0 && y <= 45) {
return 'river';
}
if ((x === 42 || x === 43) && y >= 4 && y <= 39) {
return 'river';
}
if ((x === 54 || x === 55) && y >= 39 && y <= 55) {
return 'river';
}
if (
(x >= 4 && x <= 25 && y >= 8 && y <= 39) ||
(x >= 27 && x <= 40 && y >= 16 && y <= 41) ||
(x >= 45 && x <= 59 && y >= 42 && y <= 55) ||
(x >= 57 && x <= 73 && y >= 39 && y <= 54)
) {
return 'forest';
}
if (
(x >= 0 && x <= 16 && y <= 24) ||
(x >= 26 && x <= 41 && y <= 15) ||
(x >= 42 && x <= 60 && y >= 1 && y <= 18) ||
(x >= 62 && x <= 73 && y <= 15) ||
(x >= 30 && x <= 46 && y >= 48 && y <= 55)
) {
return 'hill';
}
if (
(x <= 2 && y <= 48) ||
(x >= 71 && y >= 35) ||
(x >= 55 && x <= 58 && y <= 8) ||
(x >= 25 && x <= 30 && y >= 25 && y <= 38)
) {
return 'cliff';
}
return 'plain';
})
);
}
function createThirtyEighthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 58 }, (_, y) =>
Array.from({ length: 76 }, (_, x): TerrainType => {
if (x <= 5 && y >= 51) {
return 'camp';
}
if (
(x >= 58 && x <= 74 && y >= 8 && y <= 27) ||
(x >= 51 && x <= 63 && y >= 9 && y <= 22) ||
(x >= 64 && x <= 75 && y >= 21 && y <= 38) ||
(x >= 66 && x <= 72 && y >= 34 && y <= 42)
) {
return 'fort';
}
if (
(x >= 20 && x <= 24 && y >= 48 && y <= 52) ||
(x >= 41 && x <= 45 && y >= 41 && y <= 44) ||
(x >= 55 && x <= 59 && y >= 35 && y <= 38) ||
(x >= 69 && x <= 72 && y >= 39 && y <= 42)
) {
return 'village';
}
if (
(y >= 53 && x >= 5 && x <= 25) ||
(x >= 24 && x <= 40 && y >= 48 && y <= 53) ||
(x >= 39 && x <= 54 && y >= 42 && y <= 48) ||
(x >= 53 && x <= 66 && y >= 36 && y <= 42) ||
(x >= 65 && x <= 74 && y >= 28 && y <= 36) ||
(x >= 68 && x <= 75 && y >= 19 && y <= 28)
) {
return 'road';
}
if ((x === 18 || x === 19 || x === 20) && y >= 0 && y <= 49) {
return 'river';
}
if ((x === 46 || x === 47) && y >= 5 && y <= 42) {
return 'river';
}
if ((x === 57 || x === 58) && y >= 39 && y <= 57) {
return 'river';
}
if (
(x >= 4 && x <= 27 && y >= 9 && y <= 41) ||
(x >= 28 && x <= 42 && y >= 17 && y <= 44) ||
(x >= 47 && x <= 62 && y >= 43 && y <= 57) ||
(x >= 59 && x <= 75 && y >= 40 && y <= 56)
) {
return 'forest';
}
if (
(x >= 0 && x <= 17 && y <= 25) ||
(x >= 27 && x <= 44 && y <= 16) ||
(x >= 45 && x <= 63 && y >= 1 && y <= 18) ||
(x >= 64 && x <= 75 && y <= 14) ||
(x >= 31 && x <= 48 && y >= 50 && y <= 57)
) {
return 'hill';
}
if (
(x <= 2 && y <= 50) ||
(x >= 73 && y >= 35) ||
(x >= 56 && x <= 60 && y <= 8) ||
(x >= 26 && x <= 31 && y >= 26 && y <= 39)
) {
return 'cliff';
}
return 'plain';
})
);
}
function createThirtyNinthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 60 }, (_, y) =>
Array.from({ length: 78 }, (_, x): TerrainType => {
if (x <= 6 && y >= 53) {
return 'camp';
}
if (
(x >= 60 && x <= 77 && y >= 6 && y <= 24) ||
(x >= 53 && x <= 65 && y >= 9 && y <= 22) ||
(x >= 66 && x <= 77 && y >= 20 && y <= 38) ||
(x >= 68 && x <= 74 && y >= 34 && y <= 44)
) {
return 'fort';
}
if (
(x >= 21 && x <= 25 && y >= 50 && y <= 54) ||
(x >= 42 && x <= 46 && y >= 43 && y <= 46) ||
(x >= 56 && x <= 60 && y >= 36 && y <= 40) ||
(x >= 70 && x <= 73 && y >= 40 && y <= 44)
) {
return 'village';
}
if (
(y >= 55 && x >= 6 && x <= 27) ||
(x >= 26 && x <= 42 && y >= 50 && y <= 55) ||
(x >= 41 && x <= 56 && y >= 44 && y <= 50) ||
(x >= 55 && x <= 68 && y >= 38 && y <= 44) ||
(x >= 67 && x <= 76 && y >= 30 && y <= 38) ||
(x >= 70 && x <= 77 && y >= 18 && y <= 30) ||
(x >= 58 && x <= 75 && y >= 16 && y <= 20)
) {
return 'road';
}
if ((x === 19 || x === 20 || x === 21) && y >= 0 && y <= 51) {
return 'river';
}
if ((x === 48 || x === 49) && y >= 6 && y <= 44) {
return 'river';
}
if ((x === 59 || x === 60) && y >= 40 && y <= 59) {
return 'river';
}
if (
(x >= 4 && x <= 28 && y >= 10 && y <= 42) ||
(x >= 29 && x <= 44 && y >= 18 && y <= 46) ||
(x >= 49 && x <= 64 && y >= 44 && y <= 59) ||
(x >= 61 && x <= 77 && y >= 41 && y <= 58)
) {
return 'forest';
}
if (
(x >= 0 && x <= 18 && y <= 26) ||
(x >= 28 && x <= 46 && y <= 17) ||
(x >= 47 && x <= 65 && y >= 1 && y <= 19) ||
(x >= 66 && x <= 77 && y <= 14) ||
(x >= 32 && x <= 50 && y >= 52 && y <= 59)
) {
return 'hill';
}
if (
(x <= 2 && y <= 52) ||
(x >= 75 && y >= 36) ||
(x >= 58 && x <= 62 && y <= 8) ||
(x >= 27 && x <= 32 && y >= 27 && y <= 41)
) {
return 'cliff';
}
return 'plain';
})
);
}
function createFortiethBattleTerrain(): TerrainType[][] {
return Array.from({ length: 62 }, (_, y) =>
Array.from({ length: 80 }, (_, x): TerrainType => {
if (x <= 6 && y >= 55) {
return 'camp';
}
if (
(x >= 62 && x <= 79 && y >= 6 && y <= 22) ||
(x >= 55 && x <= 68 && y >= 10 && y <= 24) ||
(x >= 68 && x <= 79 && y >= 22 && y <= 39) ||
(x >= 70 && x <= 76 && y >= 36 && y <= 45)
) {
return 'fort';
}
if (
(x >= 22 && x <= 26 && y >= 52 && y <= 56) ||
(x >= 44 && x <= 48 && y >= 45 && y <= 48) ||
(x >= 58 && x <= 62 && y >= 38 && y <= 42) ||
(x >= 72 && x <= 75 && y >= 42 && y <= 46)
) {
return 'village';
}
if (
(x >= 19 && x <= 23 && y >= 0 && y <= 53) ||
(x >= 34 && x <= 37 && y >= 13 && y <= 58) ||
(x >= 50 && x <= 53 && y >= 4 && y <= 47) ||
(x >= 60 && x <= 62 && y >= 41 && y <= 61) ||
(y >= 30 && y <= 33 && x >= 22 && x <= 62)
) {
return 'river';
}
if (
(y >= 57 && x >= 6 && x <= 29) ||
(x >= 28 && x <= 44 && y >= 52 && y <= 57) ||
(x >= 43 && x <= 58 && y >= 46 && y <= 52) ||
(x >= 57 && x <= 70 && y >= 40 && y <= 46) ||
(x >= 69 && x <= 78 && y >= 32 && y <= 40) ||
(x >= 72 && x <= 79 && y >= 18 && y <= 32) ||
(x >= 58 && x <= 77 && y >= 16 && y <= 20) ||
(y >= 26 && y <= 29 && x >= 22 && x <= 72)
) {
return 'road';
}
if (
(x >= 4 && x <= 29 && y >= 11 && y <= 43) ||
(x >= 30 && x <= 46 && y >= 19 && y <= 48) ||
(x >= 52 && x <= 66 && y >= 46 && y <= 61) ||
(x >= 63 && x <= 79 && y >= 42 && y <= 60)
) {
return 'forest';
}
if (
(x >= 0 && x <= 18 && y <= 28) ||
(x >= 28 && x <= 48 && y <= 18) ||
(x >= 49 && x <= 67 && y >= 1 && y <= 20) ||
(x >= 68 && x <= 79 && y <= 15) ||
(x >= 33 && x <= 52 && y >= 54 && y <= 61)
) {
return 'hill';
}
if (
(x <= 2 && y <= 54) ||
(x >= 77 && y >= 37) ||
(x >= 60 && x <= 64 && y <= 8) ||
(x >= 27 && x <= 33 && y >= 28 && y <= 43)
) {
return 'cliff';
}
return 'plain';
})
);
}
function createFortyFirstBattleTerrain(): TerrainType[][] {
return Array.from({ length: 64 }, (_, y) =>
Array.from({ length: 82 }, (_, x): TerrainType => {
if (x <= 6 && y >= 57) {
return 'camp';
}
if (
(x >= 60 && x <= 81 && y >= 5 && y <= 24) ||
(x >= 54 && x <= 70 && y >= 12 && y <= 27) ||
(x >= 68 && x <= 81 && y >= 23 && y <= 41) ||
(x >= 73 && x <= 80 && y >= 37 && y <= 47) ||
(x >= 75 && x <= 81 && y >= 8 && y <= 17)
) {
return 'fort';
}
if (
(x >= 22 && x <= 26 && y >= 54 && y <= 58) ||
(x >= 45 && x <= 49 && y >= 47 && y <= 50) ||
(x >= 58 && x <= 62 && y >= 40 && y <= 44) ||
(x >= 72 && x <= 76 && y >= 44 && y <= 48)
) {
return 'village';
}
if (
(x >= 18 && x <= 22 && y >= 0 && y <= 55) ||
(x >= 34 && x <= 36 && y >= 12 && y <= 60) ||
(x >= 51 && x <= 54 && y >= 5 && y <= 49) ||
(x >= 63 && x <= 65 && y >= 41 && y <= 63) ||
(y >= 31 && y <= 34 && x >= 21 && x <= 65) ||
(x >= 70 && x <= 72 && y >= 16 && y <= 44)
) {
return 'river';
}
if (
(y >= 59 && x >= 6 && x <= 31) ||
(x >= 30 && x <= 46 && y >= 54 && y <= 59) ||
(x >= 45 && x <= 60 && y >= 48 && y <= 54) ||
(x >= 59 && x <= 72 && y >= 42 && y <= 48) ||
(x >= 71 && x <= 80 && y >= 34 && y <= 42) ||
(x >= 74 && x <= 81 && y >= 19 && y <= 34) ||
(x >= 58 && x <= 79 && y >= 17 && y <= 21) ||
(y >= 27 && y <= 30 && x >= 22 && x <= 74) ||
(x >= 37 && x <= 56 && y >= 37 && y <= 40)
) {
return 'road';
}
if (
(x >= 4 && x <= 29 && y >= 12 && y <= 45) ||
(x >= 30 && x <= 47 && y >= 20 && y <= 50) ||
(x >= 52 && x <= 68 && y >= 47 && y <= 63) ||
(x >= 64 && x <= 81 && y >= 43 && y <= 62)
) {
return 'forest';
}
if (
(x >= 0 && x <= 17 && y <= 29) ||
(x >= 28 && x <= 49 && y <= 19) ||
(x >= 50 && x <= 69 && y >= 1 && y <= 21) ||
(x >= 70 && x <= 81 && y <= 16) ||
(x >= 33 && x <= 53 && y >= 56 && y <= 63)
) {
return 'hill';
}
if (
(x <= 2 && y <= 56) ||
(x >= 79 && y >= 38) ||
(x >= 61 && x <= 66 && y <= 9) ||
(x >= 27 && x <= 33 && y >= 29 && y <= 45) ||
(x >= 68 && x <= 70 && y >= 45 && y <= 57)
) {
return 'cliff';
}
return 'plain';
})
);
}
function createFortySecondBattleTerrain(): TerrainType[][] {
return Array.from({ length: 66 }, (_, y) =>
Array.from({ length: 84 }, (_, x): TerrainType => {
if (x <= 7 && y >= 58) {
return 'camp';
}
if (
(x >= 57 && x <= 68 && y >= 39 && y <= 51) ||
(x >= 64 && x <= 76 && y >= 27 && y <= 39) ||
(x >= 72 && x <= 83 && y >= 14 && y <= 29) ||
(x >= 76 && x <= 83 && y >= 6 && y <= 16)
) {
return 'fort';
}
if (
(x >= 21 && x <= 26 && y >= 55 && y <= 60) ||
(x >= 43 && x <= 49 && y >= 49 && y <= 53) ||
(x >= 58 && x <= 64 && y >= 43 && y <= 47) ||
(x >= 72 && x <= 78 && y >= 35 && y <= 40)
) {
return 'village';
}
if (
(x >= 16 && x <= 22 && y >= 0 && y <= 57) ||
(x >= 35 && x <= 39 && y >= 9 && y <= 64) ||
(x >= 54 && x <= 58 && y >= 4 && y <= 53) ||
(x >= 70 && x <= 73 && y >= 18 && y <= 46) ||
(y >= 34 && y <= 38 && x >= 22 && x <= 72) ||
(y >= 51 && y <= 54 && x >= 36 && x <= 66)
) {
return 'river';
}
if (
(y >= 60 && x >= 7 && x <= 32) ||
(x >= 31 && x <= 47 && y >= 55 && y <= 60) ||
(x >= 46 && x <= 62 && y >= 49 && y <= 55) ||
(x >= 61 && x <= 73 && y >= 42 && y <= 49) ||
(x >= 72 && x <= 82 && y >= 33 && y <= 42) ||
(x >= 75 && x <= 83 && y >= 20 && y <= 33) ||
(x >= 58 && x <= 81 && y >= 17 && y <= 21) ||
(y >= 28 && y <= 31 && x >= 22 && x <= 75)
) {
return 'road';
}
if (
(x >= 4 && x <= 30 && y >= 13 && y <= 47) ||
(x >= 30 && x <= 49 && y >= 20 && y <= 52) ||
(x >= 53 && x <= 70 && y >= 48 && y <= 65) ||
(x >= 66 && x <= 83 && y >= 42 && y <= 64)
) {
return 'forest';
}
if (
(x >= 0 && x <= 15 && y <= 30) ||
(x >= 28 && x <= 50 && y <= 20) ||
(x >= 50 && x <= 70 && y >= 0 && y <= 22) ||
(x >= 71 && x <= 83 && y <= 13) ||
(x >= 33 && x <= 54 && y >= 58 && y <= 65)
) {
return 'hill';
}
if (
(x <= 2 && y <= 57) ||
(x >= 81 && y >= 37) ||
(x >= 62 && x <= 67 && y <= 10) ||
(x >= 27 && x <= 34 && y >= 30 && y <= 46) ||
(x >= 68 && x <= 70 && y >= 47 && y <= 58)
) {
return 'cliff';
}
return 'plain';
})
);
}
function createFortyThirdBattleTerrain(): TerrainType[][] {
return Array.from({ length: 68 }, (_, y) =>
Array.from({ length: 86 }, (_, x): TerrainType => {
if (x <= 8 && y >= 60) {
return 'camp';
}
if (
(x >= 58 && x <= 70 && y >= 41 && y <= 54) ||
(x >= 66 && x <= 79 && y >= 29 && y <= 41) ||
(x >= 74 && x <= 85 && y >= 16 && y <= 31) ||
(x >= 78 && x <= 85 && y >= 7 && y <= 17) ||
(x >= 70 && x <= 76 && y >= 45 && y <= 54)
) {
return 'fort';
}
if (
(x >= 22 && x <= 28 && y >= 57 && y <= 62) ||
(x >= 44 && x <= 51 && y >= 51 && y <= 55) ||
(x >= 60 && x <= 66 && y >= 45 && y <= 49) ||
(x >= 74 && x <= 80 && y >= 37 && y <= 42) ||
(x >= 78 && x <= 84 && y >= 23 && y <= 27)
) {
return 'village';
}
if (
(x >= 15 && x <= 22 && y >= 0 && y <= 59) ||
(x >= 36 && x <= 41 && y >= 8 && y <= 66) ||
(x >= 55 && x <= 60 && y >= 3 && y <= 55) ||
(x >= 71 && x <= 75 && y >= 17 && y <= 48) ||
(y >= 35 && y <= 39 && x >= 22 && x <= 74) ||
(y >= 53 && y <= 56 && x >= 38 && x <= 69)
) {
return 'river';
}
if (
(y >= 62 && x >= 8 && x <= 34) ||
(x >= 33 && x <= 49 && y >= 57 && y <= 62) ||
(x >= 48 && x <= 64 && y >= 51 && y <= 57) ||
(x >= 63 && x <= 75 && y >= 44 && y <= 51) ||
(x >= 74 && x <= 84 && y >= 35 && y <= 44) ||
(x >= 77 && x <= 85 && y >= 21 && y <= 35) ||
(x >= 59 && x <= 83 && y >= 18 && y <= 22) ||
(y >= 29 && y <= 32 && x >= 22 && x <= 77) ||
(x >= 49 && x <= 68 && y >= 40 && y <= 43)
) {
return 'road';
}
if (
(x >= 4 && x <= 31 && y >= 14 && y <= 49) ||
(x >= 30 && x <= 51 && y >= 21 && y <= 54) ||
(x >= 54 && x <= 72 && y >= 50 && y <= 67) ||
(x >= 68 && x <= 85 && y >= 44 && y <= 66)
) {
return 'forest';
}
if (
(x >= 0 && x <= 14 && y <= 31) ||
(x >= 28 && x <= 52 && y <= 21) ||
(x >= 51 && x <= 72 && y >= 0 && y <= 23) ||
(x >= 73 && x <= 85 && y <= 15) ||
(x >= 34 && x <= 56 && y >= 60 && y <= 67)
) {
return 'hill';
}
if (
(x <= 2 && y <= 59) ||
(x >= 83 && y >= 39) ||
(x >= 64 && x <= 69 && y <= 11) ||
(x >= 27 && x <= 35 && y >= 31 && y <= 48) ||
(x >= 69 && x <= 71 && y >= 49 && y <= 60)
) {
return 'cliff';
}
return 'plain';
})
);
}
function createFortyFourthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 70 }, (_, y) =>
Array.from({ length: 88 }, (_, x): TerrainType => {
if (x >= 27 && x <= 39 && y >= 33 && y <= 46) {
return 'fort';
}
if (
(x >= 31 && x <= 35 && y >= 36 && y <= 42) ||
(x >= 44 && x <= 49 && y >= 50 && y <= 56) ||
(x >= 12 && x <= 18 && y >= 45 && y <= 51) ||
(x >= 60 && x <= 66 && y >= 22 && y <= 28)
) {
return 'village';
}
if (
(x >= 36 && x <= 42 && y >= 48 && y <= 69) ||
(x >= 43 && x <= 50 && y >= 55 && y <= 69) ||
(x >= 51 && x <= 57 && y >= 61 && y <= 69) ||
(x >= 0 && x <= 9 && y >= 28 && y <= 69)
) {
return 'river';
}
if (
(x >= 1 && x <= 31 && y >= 39 && y <= 43) ||
(x >= 29 && x <= 57 && y >= 37 && y <= 41) ||
(x >= 38 && x <= 82 && y >= 29 && y <= 33) ||
(x >= 44 && x <= 80 && y >= 48 && y <= 52) ||
(x >= 22 && x <= 32 && y >= 46 && y <= 62) ||
(x >= 55 && x <= 64 && y >= 18 && y <= 36)
) {
return 'road';
}
if (
(x >= 4 && x <= 26 && y >= 20 && y <= 56) ||
(x >= 18 && x <= 36 && y >= 4 && y <= 31) ||
(x >= 42 && x <= 66 && y >= 5 && y <= 25) ||
(x >= 58 && x <= 86 && y >= 34 && y <= 64)
) {
return 'forest';
}
if (
(x >= 0 && x <= 25 && y <= 21) ||
(x >= 34 && x <= 62 && y <= 15) ||
(x >= 67 && x <= 87 && y <= 31) ||
(x >= 58 && x <= 87 && y >= 60) ||
(x >= 12 && x <= 31 && y >= 56)
) {
return 'hill';
}
if (
(x <= 2 && y <= 27) ||
(x >= 85 && y >= 32) ||
(x >= 38 && x <= 43 && y <= 8) ||
(x >= 66 && x <= 70 && y >= 6 && y <= 31) ||
(x >= 9 && x <= 13 && y >= 52 && y <= 69) ||
(x >= 25 && x <= 27 && y >= 30 && y <= 49)
) {
return 'cliff';
}
if (
(x >= 24 && x <= 42 && y >= 30 && y <= 49) ||
(x >= 48 && x <= 60 && y >= 28 && y <= 44) ||
(x >= 14 && x <= 27 && y >= 34 && y <= 53)
) {
return 'camp';
}
return 'plain';
})
);
}
function createFortyFifthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 72 }, (_, y) =>
Array.from({ length: 90 }, (_, x): TerrainType => {
if (
(x >= 0 && x <= 89 && y >= 60) ||
(x >= 36 && x <= 48 && y >= 55 && y <= 71) ||
(x >= 58 && x <= 70 && y >= 63 && y <= 71)
) {
return 'river';
}
if (
(x >= 8 && x <= 18 && y >= 34 && y <= 45) ||
(x >= 48 && x <= 56 && y >= 38 && y <= 47) ||
(x >= 70 && x <= 78 && y >= 30 && y <= 39)
) {
return 'village';
}
if (
(x >= 1 && x <= 83 && y >= 34 && y <= 39) ||
(x >= 12 && x <= 87 && y >= 45 && y <= 49) ||
(x >= 21 && x <= 32 && y >= 28 && y <= 45) ||
(x >= 54 && x <= 63 && y >= 21 && y <= 45) ||
(x >= 68 && x <= 83 && y >= 25 && y <= 34)
) {
return 'road';
}
if (
(x >= 22 && x <= 52 && y >= 18 && y <= 53) ||
(x >= 42 && x <= 76 && y >= 24 && y <= 58) ||
(x >= 4 && x <= 27 && y >= 45 && y <= 59) ||
(x >= 70 && x <= 89 && y >= 40 && y <= 59)
) {
return 'forest';
}
if (
(x >= 0 && x <= 24 && y <= 28) ||
(x >= 32 && x <= 58 && y <= 20) ||
(x >= 64 && x <= 89 && y <= 26) ||
(x >= 78 && x <= 89 && y >= 27 && y <= 43)
) {
return 'hill';
}
if (
(x <= 2 && y <= 59) ||
(x >= 87 && y <= 55) ||
(x >= 29 && x <= 34 && y >= 0 && y <= 27) ||
(x >= 60 && x <= 64 && y >= 0 && y <= 24) ||
(x >= 31 && x <= 35 && y >= 50 && y <= 71)
) {
return 'cliff';
}
if (
(x >= 6 && x <= 21 && y >= 31 && y <= 50) ||
(x >= 47 && x <= 64 && y >= 32 && y <= 52) ||
(x >= 73 && x <= 87 && y >= 26 && y <= 42)
) {
return 'camp';
}
if (
(x >= 15 && x <= 22 && y >= 25 && y <= 31) ||
(x >= 78 && x <= 86 && y >= 44 && y <= 55)
) {
return 'fort';
}
return 'plain';
})
);
}
function createFortySixthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 74 }, (_, y) =>
Array.from({ length: 92 }, (_, x): TerrainType => {
if (
(x >= 0 && x <= 91 && y >= 62) ||
(x >= 44 && x <= 58 && y >= 56 && y <= 73) ||
(x >= 66 && x <= 78 && y >= 64 && y <= 73)
) {
return 'river';
}
if (
(x >= 11 && x <= 22 && y >= 38 && y <= 50) ||
(x >= 42 && x <= 55 && y >= 35 && y <= 49) ||
(x >= 68 && x <= 82 && y >= 27 && y <= 42)
) {
return 'camp';
}
if (
(x >= 1 && x <= 84 && y >= 38 && y <= 43) ||
(x >= 15 && x <= 88 && y >= 50 && y <= 54) ||
(x >= 24 && x <= 37 && y >= 31 && y <= 50) ||
(x >= 57 && x <= 67 && y >= 23 && y <= 50)
) {
return 'road';
}
if (
(x >= 25 && x <= 60 && y >= 18 && y <= 55) ||
(x >= 48 && x <= 78 && y >= 25 && y <= 60) ||
(x >= 4 && x <= 30 && y >= 48 && y <= 61) ||
(x >= 72 && x <= 91 && y >= 42 && y <= 61)
) {
return 'forest';
}
if (
(x >= 0 && x <= 26 && y <= 29) ||
(x >= 34 && x <= 60 && y <= 22) ||
(x >= 66 && x <= 91 && y <= 28) ||
(x >= 80 && x <= 91 && y >= 29 && y <= 44)
) {
return 'hill';
}
if (
(x <= 2 && y <= 61) ||
(x >= 89 && y <= 57) ||
(x >= 30 && x <= 35 && y >= 0 && y <= 30) ||
(x >= 62 && x <= 66 && y >= 0 && y <= 25) ||
(x >= 35 && x <= 39 && y >= 52 && y <= 73)
) {
return 'cliff';
}
if ((x >= 16 && x <= 23 && y >= 31 && y <= 37) || (x >= 76 && x <= 87 && y >= 45 && y <= 57)) {
return 'fort';
}
if ((x >= 9 && x <= 18 && y >= 52 && y <= 58) || (x >= 56 && x <= 63 && y >= 53 && y <= 59)) {
return 'village';
}
return 'plain';
})
);
}
function createFortySeventhBattleTerrain(): TerrainType[][] {
return Array.from({ length: 76 }, (_, y) =>
Array.from({ length: 94 }, (_, x): TerrainType => {
if (
(x >= 0 && x <= 93 && y >= 66) ||
(x >= 46 && x <= 58 && y >= 55 && y <= 75) ||
(x >= 10 && x <= 20 && y >= 59 && y <= 75)
) {
return 'river';
}
if (
(x >= 1 && x <= 86 && y >= 46 && y <= 51) ||
(x >= 20 && x <= 91 && y >= 57 && y <= 61) ||
(x >= 28 && x <= 39 && y >= 33 && y <= 57) ||
(x >= 61 && x <= 70 && y >= 24 && y <= 58)
) {
return 'road';
}
if (
(x >= 24 && x <= 64 && y >= 18 && y <= 62) ||
(x >= 48 && x <= 82 && y >= 27 && y <= 66) ||
(x >= 3 && x <= 31 && y >= 45 && y <= 65) ||
(x >= 72 && x <= 93 && y >= 38 && y <= 65)
) {
return 'forest';
}
if (
(x >= 0 && x <= 28 && y <= 32) ||
(x >= 36 && x <= 62 && y <= 22) ||
(x >= 66 && x <= 93 && y <= 30) ||
(x >= 82 && x <= 93 && y >= 29 && y <= 46)
) {
return 'hill';
}
if (
(x <= 2 && y <= 65) ||
(x >= 91 && y <= 60) ||
(x >= 31 && x <= 36 && y >= 0 && y <= 32) ||
(x >= 63 && x <= 68 && y >= 0 && y <= 26) ||
(x >= 37 && x <= 42 && y >= 56 && y <= 75)
) {
return 'cliff';
}
if (
(x >= 12 && x <= 23 && y >= 43 && y <= 55) ||
(x >= 42 && x <= 54 && y >= 38 && y <= 52) ||
(x >= 70 && x <= 84 && y >= 34 && y <= 49)
) {
return 'village';
}
if ((x >= 16 && x <= 25 && y >= 34 && y <= 42) || (x >= 76 && x <= 88 && y >= 50 && y <= 62)) {
return 'fort';
}
if ((x >= 54 && x <= 64 && y >= 52 && y <= 61) || (x >= 30 && x <= 40 && y >= 42 && y <= 50)) {
return 'camp';
}
return 'plain';
})
);
}
function createFortyEighthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 78 }, (_, y) =>
Array.from({ length: 96 }, (_, x): TerrainType => {
if (
(x >= 0 && x <= 95 && y >= 69) ||
(x >= 43 && x <= 55 && y >= 55 && y <= 77) ||
(x >= 3 && x <= 19 && y >= 60 && y <= 77) ||
(x >= 72 && x <= 82 && y >= 50 && y <= 68)
) {
return 'river';
}
if (
(x >= 3 && x <= 89 && y >= 53 && y <= 58) ||
(x >= 21 && x <= 92 && y >= 62 && y <= 66) ||
(x >= 27 && x <= 40 && y >= 37 && y <= 62) ||
(x >= 60 && x <= 72 && y >= 25 && y <= 63) ||
(x >= 73 && x <= 90 && y >= 35 && y <= 41)
) {
return 'road';
}
if (
(x >= 24 && x <= 68 && y >= 20 && y <= 67) ||
(x >= 50 && x <= 88 && y >= 27 && y <= 70) ||
(x >= 2 && x <= 34 && y >= 46 && y <= 68) ||
(x >= 74 && x <= 95 && y >= 38 && y <= 68)
) {
return 'forest';
}
if (
(x >= 0 && x <= 30 && y <= 35) ||
(x >= 35 && x <= 63 && y <= 25) ||
(x >= 66 && x <= 95 && y <= 31) ||
(x >= 84 && x <= 95 && y >= 29 && y <= 48)
) {
return 'hill';
}
if (
(x <= 2 && y <= 68) ||
(x >= 93 && y <= 62) ||
(x >= 31 && x <= 37 && y >= 0 && y <= 35) ||
(x >= 64 && x <= 70 && y >= 0 && y <= 28) ||
(x >= 38 && x <= 44 && y >= 58 && y <= 77)
) {
return 'cliff';
}
if (
(x >= 10 && x <= 24 && y >= 48 && y <= 60) ||
(x >= 46 && x <= 58 && y >= 41 && y <= 55) ||
(x >= 72 && x <= 87 && y >= 43 && y <= 55)
) {
return 'village';
}
if ((x >= 17 && x <= 28 && y >= 38 && y <= 47) || (x >= 77 && x <= 91 && y >= 31 && y <= 43)) {
return 'fort';
}
if ((x >= 54 && x <= 66 && y >= 54 && y <= 64) || (x >= 31 && x <= 43 && y >= 44 && y <= 53)) {
return 'camp';
}
return 'plain';
})
);
}
function createFortyNinthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 80 }, (_, y) =>
Array.from({ length: 98 }, (_, x): TerrainType => {
if (
(x >= 0 && x <= 97 && y >= 72) ||
(x >= 56 && x <= 62 && y >= 24 && y <= 72) ||
(x >= 4 && x <= 25 && y >= 64 && y <= 79) ||
(x >= 73 && x <= 88 && y >= 54 && y <= 72)
) {
return 'river';
}
if (
(x >= 8 && x <= 91 && y >= 59 && y <= 65) ||
(x >= 25 && x <= 70 && y >= 39 && y <= 45) ||
(x >= 67 && x <= 92 && y >= 31 && y <= 36) ||
(x >= 34 && x <= 42 && y >= 36 && y <= 68)
) {
return 'road';
}
if (
(x >= 20 && x <= 68 && y >= 20 && y <= 70) ||
(x >= 52 && x <= 91 && y >= 25 && y <= 66) ||
(x >= 2 && x <= 34 && y >= 46 && y <= 70) ||
(x >= 74 && x <= 97 && y >= 38 && y <= 69)
) {
return 'forest';
}
if (
(x >= 0 && x <= 27 && y <= 35) ||
(x >= 31 && x <= 65 && y <= 25) ||
(x >= 68 && x <= 97 && y <= 33) ||
(x >= 84 && x <= 97 && y >= 31 && y <= 51)
) {
return 'hill';
}
if (
(x <= 2 && y <= 70) ||
(x >= 95 && y <= 66) ||
(x >= 28 && x <= 34 && y >= 0 && y <= 36) ||
(x >= 65 && x <= 71 && y >= 0 && y <= 30) ||
(x >= 40 && x <= 46 && y >= 60 && y <= 79)
) {
return 'cliff';
}
if (
(x >= 9 && x <= 23 && y >= 55 && y <= 67) ||
(x >= 36 && x <= 50 && y >= 40 && y <= 52) ||
(x >= 72 && x <= 87 && y >= 45 && y <= 57)
) {
return 'village';
}
if ((x >= 22 && x <= 35 && y >= 47 && y <= 58) || (x >= 60 && x <= 74 && y >= 52 && y <= 64)) {
return 'camp';
}
if ((x >= 46 && x <= 60 && y >= 28 && y <= 38) || (x >= 70 && x <= 88 && y >= 28 && y <= 41)) {
return 'fort';
}
return 'plain';
})
);
}
function createFiftiethBattleTerrain(): TerrainType[][] {
return Array.from({ length: 82 }, (_, y) =>
Array.from({ length: 100 }, (_, x): TerrainType => {
if (
(x >= 0 && x <= 99 && y >= 74) ||
(x >= 58 && x <= 64 && y >= 25 && y <= 74) ||
(x >= 4 && x <= 27 && y >= 66 && y <= 81) ||
(x >= 74 && x <= 90 && y >= 56 && y <= 74)
) {
return 'river';
}
if (
(x >= 8 && x <= 94 && y >= 61 && y <= 67) ||
(x >= 26 && x <= 72 && y >= 40 && y <= 47) ||
(x >= 68 && x <= 94 && y >= 32 && y <= 38) ||
(x >= 35 && x <= 43 && y >= 37 && y <= 70)
) {
return 'road';
}
if (
(x >= 19 && x <= 70 && y >= 19 && y <= 72) ||
(x >= 54 && x <= 94 && y >= 26 && y <= 68) ||
(x >= 2 && x <= 36 && y >= 48 && y <= 72) ||
(x >= 76 && x <= 99 && y >= 39 && y <= 71)
) {
return 'forest';
}
if (
(x >= 0 && x <= 29 && y <= 36) ||
(x >= 32 && x <= 67 && y <= 26) ||
(x >= 69 && x <= 99 && y <= 35) ||
(x >= 85 && x <= 99 && y >= 32 && y <= 53)
) {
return 'hill';
}
if (
(x <= 2 && y <= 72) ||
(x >= 97 && y <= 68) ||
(x >= 29 && x <= 35 && y >= 0 && y <= 38) ||
(x >= 66 && x <= 72 && y >= 0 && y <= 31) ||
(x >= 41 && x <= 47 && y >= 62 && y <= 81)
) {
return 'cliff';
}
if (
(x >= 9 && x <= 24 && y >= 57 && y <= 69) ||
(x >= 37 && x <= 52 && y >= 41 && y <= 54) ||
(x >= 74 && x <= 89 && y >= 47 && y <= 59)
) {
return 'village';
}
if ((x >= 22 && x <= 36 && y >= 49 && y <= 60) || (x >= 61 && x <= 76 && y >= 54 && y <= 66)) {
return 'camp';
}
if ((x >= 46 && x <= 61 && y >= 29 && y <= 40) || (x >= 71 && x <= 90 && y >= 30 && y <= 43)) {
return 'fort';
}
return 'plain';
})
);
}
function createFiftyFirstBattleTerrain(): TerrainType[][] {
return Array.from({ length: 84 }, (_, y) =>
Array.from({ length: 102 }, (_, x): TerrainType => {
if (
(x >= 0 && x <= 101 && y >= 76) ||
(x >= 62 && x <= 68 && y >= 0 && y <= 78) ||
(x >= 5 && x <= 30 && y >= 67 && y <= 83) ||
(x >= 76 && x <= 92 && y >= 58 && y <= 76)
) {
return 'river';
}
if (
(x >= 9 && x <= 96 && y >= 63 && y <= 69) ||
(x >= 27 && x <= 74 && y >= 42 && y <= 49) ||
(x >= 70 && x <= 96 && y >= 34 && y <= 40) ||
(x >= 37 && x <= 45 && y >= 39 && y <= 72) ||
(x >= 76 && x <= 82 && y >= 48 && y <= 80)
) {
return 'road';
}
if (
(x >= 18 && x <= 72 && y >= 20 && y <= 74) ||
(x >= 55 && x <= 96 && y >= 28 && y <= 70) ||
(x >= 2 && x <= 38 && y >= 49 && y <= 74) ||
(x >= 78 && x <= 101 && y >= 41 && y <= 73)
) {
return 'forest';
}
if (
(x >= 0 && x <= 31 && y <= 38) ||
(x >= 33 && x <= 68 && y <= 28) ||
(x >= 71 && x <= 101 && y <= 37) ||
(x >= 86 && x <= 101 && y >= 33 && y <= 55)
) {
return 'hill';
}
if (
(x <= 2 && y <= 74) ||
(x >= 99 && y <= 70) ||
(x >= 30 && x <= 36 && y >= 0 && y <= 40) ||
(x >= 68 && x <= 74 && y >= 0 && y <= 34) ||
(x >= 42 && x <= 48 && y >= 64 && y <= 83)
) {
return 'cliff';
}
if (
(x >= 10 && x <= 25 && y >= 59 && y <= 71) ||
(x >= 39 && x <= 54 && y >= 43 && y <= 56) ||
(x >= 75 && x <= 91 && y >= 49 && y <= 61) ||
(x >= 80 && x <= 94 && y >= 32 && y <= 44)
) {
return 'village';
}
if ((x >= 23 && x <= 37 && y >= 51 && y <= 62) || (x >= 63 && x <= 78 && y >= 56 && y <= 68)) {
return 'camp';
}
if (
(x >= 47 && x <= 63 && y >= 31 && y <= 42) ||
(x >= 72 && x <= 92 && y >= 31 && y <= 45) ||
(x >= 84 && x <= 96 && y >= 43 && y <= 54)
) {
return 'fort';
}
return 'plain';
})
);
}
function createFiftySecondBattleTerrain(): TerrainType[][] {
return Array.from({ length: 86 }, (_, y) =>
Array.from({ length: 104 }, (_, x): TerrainType => {
if (
(x >= 0 && x <= 103 && y >= 78) ||
(x >= 65 && x <= 71 && y >= 0 && y <= 80) ||
(x >= 5 && x <= 31 && y >= 69 && y <= 85) ||
(x >= 78 && x <= 95 && y >= 60 && y <= 78)
) {
return 'river';
}
if (
(x >= 10 && x <= 98 && y >= 65 && y <= 71) ||
(x >= 28 && x <= 76 && y >= 44 && y <= 51) ||
(x >= 72 && x <= 98 && y >= 36 && y <= 42) ||
(x >= 39 && x <= 47 && y >= 41 && y <= 74) ||
(x >= 78 && x <= 84 && y >= 50 && y <= 82) ||
(x >= 18 && x <= 52 && y >= 57 && y <= 61)
) {
return 'road';
}
if (
(x >= 18 && x <= 74 && y >= 21 && y <= 76) ||
(x >= 56 && x <= 98 && y >= 29 && y <= 72) ||
(x >= 2 && x <= 39 && y >= 51 && y <= 76) ||
(x >= 80 && x <= 103 && y >= 43 && y <= 75)
) {
return 'forest';
}
if (
(x >= 0 && x <= 32 && y <= 40) ||
(x >= 34 && x <= 70 && y <= 30) ||
(x >= 73 && x <= 103 && y <= 39) ||
(x >= 88 && x <= 103 && y >= 35 && y <= 57)
) {
return 'hill';
}
if (
(x <= 2 && y <= 76) ||
(x >= 101 && y <= 72) ||
(x >= 31 && x <= 37 && y >= 0 && y <= 42) ||
(x >= 70 && x <= 76 && y >= 0 && y <= 36) ||
(x >= 44 && x <= 50 && y >= 66 && y <= 85)
) {
return 'cliff';
}
if (
(x >= 11 && x <= 26 && y >= 61 && y <= 73) ||
(x >= 40 && x <= 56 && y >= 45 && y <= 58) ||
(x >= 77 && x <= 93 && y >= 51 && y <= 63) ||
(x >= 82 && x <= 96 && y >= 34 && y <= 46)
) {
return 'village';
}
if (
(x >= 24 && x <= 38 && y >= 53 && y <= 64) ||
(x >= 65 && x <= 80 && y >= 58 && y <= 70) ||
(x >= 83 && x <= 97 && y >= 41 && y <= 53)
) {
return 'camp';
}
if (
(x >= 48 && x <= 65 && y >= 33 && y <= 44) ||
(x >= 74 && x <= 94 && y >= 33 && y <= 47) ||
(x >= 86 && x <= 98 && y >= 45 && y <= 56)
) {
return 'fort';
}
return 'plain';
})
);
}
function createFiftyThirdBattleTerrain(): TerrainType[][] {
return Array.from({ length: 88 }, (_, y) =>
Array.from({ length: 106 }, (_, x): TerrainType => {
if (
(x >= 0 && x <= 105 && y >= 80) ||
(x >= 67 && x <= 73 && y >= 0 && y <= 82) ||
(x >= 6 && x <= 34 && y >= 71 && y <= 87) ||
(x >= 80 && x <= 98 && y >= 62 && y <= 80)
) {
return 'river';
}
if (
(x >= 10 && x <= 101 && y >= 67 && y <= 73) ||
(x >= 29 && x <= 78 && y >= 45 && y <= 52) ||
(x >= 74 && x <= 101 && y >= 37 && y <= 43) ||
(x >= 40 && x <= 49 && y >= 42 && y <= 76) ||
(x >= 80 && x <= 86 && y >= 51 && y <= 84) ||
(x >= 18 && x <= 54 && y >= 59 && y <= 63) ||
(x >= 53 && x <= 67 && y >= 54 && y <= 59)
) {
return 'road';
}
if (
(x >= 18 && x <= 76 && y >= 22 && y <= 78) ||
(x >= 57 && x <= 100 && y >= 30 && y <= 74) ||
(x >= 2 && x <= 41 && y >= 52 && y <= 78) ||
(x >= 82 && x <= 105 && y >= 44 && y <= 77)
) {
return 'forest';
}
if (
(x >= 0 && x <= 33 && y <= 41) ||
(x >= 35 && x <= 72 && y <= 31) ||
(x >= 75 && x <= 105 && y <= 40) ||
(x >= 90 && x <= 105 && y >= 36 && y <= 59)
) {
return 'hill';
}
if (
(x <= 2 && y <= 78) ||
(x >= 103 && y <= 74) ||
(x >= 32 && x <= 38 && y >= 0 && y <= 43) ||
(x >= 72 && x <= 78 && y >= 0 && y <= 37) ||
(x >= 46 && x <= 52 && y >= 68 && y <= 87)
) {
return 'cliff';
}
if (
(x >= 12 && x <= 28 && y >= 63 && y <= 75) ||
(x >= 41 && x <= 58 && y >= 46 && y <= 60) ||
(x >= 79 && x <= 95 && y >= 52 && y <= 65) ||
(x >= 84 && x <= 98 && y >= 35 && y <= 47)
) {
return 'village';
}
if (
(x >= 25 && x <= 40 && y >= 55 && y <= 66) ||
(x >= 67 && x <= 82 && y >= 60 && y <= 72) ||
(x >= 85 && x <= 100 && y >= 42 && y <= 55)
) {
return 'camp';
}
if (
(x >= 49 && x <= 67 && y >= 34 && y <= 45) ||
(x >= 76 && x <= 97 && y >= 34 && y <= 48) ||
(x >= 88 && x <= 101 && y >= 46 && y <= 58)
) {
return 'fort';
}
return 'plain';
})
);
}
function createFiftyFourthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 90 }, (_, y) =>
Array.from({ length: 108 }, (_, x): TerrainType => {
if (
(x >= 0 && x <= 107 && y >= 82) ||
(x >= 69 && x <= 75 && y >= 0 && y <= 84) ||
(x >= 7 && x <= 36 && y >= 73 && y <= 89) ||
(x >= 82 && x <= 100 && y >= 64 && y <= 82)
) {
return 'river';
}
if (
(x >= 10 && x <= 103 && y >= 69 && y <= 75) ||
(x >= 30 && x <= 80 && y >= 46 && y <= 54) ||
(x >= 75 && x <= 103 && y >= 38 && y <= 44) ||
(x >= 41 && x <= 50 && y >= 43 && y <= 78) ||
(x >= 82 && x <= 88 && y >= 52 && y <= 86) ||
(x >= 18 && x <= 56 && y >= 61 && y <= 65) ||
(x >= 54 && x <= 69 && y >= 55 && y <= 61) ||
(x >= 60 && x <= 76 && y >= 45 && y <= 53)
) {
return 'road';
}
if (
(x >= 18 && x <= 78 && y >= 23 && y <= 80) ||
(x >= 58 && x <= 102 && y >= 31 && y <= 76) ||
(x >= 2 && x <= 43 && y >= 54 && y <= 80) ||
(x >= 84 && x <= 107 && y >= 45 && y <= 79)
) {
return 'forest';
}
if (
(x >= 0 && x <= 34 && y <= 42) ||
(x >= 36 && x <= 74 && y <= 32) ||
(x >= 77 && x <= 107 && y <= 41) ||
(x >= 92 && x <= 107 && y >= 37 && y <= 61)
) {
return 'hill';
}
if (
(x <= 2 && y <= 80) ||
(x >= 105 && y <= 76) ||
(x >= 33 && x <= 39 && y >= 0 && y <= 44) ||
(x >= 74 && x <= 80 && y >= 0 && y <= 38) ||
(x >= 48 && x <= 54 && y >= 70 && y <= 89)
) {
return 'cliff';
}
if (
(x >= 13 && x <= 30 && y >= 65 && y <= 77) ||
(x >= 42 && x <= 60 && y >= 48 && y <= 62) ||
(x >= 81 && x <= 97 && y >= 54 && y <= 67) ||
(x >= 86 && x <= 100 && y >= 36 && y <= 49)
) {
return 'village';
}
if (
(x >= 26 && x <= 42 && y >= 57 && y <= 68) ||
(x >= 69 && x <= 84 && y >= 62 && y <= 74) ||
(x >= 87 && x <= 102 && y >= 43 && y <= 57)
) {
return 'camp';
}
if (
(x >= 51 && x <= 69 && y >= 35 && y <= 46) ||
(x >= 78 && x <= 99 && y >= 35 && y <= 50) ||
(x >= 90 && x <= 103 && y >= 48 && y <= 60)
) {
return 'fort';
}
return 'plain';
})
);
}
function createFiftyFifthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 92 }, (_, y) =>
Array.from({ length: 110 }, (_, x): TerrainType => {
if (
(x >= 11 && x <= 105 && y >= 71 && y <= 77) ||
(x >= 31 && x <= 83 && y >= 48 && y <= 56) ||
(x >= 77 && x <= 105 && y >= 39 && y <= 46) ||
(x >= 42 && x <= 52 && y >= 44 && y <= 80) ||
(x >= 84 && x <= 90 && y >= 54 && y <= 88) ||
(x >= 19 && x <= 58 && y >= 63 && y <= 67) ||
(x >= 55 && x <= 72 && y >= 56 && y <= 62) ||
(x >= 61 && x <= 79 && y >= 46 && y <= 54) ||
(x >= 34 && x <= 46 && y >= 57 && y <= 72)
) {
return 'road';
}
if (
(x >= 0 && x <= 109 && y >= 84) ||
(x >= 72 && x <= 78 && y >= 0 && y <= 86) ||
(x >= 4 && x <= 32 && y >= 75 && y <= 91) ||
(x >= 84 && x <= 104 && y >= 67 && y <= 84)
) {
return 'river';
}
if (
(x >= 18 && x <= 80 && y >= 24 && y <= 82) ||
(x >= 59 && x <= 104 && y >= 31 && y <= 78) ||
(x >= 2 && x <= 44 && y >= 55 && y <= 82) ||
(x >= 86 && x <= 109 && y >= 46 && y <= 81)
) {
return 'forest';
}
if (
(x >= 0 && x <= 35 && y <= 43) ||
(x >= 37 && x <= 76 && y <= 33) ||
(x >= 79 && x <= 109 && y <= 42) ||
(x >= 94 && x <= 109 && y >= 38 && y <= 63)
) {
return 'hill';
}
if (
(x <= 2 && y <= 82) ||
(x >= 107 && y <= 78) ||
(x >= 34 && x <= 40 && y >= 0 && y <= 46) ||
(x >= 76 && x <= 82 && y >= 0 && y <= 40) ||
(x >= 49 && x <= 55 && y >= 72 && y <= 91)
) {
return 'cliff';
}
if (
(x >= 14 && x <= 31 && y >= 66 && y <= 79) ||
(x >= 43 && x <= 62 && y >= 49 && y <= 64) ||
(x >= 82 && x <= 99 && y >= 55 && y <= 68) ||
(x >= 88 && x <= 102 && y >= 37 && y <= 51)
) {
return 'village';
}
if (
(x >= 27 && x <= 44 && y >= 58 && y <= 70) ||
(x >= 70 && x <= 86 && y >= 63 && y <= 76) ||
(x >= 88 && x <= 104 && y >= 44 && y <= 58)
) {
return 'camp';
}
if (
(x >= 52 && x <= 70 && y >= 36 && y <= 48) ||
(x >= 80 && x <= 101 && y >= 36 && y <= 51) ||
(x >= 91 && x <= 105 && y >= 49 && y <= 62) ||
(x >= 95 && x <= 107 && y >= 20 && y <= 33)
) {
return 'fort';
}
return 'plain';
})
);
}
function createFiftySixthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 94 }, (_, y) =>
Array.from({ length: 112 }, (_, x): TerrainType => {
if (
(x >= 0 && x <= 111 && y >= 82) ||
(x >= 76 && x <= 81 && y >= 0 && y <= 93 && !(y >= 43 && y <= 58)) ||
(x >= 0 && x <= 30 && y >= 73 && y <= 90) ||
(x >= 86 && x <= 107 && y >= 69 && y <= 84)
) {
return 'river';
}
if (
(x >= 8 && x <= 108 && y >= 74 && y <= 80) ||
(x >= 29 && x <= 88 && y >= 58 && y <= 66) ||
(x >= 70 && x <= 108 && y >= 50 && y <= 58) ||
(x >= 44 && x <= 51 && y >= 50 && y <= 82) ||
(x >= 86 && x <= 92 && y >= 54 && y <= 90) ||
(x >= 54 && x <= 75 && y >= 62 && y <= 69) ||
(x >= 63 && x <= 86 && y >= 43 && y <= 52) ||
(x >= 90 && x <= 108 && y >= 25 && y <= 35)
) {
return 'road';
}
if (
(x >= 11 && x <= 72 && y >= 55 && y <= 82) ||
(x >= 60 && x <= 105 && y >= 47 && y <= 76) ||
(x >= 2 && x <= 42 && y >= 61 && y <= 82) ||
(x >= 88 && x <= 111 && y >= 53 && y <= 78)
) {
return 'forest';
}
if (
(x >= 0 && x <= 42 && y <= 47) ||
(x >= 38 && x <= 80 && y <= 38) ||
(x >= 82 && x <= 111 && y <= 48) ||
(x >= 96 && x <= 111 && y >= 34 && y <= 65)
) {
return 'hill';
}
if (
(x <= 2 && y <= 82) ||
(x >= 109 && y <= 79) ||
(x >= 33 && x <= 39 && y >= 0 && y <= 53) ||
(x >= 80 && x <= 85 && y >= 0 && y <= 42) ||
(x >= 52 && x <= 58 && y >= 74 && y <= 93)
) {
return 'cliff';
}
if (
(x >= 14 && x <= 28 && y >= 70 && y <= 81) ||
(x >= 49 && x <= 63 && y >= 58 && y <= 68) ||
(x >= 84 && x <= 99 && y >= 50 && y <= 61) ||
(x >= 94 && x <= 106 && y >= 30 && y <= 41)
) {
return 'village';
}
if (
(x >= 24 && x <= 43 && y >= 64 && y <= 74) ||
(x >= 67 && x <= 84 && y >= 60 && y <= 72) ||
(x >= 88 && x <= 106 && y >= 42 && y <= 55)
) {
return 'camp';
}
if (
(x >= 58 && x <= 72 && y >= 36 && y <= 48) ||
(x >= 80 && x <= 98 && y >= 33 && y <= 47) ||
(x >= 94 && x <= 108 && y >= 45 && y <= 58) ||
(x >= 96 && x <= 109 && y >= 18 && y <= 31)
) {
return 'fort';
}
return 'plain';
})
);
}
function createFiftySeventhBattleTerrain(): TerrainType[][] {
return Array.from({ length: 96 }, (_, y) =>
Array.from({ length: 114 }, (_, x): TerrainType => {
if (
(x >= 0 && x <= 113 && y >= 84) ||
(x >= 30 && x <= 36 && y >= 0 && y <= 94 && !((y >= 46 && y <= 54) || (y >= 62 && y <= 83))) ||
(x >= 78 && x <= 84 && y >= 0 && y <= 88 && !(y >= 44 && y <= 70)) ||
(x >= 88 && x <= 113 && y >= 70 && y <= 88)
) {
return 'river';
}
if (
(x >= 8 && x <= 110 && y >= 78 && y <= 83) ||
(x >= 28 && x <= 68 && y >= 46 && y <= 54) ||
(x >= 28 && x <= 91 && y >= 62 && y <= 70) ||
(x >= 64 && x <= 110 && y >= 53 && y <= 61) ||
(x >= 46 && x <= 53 && y >= 54 && y <= 84) ||
(x >= 86 && x <= 94 && y >= 55 && y <= 91) ||
(x >= 58 && x <= 78 && y >= 66 && y <= 73) ||
(x >= 68 && x <= 90 && y >= 44 && y <= 54) ||
(x >= 92 && x <= 110 && y >= 26 && y <= 36)
) {
return 'road';
}
if (
(x >= 10 && x <= 70 && y >= 58 && y <= 84) ||
(x >= 58 && x <= 108 && y >= 49 && y <= 78) ||
(x >= 0 && x <= 44 && y >= 62 && y <= 84) ||
(x >= 90 && x <= 113 && y >= 52 && y <= 80)
) {
return 'forest';
}
if (
(x >= 0 && x <= 44 && y <= 50) ||
(x >= 40 && x <= 82 && y <= 40) ||
(x >= 84 && x <= 113 && y <= 50) ||
(x >= 96 && x <= 113 && y >= 35 && y <= 67)
) {
return 'hill';
}
if (
(x <= 2 && y <= 84) ||
(x >= 111 && y <= 80) ||
(x >= 36 && x <= 42 && y >= 0 && y <= 56 && !(y >= 46 && y <= 54)) ||
(x >= 84 && x <= 89 && y >= 0 && y <= 44) ||
(x >= 54 && x <= 60 && y >= 76 && y <= 95)
) {
return 'cliff';
}
if (
(x >= 14 && x <= 29 && y >= 72 && y <= 83) ||
(x >= 50 && x <= 65 && y >= 61 && y <= 71) ||
(x >= 86 && x <= 101 && y >= 51 && y <= 63) ||
(x >= 96 && x <= 108 && y >= 31 && y <= 43)
) {
return 'village';
}
if (
(x >= 24 && x <= 44 && y >= 66 && y <= 76) ||
(x >= 67 && x <= 85 && y >= 62 && y <= 74) ||
(x >= 88 && x <= 108 && y >= 43 && y <= 56) ||
(x >= 82 && x <= 98 && y >= 31 && y <= 42)
) {
return 'camp';
}
if (
(x >= 58 && x <= 74 && y >= 37 && y <= 50) ||
(x >= 80 && x <= 100 && y >= 34 && y <= 48) ||
(x >= 95 && x <= 110 && y >= 46 && y <= 60) ||
(x >= 98 && x <= 111 && y >= 18 && y <= 32)
) {
return 'fort';
}
return 'plain';
})
);
}
function createFiftyEighthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 98 }, (_, y) =>
Array.from({ length: 116 }, (_, x): TerrainType => {
if (
(x >= 6 && x <= 76 && y >= 82 && y <= 87) ||
(x >= 18 && x <= 88 && y >= 70 && y <= 78) ||
(x >= 52 && x <= 102 && y >= 58 && y <= 67) ||
(x >= 72 && x <= 110 && y >= 43 && y <= 53) ||
(x >= 88 && x <= 115 && y >= 29 && y <= 39) ||
(x >= 24 && x <= 32 && y >= 64 && y <= 92) ||
(x >= 48 && x <= 56 && y >= 50 && y <= 84) ||
(x >= 78 && x <= 86 && y >= 36 && y <= 72)
) {
return 'road';
}
if (
(x >= 36 && x <= 43 && y >= 0 && y <= 97) ||
(x >= 64 && x <= 71 && y >= 18 && y <= 97) ||
(x >= 0 && x <= 115 && y >= 88)
) {
return 'river';
}
if (
(x >= 0 && x <= 38 && y >= 55 && y <= 86) ||
(x >= 46 && x <= 78 && y >= 67 && y <= 88) ||
(x >= 88 && x <= 115 && y >= 59 && y <= 84) ||
(x >= 12 && x <= 34 && y >= 38 && y <= 56)
) {
return 'forest';
}
if (
(x >= 0 && x <= 44 && y <= 34) ||
(x >= 44 && x <= 86 && y <= 28) ||
(x >= 84 && x <= 115 && y <= 45) ||
(x >= 96 && x <= 115 && y >= 38 && y <= 64)
) {
return 'hill';
}
if (
(x <= 2 && y <= 88) ||
(x >= 113 && y <= 82) ||
(x >= 32 && x <= 37 && y >= 0 && y <= 58) ||
(x >= 72 && x <= 78 && y >= 0 && y <= 40) ||
(x >= 58 && x <= 64 && y >= 78 && y <= 97)
) {
return 'cliff';
}
if (
(x >= 9 && x <= 24 && y >= 78 && y <= 88) ||
(x >= 42 && x <= 58 && y >= 66 && y <= 77) ||
(x >= 75 && x <= 91 && y >= 51 && y <= 63) ||
(x >= 96 && x <= 110 && y >= 36 && y <= 48)
) {
return 'village';
}
if (
(x >= 18 && x <= 40 && y >= 72 && y <= 84) ||
(x >= 52 && x <= 74 && y >= 58 && y <= 70) ||
(x >= 84 && x <= 104 && y >= 43 && y <= 56) ||
(x >= 92 && x <= 112 && y >= 26 && y <= 38)
) {
return 'camp';
}
if (
(x >= 47 && x <= 63 && y >= 40 && y <= 54) ||
(x >= 70 && x <= 90 && y >= 30 && y <= 44) ||
(x >= 92 && x <= 110 && y >= 44 && y <= 58) ||
(x >= 99 && x <= 114 && y >= 14 && y <= 28)
) {
return 'fort';
}
return 'plain';
})
);
}
function createFiftyNinthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 100 }, (_, y) =>
Array.from({ length: 118 }, (_, x): TerrainType => {
if (
(x >= 4 && x <= 10 && y >= 0 && y <= 99) ||
(x >= 60 && x <= 67 && y >= 20 && y <= 99 && !(y >= 54 && y <= 90)) ||
(x >= 0 && x <= 117 && y >= 92)
) {
return 'river';
}
if (
(x >= 10 && x <= 78 && y >= 84 && y <= 90) ||
(x >= 24 && x <= 94 && y >= 72 && y <= 80) ||
(x >= 48 && x <= 106 && y >= 60 && y <= 70) ||
(x >= 72 && x <= 114 && y >= 47 && y <= 58) ||
(x >= 92 && x <= 117 && y >= 33 && y <= 44) ||
(x >= 30 && x <= 38 && y >= 66 && y <= 94) ||
(x >= 54 && x <= 62 && y >= 54 && y <= 86) ||
(x >= 84 && x <= 92 && y >= 39 && y <= 76)
) {
return 'road';
}
if (
(x >= 0 && x <= 34 && y >= 56 && y <= 88) ||
(x >= 42 && x <= 76 && y >= 70 && y <= 91) ||
(x >= 88 && x <= 117 && y >= 63 && y <= 88) ||
(x >= 14 && x <= 36 && y >= 40 && y <= 58)
) {
return 'forest';
}
if (
(x >= 0 && x <= 48 && y <= 36) ||
(x >= 46 && x <= 88 && y <= 30) ||
(x >= 86 && x <= 117 && y <= 48) ||
(x >= 98 && x <= 117 && y >= 42 && y <= 68)
) {
return 'hill';
}
if (
(x <= 2 && y <= 90) ||
(x >= 115 && y <= 84) ||
(x >= 37 && x <= 43 && y >= 0 && y <= 60) ||
(x >= 74 && x <= 80 && y >= 0 && y <= 42) ||
(x >= 58 && x <= 65 && y >= 82 && y <= 99)
) {
return 'cliff';
}
if (
(x >= 12 && x <= 27 && y >= 80 && y <= 90) ||
(x >= 44 && x <= 61 && y >= 68 && y <= 79) ||
(x >= 77 && x <= 94 && y >= 54 && y <= 66) ||
(x >= 98 && x <= 114 && y >= 39 && y <= 52)
) {
return 'village';
}
if (
(x >= 20 && x <= 44 && y >= 75 && y <= 88) ||
(x >= 54 && x <= 78 && y >= 62 && y <= 74) ||
(x >= 86 && x <= 108 && y >= 48 && y <= 61)
) {
return 'camp';
}
if (
(x >= 48 && x <= 66 && y >= 43 && y <= 58) ||
(x >= 72 && x <= 94 && y >= 33 && y <= 48) ||
(x >= 92 && x <= 114 && y >= 42 && y <= 58) ||
(x >= 100 && x <= 117 && y >= 12 && y <= 31)
) {
return 'fort';
}
return 'plain';
})
);
}
function createSixtiethBattleTerrain(): TerrainType[][] {
return Array.from({ length: 102 }, (_, y) =>
Array.from({ length: 120 }, (_, x): TerrainType => {
if (
(x >= 5 && x <= 11 && y >= 0 && y <= 101) ||
(x >= 62 && x <= 68 && y >= 16 && y <= 101 && !(y >= 55 && y <= 92)) ||
(x >= 0 && x <= 119 && y >= 94)
) {
return 'river';
}
if (
(x >= 9 && x <= 80 && y >= 86 && y <= 92) ||
(x >= 23 && x <= 98 && y >= 75 && y <= 83) ||
(x >= 48 && x <= 108 && y >= 63 && y <= 73) ||
(x >= 76 && x <= 116 && y >= 49 && y <= 61) ||
(x >= 92 && x <= 119 && y >= 35 && y <= 46) ||
(x >= 30 && x <= 38 && y >= 68 && y <= 96) ||
(x >= 54 && x <= 62 && y >= 55 && y <= 88) ||
(x >= 84 && x <= 93 && y >= 41 && y <= 78)
) {
return 'road';
}
if (
(x >= 0 && x <= 35 && y >= 58 && y <= 90) ||
(x >= 42 && x <= 78 && y >= 72 && y <= 93) ||
(x >= 88 && x <= 119 && y >= 66 && y <= 91) ||
(x >= 14 && x <= 38 && y >= 42 && y <= 60)
) {
return 'forest';
}
if (
(x >= 0 && x <= 49 && y <= 38) ||
(x >= 46 && x <= 90 && y <= 32) ||
(x >= 86 && x <= 119 && y <= 50) ||
(x >= 98 && x <= 119 && y >= 44 && y <= 70)
) {
return 'hill';
}
if (
(x <= 2 && y <= 92) ||
(x >= 117 && y <= 86) ||
(x >= 38 && x <= 44 && y >= 0 && y <= 62) ||
(x >= 75 && x <= 81 && y >= 0 && y <= 44) ||
(x >= 59 && x <= 66 && y >= 84 && y <= 101)
) {
return 'cliff';
}
if (
(x >= 12 && x <= 28 && y >= 82 && y <= 92) ||
(x >= 43 && x <= 62 && y >= 70 && y <= 82) ||
(x >= 78 && x <= 96 && y >= 56 && y <= 68) ||
(x >= 100 && x <= 116 && y >= 41 && y <= 54)
) {
return 'village';
}
if (
(x >= 20 && x <= 45 && y >= 77 && y <= 90) ||
(x >= 54 && x <= 79 && y >= 64 && y <= 76) ||
(x >= 87 && x <= 110 && y >= 50 && y <= 63)
) {
return 'camp';
}
if (
(x >= 48 && x <= 67 && y >= 45 && y <= 60) ||
(x >= 72 && x <= 96 && y >= 35 && y <= 50) ||
(x >= 94 && x <= 116 && y >= 44 && y <= 60) ||
(x >= 102 && x <= 119 && y >= 14 && y <= 33)
) {
return 'fort';
}
return 'plain';
})
);
}
function createSixtyFirstBattleTerrain(): TerrainType[][] {
return Array.from({ length: 104 }, (_, y) =>
Array.from({ length: 122 }, (_, x): TerrainType => {
if (
(x >= 5 && x <= 12 && y >= 0 && y <= 103) ||
(x >= 63 && x <= 70 && y >= 14 && y <= 103 && !(y >= 56 && y <= 94)) ||
(x >= 0 && x <= 121 && y >= 96)
) {
return 'river';
}
if (
(x >= 8 && x <= 82 && y >= 88 && y <= 94) ||
(x >= 22 && x <= 101 && y >= 77 && y <= 85) ||
(x >= 48 && x <= 110 && y >= 65 && y <= 75) ||
(x >= 76 && x <= 118 && y >= 51 && y <= 63) ||
(x >= 92 && x <= 121 && y >= 37 && y <= 48) ||
(x >= 30 && x <= 39 && y >= 69 && y <= 98) ||
(x >= 54 && x <= 63 && y >= 56 && y <= 90) ||
(x >= 84 && x <= 94 && y >= 43 && y <= 80) ||
(x >= 98 && x <= 108 && y >= 24 && y <= 66)
) {
return 'road';
}
if (
(x >= 0 && x <= 36 && y >= 60 && y <= 92) ||
(x >= 42 && x <= 80 && y >= 74 && y <= 95) ||
(x >= 88 && x <= 121 && y >= 68 && y <= 93) ||
(x >= 14 && x <= 40 && y >= 44 && y <= 62) ||
(x >= 98 && x <= 121 && y >= 52 && y <= 72)
) {
return 'forest';
}
if (
(x >= 0 && x <= 50 && y <= 40) ||
(x >= 46 && x <= 92 && y <= 34) ||
(x >= 86 && x <= 121 && y <= 52) ||
(x >= 98 && x <= 121 && y >= 45 && y <= 72)
) {
return 'hill';
}
if (
(x <= 2 && y <= 94) ||
(x >= 119 && y <= 88) ||
(x >= 38 && x <= 45 && y >= 0 && y <= 64) ||
(x >= 76 && x <= 82 && y >= 0 && y <= 46) ||
(x >= 59 && x <= 67 && y >= 85 && y <= 103)
) {
return 'cliff';
}
if (
(x >= 12 && x <= 29 && y >= 84 && y <= 94) ||
(x >= 43 && x <= 63 && y >= 72 && y <= 84) ||
(x >= 79 && x <= 98 && y >= 58 && y <= 70) ||
(x >= 101 && x <= 118 && y >= 43 && y <= 56)
) {
return 'village';
}
if (
(x >= 19 && x <= 46 && y >= 79 && y <= 92) ||
(x >= 54 && x <= 80 && y >= 66 && y <= 78) ||
(x >= 88 && x <= 112 && y >= 52 && y <= 65) ||
(x >= 98 && x <= 116 && y >= 24 && y <= 38)
) {
return 'camp';
}
if (
(x >= 48 && x <= 68 && y >= 47 && y <= 62) ||
(x >= 72 && x <= 98 && y >= 37 && y <= 52) ||
(x >= 94 && x <= 118 && y >= 46 && y <= 62) ||
(x >= 103 && x <= 121 && y >= 14 && y <= 35)
) {
return 'fort';
}
return 'plain';
})
);
}
function createSixtySecondBattleTerrain(): TerrainType[][] {
return Array.from({ length: 106 }, (_, y) =>
Array.from({ length: 124 }, (_, x): TerrainType => {
if (
(x >= 5 && x <= 12 && y >= 0 && y <= 105) ||
(x >= 64 && x <= 71 && y >= 12 && y <= 105 && !(y >= 56 && y <= 96)) ||
(x >= 0 && x <= 123 && y >= 98)
) {
return 'river';
}
if (
(x >= 7 && x <= 84 && y >= 90 && y <= 96) ||
(x >= 22 && x <= 103 && y >= 78 && y <= 86) ||
(x >= 48 && x <= 112 && y >= 66 && y <= 76) ||
(x >= 76 && x <= 120 && y >= 52 && y <= 64) ||
(x >= 93 && x <= 123 && y >= 37 && y <= 49) ||
(x >= 30 && x <= 40 && y >= 70 && y <= 100) ||
(x >= 55 && x <= 64 && y >= 56 && y <= 92) ||
(x >= 85 && x <= 95 && y >= 42 && y <= 82) ||
(x >= 99 && x <= 109 && y >= 24 && y <= 68) ||
(x >= 44 && x <= 82 && y >= 82 && y <= 88)
) {
return 'road';
}
if (
(x >= 0 && x <= 38 && y >= 60 && y <= 94) ||
(x >= 42 && x <= 82 && y >= 75 && y <= 97) ||
(x >= 88 && x <= 123 && y >= 69 && y <= 95) ||
(x >= 14 && x <= 42 && y >= 44 && y <= 64) ||
(x >= 98 && x <= 123 && y >= 52 && y <= 74) ||
(x >= 116 && x <= 123 && y >= 26 && y <= 48)
) {
return 'forest';
}
if (
(x >= 0 && x <= 52 && y <= 41) ||
(x >= 46 && x <= 94 && y <= 35) ||
(x >= 86 && x <= 123 && y <= 53) ||
(x >= 98 && x <= 123 && y >= 45 && y <= 74)
) {
return 'hill';
}
if (
(x <= 2 && y <= 96) ||
(x >= 121 && y <= 90) ||
(x >= 39 && x <= 46 && y >= 0 && y <= 66) ||
(x >= 77 && x <= 83 && y >= 0 && y <= 48) ||
(x >= 60 && x <= 68 && y >= 86 && y <= 105)
) {
return 'cliff';
}
if (
(x >= 12 && x <= 30 && y >= 86 && y <= 96) ||
(x >= 43 && x <= 64 && y >= 73 && y <= 85) ||
(x >= 80 && x <= 100 && y >= 59 && y <= 71) ||
(x >= 102 && x <= 120 && y >= 43 && y <= 57)
) {
return 'village';
}
if (
(x >= 20 && x <= 48 && y >= 80 && y <= 94) ||
(x >= 55 && x <= 82 && y >= 67 && y <= 80) ||
(x >= 89 && x <= 114 && y >= 53 && y <= 66) ||
(x >= 99 && x <= 118 && y >= 24 && y <= 39)
) {
return 'camp';
}
if (
(x >= 49 && x <= 70 && y >= 48 && y <= 64) ||
(x >= 73 && x <= 100 && y >= 38 && y <= 53) ||
(x >= 95 && x <= 120 && y >= 47 && y <= 63) ||
(x >= 104 && x <= 123 && y >= 14 && y <= 36)
) {
return 'fort';
}
return 'plain';
})
);
}
function createSixtyThirdBattleTerrain(): TerrainType[][] {
return Array.from({ length: 108 }, (_, y) =>
Array.from({ length: 126 }, (_, x): TerrainType => {
if (
(x >= 6 && x <= 13 && y >= 0 && y <= 107) ||
(x >= 66 && x <= 73 && y >= 10 && y <= 107 && !(y >= 58 && y <= 98)) ||
(x >= 0 && x <= 125 && y >= 100)
) {
return 'river';
}
if (
(x >= 6 && x <= 86 && y >= 92 && y <= 98) ||
(x >= 24 && x <= 106 && y >= 80 && y <= 88) ||
(x >= 48 && x <= 114 && y >= 68 && y <= 78) ||
(x >= 78 && x <= 122 && y >= 54 && y <= 66) ||
(x >= 96 && x <= 125 && y >= 38 && y <= 50) ||
(x >= 31 && x <= 41 && y >= 72 && y <= 102) ||
(x >= 57 && x <= 66 && y >= 58 && y <= 94) ||
(x >= 87 && x <= 97 && y >= 44 && y <= 84) ||
(x >= 100 && x <= 110 && y >= 24 && y <= 70) ||
(x >= 42 && x <= 86 && y >= 84 && y <= 90)
) {
return 'road';
}
if (
(x >= 0 && x <= 39 && y >= 62 && y <= 96) ||
(x >= 43 && x <= 84 && y >= 77 && y <= 99) ||
(x >= 90 && x <= 125 && y >= 71 && y <= 97) ||
(x >= 15 && x <= 44 && y >= 45 && y <= 66) ||
(x >= 100 && x <= 125 && y >= 54 && y <= 76) ||
(x >= 117 && x <= 125 && y >= 27 && y <= 50)
) {
return 'forest';
}
if (
(x >= 0 && x <= 54 && y <= 42) ||
(x >= 47 && x <= 96 && y <= 36) ||
(x >= 88 && x <= 125 && y <= 55) ||
(x >= 99 && x <= 125 && y >= 47 && y <= 76)
) {
return 'hill';
}
if (
(x <= 2 && y <= 98) ||
(x >= 123 && y <= 92) ||
(x >= 40 && x <= 47 && y >= 0 && y <= 68) ||
(x >= 79 && x <= 85 && y >= 0 && y <= 50) ||
(x >= 62 && x <= 70 && y >= 88 && y <= 107)
) {
return 'cliff';
}
if (
(x >= 12 && x <= 31 && y >= 88 && y <= 98) ||
(x >= 44 && x <= 66 && y >= 75 && y <= 87) ||
(x >= 82 && x <= 102 && y >= 61 && y <= 73) ||
(x >= 104 && x <= 122 && y >= 45 && y <= 59) ||
(x >= 112 && x <= 124 && y >= 28 && y <= 38)
) {
return 'village';
}
if (
(x >= 21 && x <= 50 && y >= 82 && y <= 96) ||
(x >= 56 && x <= 84 && y >= 69 && y <= 82) ||
(x >= 91 && x <= 116 && y >= 55 && y <= 68) ||
(x >= 100 && x <= 120 && y >= 25 && y <= 41)
) {
return 'camp';
}
if (
(x >= 50 && x <= 72 && y >= 50 && y <= 66) ||
(x >= 74 && x <= 102 && y >= 40 && y <= 55) ||
(x >= 96 && x <= 122 && y >= 49 && y <= 65) ||
(x >= 105 && x <= 125 && y >= 15 && y <= 38) ||
(x >= 112 && x <= 125 && y >= 68 && y <= 86)
) {
return 'fort';
}
return 'plain';
})
);
}
function createSixtyFourthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 110 }, (_, y) =>
Array.from({ length: 128 }, (_, x): TerrainType => {
if (
(x >= 2 && x <= 126 && y >= 21 && y <= 32 && !(x >= 100 && x <= 116)) ||
(x >= 2 && x <= 126 && y >= 36 && y <= 45 && !(x >= 99 && x <= 127))
) {
return 'river';
}
if (
(x >= 7 && x <= 90 && y >= 95 && y <= 101) ||
(x >= 24 && x <= 108 && y >= 83 && y <= 91) ||
(x >= 48 && x <= 116 && y >= 71 && y <= 81) ||
(x >= 78 && x <= 124 && y >= 58 && y <= 70) ||
(x >= 99 && x <= 127 && y >= 44 && y <= 56) ||
(x >= 33 && x <= 43 && y >= 75 && y <= 105) ||
(x >= 59 && x <= 69 && y >= 61 && y <= 96) ||
(x >= 88 && x <= 99 && y >= 47 && y <= 86) ||
(x >= 102 && x <= 112 && y >= 27 && y <= 72) ||
(x >= 43 && x <= 88 && y >= 87 && y <= 93)
) {
return 'road';
}
if (
(x >= 0 && x <= 40 && y >= 65 && y <= 98) ||
(x >= 44 && x <= 86 && y >= 80 && y <= 101) ||
(x >= 92 && x <= 127 && y >= 74 && y <= 100) ||
(x >= 16 && x <= 45 && y >= 48 && y <= 69) ||
(x >= 102 && x <= 127 && y >= 57 && y <= 78) ||
(x >= 118 && x <= 127 && y >= 30 && y <= 53)
) {
return 'forest';
}
if (
(x >= 0 && x <= 55 && y <= 19) ||
(x >= 47 && x <= 98 && y <= 22) ||
(x >= 90 && x <= 127 && y <= 27) ||
(x >= 100 && x <= 127 && y >= 50 && y <= 78)
) {
return 'hill';
}
if (
(x <= 2 && y <= 101) ||
(x >= 125 && y <= 94) ||
(x >= 41 && x <= 48 && y >= 0 && y <= 70) ||
(x >= 80 && x <= 87 && y >= 0 && y <= 53) ||
(x >= 64 && x <= 72 && y >= 90 && y <= 109)
) {
return 'cliff';
}
if (
(x >= 13 && x <= 33 && y >= 91 && y <= 101) ||
(x >= 45 && x <= 68 && y >= 78 && y <= 90) ||
(x >= 84 && x <= 105 && y >= 64 && y <= 76) ||
(x >= 106 && x <= 125 && y >= 48 && y <= 62) ||
(x >= 113 && x <= 127 && y >= 31 && y <= 41)
) {
return 'village';
}
if (
(x >= 22 && x <= 52 && y >= 85 && y <= 99) ||
(x >= 57 && x <= 86 && y >= 72 && y <= 85) ||
(x >= 92 && x <= 118 && y >= 58 && y <= 71) ||
(x >= 101 && x <= 122 && y >= 28 && y <= 44)
) {
return 'camp';
}
if (
(x >= 51 && x <= 74 && y >= 52 && y <= 68) ||
(x >= 75 && x <= 104 && y >= 42 && y <= 58) ||
(x >= 97 && x <= 124 && y >= 51 && y <= 67) ||
(x >= 106 && x <= 127 && y >= 16 && y <= 40) ||
(x >= 113 && x <= 127 && y >= 70 && y <= 88)
) {
return 'fort';
}
return 'plain';
})
);
}
function createSixtyFifthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 112 }, (_, y) =>
Array.from({ length: 130 }, (_, x): TerrainType => {
if (
(x >= 2 && x <= 128 && y >= 27 && y <= 38 && !(x >= 102 && x <= 118)) ||
(x >= 3 && x <= 128 && y >= 42 && y <= 52 && !(x >= 101 && x <= 129))
) {
return 'river';
}
if (
(x >= 7 && x <= 92 && y >= 97 && y <= 104) ||
(x >= 25 && x <= 111 && y >= 85 && y <= 94) ||
(x >= 50 && x <= 119 && y >= 73 && y <= 83) ||
(x >= 80 && x <= 126 && y >= 60 && y <= 72) ||
(x >= 101 && x <= 129 && y >= 47 && y <= 59) ||
(x >= 34 && x <= 45 && y >= 77 && y <= 107) ||
(x >= 60 && x <= 71 && y >= 63 && y <= 98) ||
(x >= 90 && x <= 101 && y >= 49 && y <= 88) ||
(x >= 104 && x <= 115 && y >= 32 && y <= 74) ||
(x >= 44 && x <= 90 && y >= 89 && y <= 95)
) {
return 'road';
}
if (
(x >= 0 && x <= 42 && y >= 68 && y <= 101) ||
(x >= 45 && x <= 88 && y >= 82 && y <= 103) ||
(x >= 94 && x <= 129 && y >= 76 && y <= 102) ||
(x >= 16 && x <= 47 && y >= 52 && y <= 72) ||
(x >= 104 && x <= 129 && y >= 60 && y <= 80) ||
(x >= 120 && x <= 129 && y >= 34 && y <= 56)
) {
return 'forest';
}
if (
(x >= 0 && x <= 56 && y <= 25) ||
(x >= 48 && x <= 100 && y <= 26) ||
(x >= 92 && x <= 129 && y <= 32) ||
(x >= 102 && x <= 129 && y >= 53 && y <= 80)
) {
return 'hill';
}
if (
(x <= 2 && y <= 103) ||
(x >= 127 && y <= 96) ||
(x >= 42 && x <= 49 && y >= 0 && y <= 73) ||
(x >= 82 && x <= 89 && y >= 0 && y <= 56) ||
(x >= 66 && x <= 75 && y >= 92 && y <= 111)
) {
return 'cliff';
}
if (
(x >= 14 && x <= 35 && y >= 93 && y <= 104) ||
(x >= 46 && x <= 70 && y >= 80 && y <= 92) ||
(x >= 86 && x <= 108 && y >= 66 && y <= 78) ||
(x >= 108 && x <= 127 && y >= 50 && y <= 64) ||
(x >= 115 && x <= 129 && y >= 34 && y <= 44)
) {
return 'village';
}
if (
(x >= 23 && x <= 54 && y >= 87 && y <= 101) ||
(x >= 58 && x <= 88 && y >= 74 && y <= 88) ||
(x >= 94 && x <= 121 && y >= 60 && y <= 74) ||
(x >= 103 && x <= 124 && y >= 32 && y <= 48)
) {
return 'camp';
}
if (
(x >= 52 && x <= 76 && y >= 54 && y <= 70) ||
(x >= 77 && x <= 106 && y >= 44 && y <= 60) ||
(x >= 99 && x <= 126 && y >= 53 && y <= 69) ||
(x >= 108 && x <= 129 && y >= 18 && y <= 43) ||
(x >= 114 && x <= 129 && y >= 72 && y <= 90) ||
(x >= 118 && x <= 129 && y >= 5 && y <= 18)
) {
return 'fort';
}
return 'plain';
})
);
}
function createSixtySixthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 114 }, (_, y) =>
Array.from({ length: 132 }, (_, x): TerrainType => {
if (
(x >= 4 && x <= 95 && y >= 99 && y <= 107) ||
(x >= 24 && x <= 114 && y >= 87 && y <= 97) ||
(x >= 49 && x <= 123 && y >= 75 && y <= 85) ||
(x >= 79 && x <= 130 && y >= 61 && y <= 73) ||
(x >= 101 && x <= 131 && y >= 49 && y <= 60) ||
(x >= 33 && x <= 45 && y >= 79 && y <= 111) ||
(x >= 61 && x <= 72 && y >= 64 && y <= 101) ||
(x >= 91 && x <= 102 && y >= 50 && y <= 90) ||
(x >= 105 && x <= 116 && y >= 31 && y <= 75)
) {
return 'road';
}
if (
(x >= 0 && x <= 131 && y >= 22 && y <= 32) ||
(x >= 4 && x <= 131 && y >= 38 && y <= 48)
) {
return 'river';
}
if (
(x >= 0 && x <= 44 && y >= 70 && y <= 104) ||
(x >= 47 && x <= 90 && y >= 83 && y <= 105) ||
(x >= 96 && x <= 131 && y >= 76 && y <= 103) ||
(x >= 15 && x <= 48 && y >= 52 && y <= 73) ||
(x >= 105 && x <= 131 && y >= 61 && y <= 82) ||
(x >= 120 && x <= 131 && y >= 34 && y <= 57)
) {
return 'forest';
}
if (
(x >= 0 && x <= 58 && y <= 20) ||
(x >= 48 && x <= 101 && y <= 24) ||
(x >= 92 && x <= 131 && y <= 31) ||
(x >= 103 && x <= 131 && y >= 54 && y <= 81)
) {
return 'hill';
}
if (
(x <= 2 && y <= 106) ||
(x >= 129 && y <= 98) ||
(x >= 42 && x <= 49 && y >= 0 && y <= 75) ||
(x >= 83 && x <= 90 && y >= 0 && y <= 58) ||
(x >= 67 && x <= 76 && y >= 94 && y <= 113)
) {
return 'cliff';
}
if (
(x >= 13 && x <= 36 && y >= 95 && y <= 107) ||
(x >= 46 && x <= 72 && y >= 81 && y <= 94) ||
(x >= 86 && x <= 110 && y >= 67 && y <= 80) ||
(x >= 108 && x <= 129 && y >= 51 && y <= 66) ||
(x >= 116 && x <= 131 && y >= 34 && y <= 46)
) {
return 'village';
}
if (
(x >= 22 && x <= 55 && y >= 88 && y <= 103) ||
(x >= 58 && x <= 90 && y >= 75 && y <= 90) ||
(x >= 94 && x <= 123 && y >= 61 && y <= 76) ||
(x >= 103 && x <= 126 && y >= 32 && y <= 49)
) {
return 'camp';
}
if (
(x >= 52 && x <= 77 && y >= 55 && y <= 72) ||
(x >= 77 && x <= 108 && y >= 44 && y <= 61) ||
(x >= 99 && x <= 128 && y >= 53 && y <= 71) ||
(x >= 108 && x <= 131 && y >= 18 && y <= 44) ||
(x >= 114 && x <= 131 && y >= 73 && y <= 92) ||
(x >= 119 && x <= 131 && y >= 5 && y <= 19)
) {
return 'fort';
}
return 'plain';
})
);
}
function placeScenarioUnit(unit: UnitData, position: { x: number; y: number }): UnitData {
return {
...cloneUnitForScenario(unit),
x: position.x,
y: position.y
};
}
function cloneUnitForScenario(unit: UnitData): UnitData {
return JSON.parse(JSON.stringify(unit)) as UnitData;
}
function cloneBattleBondForScenario(bond: BattleBond): BattleBond {
return {
...bond,
unitIds: [...bond.unitIds] as [string, string]
};
}