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> = { '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: '좋다! 숨어 있는 놈들도 모조리 끌어내 주마. 이번에는 도망칠 틈도 주지 않겠다!' } ]; 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: '탁현 인근의 소란은 잦아들었지만, 황건의 난은 아직 천하 곳곳에서 타오르고 있었다. 세 형제의 길은 이제 더 멀리 이어진다.' } ]; 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: '전령이든 두령이든 내 앞길에 서면 다 똑같소! 형님, 명만 내리시오. 길목을 시원하게 열어 버리겠소!' } ]; 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: '세 형제는 병사를 추스르고 광종 방면으로 눈을 돌렸다. 황건의 큰 물결은 아직 꺾이지 않았다.' } ]; 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', 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: '장비', portrait: 'zhangFei', 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: 19, maxHp: 19, 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: 6, y: 13 }, { id: 'rebel-b', name: '황건병', faction: 'enemy', className: '황건병', classKey: 'yellowTurban', level: 1, exp: 4, hp: 20, maxHp: 20, 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: 8, y: 12 }, { id: 'rebel-c', name: '황건궁병', faction: 'enemy', className: '궁병', classKey: 'archer', level: 1, exp: 10, hp: 18, maxHp: 18, attack: 7, 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: 10, y: 11 }, { id: 'rebel-d', name: '황건병', faction: 'enemy', className: '황건병', classKey: 'yellowTurban', level: 1, exp: 8, hp: 20, maxHp: 20, 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: 7, y: 9 }, { id: 'rebel-e', name: '황건병', faction: 'enemy', className: '황건병', classKey: 'yellowTurban', level: 1, exp: 8, hp: 21, maxHp: 21, 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: 19, maxHp: 19, 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: 24, maxHp: 24, attack: 8, 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: 22, maxHp: 22, 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: 23, maxHp: 23, 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: 32, maxHp: 32, attack: 10, 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 = { '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: 23, maxHp: 23, 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: 12 }, { id: 'pursuit-raider-b', name: '황건 습격병', faction: 'enemy', className: '황건병', classKey: 'yellowTurban', level: 2, exp: 12, hp: 23, maxHp: 23, 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: 24, maxHp: 24, 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: 6, y: 8 }, { id: 'pursuit-archer-a', name: '황건 궁병', faction: 'enemy', className: '궁병', classKey: 'archer', level: 2, exp: 16, hp: 20, maxHp: 20, attack: 8, 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: 10 }, { 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: 15, y: 7 }, { id: 'pursuit-raider-c', name: '마을 습격병', faction: 'enemy', className: '황건병', classKey: 'yellowTurban', level: 2, exp: 13, hp: 24, maxHp: 24, 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: 17, y: 6 }, { id: 'pursuit-archer-b', name: '황건 궁병', faction: 'enemy', className: '궁병', classKey: 'archer', level: 3, exp: 18, hp: 21, maxHp: 21, attack: 8, 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: 18, y: 3 }, { 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: 19, y: 2 }, { id: 'pursuit-guard-b', 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: 21, y: 2 }, { id: 'pursuit-leader-han-seok', name: '두령 한석', faction: 'enemy', className: '두령', classKey: 'rebelLeader', level: 4, exp: 24, hp: 38, maxHp: 38, attack: 11, 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: 20, y: 1 } ]; const thirdBattleAllyPositions: Record = { 'liu-bei': { x: 2, y: 17 }, 'guan-yu': { x: 3, y: 17 }, 'zhang-fei': { x: 2, y: 18 } }; 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: 25, maxHp: 25, 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: 26, maxHp: 26, attack: 9, 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: 22, maxHp: 22, attack: 9, 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: 29, maxHp: 29, attack: 10, 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: 23, maxHp: 23, attack: 9, 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: 30, maxHp: 30, attack: 10, 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: 17, y: 6 }, { id: 'guangzong-guard-a', name: '요새 수비병', faction: 'enemy', className: '황건병', classKey: 'yellowTurban', level: 4, exp: 22, hp: 28, maxHp: 28, attack: 9, 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: 18, y: 4 }, { id: 'guangzong-guard-b', name: '요새 수비병', faction: 'enemy', className: '황건병', classKey: 'yellowTurban', level: 4, exp: 22, hp: 28, maxHp: 28, attack: 9, 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: 20, y: 4 }, { id: 'guangzong-fort-archer', name: '망루 궁병', faction: 'enemy', className: '궁병', classKey: 'archer', level: 4, exp: 25, hp: 24, maxHp: 24, attack: 10, 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: 19, y: 2 }, { id: 'guangzong-leader-ma-yuan', name: '전령 마원', faction: 'enemy', className: '두령', classKey: 'rebelLeader', level: 5, exp: 30, hp: 42, maxHp: 42, attack: 12, 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: 20, y: 2 } ]; const fourthBattleAllyPositions: Record = { '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 = { '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 = { '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 = { '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 } ]; const eighthBattleAllyPositions: Record = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { 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 = { 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>>; } ): 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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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 = { '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] }; }