import type { TerrainType, UnitClassKey } from './battleRules';
import type { EquipmentSet } from './battleItems';

export type PortraitKey = 'liuBei' | 'guanYu' | 'zhangFei';

export type StoryPage = {
  id: string;
  chapter: string;
  background: string;
  speaker?: string;
  portrait?: PortraitKey;
  bgm?: string;
  text: string;
};

export type UnitData = {
  id: string;
  name: string;
  faction: 'ally' | 'enemy';
  className: string;
  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: 'battle-briefing',
    bgm: 'battle-prep',
    chapter: '황건적 토벌',
    background: 'story-sortie',
    text: '의용군은 마을 어귀로 향했다. 첫 싸움은 곧 시작된다.'
  }
];

export const firstBattleVictoryPages: StoryPage[] = [
  {
    id: 'first-victory-village',
    bgm: 'militia-theme',
    chapter: '첫 승리',
    background: 'story-militia',
    text: '황건적의 깃발이 쓰러지자, 숨어 있던 백성들이 하나둘 마을 어귀로 돌아왔다.'
  },
  {
    id: 'first-victory-liu-bei',
    bgm: 'militia-theme',
    chapter: '첫 승리',
    background: 'story-liu-bei',
    speaker: '유비',
    portrait: 'liuBei',
    text: '오늘의 승리는 작다. 그러나 백성 한 사람을 지키는 일에서 천하를 바로잡는 뜻이 시작된다.'
  },
  {
    id: 'first-victory-guan-yu',
    bgm: 'militia-theme',
    chapter: '의용군의 이름',
    background: 'story-three-heroes',
    speaker: '관우',
    portrait: 'guanYu',
    text: '형님의 뜻을 보고 사람들이 모일 것입니다. 다음 싸움은 오늘보다 더 큰 책임을 요구하겠지요.'
  },
  {
    id: 'first-victory-zhang-fei',
    bgm: 'militia-theme',
    chapter: '의용군의 이름',
    background: 'story-militia',
    speaker: '장비',
    portrait: 'zhangFei',
    text: '하하! 그럼 더 크게 외쳐야겠소. 창을 들 자는 모여라! 우리 의용군은 물러서지 않는다!'
  },
  {
    id: 'first-victory-next',
    bgm: 'battle-prep',
    chapter: '다음 길',
    background: 'story-sortie',
    text: '세 형제의 이름은 탁현 일대에 퍼지기 시작했다. 이제 더 넓은 전장과 더 많은 인연이 그들을 기다린다.'
  }
];

export const secondBattleIntroPages: StoryPage[] = [
  {
    id: 'second-pursuit-rumor',
    bgm: 'militia-theme',
    chapter: '잔당의 그림자',
    background: 'story-militia',
    text: '첫 승리의 기쁨이 채 가시기도 전에, 황건 잔당이 북쪽 길목의 마을을 습격하고 있다는 급보가 도착했다.'
  },
  {
    id: 'second-liu-bei-command',
    bgm: 'battle-prep',
    chapter: '추격 명령',
    background: 'story-liu-bei',
    speaker: '유비',
    portrait: 'liuBei',
    text: '백성이 다시 칼끝에 몰렸다면 우리가 쉬어 갈 곳은 없다. 길을 따라 추격하되, 마을을 먼저 지켜야 한다.'
  },
  {
    id: 'second-guan-yu-vow',
    bgm: 'battle-prep',
    chapter: '좁은 길목',
    background: 'story-three-heroes',
    speaker: '관우',
    portrait: 'guanYu',
    text: '적은 숲과 강을 끼고 물러설 것입니다. 제가 앞길을 열겠습니다. 형님께서는 백성을 살피십시오.'
  },
  {
    id: 'second-zhang-fei-charge',
    bgm: 'battle-prep',
    chapter: '의용군 출진',
    background: 'story-sortie',
    speaker: '장비',
    portrait: 'zhangFei',
    text: '좋다! 숨어 있는 놈들도 모조리 끌어내 주마. 이번에는 도망칠 틈도 주지 않겠다!'
  }
];

export const secondBattleVictoryPages: StoryPage[] = [
  {
    id: 'second-victory-village',
    bgm: 'militia-theme',
    chapter: '마을의 안도',
    background: 'story-militia',
    text: '잔당의 불길은 꺼지고, 피난하던 백성들이 하나둘 마을로 돌아왔다. 의용군의 이름은 이제 길목의 장터마다 오르내렸다.'
  },
  {
    id: 'second-victory-liu-bei',
    bgm: 'militia-theme',
    chapter: '다음 책임',
    background: 'story-liu-bei',
    speaker: '유비',
    portrait: 'liuBei',
    text: '우리가 이긴 것은 힘만으로 된 일이 아니다. 백성을 지키겠다는 뜻을 잊지 않는다면, 더 큰 전장도 견딜 수 있을 것이다.'
  },
  {
    id: 'second-victory-next',
    bgm: 'battle-prep',
    chapter: '넓어지는 전장',
    background: 'story-sortie',
    text: '탁현 인근의 소란은 잦아들었지만, 황건의 난은 아직 천하 곳곳에서 타오르고 있었다. 세 형제의 길은 이제 더 멀리 이어진다.'
  }
];

export const thirdBattleIntroPages: StoryPage[] = [
  {
    id: 'third-guangzong-report',
    bgm: 'militia-theme',
    chapter: '광종의 급보',
    background: 'story-militia',
    text: '탁현 북쪽의 소란을 잠재우자, 장터에는 더 큰 소식이 밀려왔다. 광종 방면에서 황건 본대가 관군을 압박하고 있다는 전갈이었다.'
  },
  {
    id: 'third-liu-bei-decision',
    bgm: 'battle-prep',
    chapter: '넓어지는 길',
    background: 'story-liu-bei',
    speaker: '유비',
    portrait: 'liuBei',
    text: '작은 마을만 지키고 물러선다면 난세는 끝나지 않는다. 광종으로 향하는 길을 열어, 더 많은 백성이 버틸 시간을 만들어야 한다.'
  },
  {
    id: 'third-guan-yu-bridge',
    bgm: 'battle-prep',
    chapter: '강가의 길목',
    background: 'story-three-heroes',
    speaker: '관우',
    portrait: 'guanYu',
    text: '적 전령이 강가 요새를 거쳐 본대로 향한다면, 그 길을 끊어야 합니다. 좁은 다리와 숲길을 먼저 장악하겠습니다.'
  },
  {
    id: 'third-zhang-fei-vanguard',
    bgm: 'battle-prep',
    chapter: '전초전',
    background: 'story-sortie',
    speaker: '장비',
    portrait: 'zhangFei',
    text: '전령이든 두령이든 내 앞길에 서면 다 똑같소! 형님, 명만 내리시오. 길목을 시원하게 열어 버리겠소!'
  }
];

export const thirdBattleVictoryPages: StoryPage[] = [
  {
    id: 'third-victory-road',
    bgm: 'militia-theme',
    chapter: '열린 길목',
    background: 'story-sortie',
    text: '황건 전령의 깃발이 꺾이자 광종으로 향하는 길목에 잠시 숨통이 트였다. 흩어진 백성들은 의용군의 이름을 기억하기 시작했다.'
  },
  {
    id: 'third-victory-liu-bei',
    bgm: 'militia-theme',
    chapter: '큰 싸움의 그림자',
    background: 'story-liu-bei',
    speaker: '유비',
    portrait: 'liuBei',
    text: '우리가 막은 것은 작은 전갈 하나일 뿐이다. 그러나 작은 길 하나가 열리면, 다음 전장에서도 백성을 구할 길이 생긴다.'
  },
  {
    id: 'third-victory-next',
    bgm: 'battle-prep',
    chapter: '광종으로',
    background: 'story-militia',
    text: '세 형제는 병사를 추스르고 광종 방면으로 눈을 돌렸다. 황건의 큰 물결은 아직 꺾이지 않았다.'
  }
];

export const fourthBattleIntroPages: StoryPage[] = [
  {
    id: 'fourth-guangzong-camp',
    bgm: 'militia-theme',
    chapter: '광종 본영',
    background: 'story-militia',
    text: '전령의 길이 끊기자 황건 본대는 광종 들판에 진을 굳혔다. 노란 깃발이 겹겹이 서고, 장각의 이름이 병사들 사이에 낮게 울렸다.'
  },
  {
    id: 'fourth-liu-bei-resolve',
    bgm: 'battle-prep',
    chapter: '의용군의 결의',
    background: 'story-liu-bei',
    speaker: '유비',
    portrait: 'liuBei',
    text: '장각을 치는 일은 한 사람을 꺾는 일이 아니다. 두려움에 몰린 백성들이 다시 길을 찾게 하는 일이다.'
  },
  {
    id: 'fourth-guan-yu-line',
    bgm: 'battle-prep',
    chapter: '본영 돌파',
    background: 'story-three-heroes',
    speaker: '관우',
    portrait: 'guanYu',
    text: '적은 요새와 숲 사이에 궁병을 숨겼습니다. 전열을 흐트러뜨리지 않고 본영의 깃발까지 밀고 들어가야 합니다.'
  },
  {
    id: 'fourth-zhang-fei-roar',
    bgm: 'battle-prep',
    chapter: '황건적 토벌',
    background: 'story-sortie',
    speaker: '장비',
    portrait: 'zhangFei',
    text: '좋소! 광종의 누런 깃발을 오늘 모두 뽑아 버립시다. 뒤돌아볼 틈 없이 밀고 들어가겠소!'
  }
];

export const fourthBattleVictoryPages: StoryPage[] = [
  {
    id: 'fourth-victory-yellow-flags-fall',
    bgm: 'militia-theme',
    chapter: '황건적 토벌',
    background: 'story-militia',
    text: '광종의 들판에서 황건의 본영이 무너졌다. 피난민들은 오래 닫았던 문을 열고, 쓰러진 깃발 너머로 관군과 의용군을 바라보았다.'
  },
  {
    id: 'fourth-victory-liu-bei',
    bgm: 'militia-theme',
    chapter: '이름이 퍼지다',
    background: 'story-liu-bei',
    speaker: '유비',
    portrait: 'liuBei',
    text: '난은 잠시 가라앉았지만, 천하가 바로 선 것은 아니다. 오늘의 공이 교만이 되지 않도록 마음을 다잡자.'
  },
  {
    id: 'fourth-victory-next-era',
    bgm: 'battle-prep',
    chapter: '새로운 혼란',
    background: 'story-sortie',
    text: '황건의 불길이 잦아들 무렵, 조정 안에서는 또 다른 그림자가 자라났다. 세 형제의 길은 이제 반동탁의 흐름으로 이어진다.'
  }
];

export const fifthBattleIntroPages: StoryPage[] = [
  {
    id: 'fifth-coalition-rumor',
    bgm: 'militia-theme',
    chapter: '반동탁의 격문',
    background: 'story-militia',
    text: '황건의 불길이 잦아들자 조정에는 또 다른 폭풍이 일었다. 동탁이 낙양을 장악했다는 소식과 함께, 각지의 제후들이 반동탁의 격문에 응하기 시작했다.'
  },
  {
    id: 'fifth-liu-bei-choice',
    bgm: 'battle-prep',
    chapter: '새로운 대의',
    background: 'story-liu-bei',
    speaker: '유비',
    portrait: 'liuBei',
    text: '백성을 괴롭히는 난을 막았다 하나, 조정이 어지러우면 천하는 다시 피를 흘린다. 우리는 더 큰 흐름 속으로 들어가야 한다.'
  },
  {
    id: 'fifth-gongsun-zan',
    bgm: 'battle-prep',
    chapter: '공손찬의 진영',
    background: 'story-three-heroes',
    speaker: '관우',
    portrait: 'guanYu',
    text: '공손찬의 군영에 합류하면 연합군의 움직임을 가까이서 볼 수 있습니다. 그러나 동탁군도 사수관 앞길을 막고 있습니다.'
  },
  {
    id: 'fifth-sishui-sortie',
    bgm: 'battle-prep',
    chapter: '사수관 전초전',
    background: 'story-sortie',
    speaker: '장비',
    portrait: 'zhangFei',
    text: '동탁군이든 황건적이든 백성을 짓밟는 놈들은 똑같소. 사수관 앞길부터 뚫어 봅시다!'
  }
];

export const fifthBattleVictoryPages: StoryPage[] = [
  {
    id: 'fifth-victory-sishui',
    bgm: 'militia-theme',
    chapter: '사수관의 문턱',
    background: 'story-sortie',
    text: '동탁군의 전초 부대가 물러서자 연합군 진영에 세 형제의 이름이 다시 한 번 전해졌다.'
  },
  {
    id: 'fifth-victory-next',
    bgm: 'battle-prep',
    chapter: '공손찬 의탁',
    background: 'story-militia',
    text: '사수관 앞 전초전은 끝났지만, 반동탁의 싸움은 이제 막 시작되었다. 유비는 공손찬의 군영에서 다음 기회를 기다린다.'
  }
];

export const sixthBattleIntroPages: StoryPage[] = [
  {
    id: 'sixth-gongsun-zan-order',
    bgm: 'militia-theme',
    chapter: '공손찬의 명',
    background: 'story-three-heroes',
    text: '사수관 전초전 뒤, 유비군은 공손찬의 군영에 머물며 북방의 정세를 살폈다. 원소군의 별동대가 계교로 향하는 보급로를 위협하자, 공손찬은 세 형제에게 길목을 맡겼다.'
  },
  {
    id: 'sixth-liu-bei-service',
    bgm: 'battle-prep',
    chapter: '의탁의 무게',
    background: 'story-liu-bei',
    speaker: '유비',
    portrait: 'liuBei',
    text: '남의 깃발 아래에 서더라도 백성을 지키는 뜻은 변하지 않는다. 공손찬 장군의 군영에 머무는 동안에도 우리의 길을 분명히 하자.'
  },
  {
    id: 'sixth-guan-yu-road',
    bgm: 'battle-prep',
    chapter: '계교 원군로',
    background: 'story-militia',
    speaker: '관우',
    portrait: 'guanYu',
    text: '계교로 향하는 길은 강과 숲이 얽혀 있습니다. 원소군의 궁병과 기병을 나누어 상대해야 길을 열 수 있습니다.'
  },
  {
    id: 'sixth-zhang-fei-sortie',
    bgm: 'battle-prep',
    chapter: '북방의 먼지',
    background: 'story-sortie',
    speaker: '장비',
    portrait: 'zhangFei',
    text: '원소군이든 누구든 길을 막는 놈은 비켜서게 만들면 됩니다. 형님, 이번엔 제가 먼저 먼지를 일으키겠습니다!'
  }
];

export const sixthBattleVictoryPages: StoryPage[] = [
  {
    id: 'sixth-victory-jieqiao',
    bgm: 'militia-theme',
    chapter: '계교의 길',
    background: 'story-militia',
    text: '계교로 향하는 보급로가 열리자 공손찬의 군영에도 한숨 돌릴 여유가 생겼다. 그러나 북방의 전공은 세 형제의 마음을 오래 붙잡아 두지 못했다.'
  },
  {
    id: 'sixth-xuzhou-envoy',
    bgm: 'battle-prep',
    chapter: '서주의 사신',
    background: 'story-liu-bei',
    speaker: '유비',
    portrait: 'liuBei',
    text: '도겸 공이 서주에서 원군을 청한다면, 백성의 고통을 외면할 수 없소. 공손찬 장군께 허락을 구하고 서주로 향할 준비를 하자.'
  }
];

export const seventhBattleIntroPages: StoryPage[] = [
  {
    id: 'seventh-xuzhou-envoy-arrives',
    bgm: 'militia-theme',
    chapter: '도겸의 사신',
    background: 'story-militia',
    text: '서주의 도겸이 조조군의 압박을 견디지 못하고 원군을 청했다. 공손찬의 허락을 받은 유비는 세 형제와 의용군을 이끌고 남쪽 길로 향했다.'
  },
  {
    id: 'seventh-liu-bei-xuzhou',
    bgm: 'battle-prep',
    chapter: '서주로 가는 길',
    background: 'story-liu-bei',
    speaker: '유비',
    portrait: 'liuBei',
    text: '서주 백성이 위태롭다는데 어찌 머뭇거리겠는가. 도겸 공을 돕고, 백성들이 피난길에서 더 쓰러지지 않게 길을 열자.'
  },
  {
    id: 'seventh-guan-yu-field',
    bgm: 'battle-prep',
    chapter: '조조군 선봉',
    background: 'story-three-heroes',
    speaker: '관우',
    portrait: 'guanYu',
    text: '조조군 선봉은 길과 촌락을 함께 누르고 있습니다. 기병은 길을 따라 빠르게 내려오고, 궁병은 강가와 마을 뒤에서 전열을 끊을 것입니다.'
  },
  {
    id: 'seventh-zhang-fei-charge',
    bgm: 'battle-prep',
    chapter: '서주 구원전',
    background: 'story-sortie',
    speaker: '장비',
    portrait: 'zhangFei',
    text: '서주 백성을 울리는 놈들이라면 이름이 누구든 상관없습니다. 형님, 조조군 선봉부터 박살내고 길을 열어 봅시다!'
  }
];

export const seventhBattleVictoryPages: StoryPage[] = [
  {
    id: 'seventh-victory-xuzhou-road',
    bgm: 'militia-theme',
    chapter: '서주의 문',
    background: 'story-militia',
    text: '조조군 선봉이 물러서자 서주 성문 앞 피난민들의 숨통이 트였다. 도겸은 유비의 군기를 맞이하며 깊이 고개를 숙였다.'
  },
  {
    id: 'seventh-tao-qian-entrusts',
    bgm: 'battle-prep',
    chapter: '도겸의 부탁',
    background: 'story-liu-bei',
    speaker: '유비',
    portrait: 'liuBei',
    text: '서주를 맡아 달라는 도겸 공의 청은 너무 무거운 일이다. 그러나 백성이 의지할 곳이 없다면, 외면하는 것도 의가 아니다.'
  }
];

export const eighthBattleIntroPages: StoryPage[] = [
  {
    id: 'eighth-xuzhou-handover',
    bgm: 'militia-theme',
    chapter: '서주의 새 군영',
    background: 'story-militia',
    text: '도겸은 병든 몸을 일으켜 서주의 장부와 군량 창고를 유비에게 넘겼다. 간옹과 미축은 백성의 청원과 보급로를 정리하며 새 군영의 기초를 세웠다.'
  },
  {
    id: 'eighth-lu-bu-shadow',
    bgm: 'battle-prep',
    chapter: '여포의 그림자',
    background: 'story-liu-bei',
    speaker: '유비',
    portrait: 'liuBei',
    text: '여포가 떠돌고 있다는 소식은 가볍지 않다. 그 이름 하나만으로도 여러 군세가 흔들린다. 그러나 지금은 서주의 길과 백성을 먼저 지켜야 한다.'
  },
  {
    id: 'eighth-xiaopei-road',
    bgm: 'battle-prep',
    chapter: '소패 보급로',
    background: 'story-sortie',
    speaker: '미축',
    text: '소패로 이어지는 창고 길목이 습격받고 있습니다. 군량이 끊기면 서주를 안정시킬 수 없습니다. 보급로와 마을을 동시에 지켜야 합니다.'
  },
  {
    id: 'eighth-sortie-choice',
    bgm: 'battle-prep',
    chapter: '첫 방위전',
    background: 'story-three-heroes',
    speaker: '간옹',
    text: '현덕, 이제 함께 갈 장수를 고르는 일도 전술이 되었네. 칼이 필요한 곳과 말이 필요한 곳, 그리고 말보다 장부가 필요한 곳을 구분해야 하네.'
  }
];

export const eighthBattleVictoryPages: StoryPage[] = [
  {
    id: 'eighth-victory-supply-road',
    bgm: 'militia-theme',
    chapter: '지켜낸 보급로',
    background: 'story-militia',
    text: '소패의 보급로가 다시 열리자 서주의 창고와 마을은 겨우 숨을 돌렸다. 새로 합류한 장수들은 각자의 방식으로 유비군의 빈틈을 메웠다.'
  },
  {
    id: 'eighth-lu-bu-arrival',
    bgm: 'battle-prep',
    chapter: '뜻밖의 손님',
    background: 'story-liu-bei',
    speaker: '유비',
    portrait: 'liuBei',
    text: '전투가 끝난 뒤, 여포가 몸을 의탁할 곳을 구한다는 전갈이 왔다. 그를 받아들이는 일은 의로울 수 있으나, 서주에 또 다른 불씨를 들이는 일이기도 했다.'
  }
];

export const ninthBattleIntroPages: StoryPage[] = [
  {
    id: 'ninth-lu-bu-refuge',
    bgm: 'militia-theme',
    chapter: '여포의 의탁',
    background: 'story-liu-bei',
    speaker: '유비',
    portrait: 'liuBei',
    text: '여포가 몸을 의탁하겠다 청했다. 난세에 갈 곳 없는 이를 내치는 것은 쉽지 않으나, 서주 백성의 불안을 모른 척할 수도 없다.'
  },
  {
    id: 'ninth-zhang-fei-suspicion',
    bgm: 'battle-prep',
    chapter: '성문 안의 불씨',
    background: 'story-three-heroes',
    speaker: '장비',
    portrait: 'zhangFei',
    text: '여포 같은 자를 성 안에 들이면 반드시 화근이 됩니다. 도겸의 옛 무장들까지 술렁이니, 성문부터 단단히 지켜야 합니다.'
  },
  {
    id: 'ninth-cao-bao-mutiny',
    bgm: 'battle-prep',
    chapter: '조표의 야습',
    background: 'story-sortie',
    text: '밤이 깊자 조표가 일부 성문 수비병을 움직였다. 바깥의 여포군 기병은 불빛을 신호로 삼아 성문을 향해 몰려들었다.'
  },
  {
    id: 'ninth-xuzhou-gate',
    bgm: 'battle-prep',
    chapter: '서주 성문 방위',
    background: 'story-militia',
    speaker: '간옹',
    text: '현덕, 이 싸움은 이겨도 상처가 남을 걸세. 하지만 성문이 오늘 밤 무너지면 내일의 선택도 사라진다네.'
  }
];

export const ninthBattleVictoryPages: StoryPage[] = [
  {
    id: 'ninth-victory-gate-held',
    bgm: 'militia-theme',
    chapter: '지켜낸 밤',
    background: 'story-militia',
    text: '조표의 야습은 물러났고 성문은 다시 닫혔다. 그러나 성 안의 의심과 두려움은 이미 선명한 금이 되어 남았다.'
  },
  {
    id: 'ninth-lu-bu-pretext',
    bgm: 'battle-prep',
    chapter: '더 깊어진 그림자',
    background: 'story-liu-bei',
    speaker: '유비',
    portrait: 'liuBei',
    text: '여포는 서주의 혼란을 핑계 삼아 더 깊이 발을 들이려 했다. 오늘 밤 성문은 지켰으나, 서주를 잃을 싸움은 이제 시작되고 있었다.'
  }
];

export const tenthBattleIntroPages: StoryPage[] = [
  {
    id: 'tenth-zhang-fei-fault',
    bgm: 'story-dark',
    chapter: '술잔이 부른 균열',
    background: 'story-liu-bei',
    speaker: '장비',
    portrait: 'zhangFei',
    text: '조표의 잔당을 다그치던 장비는 분노를 이기지 못했다. 말 한마디, 술 한잔, 그리고 성 안의 오래된 원한이 한밤중에 다시 타올랐다.'
  },
  {
    id: 'tenth-lu-bu-takes-xuzhou',
    bgm: 'story-dark',
    chapter: '빼앗긴 서주',
    background: 'story-militia',
    text: '여포는 성문이 흔들린 틈을 놓치지 않았다. 서주 곳곳의 수비대가 갈라졌고, 유비가 돌아왔을 때 성루의 깃발은 이미 바뀌어 있었다.'
  },
  {
    id: 'tenth-brothers-regroup',
    bgm: 'militia-theme',
    chapter: '무너진 성 앞에서',
    background: 'story-three-heroes',
    speaker: '관우',
    portrait: 'guanYu',
    text: '형님, 지금 성을 되찾으려 들면 백성과 군졸을 모두 잃습니다. 익덕을 꾸짖는 일은 살아나간 뒤에 해도 늦지 않습니다.'
  },
  {
    id: 'tenth-xuzhou-escape',
    bgm: 'battle-prep',
    chapter: '서주 탈출',
    background: 'story-sortie',
    speaker: '유비',
    portrait: 'liuBei',
    text: '서주는 오늘 내 손에서 떠났다. 그러나 백성과 형제와 뜻까지 잃을 수는 없다. 포위망을 뚫고 다음 길을 찾자.'
  }
];

export const tenthBattleVictoryPages: StoryPage[] = [
  {
    id: 'tenth-victory-breakout',
    bgm: 'militia-theme',
    chapter: '잃고도 남은 것',
    background: 'story-militia',
    text: '유비군은 여포군 선봉을 뚫고 서주 외곽으로 물러났다. 성은 빼앗겼으나, 세 형제와 새로 모인 장수들의 전열은 아직 흩어지지 않았다.'
  },
  {
    id: 'tenth-cao-cao-shadow',
    bgm: 'story-dark',
    chapter: '허도로 향하는 그림자',
    background: 'story-liu-bei',
    speaker: '간옹',
    text: '현덕, 이제 서주 안에서 버티는 길은 막혔네. 조조의 휘하로 들어가는 일은 마음에 걸리지만, 살아남아 다시 뜻을 세우려면 그 길을 지나야 할 걸세.'
  }
];

export const eleventhBattleIntroPages: StoryPage[] = [
  {
    id: 'eleventh-arrive-cao-cao-camp',
    bgm: 'story-dark',
    chapter: '조조의 장막',
    background: 'story-liu-bei',
    text: '서주를 잃은 유비군은 허도로 향했다. 조조는 웃으며 맞이했지만, 그 웃음 뒤에는 사람을 재는 날카로운 눈빛이 숨어 있었다.'
  },
  {
    id: 'eleventh-cao-cao-test',
    bgm: 'militia-theme',
    chapter: '의탁의 대가',
    background: 'story-militia',
    speaker: '간옹',
    text: '현덕, 조조는 우리에게 머물 곳을 주겠지만 공짜로 주지는 않을 걸세. 허도 입성로에 남은 원술 잔군을 치라는 명은 환대이자 시험이지.'
  },
  {
    id: 'eleventh-brothers-under-watch',
    bgm: 'story-dark',
    chapter: '감시 속의 출진',
    background: 'story-three-heroes',
    speaker: '관우',
    portrait: 'guanYu',
    text: '형님, 조조의 깃발 아래 싸우더라도 우리의 칼끝은 백성을 향하지 않습니다. 명을 따르되 뜻은 잃지 않겠습니다.'
  },
  {
    id: 'eleventh-xudu-road-sortie',
    bgm: 'battle-prep',
    chapter: '허도 입성로',
    background: 'story-sortie',
    speaker: '유비',
    portrait: 'liuBei',
    text: '지금은 몸을 낮추어야 할 때다. 그러나 낮춘 몸 안에서도 마음까지 굽힐 수는 없다. 길을 열고, 살아남아 다시 일어서자.'
  }
];

export const eleventhBattleVictoryPages: StoryPage[] = [
  {
    id: 'eleventh-victory-road-cleared',
    bgm: 'militia-theme',
    chapter: '열린 허도 길',
    background: 'story-militia',
    text: '원술 잔군은 물러났고 허도로 향하는 길이 열렸다. 조조군의 감시병들은 유비군의 전열과 군율을 조용히 기록했다.'
  },
  {
    id: 'eleventh-cao-cao-accepts',
    bgm: 'story-dark',
    chapter: '웃음 속의 칼',
    background: 'story-liu-bei',
    speaker: '유비',
    portrait: 'liuBei',
    text: '조조의 장막은 비바람을 피하게 해 주지만, 그 안의 공기는 오래 머물수록 무겁다. 나는 살아남기 위해 들어가되, 나올 날을 잊지 않겠다.'
  }
];

export const twelfthBattleIntroPages: StoryPage[] = [
  {
    id: 'twelfth-cao-cao-order',
    bgm: 'story-dark',
    chapter: '조조의 명',
    background: 'story-liu-bei',
    text: '허도에 머문 지 오래지 않아 조조는 유비군을 하비 포위전에 부른다. 여포를 치는 명령은 서주를 잃은 한을 풀 기회이자, 조조의 칼끝이 어디를 향하는지 가늠하는 시험이었다.'
  },
  {
    id: 'twelfth-xiapi-shadow',
    bgm: 'militia-theme',
    chapter: '하비의 물길',
    background: 'story-militia',
    speaker: '미축',
    text: '하비 외곽은 강과 진흙이 얽혀 있습니다. 보급로를 끊고 둑길을 잡지 못하면, 여포군 기병이 포위망의 빈틈을 찢고 나올 것입니다.'
  },
  {
    id: 'twelfth-brothers-before-lubu',
    bgm: 'story-dark',
    chapter: '다시 마주한 여포',
    background: 'story-three-heroes',
    speaker: '장비',
    portrait: 'zhangFei',
    text: '형님, 이번엔 여포의 이름만 들어도 창끝이 뜨겁습니다. 허나 서두르지 않겠습니다. 먼저 포위망을 조이고, 놈의 날뛰는 길을 끊겠습니다.'
  },
  {
    id: 'twelfth-xiapi-sortie',
    bgm: 'battle-prep',
    chapter: '하비 외곽전',
    background: 'story-sortie',
    speaker: '유비',
    portrait: 'liuBei',
    text: '여포를 치는 싸움이 조조의 명이라 해도, 서주 백성이 다시 짓밟히지 않게 하는 일은 우리의 뜻이다. 물길을 잡고 포위망을 열어라.'
  }
];

export const twelfthBattleVictoryPages: StoryPage[] = [
  {
    id: 'twelfth-victory-outer-camp',
    bgm: 'militia-theme',
    chapter: '무너진 외곽 진영',
    background: 'story-militia',
    text: '유비군은 하비 외곽의 둑길과 보급 진영을 장악했다. 여포군 선봉은 성 안으로 물러났고, 조조군은 포위망을 한층 더 좁혔다.'
  },
  {
    id: 'twelfth-cao-cao-watches',
    bgm: 'story-dark',
    chapter: '칭찬과 감시',
    background: 'story-liu-bei',
    speaker: '간옹',
    text: '현덕, 조조는 오늘의 공을 칭찬하겠지만 동시에 더 깊이 살필 걸세. 여포를 치는 동안에도, 우리가 조조의 손안에만 있지 않다는 것을 잊지 말아야 하네.'
  }
];

export const thirteenthBattleIntroPages: StoryPage[] = [
  {
    id: 'thirteenth-cao-cao-final-order',
    bgm: 'story-dark',
    chapter: '하비 결전의 명',
    background: 'story-liu-bei',
    text: '하비 외곽이 무너지자 조조는 마지막 총공세를 명했다. 성 안의 여포는 아직 강했고, 진궁은 남은 성루와 수문을 엮어 마지막 반격을 준비하고 있었다.'
  },
  {
    id: 'thirteenth-brothers-before-final',
    bgm: 'militia-theme',
    chapter: '여포를 앞두고',
    background: 'story-three-heroes',
    speaker: '관우',
    portrait: 'guanYu',
    text: '형님, 여포는 용맹하나 믿음이 얕습니다. 다만 그 칼끝이 어지러운 세상의 그림자라면, 오늘 싸움 뒤에 우리 길도 더 뚜렷해질 것입니다.'
  },
  {
    id: 'thirteenth-liu-bei-resolve',
    bgm: 'story-dark',
    chapter: '조조의 그늘',
    background: 'story-liu-bei',
    speaker: '유비',
    portrait: 'liuBei',
    text: '조조의 명으로 싸우되, 백성의 원망을 덜고 난세의 사슬을 끊기 위해 싸운다. 여포의 끝을 보더라도 우리의 뜻까지 맡기지는 말자.'
  },
  {
    id: 'thirteenth-xiapi-final-sortie',
    bgm: 'battle-prep',
    chapter: '하비 결전',
    background: 'story-sortie',
    speaker: '장비',
    portrait: 'zhangFei',
    text: '좋습니다, 형님. 이번엔 성문을 열고 여포의 깃발까지 밀고 들어가겠습니다. 누가 함께 나설지 정해 주십시오. 대기한 자도 다음 싸움을 위해 힘을 아껴야 합니다.'
  }
];

export const thirteenthBattleVictoryPages: StoryPage[] = [
  {
    id: 'thirteenth-victory-lubu-falls',
    bgm: 'militia-theme',
    chapter: '무너진 여포',
    background: 'story-militia',
    text: '하비 성내의 마지막 저항이 꺾이고 여포의 깃발이 내려갔다. 뛰어난 무용도 믿음을 잃으면 성 하나를 지키지 못한다는 소문이 병사들 사이에 퍼졌다.'
  },
  {
    id: 'thirteenth-cao-cao-weighs-liu-bei',
    bgm: 'story-dark',
    chapter: '칭찬과 경계',
    background: 'story-liu-bei',
    speaker: '간옹',
    text: '조조는 형님의 말을 들은 뒤 오래 웃지 않았네. 여포의 운명은 끝났지만, 이제부터는 조조가 우리를 어디까지 품고 어디서부터 경계할지 살펴야 하네.'
  },
  {
    id: 'thirteenth-road-to-cao-break',
    bgm: 'story-dark',
    chapter: '떠날 때를 헤아리다',
    background: 'story-three-heroes',
    speaker: '유비',
    portrait: 'liuBei',
    text: '오늘 싸움으로 빚도 공도 쌓였다. 그러나 의로 시작한 길을 남의 장부 속 숫자로 끝낼 수는 없다. 떠날 때가 오면 망설이지 않도록 마음을 단단히 하자.'
  }
];

export const fourteenthBattleIntroPages: StoryPage[] = [
  {
    id: 'fourteenth-secret-edict-shadow',
    bgm: 'story-dark',
    chapter: '조조의 그늘',
    background: 'story-liu-bei',
    speaker: '유비',
    portrait: 'liuBei',
    text: '하비의 공은 컸지만 조조의 시선은 더욱 무거워졌다. 허도의 잔치와 칭찬 사이에서, 유비는 황실의 명분과 자신의 뜻이 더는 같은 장막 안에 머물 수 없음을 느꼈다.'
  },
  {
    id: 'fourteenth-sun-qian-arrives',
    bgm: 'militia-theme',
    chapter: '새로 온 책사',
    background: 'story-militia',
    speaker: '손건',
    text: '현덕공, 저는 손건이라 합니다. 서주와 허도 사이의 길을 오가며 민심과 조조군의 움직임을 살펴 왔습니다. 이제 떠날 때를 고르신다면, 그 길의 말과 문서를 제가 맡겠습니다.'
  },
  {
    id: 'fourteenth-brothers-break-from-cao',
    bgm: 'battle-prep',
    chapter: '서주로 나아가다',
    background: 'story-three-heroes',
    speaker: '장비',
    portrait: 'zhangFei',
    text: '조조의 눈치를 보느라 칼집만 만지고 있을 순 없습니다. 형님, 서주 길목의 감시대를 뚫고 백성들이 우리 깃발을 다시 볼 수 있게 합시다.'
  },
  {
    id: 'fourteenth-xuzhou-gate-sortie',
    bgm: 'battle-prep',
    chapter: '서주 재기',
    background: 'story-sortie',
    speaker: '간옹',
    text: '차주는 조조의 명을 앞세워 성문과 역참을 잡고 있습니다. 길목을 끊고 차주를 격파하면, 조조의 장막 밖으로 나갈 첫 명분을 세울 수 있습니다.'
  }
];

export const fourteenthBattleVictoryPages: StoryPage[] = [
  {
    id: 'fourteenth-victory-xuzhou-gate-opens',
    bgm: 'militia-theme',
    chapter: '다시 열린 서주 길',
    background: 'story-militia',
    text: '차주의 감시대가 흩어지자 서주로 향하는 관문이 열렸다. 백성들은 유비군의 깃발을 알아보았고, 조조의 이름보다 현덕의 이름을 먼저 속삭이기 시작했다.'
  },
  {
    id: 'fourteenth-cao-cao-anger',
    bgm: 'story-dark',
    chapter: '돌이킬 수 없는 길',
    background: 'story-liu-bei',
    speaker: '손건',
    text: '이 승리는 조조에게는 반역의 조짐으로 보일 것입니다. 허도로 돌아갈 길은 사실상 끊겼고, 다음으로 기대야 할 큰 세력은 원소입니다.'
  },
  {
    id: 'fourteenth-road-to-yuan-shao',
    bgm: 'battle-prep',
    chapter: '원소를 향하여',
    background: 'story-three-heroes',
    speaker: '유비',
    portrait: 'liuBei',
    text: '조조를 떠난 이상, 더 큰 파도 속으로 들어가야 한다. 원소의 진영은 안전한 항구가 아니라 또 다른 시험일 것이다. 그래도 뜻을 이어 가려면 그 길을 지나야 한다.'
  }
];

export const fifteenthBattleIntroPages: StoryPage[] = [
  {
    id: 'fifteenth-yuan-envoy-rumor',
    bgm: 'story-dark',
    chapter: '북쪽의 초대',
    background: 'story-militia',
    speaker: '손건',
    text: '원소 진영에서 사자가 내려왔습니다. 조조를 떠난 주공을 받아들일 뜻은 있으나, 북상로 곳곳에는 조조군 추격대가 깔려 있습니다.'
  },
  {
    id: 'fifteenth-liu-bei-under-yuan-shadow',
    bgm: 'battle-prep',
    chapter: '원소 의탁',
    background: 'story-liu-bei',
    speaker: '유비',
    portrait: 'liuBei',
    text: '원소의 깃발 아래로 들어가는 일은 뜻을 접는 일이 아니다. 지금은 큰 세력의 틈에서 백성을 지킬 시간을 얻어야 한다.'
  },
  {
    id: 'fifteenth-guan-yu-pursuit-road',
    bgm: 'battle-prep',
    chapter: '추격로',
    background: 'story-three-heroes',
    speaker: '관우',
    portrait: 'guanYu',
    text: '추격대가 강가와 고갯길을 나누어 막고 있습니다. 채양의 군세를 물리치고 접선지를 확보해야 원소 진영과 이어질 수 있습니다.'
  },
  {
    id: 'fifteenth-yuan-road-sortie',
    bgm: 'battle-prep',
    chapter: '북상 전투',
    background: 'story-sortie',
    speaker: '장비',
    portrait: 'zhangFei',
    text: '쫓아오는 놈들이 조조의 명이라 떠들어도 결국 길을 막는 적일 뿐입니다. 형님, 이번엔 북쪽 길을 시원하게 열어 봅시다!'
  }
];

export const fifteenthBattleVictoryPages: StoryPage[] = [
  {
    id: 'fifteenth-victory-pursuit-breaks',
    bgm: 'militia-theme',
    chapter: '추격을 끊다',
    background: 'story-sortie',
    text: '채양의 추격대가 흩어지자 북상로의 먼지가 잠시 가라앉았다. 유비군은 원소의 사자가 기다리는 접선지에 닿을 수 있었다.'
  },
  {
    id: 'fifteenth-yuan-camp-opens',
    bgm: 'story-dark',
    chapter: '원소의 장막',
    background: 'story-militia',
    speaker: '간옹',
    text: '원소의 진영은 넓고 군세는 크지만, 그만큼 말과 눈도 많습니다. 몸을 맡기되 마음까지 맡기지는 말아야 하겠지요.'
  },
  {
    id: 'fifteenth-road-to-liu-biao',
    bgm: 'battle-prep',
    chapter: '다음 의탁의 그림자',
    background: 'story-liu-bei',
    speaker: '유비',
    portrait: 'liuBei',
    text: '큰 깃발 아래에서도 우리의 뜻은 작아져서는 안 된다. 원소의 군영에서 기회를 살피고, 다시 백성을 지킬 길을 찾아야 한다.'
  }
];

export const sixteenthBattleIntroPages: StoryPage[] = [
  {
    id: 'sixteenth-yuan-camp-shifts',
    bgm: 'story-dark',
    chapter: '원소 진영의 그림자',
    background: 'story-militia',
    speaker: '간옹',
    text: '원소의 군막은 넓지만, 그 안에서는 말 한마디가 칼보다 빠르게 옮겨집니다. 조조를 떠난 유비군을 오래 품으려는 자도, 조조에게 빌미를 주지 않으려는 자도 모두 눈치를 보고 있습니다.'
  },
  {
    id: 'sixteenth-zhao-yun-returns',
    bgm: 'militia-theme',
    chapter: '백마의 재회',
    background: 'story-three-heroes',
    speaker: '조운',
    text: '공손찬 장군의 군세가 흩어진 뒤에도 주공의 의리를 잊지 않았습니다. 오늘부터 이 조자룡의 창은 백성을 버리지 않는 군주를 위해 달리겠습니다.'
  },
  {
    id: 'sixteenth-liu-biao-road',
    bgm: 'battle-prep',
    chapter: '형주로 가는 길',
    background: 'story-liu-bei',
    speaker: '유비',
    portrait: 'liuBei',
    text: '원소의 장막 아래 머무는 것은 잠시 몸을 숨기는 일일 뿐, 뜻을 세울 땅은 되지 못한다. 형주의 유표에게 의탁해 백성을 거둘 길을 다시 찾아야 하오.'
  },
  {
    id: 'sixteenth-jingzhou-road-sortie',
    bgm: 'battle-prep',
    chapter: '형주 의탁로',
    background: 'story-sortie',
    speaker: '장비',
    portrait: 'zhangFei',
    text: '형님, 조조군 추격대가 또 길목을 막고 있소. 이번에는 조운도 합류했으니, 데려갈 장수를 잘 골라 한 번에 길을 열어 봅시다.'
  }
];

export const sixteenthBattleVictoryPages: StoryPage[] = [
  {
    id: 'sixteenth-victory-jingzhou-gate',
    bgm: 'militia-theme',
    chapter: '형주 관문',
    background: 'story-sortie',
    text: '조인의 추격대가 물러서자 형주로 향하는 관문이 열렸다. 유비군은 원소 진영의 무거운 시선에서 벗어나, 다시 스스로 길을 고를 수 있는 숨을 얻었다.'
  },
  {
    id: 'sixteenth-liu-biao-welcome',
    bgm: 'story-dark',
    chapter: '유표의 객장',
    background: 'story-militia',
    speaker: '손건',
    text: '유표는 주공을 객장으로 맞이하겠다고 합니다. 환대는 분명하지만 형주 안에도 각자의 계산이 있습니다. 이제 싸움만큼이나 사람의 마음을 읽어야 할 때입니다.'
  },
  {
    id: 'sixteenth-next-zhuge-shadow',
    bgm: 'battle-prep',
    chapter: '와룡의 소문',
    background: 'story-liu-bei',
    speaker: '간옹',
    text: '형주 선비들 사이에 융중의 와룡이라는 이름이 오갑니다. 주공의 뜻을 천하의 길로 펼칠 사람이라면, 다음 걸음은 그 사람을 찾아가는 일이 되겠습니다.'
  }
];

export const seventeenthBattleIntroPages: StoryPage[] = [
  {
    id: 'seventeenth-wolong-clue-gathered',
    bgm: 'story-dark',
    chapter: '와룡의 단서',
    background: 'story-militia',
    speaker: '손건',
    text: '형주 선비들의 말이 하나로 모입니다. 융중의 초가에 머무는 제갈공명, 사람들은 그를 와룡이라 부릅니다. 주공께서 직접 찾아가 예를 다한다면 길이 열릴지도 모릅니다.'
  },
  {
    id: 'seventeenth-liu-bei-third-visit',
    bgm: 'militia-theme',
    chapter: '삼고초려',
    background: 'story-liu-bei',
    speaker: '유비',
    portrait: 'liuBei',
    text: '한 번 찾아가 만나지 못했다 하여 뜻이 얕아지는 것은 아니오. 천하를 구할 계책을 구하려면, 내가 먼저 몸을 낮추어 그 문 앞에 서야 하오.'
  },
  {
    id: 'seventeenth-road-to-longzhong',
    bgm: 'battle-prep',
    chapter: '융중 방문로',
    background: 'story-three-heroes',
    speaker: '조운',
    text: '융중으로 향하는 산길에 수상한 가병들이 숨어 있습니다. 주공의 방문이 형주 안의 권신들에게 알려진 듯합니다. 길을 먼저 정리하겠습니다.'
  },
  {
    id: 'seventeenth-longzhong-sortie',
    bgm: 'battle-prep',
    chapter: '와룡을 찾아',
    background: 'story-sortie',
    speaker: '장비',
    portrait: 'zhangFei',
    text: '군사 하나 만나러 가는데 길목마다 잔챙이들이 성가시게 하는군요. 그래도 형님 뜻이라면 길부터 시원하게 열어 보겠습니다.'
  }
];

export const seventeenthBattleVictoryPages: StoryPage[] = [
  {
    id: 'seventeenth-victory-longzhong-road',
    bgm: 'militia-theme',
    chapter: '열린 초가 길',
    background: 'story-sortie',
    text: '융중으로 향하는 길목의 가병들이 흩어지고, 산길은 조용해졌다. 유비는 갑옷의 먼지를 털지도 않은 채 제갈량의 초가 앞에 다시 섰다.'
  },
  {
    id: 'seventeenth-zhuge-liang-counsel',
    bgm: 'story-dark',
    chapter: '천하삼분의 말',
    background: 'story-liu-bei',
    speaker: '제갈량',
    text: '한실을 일으키려면 먼저 형주와 익주를 얻어 근본을 세우고, 때를 기다려 북벌의 길을 여십시오. 주공의 뜻이 백성에게 닿는다면, 저는 그 길에 지혜를 보태겠습니다.'
  },
  {
    id: 'seventeenth-zhuge-liang-joins',
    bgm: 'battle-prep',
    chapter: '와룡 출려',
    background: 'story-three-heroes',
    speaker: '유비',
    portrait: 'liuBei',
    text: '공명 선생이 함께한다면 우리 군은 비로소 길을 보는 눈을 얻은 것이오. 이제 형주의 머무름은 다음 큰 전장을 준비하는 시간이 될 것이오.'
  }
];

export const eighteenthBattleIntroPages: StoryPage[] = [
  {
    id: 'eighteenth-cao-vanguard-moves',
    bgm: 'story-dark',
    chapter: '조조 남하의 그림자',
    background: 'story-militia',
    speaker: '손건',
    text: '조조가 형주를 향해 병력을 움직이고 있습니다. 유표의 병세와 형주의 불안이 겹치자, 신야의 작은 군영에도 큰 물결이 밀려옵니다.'
  },
  {
    id: 'eighteenth-zhuge-first-plan',
    bgm: 'battle-prep',
    chapter: '박망파의 계책',
    background: 'story-liu-bei',
    speaker: '제갈량',
    text: '하후돈의 선봉은 빠르나 숲과 좁은 길을 가볍게 여길 것입니다. 길을 내어 주는 척하다가 박망파의 숲길에서 불과 매복으로 그 기세를 꺾겠습니다.'
  },
  {
    id: 'eighteenth-generals-doubt',
    bgm: 'militia-theme',
    chapter: '새 군사의 첫 명',
    background: 'story-three-heroes',
    speaker: '관우',
    portrait: 'guanYu',
    text: '군사의 말이 이치에 맞다 하여도, 전장은 말과 다릅니다. 그러나 형님께서 맡기셨다면 우리 또한 그 계책을 전장에서 증명하겠습니다.'
  },
  {
    id: 'eighteenth-bowang-sortie',
    bgm: 'battle-prep',
    chapter: '박망파 매복전',
    background: 'story-sortie',
    speaker: '유비',
    portrait: 'liuBei',
    text: '오늘 싸움은 적을 많이 베는 것보다 조조군의 발을 묶는 것이 중요하오. 공명의 계책을 중심에 두고, 숲길과 불길 사이에서 전열을 흩트리지 맙시다.'
  }
];

export const eighteenthBattleVictoryPages: StoryPage[] = [
  {
    id: 'eighteenth-victory-bowang-fire',
    bgm: 'militia-theme',
    chapter: '숲길의 불빛',
    background: 'story-sortie',
    text: '박망파의 숲길에 불빛이 번지고, 하후돈의 선봉은 좁은 길에서 서로의 퇴로를 막았다. 유비군은 큰 병력 없이도 조조군의 진격을 늦추었다.'
  },
  {
    id: 'eighteenth-zhuge-trust-earned',
    bgm: 'battle-prep',
    chapter: '계책을 믿다',
    background: 'story-liu-bei',
    speaker: '장비',
    portrait: 'zhangFei',
    text: '처음에는 군사 양반이 종이 위에서만 싸우는 줄 알았습니다. 그런데 오늘 보니, 종이 위의 길이 정말 전장의 길이 되더군요.'
  },
  {
    id: 'eighteenth-red-cliffs-wind',
    bgm: 'story-dark',
    chapter: '강동으로 부는 바람',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '조조의 큰 군세는 여기서 멈추지 않을 것입니다. 이제 강동과 손을 잡을 길을 열어야 합니다. 바람은 아직 멀리 있으나, 방향은 보이기 시작했습니다.'
  }
];

export const nineteenthBattleIntroPages: StoryPage[] = [
  {
    id: 'nineteenth-cao-army-south',
    bgm: 'story-dark',
    chapter: '조조의 남하',
    background: 'story-militia',
    speaker: '손건',
    text: '박망파에서 시간을 벌었지만 조조의 대군은 멈추지 않았습니다. 신야의 백성들이 남쪽으로 몰리고, 장판파 길목에는 추격 기병이 먼저 닿고 있습니다.'
  },
  {
    id: 'nineteenth-zhao-yun-rescue',
    bgm: 'battle-prep',
    chapter: '백마의 구원',
    background: 'story-three-heroes',
    speaker: '조운',
    text: '주공, 피난 행렬이 흩어지면 백성도 군도 모두 잃습니다. 제가 앞뒤를 오가며 길을 묶겠습니다. 다리와 마을을 먼저 지켜 주십시오.'
  },
  {
    id: 'nineteenth-zhang-fei-bridge',
    bgm: 'battle-prep',
    chapter: '장판교의 호령',
    background: 'story-sortie',
    speaker: '장비',
    portrait: 'zhangFei',
    text: '형님은 백성을 이끌고 남쪽 길을 보시오. 뒤쫓는 놈들은 제가 다리목에서 한 번 꺾어 놓겠습니다. 다만 누가 옆을 받쳐 줄지는 잘 골라야겠소!'
  },
  {
    id: 'nineteenth-changban-sortie',
    bgm: 'battle-prep',
    chapter: '장판파 피난로',
    background: 'story-liu-bei',
    speaker: '유비',
    portrait: 'liuBei',
    text: '오늘의 싸움은 이기는 것만으로 끝나지 않소. 백성이 지나갈 길을 열고, 조운과 익덕이 무너지지 않게 서로 받쳐야 하오. 함께할 무장을 신중히 정합시다.'
  }
];

export const nineteenthBattleVictoryPages: StoryPage[] = [
  {
    id: 'nineteenth-victory-refuge-road',
    bgm: 'militia-theme',
    chapter: '피난로가 열리다',
    background: 'story-militia',
    text: '장판파의 먼지 속에서 유비군은 피난 행렬을 가까스로 남쪽 길로 흘려보냈습니다. 조운의 창과 장비의 호령이 무너질 뻔한 길목을 붙들었습니다.'
  },
  {
    id: 'nineteenth-zhao-yun-returns',
    bgm: 'battle-prep',
    chapter: '흩어진 깃발을 모아',
    background: 'story-three-heroes',
    speaker: '조운',
    text: '흩어진 병사와 백성을 모두 되찾지는 못했습니다. 그러나 주공의 깃발이 뒤돌아보았기에 사람들은 다시 모일 곳을 알게 되었습니다.'
  },
  {
    id: 'nineteenth-jiangdong-envoy',
    bgm: 'story-dark',
    chapter: '강동으로 보낼 사절',
    background: 'story-liu-bei',
    speaker: '제갈량',
    text: '조조의 남하는 이제 강동도 외면할 수 없습니다. 장판파에서 지켜낸 백성의 길과 조조군의 속도를 함께 전하면, 손권과 마주 앉을 명분이 생깁니다.'
  }
];

export const twentiethBattleIntroPages: StoryPage[] = [
  {
    id: 'twentieth-envoy-road-opens',
    bgm: 'story-dark',
    chapter: '강동으로 가는 길',
    background: 'story-militia',
    speaker: '손건',
    text: '장판파의 피난로를 지나 유비군은 하구로 향합니다. 강동에 사절을 보내려면 조조군 추격대가 강나루를 닫기 전에 길을 열어야 합니다.'
  },
  {
    id: 'twentieth-zhuge-envoy-plan',
    bgm: 'battle-prep',
    chapter: '사절의 문서',
    background: 'story-liu-bei',
    speaker: '제갈량',
    text: '강동은 조조를 두려워하지만, 싸울 계산이 서야 움직입니다. 손건의 문서와 장판파의 기록을 나루까지 지켜야 합니다.'
  },
  {
    id: 'twentieth-generals-protect-envoy',
    bgm: 'battle-prep',
    chapter: '호위와 돌파',
    background: 'story-three-heroes',
    speaker: '관우',
    portrait: 'guanYu',
    text: '이번 길은 적을 많이 베는 것보다 사절을 온전히 보내는 일이 먼저입니다. 전열과 기동, 보급을 골고루 세우는 편성이 필요하겠습니다.'
  },
  {
    id: 'twentieth-jiangdong-envoy-sortie',
    bgm: 'battle-prep',
    chapter: '강동 사절로',
    background: 'story-sortie',
    speaker: '유비',
    portrait: 'liuBei',
    text: '선생과 손건이 강동에 닿아야 조조의 큰 군세를 막을 길이 열리오. 오늘은 칼끝만이 아니라 말과 문서를 지키는 싸움이오.'
  }
];

export const twentiethBattleVictoryPages: StoryPage[] = [
  {
    id: 'twentieth-victory-river-port',
    bgm: 'militia-theme',
    chapter: '나루가 열리다',
    background: 'story-sortie',
    text: '문빙의 추격대가 물러서자 강나루의 문이 열렸습니다. 유비군은 피난 행렬을 뒤에 두고, 강동으로 향할 작은 배와 사절 문서를 지켜냈습니다.'
  },
  {
    id: 'twentieth-sun-qian-letter-ready',
    bgm: 'battle-prep',
    chapter: '손권에게 보낼 말',
    background: 'story-militia',
    speaker: '손건',
    text: '강동에 전할 말은 이제 분명합니다. 조조의 남하, 장판파의 피난로, 그리고 주공께서 백성을 버리지 않았다는 사실을 함께 적겠습니다.'
  },
  {
    id: 'twentieth-red-cliffs-near',
    bgm: 'story-dark',
    chapter: '적벽으로 부는 바람',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '이제 강동의 마음을 움직일 차례입니다. 손권과 주유가 계산을 마치면, 조조의 대군은 장강 위에서 처음으로 멈춰 서게 될 것입니다.'
  }
];

export const twentyFirstBattleIntroPages: StoryPage[] = [
  {
    id: 'twenty-first-sun-quan-council',
    bgm: 'story-dark',
    chapter: '강동 회담',
    background: 'story-liu-bei',
    speaker: '제갈량',
    text: '손권의 장막 안에서는 항복과 결전의 말이 맞섰습니다. 제갈량은 조조의 대군이 강을 건너면 강동도, 유비군도 설 곳을 잃는다는 사실을 차분히 짚었습니다.'
  },
  {
    id: 'twenty-first-zhou-yu-decision',
    bgm: 'battle-prep',
    chapter: '주유의 결단',
    background: 'story-three-heroes',
    speaker: '주유',
    text: '조조가 강 위에서 싸우는 법을 모른다면, 장강은 우리 편이 될 것입니다. 손권께서 결심하셨으니, 이제 말이 아니라 배와 불길로 답해야 합니다.'
  },
  {
    id: 'twenty-first-liu-bei-alliance',
    bgm: 'militia-theme',
    chapter: '손유 동맹',
    background: 'story-militia',
    speaker: '유비',
    portrait: 'liuBei',
    text: '강동이 함께 선다면 조조의 군세도 처음으로 멈출 수 있소. 우리는 작은 군이지만, 장강의 바람과 백성을 지키는 뜻을 함께 세웁시다.'
  },
  {
    id: 'twenty-first-red-cliffs-sortie',
    bgm: 'battle-prep',
    chapter: '적벽 전초전',
    background: 'story-sortie',
    speaker: '제갈량',
    text: '조조군 수군 선봉이 강가 포구를 시험하고 있습니다. 채모의 선봉을 물리쳐야 강동 수군과 합류할 첫 자리를 지킬 수 있습니다.'
  }
];

export const twentyFirstBattleVictoryPages: StoryPage[] = [
  {
    id: 'twenty-first-victory-river-line',
    bgm: 'militia-theme',
    chapter: '강 위의 첫 승리',
    background: 'story-sortie',
    text: '채모의 선봉이 물러서자 장강의 물결 위에 손유 동맹의 첫 전선이 세워졌습니다. 작은 승리였지만 조조군이 강 위에서 무적이 아님을 모두가 보았습니다.'
  },
  {
    id: 'twenty-first-zhou-yu-fire-plan',
    bgm: 'battle-prep',
    chapter: '화공의 실마리',
    background: 'story-militia',
    speaker: '주유',
    text: '조조군의 배는 많지만 서로를 믿지 못하고, 사슬로 묶으면 바람 앞에서 약점이 됩니다. 아직 때가 무르익지는 않았지만 불길의 길은 보이기 시작했습니다.'
  },
  {
    id: 'twenty-first-zhuge-wind',
    bgm: 'story-dark',
    chapter: '바람을 기다리다',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '다음 싸움은 힘으로만 밀어붙일 수 없습니다. 황개의 결단, 주유의 수군, 그리고 바람의 때가 맞아야 조조의 대군을 무너뜨릴 수 있습니다.'
  }
];

export const twentySecondBattleIntroPages: StoryPage[] = [
  {
    id: 'twenty-second-huang-gai-bitter-plan',
    bgm: 'story-dark',
    chapter: '황개의 결단',
    background: 'story-liu-bei',
    speaker: '주유',
    text: '황개 장군은 거짓 항복의 배를 준비했습니다. 조조가 그 배를 의심하지 않게 하려면, 유비군은 강안의 감시선을 흔들어 화선이 다가갈 길을 열어야 합니다.'
  },
  {
    id: 'twenty-second-zhuge-wind-watch',
    bgm: 'battle-prep',
    chapter: '동남풍을 기다리다',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '바람은 아직 완전히 돌지 않았습니다. 그러나 때가 오면 불길은 강 위에서 산처럼 번질 것입니다. 그 전까지 조조의 척후와 갑판 궁병을 묶어 두어야 합니다.'
  },
  {
    id: 'twenty-second-liu-bei-fire-line',
    bgm: 'militia-theme',
    chapter: '불길 앞의 뜻',
    background: 'story-militia',
    speaker: '유비',
    portrait: 'liuBei',
    text: '오늘의 불은 백성을 태우기 위한 불이 아니라 난세의 물결을 멈추기 위한 불이오. 화선이 닿을 때까지 강안 전선을 흔들림 없이 지킵시다.'
  },
  {
    id: 'twenty-second-fire-attack-sortie',
    bgm: 'battle-prep',
    chapter: '적벽 화공전',
    background: 'story-sortie',
    speaker: '제갈량',
    text: '조조의 함대가 사슬로 묶인 채 강북에 모였습니다. 화선의 길을 막는 초병을 베고, 조조 본선이 불길에 휩싸일 때까지 전선을 지키십시오.'
  }
];

export const twentySecondBattleVictoryPages: StoryPage[] = [
  {
    id: 'twenty-second-victory-fire-rises',
    bgm: 'battle-prep',
    chapter: '불길이 일다',
    background: 'story-sortie',
    text: '화선이 조조군 함대에 닿자 강 위가 붉게 일렁였습니다. 사슬로 묶인 배들은 서로를 구하지 못했고, 장강의 바람은 불길을 북쪽으로 몰아붙였습니다.'
  },
  {
    id: 'twenty-second-cao-cao-retreat',
    bgm: 'story-dark',
    chapter: '조조의 퇴각',
    background: 'story-three-heroes',
    speaker: '조조',
    text: '오늘은 하늘과 강이 나를 막는구나. 그러나 난세는 아직 끝나지 않았다. 살아 돌아가 다시 군을 모으면, 이 치욕도 갚을 날이 있을 것이다.'
  },
  {
    id: 'twenty-second-liu-bei-next-land',
    bgm: 'militia-theme',
    chapter: '형주를 바라보다',
    background: 'story-militia',
    speaker: '유비',
    portrait: 'liuBei',
    text: '조조의 대군은 물러났지만 우리의 근본은 아직 없습니다. 이제 백성이 머물 땅을 얻고, 형주와 익주로 향할 길을 차근히 세워야 합니다.'
  }
];

export const twentyThirdBattleIntroPages: StoryPage[] = [
  {
    id: 'twenty-third-jingzhou-cause',
    bgm: 'militia-theme',
    chapter: '형주 남부의 문',
    background: 'story-militia',
    speaker: '유비',
    portrait: 'liuBei',
    text: '적벽의 불길은 조조를 막았지만 백성이 기대어 살 땅은 아직 없소. 형주 남부의 군현을 힘으로 짓밟지 말고, 먼저 길과 민심을 열어야 하오.'
  },
  {
    id: 'twenty-third-zhuge-plan',
    bgm: 'battle-prep',
    chapter: '군현을 여는 계책',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '영릉의 유도는 아직 마음을 정하지 못했고, 형도영은 길목을 막아 자신의 힘을 보이려 합니다. 그를 물리치되 백성을 다치게 하지 않으면 형주 남부가 움직일 것입니다.'
  },
  {
    id: 'twenty-third-ma-liang-rumor',
    bgm: 'story-dark',
    chapter: '백미의 소문',
    background: 'story-liu-bei',
    speaker: '손건',
    text: '형주 선비들 사이에 마량이라는 이름이 오갑니다. 눈썹이 희어 백미라 불리는 사람인데, 남부 군현의 민심과 길을 누구보다 잘 안다고 합니다.'
  },
  {
    id: 'twenty-third-jingzhou-sortie',
    bgm: 'battle-prep',
    chapter: '형주 남부 진입전',
    background: 'story-sortie',
    speaker: '제갈량',
    text: '형도영의 가병이 남부 길목과 마을을 막고 있습니다. 성급히 몰아붙이면 백성이 흩어지니, 전열을 세우고 마을을 지키며 길목을 확보하십시오.'
  }
];

export const twentyThirdBattleVictoryPages: StoryPage[] = [
  {
    id: 'twenty-third-victory-southern-road',
    bgm: 'militia-theme',
    chapter: '남부 길목이 열리다',
    background: 'story-sortie',
    text: '형도영이 물러서자 남부 군현으로 이어지는 길이 열렸습니다. 유비군은 약탈 없이 마을을 안정시키며 적벽 이후 처음으로 머물 땅의 윤곽을 얻었습니다.'
  },
  {
    id: 'twenty-third-ma-liang-joins',
    bgm: 'battle-prep',
    chapter: '마량의 합류',
    background: 'story-militia',
    speaker: '마량',
    text: '주공께서 백성을 먼저 살피셨다는 말을 들었습니다. 형주 남부의 길과 사람을 잇는 일이라면, 제 작은 글과 말도 보탬이 될 것입니다.'
  },
  {
    id: 'twenty-third-next-commandery',
    bgm: 'story-dark',
    chapter: '군현을 차례로',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '영릉의 문은 열렸지만 형주 남부 전체가 움직인 것은 아닙니다. 계양, 무릉, 장사까지 차례로 설득하고 지켜야 비로소 근거지가 됩니다.'
  }
];

export const twentyFourthBattleIntroPages: StoryPage[] = [
  {
    id: 'twenty-fourth-guiyang-cause',
    bgm: 'militia-theme',
    chapter: '계양으로 가는 서신',
    background: 'story-militia',
    speaker: '마량',
    text: '계양의 조범은 항복과 저항 사이에서 눈치를 보고 있습니다. 먼저 서신을 보내되, 길목의 군사들이 백성을 겁박하지 못하게 막아야 합니다.'
  },
  {
    id: 'twenty-fourth-zhuge-plan',
    bgm: 'battle-prep',
    chapter: '칼보다 먼저 놓는 글',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '이번 전투는 성을 불태우는 싸움이 아닙니다. 마을을 안정시키고 조범의 친위대를 물리치면, 계양은 스스로 문을 열 것입니다.'
  },
  {
    id: 'twenty-fourth-yi-ji-rumor',
    bgm: 'story-dark',
    chapter: '이적의 이름',
    background: 'story-liu-bei',
    speaker: '손건',
    text: '형주의 문사 이적이 계양의 움직임을 지켜보고 있다고 합니다. 무리한 점령보다 예를 갖춘 설득을 보이면, 그 역시 길을 함께할지 모릅니다.'
  },
  {
    id: 'twenty-fourth-guiyang-sortie',
    bgm: 'battle-prep',
    chapter: '계양 설득전',
    background: 'story-sortie',
    speaker: '유비',
    portrait: 'liuBei',
    text: '오늘의 목적은 계양을 꺾는 것이 아니라 열어 보이는 것이오. 마을을 지키고 성채를 압박하되, 백성이 다시 문을 닫지 않게 하시오.'
  }
];

export const twentyFourthBattleVictoryPages: StoryPage[] = [
  {
    id: 'twenty-fourth-victory-guiyang-open',
    bgm: 'militia-theme',
    chapter: '계양의 문이 열리다',
    background: 'story-sortie',
    text: '조범의 친위대가 물러나자 계양의 성문은 불길이 아니라 서신 앞에서 열렸습니다. 유비군은 군율을 세우고 마을의 창고를 함부로 건드리지 않았습니다.'
  },
  {
    id: 'twenty-fourth-yi-ji-joins',
    bgm: 'battle-prep',
    chapter: '이적의 합류',
    background: 'story-militia',
    speaker: '이적',
    text: '주공께서 계양을 힘으로만 다루지 않으셨다는 말을 들었습니다. 형주의 글과 예가 필요하다면, 저도 붓과 길을 보태겠습니다.'
  },
  {
    id: 'twenty-fourth-next-commandery',
    bgm: 'story-dark',
    chapter: '험한 무릉의 길',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '계양은 열렸지만 무릉의 산길은 아직 닫혀 있습니다. 다음에는 험한 길을 뚫고 흩어진 마을을 잇는 싸움이 될 것입니다.'
  }
];

export const twentyFifthBattleIntroPages: StoryPage[] = [
  {
    id: 'twenty-fifth-wuling-road',
    bgm: 'story-dark',
    chapter: '무릉의 닫힌 산길',
    background: 'story-three-heroes',
    speaker: '마량',
    text: '무릉은 계양처럼 성문 하나만 바라보는 땅이 아닙니다. 산길과 작은 마을이 흩어져 있어, 길을 잃으면 군량도 마음도 끊어집니다.'
  },
  {
    id: 'twenty-fifth-yi-ji-letter',
    bgm: 'battle-prep',
    chapter: '먼저 보내는 예',
    background: 'story-militia',
    speaker: '이적',
    text: '김선은 강하게 버티려 하지만, 아래 장수 공지는 백성의 피해를 걱정한다고 들었습니다. 산길 마을을 지키면 그에게 말이 닿을 것입니다.'
  },
  {
    id: 'twenty-fifth-zhuge-formation',
    bgm: 'battle-prep',
    chapter: '좁은 길의 진형',
    background: 'story-liu-bei',
    speaker: '제갈량',
    text: '좁은 산길에서는 무장이 많다고 곧 힘이 되는 것이 아닙니다. 앞길을 여는 자, 마을을 달래는 자, 보급을 잇는 자를 골라야 합니다.'
  },
  {
    id: 'twenty-fifth-wuling-sortie',
    bgm: 'battle-prep',
    chapter: '무릉 산길 확보전',
    background: 'story-sortie',
    speaker: '유비',
    portrait: 'liuBei',
    text: '산길을 불태우지 말고 이어야 하오. 무릉의 길과 마을을 지켜 내면, 닫힌 마음도 함께 열릴 것이오.'
  }
];

export const twentyFifthBattleVictoryPages: StoryPage[] = [
  {
    id: 'twenty-fifth-victory-wuling-open',
    bgm: 'militia-theme',
    chapter: '무릉의 길이 이어지다',
    background: 'story-sortie',
    text: '김선의 산길 방어선이 무너지자 무릉의 마을들은 먼저 불안한 문을 열었습니다. 유비군은 산길 창고를 봉하고 백성의 길을 지켰습니다.'
  },
  {
    id: 'twenty-fifth-gong-zhi-joins',
    bgm: 'battle-prep',
    chapter: '공지의 결심',
    background: 'story-militia',
    speaker: '공지',
    text: '무릉을 힘으로만 누르지 않으셨군요. 백성을 앞세우는 군이라면, 저도 산길과 고을의 형세를 바쳐 따르겠습니다.'
  },
  {
    id: 'twenty-fifth-changsha-shadow',
    bgm: 'story-dark',
    chapter: '장사의 노장',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '무릉까지 길이 이어졌습니다. 남은 장사에는 황충이라는 노장이 있습니다. 다음 싸움은 힘보다 예우와 인내를 시험할 것입니다.'
  }
];

export const twentySixthBattleIntroPages: StoryPage[] = [
  {
    id: 'twenty-sixth-changsha-old-general',
    bgm: 'story-dark',
    chapter: '장사의 노장',
    background: 'story-three-heroes',
    speaker: '공지',
    text: '장사에는 황충이라는 노장이 있습니다. 나이는 들었으나 활은 여전히 매섭고, 성 안 병사들은 그 이름을 믿고 버팁니다.'
  },
  {
    id: 'twenty-sixth-han-xuan-suspicion',
    bgm: 'battle-prep',
    chapter: '의심 많은 태수',
    background: 'story-militia',
    speaker: '이적',
    text: '한현은 황충의 명망도 의심한다고 합니다. 성을 무너뜨리기보다 황충의 체면을 지키면, 장사 사람들의 마음도 흔들릴 것입니다.'
  },
  {
    id: 'twenty-sixth-wei-yan-rumor',
    bgm: 'battle-prep',
    chapter: '성문 안의 불씨',
    background: 'story-liu-bei',
    speaker: '마량',
    text: '위연이라는 장수는 성 안의 부당함을 참지 못한다고 들었습니다. 백성을 해치지 않고 한현의 의심을 꺾으면, 성 안에서 길이 열릴 수 있습니다.'
  },
  {
    id: 'twenty-sixth-changsha-sortie',
    bgm: 'battle-prep',
    chapter: '장사 노장 대면전',
    background: 'story-sortie',
    speaker: '유비',
    portrait: 'liuBei',
    text: '오늘은 노장의 이름을 꺾으러 가는 것이 아니오. 예를 갖추고 한현의 의심을 물리쳐, 장사의 사람을 얻어야 하오.'
  }
];

export const twentySixthBattleVictoryPages: StoryPage[] = [
  {
    id: 'twenty-sixth-victory-changsha-open',
    bgm: 'militia-theme',
    chapter: '장사 성문이 열리다',
    background: 'story-sortie',
    text: '한현의 의심이 전장 위에서 무너지자, 장사 성문은 크게 흔들렸습니다. 유비군은 황충의 명예를 욕보이지 않고 병사들에게 길을 열었습니다.'
  },
  {
    id: 'twenty-sixth-huang-zhong-joins',
    bgm: 'battle-prep',
    chapter: '황충의 합류',
    background: 'story-militia',
    speaker: '황충',
    text: '늙은 몸이라 하나, 아직 활은 뜻을 향해 날아갈 수 있습니다. 장사를 예로 대하신 주공의 군에 제 활을 맡기겠습니다.'
  },
  {
    id: 'twenty-sixth-wei-yan-joins',
    bgm: 'battle-prep',
    chapter: '위연의 결심',
    background: 'story-liu-bei',
    speaker: '위연',
    text: '의심과 두려움으로 닫힌 성문을 더는 따를 수 없습니다. 제 창은 닫힌 문을 여는 데 쓰겠습니다.'
  },
  {
    id: 'twenty-sixth-next-yi-province',
    bgm: 'story-dark',
    chapter: '형주 남부의 끝',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '장사까지 열리면 형주 남부의 뿌리가 굳어집니다. 이제 익주로 이어질 더 큰 길을 바라볼 때가 다가옵니다.'
  }
];

export const twentySeventhBattleIntroPages: StoryPage[] = [
  {
    id: 'twenty-seventh-yizhou-request',
    bgm: 'story-dark',
    chapter: '익주에서 온 요청',
    background: 'story-three-heroes',
    speaker: '손건',
    text: '익주의 유장이 한중 장로의 압박을 두려워하여 원군을 청했습니다. 형주 남부를 안정시킨 지금, 이 요청은 촉으로 향하는 첫 문이 될 수 있습니다.'
  },
  {
    id: 'twenty-seventh-pang-tong-rumor',
    bgm: 'battle-prep',
    chapter: '봉추의 그림자',
    background: 'story-liu-bei',
    speaker: '제갈량',
    text: '익주로 들어가는 길목에는 봉추라 불리는 방통이 머문다는 소문이 있습니다. 그가 뜻을 함께한다면, 산과 관문으로 막힌 촉의 길도 달리 보일 것입니다.'
  },
  {
    id: 'twenty-seventh-gate-warning',
    bgm: 'story-dark',
    chapter: '원군로의 관문',
    background: 'story-militia',
    speaker: '마량',
    text: '양회가 이끄는 전초 병력이 원군로를 막고 있습니다. 길목의 마을을 지켜 명분을 잃지 않고, 산길의 척후를 먼저 끊어야 합니다.'
  },
  {
    id: 'twenty-seventh-yizhou-sortie',
    bgm: 'battle-prep',
    chapter: '익주 원군로',
    background: 'story-sortie',
    speaker: '유비',
    portrait: 'liuBei',
    text: '우리는 익주를 빼앗으러 가는 것이 아니라, 백성을 지키라는 부름에 응하는 것이오. 군율을 세우고 길을 열어 봉추의 마음까지 얻어 봅시다.'
  }
];

export const twentySeventhBattleVictoryPages: StoryPage[] = [
  {
    id: 'twenty-seventh-victory-road-open',
    bgm: 'militia-theme',
    chapter: '익주의 길이 열리다',
    background: 'story-sortie',
    text: '양회의 전초 병력이 물러나고 익주 원군로가 열렸습니다. 유비군은 마을의 창고를 건드리지 않고 길목을 안정시켜, 원군이라는 명분을 분명히 세웠습니다.'
  },
  {
    id: 'twenty-seventh-pang-tong-joins',
    bgm: 'battle-prep',
    chapter: '방통의 합류',
    background: 'story-liu-bei',
    speaker: '방통',
    text: '인의를 말로만 내세우는 군은 많으나, 길목의 작은 마을까지 지키며 움직이는 군은 드뭅니다. 이 방통, 촉으로 향하는 험한 길을 함께 보겠습니다.'
  },
  {
    id: 'twenty-seventh-next-fu-pass',
    bgm: 'story-dark',
    chapter: '부수관을 바라보다',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '봉추가 합류하니 익주의 지세와 사람의 마음을 함께 읽을 수 있게 되었습니다. 다음 길은 부수관과 낙성으로 이어지는 더 깊은 산문입니다.'
  }
];

export const twentyEighthBattleIntroPages: StoryPage[] = [
  {
    id: 'twenty-eighth-fu-pass-shadow',
    bgm: 'story-dark',
    chapter: '부수관의 그림자',
    background: 'story-three-heroes',
    speaker: '방통',
    text: '익주 원군로는 열렸으나 부수관은 아직 닫혀 있습니다. 고패가 관문 병력을 모아 길을 끊으면, 우리 명분은 산문 앞에서 멈출 것입니다.'
  },
  {
    id: 'twenty-eighth-fa-zheng-message',
    bgm: 'battle-prep',
    chapter: '익주 내부의 손',
    background: 'story-liu-bei',
    speaker: '제갈량',
    text: '익주 안쪽에서 법정이라는 인물이 은밀히 소식을 보냈습니다. 그는 유장의 답답한 정치를 걱정하며, 부수관을 넘을 길목을 알려 주겠다고 합니다.'
  },
  {
    id: 'twenty-eighth-roster-pressure',
    bgm: 'battle-prep',
    chapter: '와룡과 봉추의 첫 편성',
    background: 'story-militia',
    speaker: '마량',
    text: '이번 전투부터 방통도 출전 후보가 됩니다. 책사 둘을 모두 데려가면 관문 계책은 강해지지만, 전열과 보급 중 하나가 얇아질 수 있습니다.'
  },
  {
    id: 'twenty-eighth-fu-pass-sortie',
    bgm: 'battle-prep',
    chapter: '부수관 진입전',
    background: 'story-sortie',
    speaker: '유비',
    portrait: 'liuBei',
    text: '관문을 부수는 일보다 중요한 것은, 그 너머의 백성이 우리를 어떻게 기억하느냐요. 방통의 기책과 제갈량의 큰 판을 살려 부수관의 길을 열겠소.'
  }
];

export const twentyEighthBattleVictoryPages: StoryPage[] = [
  {
    id: 'twenty-eighth-victory-pass-open',
    bgm: 'militia-theme',
    chapter: '부수관이 열리다',
    background: 'story-sortie',
    text: '고패의 관문 병력이 물러나고 부수관의 첫 문이 열렸습니다. 유비군은 관문 창고를 봉인하고 마을의 곡식을 지켜, 익주 내부의 의심을 조금 누그러뜨렸습니다.'
  },
  {
    id: 'twenty-eighth-fa-zheng-joins',
    bgm: 'battle-prep',
    chapter: '법정의 합류',
    background: 'story-liu-bei',
    speaker: '법정',
    text: '익주는 험한 땅이지만, 더 험한 것은 닫힌 마음입니다. 주공께서 그 마음을 함부로 베지 않으신다면, 이 법정이 안쪽 길을 밝히겠습니다.'
  },
  {
    id: 'twenty-eighth-next-luo-castle',
    bgm: 'story-dark',
    chapter: '낙성으로 이어지는 길',
    background: 'story-three-heroes',
    speaker: '방통',
    text: '부수관은 문에 불과합니다. 낙성으로 이어지는 길에는 더 깊은 매복과 더 복잡한 마음이 기다립니다. 이제 법정의 내부 정보까지 함께 써야 합니다.'
  }
];

export const twentyNinthBattleIntroPages: StoryPage[] = [
  {
    id: 'twenty-ninth-luo-outer-wall',
    bgm: 'story-dark',
    chapter: '낙성의 바깥 성벽',
    background: 'story-three-heroes',
    speaker: '법정',
    text: '부수관을 넘으면 낙성의 바깥 성벽이 기다립니다. 장임은 성 밖의 고개와 마을을 겹쳐 방어선을 세웠고, 성 안의 장수들은 아직 우리 뜻을 믿지 않습니다.'
  },
  {
    id: 'twenty-ninth-wu-yi-rumor',
    bgm: 'battle-prep',
    chapter: '흔들리는 오의',
    background: 'story-liu-bei',
    speaker: '방통',
    text: '오의는 성문을 지키지만 백성을 함부로 몰아붙이는 명령을 달가워하지 않는다고 합니다. 전장을 거칠게 밀지 않고 길을 열면, 그의 마음도 움직일 수 있습니다.'
  },
  {
    id: 'twenty-ninth-roster-pressure',
    bgm: 'battle-prep',
    chapter: '법정의 첫 출전 선택',
    background: 'story-militia',
    speaker: '제갈량',
    text: '이번 전투부터 법정도 출전 후보입니다. 익주 내부 사정을 아는 법정을 데려가면 설득은 쉬워지지만, 무장을 줄이는 부담은 더 커집니다.'
  },
  {
    id: 'twenty-ninth-luo-sortie',
    bgm: 'battle-prep',
    chapter: '낙성 외곽전',
    background: 'story-sortie',
    speaker: '유비',
    portrait: 'liuBei',
    text: '낙성의 문을 여는 일은 칼보다 마음이 먼저요. 마을을 지키고 장임의 전열을 물리쳐, 성 안 사람들에게 우리가 어떤 군인지 보이겠소.'
  }
];

export const twentyNinthBattleVictoryPages: StoryPage[] = [
  {
    id: 'twenty-ninth-victory-outer-wall',
    bgm: 'militia-theme',
    chapter: '외곽 방어선 붕괴',
    background: 'story-sortie',
    text: '장임은 낙성 안쪽으로 물러났고, 외곽 마을은 큰 피해 없이 유비군의 보호 아래 들어왔습니다. 성 안의 장수들은 유비군을 단순한 침입군으로만 볼 수 없게 되었습니다.'
  },
  {
    id: 'twenty-ninth-wu-yi-joins',
    bgm: 'battle-prep',
    chapter: '오의의 합류',
    background: 'story-liu-bei',
    speaker: '오의',
    text: '성문을 지킨다는 명분으로 백성을 몰아넣는 일은 장수의 길이 아니었습니다. 주공께서 마을을 먼저 살피셨으니, 이 오의도 낙성의 다음 길을 열겠습니다.'
  },
  {
    id: 'twenty-ninth-next-luofeng',
    bgm: 'story-dark',
    chapter: '낙봉파의 그늘',
    background: 'story-three-heroes',
    speaker: '방통',
    text: '낙성 바깥은 열렸지만 길은 더 좁아집니다. 봉황이 떨어진다는 이름의 고개가 있다 하니, 다음 진군은 가볍게 볼 수 없습니다.'
  }
];

export const thirtiethBattleIntroPages: StoryPage[] = [
  {
    id: 'thirtieth-luofeng-shadow',
    bgm: 'story-dark',
    chapter: '낙봉파의 좁은 길',
    background: 'story-three-heroes',
    speaker: '오의',
    text: '낙성 안쪽으로 들어가는 빠른 길은 낙봉파입니다. 길은 짧지만 양쪽 산세가 높고, 장임이 기다리기에는 지나치게 좋은 곳입니다.'
  },
  {
    id: 'thirtieth-pang-tong-warning',
    bgm: 'battle-prep',
    chapter: '봉추의 불길한 직감',
    background: 'story-liu-bei',
    speaker: '방통',
    text: '좋은 길이 언제나 좋은 길은 아닙니다. 적이 우리를 빠르게 오게 만들었다면, 빠르게 물러날 길도 함께 보아 두어야 합니다.'
  },
  {
    id: 'thirtieth-roster-pressure',
    bgm: 'battle-prep',
    chapter: '오의의 첫 출전 선택',
    background: 'story-militia',
    speaker: '법정',
    text: '이번 전투부터 오의도 출전 후보입니다. 낙성의 길을 아는 오의를 데려가면 매복을 읽기 쉬우나, 전열과 보급 후보는 더 좁아집니다.'
  },
  {
    id: 'thirtieth-luofeng-sortie',
    bgm: 'battle-prep',
    chapter: '낙봉파 매복전',
    background: 'story-sortie',
    speaker: '유비',
    portrait: 'liuBei',
    text: '빠른 길을 택하되 방심하지 않겠소. 방통의 눈, 법정의 정보, 오의의 길 안내를 함께 엮어 장임의 매복을 거꾸로 무너뜨리겠소.'
  }
];

export const thirtiethBattleVictoryPages: StoryPage[] = [
  {
    id: 'thirtieth-victory-ambush-broken',
    bgm: 'militia-theme',
    chapter: '매복을 꿰뚫다',
    background: 'story-sortie',
    text: '장임의 매복은 거칠게 덮쳐 왔으나, 유비군은 길목을 버티며 역으로 활로를 열었습니다. 낙봉파의 좁은 비탈에는 무너진 방책과 흩어진 깃발만 남았습니다.'
  },
  {
    id: 'thirtieth-pang-tong-survives',
    bgm: 'battle-prep',
    chapter: '봉추의 생환',
    background: 'story-liu-bei',
    speaker: '방통',
    text: '하마터면 길의 이름값을 할 뻔했습니다. 그러나 이번에는 우리 쪽이 한 수 먼저 보았습니다. 이제 낙성 본성은 더 이상 멀지 않습니다.'
  },
  {
    id: 'thirtieth-next-luo-castle',
    bgm: 'story-dark',
    chapter: '낙성 본성 앞',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '낙봉파를 넘었으니 장임의 방어선은 본성에 몰렸습니다. 다음 전장은 낙성의 문과 익주 장수들의 마음을 함께 여는 싸움이 될 것입니다.'
  }
];

export const thirtyFirstBattleIntroPages: StoryPage[] = [
  {
    id: 'thirty-first-luo-main-gate',
    bgm: 'story-dark',
    chapter: '낙성 본성의 문',
    background: 'story-three-heroes',
    speaker: '법정',
    text: '장임은 낙봉파에서 물러난 뒤 낙성 본성의 문을 모두 닫았습니다. 성벽은 높고, 성 안의 장수들은 아직 유비공의 뜻을 의심하고 있습니다.'
  },
  {
    id: 'thirty-first-veteran-wall',
    bgm: 'battle-prep',
    chapter: '노장 엄안',
    background: 'story-liu-bei',
    speaker: '오의',
    text: '성 안에는 엄안이라는 노장이 있습니다. 장임과 뜻을 같이해 버티고 있으나, 백성을 해치지 않겠다는 약속을 보이면 마음이 움직일 수 있습니다.'
  },
  {
    id: 'thirty-first-siege-choice',
    bgm: 'battle-prep',
    chapter: '돌파와 설득',
    background: 'story-militia',
    speaker: '제갈량',
    text: '성문을 부수는 힘만으로는 낙성을 얻을 수 없습니다. 방통, 법정, 오의를 함께 쓰면 설득의 길이 열리고, 무장을 더 세우면 짧은 돌파가 가능해집니다.'
  },
  {
    id: 'thirty-first-sortie',
    bgm: 'battle-prep',
    chapter: '낙성 본성 공략',
    background: 'story-sortie',
    speaker: '유비',
    portrait: 'liuBei',
    text: '성문을 열되 백성의 마음은 닫지 않겠소. 장임의 방어선을 깨고 엄안 같은 장수에게 우리가 지키려는 뜻을 보여 주시오.'
  }
];

export const thirtyFirstBattleVictoryPages: StoryPage[] = [
  {
    id: 'thirty-first-victory-gate-opened',
    bgm: 'militia-theme',
    chapter: '낙성의 문이 열리다',
    background: 'story-sortie',
    text: '낙성 본성의 문은 마침내 열렸습니다. 성벽 위의 깃발은 내려갔고, 장임의 마지막 방어선도 유비군의 꾸준한 압박 앞에 무너졌습니다.'
  },
  {
    id: 'thirty-first-yan-yan-joins',
    bgm: 'battle-prep',
    chapter: '엄안의 결심',
    background: 'story-liu-bei',
    speaker: '엄안',
    text: '성을 잃고도 백성이 다치지 않았다면, 장수는 패배 속에서도 새 주군을 볼 수 있습니다. 노장의 활이 이제 유비공의 군영을 지키겠습니다.'
  },
  {
    id: 'thirty-first-next-chengdu-road',
    bgm: 'story-dark',
    chapter: '성도 압박의 길',
    background: 'story-three-heroes',
    speaker: '법정',
    text: '낙성이 열렸으니 익주의 심장부가 흔들립니다. 이제 유비군은 성도를 향한 길에서 더 많은 항복과 저항을 동시에 맞이하게 될 것입니다.'
  }
];

export const thirtySecondBattleIntroPages: StoryPage[] = [
  {
    id: 'thirty-second-chengdu-pressure',
    bgm: 'story-dark',
    chapter: '성도 압박의 시작',
    background: 'story-three-heroes',
    speaker: '법정',
    text: '낙성이 열리자 성도는 놀랐으나 아직 문을 닫고 있습니다. 면죽관의 수비장 이엄이 항복과 결전을 저울질하고 있으니, 힘과 명분을 함께 보여 주어야 합니다.'
  },
  {
    id: 'thirty-second-yan-yan-first-counsel',
    bgm: 'battle-prep',
    chapter: '엄안의 첫 출전',
    background: 'story-liu-bei',
    speaker: '엄안',
    text: '이엄은 무턱대고 물러설 장수가 아닙니다. 그러나 백성을 해치지 않는 군율과 익주 장수를 예우하는 마음을 보이면, 그의 칼끝도 흔들릴 것입니다.'
  },
  {
    id: 'thirty-second-mianzhu-plan',
    bgm: 'battle-prep',
    chapter: '면죽관 설득',
    background: 'story-militia',
    speaker: '방통',
    text: '정면으로만 밀면 성도는 더 굳게 닫힙니다. 엄안으로 익주 장수의 마음을 열고, 법정과 오의로 길을 짚으며, 황충과 장비가 수비선을 짧게 끊어야 합니다.'
  },
  {
    id: 'thirty-second-sortie',
    bgm: 'battle-prep',
    chapter: '면죽관 압박전',
    background: 'story-sortie',
    speaker: '유비',
    portrait: 'liuBei',
    text: '우리가 얻으려는 것은 성 하나가 아니라 익주의 마음이오. 면죽관을 넘되 백성을 다치게 하지 말고, 이엄에게도 함께 살 길을 보여 주시오.'
  }
];

export const thirtySecondBattleVictoryPages: StoryPage[] = [
  {
    id: 'thirty-second-victory-pass-yields',
    bgm: 'militia-theme',
    chapter: '면죽관이 열리다',
    background: 'story-sortie',
    text: '면죽관의 수비선은 무너졌지만 성도 길목의 마을은 불타지 않았습니다. 유비군이 군율을 지키자 익주 병사들은 패배보다 이후의 처우를 먼저 바라보았습니다.'
  },
  {
    id: 'thirty-second-li-yan-joins',
    bgm: 'battle-prep',
    chapter: '이엄의 선택',
    background: 'story-liu-bei',
    speaker: '이엄',
    text: '칼을 거두는 일이 반드시 부끄러운 것은 아니군요. 백성을 살리고 익주의 길을 보전한다면, 이엄 또한 새 주군의 군율 아래 서겠습니다.'
  },
  {
    id: 'thirty-second-next-chengdu-surrender',
    bgm: 'story-dark',
    chapter: '성도 항복 권고',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '낙성과 면죽이 열렸으니 유장의 선택지는 더욱 좁아졌습니다. 다음 길은 성도 포위와 항복 권고, 그리고 익주를 어떻게 다스릴 것인가에 달렸습니다.'
  }
];

export const thirtyThirdBattleIntroPages: StoryPage[] = [
  {
    id: 'thirty-third-chengdu-encircled',
    bgm: 'story-dark',
    chapter: '성도 앞의 마지막 권고',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '면죽관이 열렸고 이엄까지 합류했습니다. 성도는 아직 문을 닫았으나, 이제 유장은 싸움과 항복 사이에서 더 이상 오래 머물 수 없습니다.'
  },
  {
    id: 'thirty-third-li-yan-counsel',
    bgm: 'battle-prep',
    chapter: '이엄의 증언',
    background: 'story-liu-bei',
    speaker: '이엄',
    text: '황권은 성도의 체면과 백성의 안위를 함께 보는 장수입니다. 그가 물러서면 유장공도 백성을 살리는 길을 택할 수 있습니다.'
  },
  {
    id: 'thirty-third-final-plan',
    bgm: 'battle-prep',
    chapter: '성도 항복 권고전',
    background: 'story-militia',
    speaker: '법정',
    text: '성도 성문을 부수는 것이 능사가 아닙니다. 황권의 방어선을 눌러 항복 조건을 받아들이게 하고, 마을과 창고를 지켜 유비군의 약속을 증명해야 합니다.'
  },
  {
    id: 'thirty-third-sortie',
    bgm: 'battle-prep',
    chapter: '익주를 얻는 길',
    background: 'story-sortie',
    speaker: '유비',
    portrait: 'liuBei',
    text: '오늘의 승리는 성도의 문을 여는 것보다, 문 안의 백성이 두려움을 내려놓게 하는 데 있소. 칼을 들되 마음을 먼저 잃지 마시오.'
  }
];

export const thirtyThirdBattleVictoryPages: StoryPage[] = [
  {
    id: 'thirty-third-victory-chengdu-yields',
    bgm: 'militia-theme',
    chapter: '성도 항복',
    background: 'story-sortie',
    text: '성도 외곽의 방어선은 무너졌지만 성문 안쪽은 불타지 않았습니다. 유장에게 보내진 마지막 권고문은 백성을 보전하고 장수의 체면을 남기는 조건을 담았습니다.'
  },
  {
    id: 'thirty-third-huang-quan-joins',
    bgm: 'battle-prep',
    chapter: '황권의 귀순',
    background: 'story-liu-bei',
    speaker: '황권',
    text: '익주를 지키려던 마음은 변하지 않았습니다. 다만 이제는 백성을 살리는 길이 유비공의 군율 아래 있다는 것을 보았습니다. 황권이 그 길에 서겠습니다.'
  },
  {
    id: 'thirty-third-yizhou-secured',
    bgm: 'story-dark',
    chapter: '익주 확보',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '형주와 익주의 기반이 마련되었습니다. 유비군은 이제 유랑군이 아니라 나라의 뿌리를 갖춘 세력으로 바뀌며, 촉한 건국을 향한 다음 장을 준비합니다.'
  }
];

export const thirtyFourthBattleIntroPages: StoryPage[] = [
  {
    id: 'thirty-fourth-hanzhong-road',
    bgm: 'story-dark',
    chapter: '한중으로 향하는 길',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '성도는 안정되었으나 북쪽 한중은 아직 장로와 조조의 그늘 아래 흔들립니다. 촉한의 이름을 세우려면 북문을 지킬 길부터 열어야 합니다.'
  },
  {
    id: 'thirty-fourth-huang-quan-first-counsel',
    bgm: 'battle-prep',
    chapter: '황권의 첫 출전',
    background: 'story-liu-bei',
    speaker: '황권',
    text: '가맹관은 익주와 한중을 잇는 목입니다. 그곳에 마초의 기병이 나타났다면, 싸움만이 아니라 그가 누구의 길을 택할지도 보아야 합니다.'
  },
  {
    id: 'thirty-fourth-ma-chao-appears',
    bgm: 'battle-prep',
    chapter: '서량의 기병',
    background: 'story-militia',
    speaker: '법정',
    text: '마초는 조조에게 쫓기고 장로에게도 마음을 다 주지 못했습니다. 그의 돌격을 막아 내고, 유비군이 서량의 창을 품을 그릇임을 보여 주십시오.'
  },
  {
    id: 'thirty-fourth-sortie',
    bgm: 'battle-prep',
    chapter: '가맹관 마초 대면전',
    background: 'story-sortie',
    speaker: '유비',
    portrait: 'liuBei',
    text: '마초의 용맹을 꺾으려 하지 말고, 그 창끝이 향할 뜻을 바꾸어야 하오. 황권과 법정은 길을 열고, 장수들은 기병의 돌파를 받아내시오.'
  }
];

export const thirtyFourthBattleVictoryPages: StoryPage[] = [
  {
    id: 'thirty-fourth-victory-charge-stopped',
    bgm: 'militia-theme',
    chapter: '서량 돌격을 막다',
    background: 'story-sortie',
    text: '가맹관의 좁은 길에서 서량 기병의 첫 돌격은 멈췄습니다. 마초는 패배보다도 유비군의 군율과 익주 장수들의 안정된 태도를 더 오래 바라보았습니다.'
  },
  {
    id: 'thirty-fourth-ma-chao-joins',
    bgm: 'battle-prep',
    chapter: '마초의 합류',
    background: 'story-liu-bei',
    speaker: '마초',
    text: '창을 맡길 주군을 찾지 못해 오래 떠돌았습니다. 유비공이 백성을 보전하고 장수를 예우한다면, 서량의 창 또한 그 깃발 아래 서겠습니다.'
  },
  {
    id: 'thirty-fourth-next-hanzhong',
    bgm: 'story-dark',
    chapter: '한중 전선의 개막',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '마초가 합류하자 북쪽 길이 한층 넓어졌습니다. 이제 촉한의 기반은 성도 안쪽에서 끝나지 않고, 한중을 향한 전선으로 나아가게 됩니다.'
  }
];

export const thirtyFifthBattleIntroPages: StoryPage[] = [
  {
    id: 'thirty-fifth-hanzhong-front',
    bgm: 'story-dark',
    chapter: '한중 전선의 첫 정찰',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '마초가 합류하자 가맹관 너머의 길이 열렸습니다. 그러나 양평관은 장로의 군세가 한중으로 드나드는 목으로, 먼저 길과 병력을 살펴야 합니다.'
  },
  {
    id: 'thirty-fifth-ma-chao-first-sortie',
    bgm: 'battle-prep',
    chapter: '마초의 첫 출전',
    background: 'story-liu-bei',
    speaker: '마초',
    text: '양평관의 말길은 거칠지만 서량 기병이 숨을 맞추면 뚫을 수 있습니다. 이번에는 제가 앞에서 달리며 유비군의 깃발을 보이겠습니다.'
  },
  {
    id: 'thirty-fifth-huang-quan-map',
    bgm: 'battle-prep',
    chapter: '황권의 길잡이',
    background: 'story-militia',
    speaker: '황권',
    text: '적을 모두 몰아내는 것보다 관문 창고와 강변 길을 잡는 것이 중요합니다. 한중을 향한 첫 정찰은 병력보다 지형을 얻는 싸움입니다.'
  },
  {
    id: 'thirty-fifth-sortie',
    bgm: 'battle-prep',
    chapter: '양평관 정찰전',
    background: 'story-sortie',
    speaker: '유비',
    portrait: 'liuBei',
    text: '마초는 선봉을 맡고, 황권과 법정은 길을 보시오. 이 싸움은 한중을 빼앗는 첫걸음이 아니라, 한중을 얻을 자격을 살피는 첫걸음이오.'
  }
];

export const thirtyFifthBattleVictoryPages: StoryPage[] = [
  {
    id: 'thirty-fifth-victory-pass-opened',
    bgm: 'militia-theme',
    chapter: '양평관 길을 열다',
    background: 'story-sortie',
    text: '양평관의 선봉대가 물러나자 한중으로 향하는 길목과 보급 창고가 유비군의 눈앞에 드러났습니다. 마초의 첫 돌격은 이제 유비군의 돌격이 되었습니다.'
  },
  {
    id: 'thirty-fifth-ma-dai-joins',
    bgm: 'battle-prep',
    chapter: '마대의 합류',
    background: 'story-liu-bei',
    speaker: '마대',
    text: '서량의 흩어진 기병을 거두어 마초 형님의 깃발 아래로 데려왔습니다. 유비공께서 허락하신다면 저도 한중 길을 여는 창이 되겠습니다.'
  },
  {
    id: 'thirty-fifth-next-hanzhong',
    bgm: 'story-dark',
    chapter: '북문을 향하여',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '마초와 마대의 기병이 갖춰지자 북쪽 전선은 더 빠르게 움직일 수 있게 되었습니다. 이제 한중을 둘러싼 큰 싸움이 가까워집니다.'
  }
];

export const thirtySixthBattleIntroPages: StoryPage[] = [
  {
    id: 'thirty-sixth-dingjun-mountain',
    bgm: 'story-dark',
    chapter: '정군산으로',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '양평관의 길을 살핀 뒤 한중의 핵심은 정군산으로 모였습니다. 산을 잡으면 한중을 굽어보고, 산을 잃으면 북문 전체가 흔들립니다.'
  },
  {
    id: 'thirty-sixth-huang-zhong-plan',
    bgm: 'battle-prep',
    chapter: '노장의 결심',
    background: 'story-liu-bei',
    speaker: '황충',
    text: '나이가 전열을 막지는 못합니다. 법정의 계책으로 능선을 잡아 주신다면, 이 늙은 활과 칼이 하후연의 기세를 꺾어 보이겠습니다.'
  },
  {
    id: 'thirty-sixth-western-cavalry',
    bgm: 'battle-prep',
    chapter: '서량 기병의 우회로',
    background: 'story-militia',
    speaker: '마초',
    text: '정군산 서쪽 능선은 말이 달리기 어렵지만, 마대와 함께 길을 잡으면 적의 눈을 돌릴 수 있습니다. 황충 장군이 치는 순간을 만들겠습니다.'
  },
  {
    id: 'thirty-sixth-sortie',
    bgm: 'battle-prep',
    chapter: '정군산 전초전',
    background: 'story-sortie',
    speaker: '유비',
    portrait: 'liuBei',
    text: '정군산을 얻으면 한중의 이름이 가까워질 것이오. 황충과 법정은 산을 보고, 마초와 마대는 길을 흔들며, 모두 유비군의 깃발을 산 위에 세우시오.'
  }
];

export const thirtySixthBattleVictoryPages: StoryPage[] = [
  {
    id: 'thirty-sixth-victory-ridge-held',
    bgm: 'militia-theme',
    chapter: '정군산 능선을 잡다',
    background: 'story-sortie',
    text: '정군산의 첫 능선이 유비군 손에 들어오자 한중 전선의 무게가 바뀌었습니다. 하후연의 선봉은 물러났고, 산길의 병사들은 새 주인을 가늠하기 시작했습니다.'
  },
  {
    id: 'thirty-sixth-wang-ping-joins',
    bgm: 'battle-prep',
    chapter: '왕평의 투항',
    background: 'story-liu-bei',
    speaker: '왕평',
    text: '저는 한중의 산길과 병사들의 마음을 압니다. 조조군의 군율은 엄하나 이 땅을 품지는 못했습니다. 유비공께서 한중을 안정시킨다면 제 길도 그곳에 있겠습니다.'
  },
  {
    id: 'thirty-sixth-next-foundation',
    bgm: 'story-dark',
    chapter: '한중의 깃발',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '정군산의 승리와 왕평의 합류로 한중의 산길은 조금씩 유비군 편으로 기울었습니다. 이제 한중 본전과 촉한의 이름이 더 가까워집니다.'
  }
];

export const thirtySeventhBattleIntroPages: StoryPage[] = [
  {
    id: 'thirty-seventh-hanzhong-front',
    bgm: 'story-dark',
    chapter: '한중 결전으로',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '정군산의 능선이 열리자 한중의 길은 마침내 하나의 전장으로 이어졌습니다. 조조군은 물러나기 전에 마지막으로 북문을 움켜쥐려 합니다.'
  },
  {
    id: 'thirty-seventh-wang-ping-map',
    bgm: 'battle-prep',
    chapter: '산길의 눈',
    background: 'story-liu-bei',
    speaker: '왕평',
    text: '본진으로 곧장 오르는 길은 적이 기다리는 길입니다. 강변 창고를 잡고 서쪽 숲길을 열면 조조군의 퇴로와 보급이 동시에 흔들립니다.'
  },
  {
    id: 'thirty-seventh-huang-fa-plan',
    bgm: 'battle-prep',
    chapter: '노장과 군사의 합',
    background: 'story-sortie',
    speaker: '법정',
    text: '황충 장군이 고지를 누르고 왕평이 길을 잇는 사이, 마초와 마대가 북쪽 기병대를 묶어야 합니다. 이 싸움은 힘보다 순서가 중요합니다.'
  },
  {
    id: 'thirty-seventh-sortie',
    bgm: 'battle-prep',
    chapter: '한중 결전',
    background: 'story-militia',
    speaker: '유비',
    portrait: 'liuBei',
    text: '한중을 얻는 것은 북문을 얻는 일이고, 북문을 얻는 것은 촉의 백성을 지킬 이름을 얻는 일이오. 모두 각자의 길에서 하나의 깃발을 세우시오.'
  }
];

export const thirtySeventhBattleVictoryPages: StoryPage[] = [
  {
    id: 'thirty-seventh-victory-hanzhong-held',
    bgm: 'militia-theme',
    chapter: '한중을 얻다',
    background: 'story-sortie',
    text: '조조군의 본진이 흔들리고 한중의 창고와 산길이 유비군의 손에 들어왔습니다. 북문을 지키던 군세는 물러났고, 촉으로 향하는 길은 비로소 안정되었습니다.'
  },
  {
    id: 'thirty-seventh-king-of-hanzhong',
    bgm: 'battle-prep',
    chapter: '한중왕의 이름',
    background: 'story-liu-bei',
    speaker: '제갈량',
    text: '주공께서 한중을 얻었으니 이제 사람들은 촉의 주인이 누구인지 묻게 될 것입니다. 이름은 칼보다 늦게 움직이나, 때로는 칼보다 멀리 갑니다.'
  },
  {
    id: 'thirty-seventh-next-shu-han',
    bgm: 'story-dark',
    chapter: '촉한의 문턱',
    background: 'story-three-heroes',
    speaker: '유비',
    portrait: 'liuBei',
    text: '우리가 세우려는 것은 땅의 이름만이 아니오. 한실을 잇고 백성을 품을 뜻이라면, 이제 그 뜻을 나라의 이름으로 밝힐 준비를 해야 하오.'
  }
];

export const hanzhongKingCouncilPages: StoryPage[] = [
  {
    id: 'hanzhong-king-council-open',
    bgm: 'story-dark',
    chapter: '한중왕 즉위 논의',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '한중을 얻은 뒤 군영의 분위기는 전장의 승리에서 나라의 이름으로 옮겨 갔습니다. 이제 유비군은 어디를 지키는 군대인지, 누구의 뜻을 잇는 세력인지 밝혀야 합니다.'
  },
  {
    id: 'hanzhong-king-liu-bei-doubt',
    bgm: 'battle-prep',
    chapter: '이름의 무게',
    background: 'story-liu-bei',
    speaker: '유비',
    portrait: 'liuBei',
    text: '내가 왕의 이름을 받는 것이 백성을 위한 길이라면 마다하지 않겠소. 다만 그 이름이 욕심으로 보인다면 지금까지 따른 이들의 뜻을 해칠까 두렵소.'
  },
  {
    id: 'hanzhong-king-officers',
    bgm: 'battle-prep',
    chapter: '장수들의 서명',
    background: 'story-militia',
    speaker: '관우',
    portrait: 'guanYu',
    text: '형님이 세우는 이름은 한실을 잇기 위한 깃발입니다. 전장마다 모인 장수들이 그 깃발 아래 서명한다면, 병사들도 무엇을 위해 싸우는지 알게 될 것입니다.'
  },
  {
    id: 'hanzhong-king-next-foundation',
    bgm: 'militia-theme',
    chapter: '촉한의 문 앞에서',
    background: 'story-sortie',
    speaker: '제갈량',
    text: '한중왕의 격문이 준비되면 다음은 촉한의 이름을 세울 차례입니다. 그러나 나라의 이름은 새 전장을 부릅니다. 형주의 긴장과 북방의 그림자도 함께 보아야 합니다.'
  }
];

export const shuHanFoundationPages: StoryPage[] = [
  {
    id: 'shu-han-foundation-banner',
    bgm: 'militia-theme',
    chapter: '한중왕 즉위',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '한중의 깃발 아래 장수들의 이름이 모였습니다. 유비는 한중왕의 이름을 받아들이며, 이 이름이 욕심이 아니라 한실을 잇는 약속임을 밝히려 합니다.'
  },
  {
    id: 'shu-han-foundation-oath',
    bgm: 'battle-prep',
    chapter: '촉한의 이름',
    background: 'story-liu-bei',
    speaker: '유비',
    portrait: 'liuBei',
    text: '우리가 세우려는 나라는 나 한 사람의 나라가 아니오. 도원에서 맺은 뜻, 전장을 지나 모인 장수들의 뜻, 그리고 백성을 지키려는 뜻을 촉한의 이름으로 세우겠소.'
  },
  {
    id: 'shu-han-foundation-generals',
    bgm: 'battle-prep',
    chapter: '오호의 깃발',
    background: 'story-sortie',
    speaker: '관우',
    portrait: 'guanYu',
    text: '형님께서 이름을 세우셨으니 장수들도 각자의 자리를 지켜야 합니다. 서쪽은 안정되었으나 형주의 바람은 점점 거칠어지고 있습니다.'
  },
  {
    id: 'shu-han-foundation-next-front',
    bgm: 'story-dark',
    chapter: '형주의 먹구름',
    background: 'story-militia',
    speaker: '제갈량',
    text: '촉한의 이름은 세워졌지만, 그 이름은 새로운 책임을 부릅니다. 관우가 지키는 형주에는 손권과 조조의 시선이 함께 모이고 있습니다.'
  }
];

export const thirtyEighthBattleIntroPages: StoryPage[] = [
  {
    id: 'thirty-eighth-jing-warning',
    bgm: 'story-dark',
    chapter: '형주의 먹구름',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '촉한의 이름이 세워지자 형주의 무게가 더 커졌습니다. 관우가 지키는 강릉과 남군은 조조와 손권이 동시에 바라보는 칼끝이 되었습니다.'
  },
  {
    id: 'thirty-eighth-guan-yu-front',
    bgm: 'battle-prep',
    chapter: '관우의 전선',
    background: 'story-liu-bei',
    speaker: '관우',
    portrait: 'guanYu',
    text: '형주는 형님의 등을 지키는 문입니다. 위의 정찰대가 북쪽에서 움직이고, 오의 배가 강가를 맴돈다면 먼저 봉화대와 나루를 묶어야 합니다.'
  },
  {
    id: 'thirty-eighth-two-fronts',
    bgm: 'battle-prep',
    chapter: '강과 성 사이',
    background: 'story-militia',
    speaker: '마량',
    text: '강변 마을은 오의 말에 흔들리고, 북쪽 성채는 위의 군세를 두려워합니다. 백성이 흔들리면 형주는 성벽보다 먼저 무너집니다.'
  },
  {
    id: 'thirty-eighth-sortie',
    bgm: 'battle-prep',
    chapter: '형주 방위 전초전',
    background: 'story-sortie',
    speaker: '유비',
    portrait: 'liuBei',
    text: '촉한의 이름을 세운 지금, 형주를 잃는다면 그 이름도 흔들릴 것이오. 관우는 봉화대를 지키고, 모두 강과 성 사이의 불안을 잠재우시오.'
  }
];

export const thirtyEighthBattleVictoryPages: StoryPage[] = [
  {
    id: 'thirty-eighth-victory-beacon-secured',
    bgm: 'militia-theme',
    chapter: '봉화가 다시 오르다',
    background: 'story-sortie',
    text: '형주의 봉화대가 다시 불을 밝혔습니다. 위의 정찰대는 물러났고 오의 배는 강 건너로 물러났지만, 두 시선이 동시에 형주를 향하고 있다는 사실은 분명해졌습니다.'
  },
  {
    id: 'thirty-eighth-guan-yu-resolve',
    bgm: 'battle-prep',
    chapter: '관우의 결의',
    background: 'story-liu-bei',
    speaker: '관우',
    portrait: 'guanYu',
    text: '적이 둘이라 하여 뜻도 둘이 될 수는 없습니다. 형주를 지키는 칼은 더욱 곧아야 합니다. 다만 강가의 마음까지 지켜야 오래 버틸 수 있겠습니다.'
  },
  {
    id: 'thirty-eighth-next-fan-castle',
    bgm: 'story-dark',
    chapter: '번성의 그림자',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '형주의 불안은 잠시 가라앉았지만 북쪽 번성의 문은 여전히 굳게 닫혀 있습니다. 촉한의 첫 큰 시험은 관우의 전선에서 시작될 것입니다.'
  }
];

export const thirtyNinthBattleIntroPages: StoryPage[] = [
  {
    id: 'thirty-ninth-fan-castle-shadow',
    bgm: 'story-dark',
    chapter: '번성의 그림자',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '형주의 봉화는 다시 올랐으나, 번성의 문은 더욱 굳게 닫혔습니다. 조조의 북방 병력은 수로와 성채를 엮어 시간을 벌려 하고, 오의 시선도 강 건너에서 조용히 움직입니다.'
  },
  {
    id: 'thirty-ninth-guan-yu-north',
    bgm: 'battle-prep',
    chapter: '관우의 북상',
    background: 'story-liu-bei',
    speaker: '관우',
    portrait: 'guanYu',
    text: '형주를 지키는 일은 곧 한실을 일으키는 일입니다. 번성 외곽의 보루와 나루를 눌러야 적의 숨통을 조이고, 뒤이어 큰 결전을 열 수 있습니다.'
  },
  {
    id: 'thirty-ninth-flooded-fields',
    bgm: 'battle-prep',
    chapter: '물길을 보는 눈',
    background: 'story-militia',
    speaker: '법정',
    text: '한수의 물길은 평소에는 느려 보이나, 비와 둑의 높이에 따라 전장의 형세를 통째로 바꿉니다. 이번 전투에서는 성 밖 보급선과 제방 감시초를 먼저 잡아야 합니다.'
  },
  {
    id: 'thirty-ninth-sortie',
    bgm: 'battle-prep',
    chapter: '번성 외곽 압박전',
    background: 'story-sortie',
    speaker: '유비',
    portrait: 'liuBei',
    text: '관우가 선봉을 잡되 모두가 그 뒤를 받쳐라. 번성 외곽을 열면 다음 물길과 성문을 함께 도모할 수 있다. 오늘의 선택이 다음 전장의 폭을 넓힐 것이다.'
  }
];

export const thirtyNinthBattleVictoryPages: StoryPage[] = [
  {
    id: 'thirty-ninth-victory-outer-wall',
    bgm: 'militia-theme',
    chapter: '외곽 보루 함락',
    background: 'story-sortie',
    text: '번성 외곽의 보루와 나루가 촉한군의 손에 들어왔습니다. 조조군은 성 안쪽으로 물러났고, 방덕의 선봉은 다시 방어진을 고쳐 세우며 다음 격돌을 예고했습니다.'
  },
  {
    id: 'thirty-ninth-pang-de-resolve',
    bgm: 'battle-prep',
    chapter: '방덕의 결의',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '방덕은 물러났으나 기세를 잃지 않았습니다. 조인과 우금도 성 안의 병력을 다시 묶고 있으니, 다음 전투에서는 물길과 성벽이 함께 움직일 것입니다.'
  },
  {
    id: 'thirty-ninth-next-water-lines',
    bgm: 'story-dark',
    chapter: '한수 수공 준비',
    background: 'story-militia',
    speaker: '관우',
    portrait: 'guanYu',
    text: '성은 아직 멀리 있고, 강은 우리 곁에 있소. 병사들에게 둑을 살피게 하고 배와 밧줄을 준비하라. 다음에는 물길마저 우리 편으로 삼아야 하오.'
  }
];

export const fortiethBattleIntroPages: StoryPage[] = [
  {
    id: 'fortieth-han-river-rain',
    bgm: 'story-dark',
    chapter: '불어난 한수',
    background: 'story-militia',
    speaker: '제갈량',
    text: '비가 이어지며 한수의 물길이 불어났습니다. 번성 밖의 평지는 진흙으로 변했고, 우금의 본대와 방덕의 선봉은 강과 둑 사이에 길게 늘어섰습니다.'
  },
  {
    id: 'fortieth-water-plan',
    bgm: 'battle-prep',
    chapter: '수공의 군령',
    background: 'story-liu-bei',
    speaker: '법정',
    text: '둑을 무너뜨리는 것만이 수공은 아닙니다. 물이 차오를 때 적이 믿는 퇴로를 먼저 끊고, 궁병과 기병을 높은 둑 위로 몰아야 합니다.'
  },
  {
    id: 'fortieth-guan-yu-command',
    bgm: 'battle-prep',
    chapter: '관우의 결단',
    background: 'story-three-heroes',
    speaker: '관우',
    portrait: 'guanYu',
    text: '물길이 우리 편에 선다면 적의 칼도 무뎌질 것이오. 우금의 본대를 눌러 번성의 숨통을 끊고, 방덕의 돌격은 둑 위에서 맞받아치겠소.'
  },
  {
    id: 'fortieth-sortie',
    bgm: 'battle-prep',
    chapter: '한수 수공',
    background: 'story-sortie',
    speaker: '유비',
    portrait: 'liuBei',
    text: '관우가 앞을 열고, 법정과 마량이 물길을 살피며, 기동대는 둑과 나루를 끊어라. 이번 싸움은 성벽보다 먼저 강을 얻는 싸움이다.'
  }
];

export const fortiethBattleVictoryPages: StoryPage[] = [
  {
    id: 'fortieth-victory-seven-armies',
    bgm: 'militia-theme',
    chapter: '칠군이 물에 잠기다',
    background: 'story-sortie',
    text: '한수의 물길이 전장을 덮치자 조조군의 진형은 무너졌습니다. 우금의 본대는 퇴로를 잃었고, 번성 외곽에는 관우군의 깃발이 더욱 가까워졌습니다.'
  },
  {
    id: 'fortieth-yu-jin-surrenders',
    bgm: 'battle-prep',
    chapter: '우금의 항복',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '우금은 병사들을 살리기 위해 무기를 내려놓았습니다. 그러나 방덕은 끝까지 물러서지 않았고, 번성 안의 조인은 더 깊은 수성전을 준비하기 시작했습니다.'
  },
  {
    id: 'fortieth-next-siege',
    bgm: 'story-dark',
    chapter: '번성 포위',
    background: 'story-militia',
    speaker: '관우',
    portrait: 'guanYu',
    text: '강은 길을 열었으나 성문은 아직 남아 있소. 병사들에게 쉬게 하되 경계를 늦추지 마시오. 다음은 번성의 성벽을 직접 마주할 차례요.'
  }
];

export const fortyFirstBattleIntroPages: StoryPage[] = [
  {
    id: 'forty-first-fan-wall',
    bgm: 'story-dark',
    chapter: '성벽 앞의 밤',
    background: 'story-militia',
    speaker: '제갈량',
    text: '한수의 물길은 조조군의 칠군을 무너뜨렸지만, 번성의 성벽은 아직 닫혀 있습니다. 조인은 성문을 걸어 잠그고, 방덕은 마지막 돌격을 준비합니다.'
  },
  {
    id: 'forty-first-siege-plan',
    bgm: 'battle-prep',
    chapter: '포위의 순서',
    background: 'story-liu-bei',
    speaker: '마량',
    text: '성벽을 바로 두드리면 병사만 지칩니다. 외성 보루와 수문, 강가의 낮은 마을을 먼저 붙잡아야 성 안의 사기가 흔들립니다.'
  },
  {
    id: 'forty-first-wu-shadow',
    bgm: 'story-dark',
    chapter: '강 건너의 시선',
    background: 'story-three-heroes',
    speaker: '관우',
    portrait: 'guanYu',
    text: '북쪽 성문만 보아서는 안 되오. 강동의 배가 멀리서 움직이고 있으니, 번성을 치는 동안 뒤의 나루도 비워 두지 마시오.'
  },
  {
    id: 'forty-first-sortie',
    bgm: 'battle-prep',
    chapter: '번성 공성전',
    background: 'story-sortie',
    speaker: '유비',
    portrait: 'liuBei',
    text: '관우가 성문을 압박하고, 남은 무장들은 보루와 나루를 나누어 맡아라. 이번 싸움은 성을 치면서도 뒤의 그림자를 놓치지 않는 싸움이다.'
  }
];

export const fortyFirstBattleVictoryPages: StoryPage[] = [
  {
    id: 'forty-first-victory-gate',
    bgm: 'militia-theme',
    chapter: '성문이 흔들리다',
    background: 'story-sortie',
    text: '번성의 외성 보루가 무너지고 조인의 방어선은 성 안쪽으로 밀려났습니다. 방덕의 결사대도 더는 성문 밖에서 버티지 못했습니다.'
  },
  {
    id: 'forty-first-pang-de-end',
    bgm: 'battle-prep',
    chapter: '방덕의 결말',
    background: 'story-three-heroes',
    speaker: '관우',
    portrait: 'guanYu',
    text: '방덕은 끝까지 물러서지 않았소. 적이라 하나 그 기개는 가벼이 볼 수 없으니, 병사들에게 전하되 오만해지지 말라 이르시오.'
  },
  {
    id: 'forty-first-jing-warning',
    bgm: 'story-dark',
    chapter: '형주의 불안',
    background: 'story-militia',
    speaker: '제갈량',
    text: '번성의 성벽은 흔들렸으나, 강 건너 오의 움직임은 더 가까워졌습니다. 다음 장에서는 포위의 승세와 형주 후방의 균열을 함께 다루어야 합니다.'
  }
];

export const fortySecondBattleIntroPages: StoryPage[] = [
  {
    id: 'forty-second-river-rumors',
    bgm: 'story-dark',
    chapter: '강릉의 불안',
    background: 'story-militia',
    speaker: '마량',
    text: '번성 성문은 흔들리고 있지만, 강릉 동쪽 나루에는 낯선 상선이 늘었습니다. 장사꾼의 말투 속에 군령이 섞여 있고, 밤 신호는 평소보다 늦게 올라옵니다.'
  },
  {
    id: 'forty-second-lu-meng-shadow',
    bgm: 'battle-prep',
    chapter: '흰 옷의 그림자',
    background: 'story-liu-bei',
    speaker: '제갈량',
    text: '강동의 장수들은 칼을 들고 오지 않을 수도 있습니다. 흰 옷의 상인, 약재 배, 빈 곡식 자루가 모두 길을 재는 눈이 될 수 있습니다.'
  },
  {
    id: 'forty-second-guan-yu-rear-order',
    bgm: 'battle-prep',
    chapter: '후방 경계령',
    background: 'story-three-heroes',
    speaker: '관우',
    portrait: 'guanYu',
    text: '번성을 치는 손을 늦출 수는 없으나, 형주의 뒤를 비울 수도 없소. 나루와 창고를 지키며 강동 정찰대를 몰아내시오.'
  },
  {
    id: 'forty-second-sortie',
    bgm: 'battle-prep',
    chapter: '강릉 나루 경계전',
    background: 'story-sortie',
    speaker: '유비',
    portrait: 'liuBei',
    text: '전선의 승리와 후방의 평온은 따로 있지 않다. 관우의 깃발이 번성 앞에 선 동안, 강릉 나루의 작은 흔들림까지 놓치지 말라.'
  }
];

export const fortySecondBattleVictoryPages: StoryPage[] = [
  {
    id: 'forty-second-victory-river-watch',
    bgm: 'militia-theme',
    chapter: '나루의 밤이 밝아지다',
    background: 'story-sortie',
    text: '강릉 동쪽 나루의 정찰선은 물러났고, 강변 창고의 불안은 잠시 가라앉았습니다. 그러나 붙잡힌 척후의 말은 오히려 더 큰 위기를 가리켰습니다.'
  },
  {
    id: 'forty-second-lu-xun-letter',
    bgm: 'story-dark',
    chapter: '부드러운 글과 날카로운 뜻',
    background: 'story-three-heroes',
    speaker: '마량',
    text: '강동에서 온 문서는 예를 갖추고 있었지만, 글 사이에는 형주의 빈틈을 재는 뜻이 숨어 있었습니다. 승리보다 후방의 믿음이 더 급해졌습니다.'
  },
  {
    id: 'forty-second-next-crack',
    bgm: 'story-dark',
    chapter: '갈라지는 형주',
    background: 'story-militia',
    speaker: '제갈량',
    text: '나루 하나는 지켰으나, 강릉과 공안의 장수들이 흔들리기 시작했습니다. 다음 장에서는 형주 후방의 균열이 더 노골적인 배신과 침투로 이어질 것입니다.'
  }
];

export const fortyThirdBattleIntroPages: StoryPage[] = [
  {
    id: 'forty-third-gongan-gate',
    bgm: 'story-dark',
    chapter: '공안의 성문',
    background: 'story-militia',
    speaker: '미축',
    text: '강릉 창고 장부를 대조하니 공안으로 보낸 군량이 사라진 흔적이 있습니다. 성문을 지키는 병사들은 명령을 기다린다 하면서도 강동 배를 그냥 들이고 있습니다.'
  },
  {
    id: 'forty-third-fu-shiren-wavers',
    bgm: 'story-dark',
    chapter: '흔들리는 수비장',
    background: 'story-three-heroes',
    speaker: '마량',
    text: '부사인은 관우 장군의 엄한 군령을 두려워하고, 미방은 강동의 말에 마음이 흔들립니다. 이 싸움은 적을 베는 일보다 성문 안의 믿음을 붙드는 일이 더 어렵습니다.'
  },
  {
    id: 'forty-third-lu-meng-infiltration',
    bgm: 'battle-prep',
    chapter: '강동의 본대',
    background: 'story-liu-bei',
    speaker: '제갈량',
    text: '여몽은 더는 작은 정찰선만 보내지 않을 것입니다. 흰 옷의 상인이 길을 열고, 육손의 글이 의심을 누그러뜨린 뒤, 본대가 공안 성문을 향해 움직일 것입니다.'
  },
  {
    id: 'forty-third-sortie',
    bgm: 'battle-prep',
    chapter: '공안 성문 변고',
    background: 'story-sortie',
    speaker: '관우',
    portrait: 'guanYu',
    text: '번성 앞 깃발을 거둘 수 없다면, 후방의 성문을 먼저 다시 잠가야 하오. 공안 성문을 붙들고 부사인의 병사들을 안정시켜 형주가 한순간에 무너지지 않게 하시오.'
  }
];

export const fortyThirdBattleVictoryPages: StoryPage[] = [
  {
    id: 'forty-third-victory-gate-held',
    bgm: 'militia-theme',
    chapter: '잠긴 성문',
    background: 'story-sortie',
    text: '공안 성문은 다시 잠겼고, 강동의 선봉은 물러났습니다. 그러나 부사인의 얼굴에는 안도보다 두려움이 더 짙게 남았습니다.'
  },
  {
    id: 'forty-third-mi-fang-silence',
    bgm: 'story-dark',
    chapter: '말 없는 장부',
    background: 'story-militia',
    speaker: '미축',
    text: '미방은 끝내 분명한 대답을 하지 않았습니다. 창고 장부는 맞춰 놓았으나, 사람의 마음은 장부처럼 줄을 맞추기 어렵습니다.'
  },
  {
    id: 'forty-third-next-shadow',
    bgm: 'story-dark',
    chapter: '맥성으로 드리우는 그림자',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '성문 하나를 지켰지만 형주는 이미 바깥과 안쪽에서 함께 갈라지고 있습니다. 다음 장에서는 관우의 번성 전선이 고립으로 바뀌는 순간을 다루어야 합니다.'
  }
];

export const fortyFourthBattleIntroPages: StoryPage[] = [
  {
    id: 'forty-fourth-maicheng-orders',
    bgm: 'story-dark',
    chapter: '끊어진 후방',
    background: 'story-militia',
    speaker: '마량',
    text: '공안 성문을 다시 잠갔으나 강릉과 나루의 소식이 끊겼습니다. 관우 장군의 번성 전선은 앞의 조조군과 뒤의 강동군 사이에서 길을 잃고 있습니다.'
  },
  {
    id: 'forty-fourth-lu-meng-seals-roads',
    bgm: 'story-dark',
    chapter: '봉쇄되는 길',
    background: 'story-three-heroes',
    speaker: '왕평',
    text: '맥성으로 빠지는 길목마다 흰 옷을 벗은 강동 병사가 서 있습니다. 큰길은 막혔고, 숲과 물목의 작은 길도 오래 버티지 못할 것입니다.'
  },
  {
    id: 'forty-fourth-guan-yu-resolve',
    bgm: 'battle-prep',
    chapter: '남은 깃발',
    background: 'story-liu-bei',
    speaker: '관우',
    portrait: 'guanYu',
    text: '성 하나가 아니라 의리를 지키는 싸움이 되었소. 맥성으로 길을 내고 남은 병사들을 수습하겠소. 길이 좁을수록 마음이 먼저 무너지지 않게 하시오.'
  },
  {
    id: 'forty-fourth-sortie',
    bgm: 'battle-prep',
    chapter: '맥성 고립전',
    background: 'story-sortie',
    speaker: '유비',
    portrait: 'liuBei',
    text: '운장의 깃발이 고립되었다면, 늦더라도 길을 열어야 하오. 북문과 갈대 물목을 동시에 살펴 포위망을 찢고 맥성의 퇴로를 확보하시오.'
  }
];

export const fortyFourthBattleVictoryPages: StoryPage[] = [
  {
    id: 'forty-fourth-victory-road-opened',
    bgm: 'militia-theme',
    chapter: '뚫린 좁은 길',
    background: 'story-sortie',
    text: '맥성 북문의 좁은 길은 간신히 열렸고, 흩어진 병사들이 다시 깃발 아래로 모였습니다. 그러나 길 밖의 횃불은 여전히 더 많았습니다.'
  },
  {
    id: 'forty-fourth-lu-meng-tightens',
    bgm: 'story-dark',
    chapter: '좁아지는 포위',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '여몽은 물러난 것이 아니라 더 넓게 둘러섰습니다. 맥성의 작은 승리는 시간을 벌었을 뿐, 형주를 되찾는 길은 아직 멀고 험합니다.'
  },
  {
    id: 'forty-fourth-next-jing-loss',
    bgm: 'story-dark',
    chapter: '형주의 상실',
    background: 'story-militia',
    speaker: '마량',
    text: '맥성의 포위는 풀렸으나 강릉과 공안의 마음은 이미 갈라졌습니다. 다음 장에서는 형주 상실의 대가와 유비의 분노가 더 큰 전쟁으로 번지는 흐름을 준비해야 합니다.'
  }
];

export const fortyFifthBattleIntroPages: StoryPage[] = [
  {
    id: 'forty-fifth-jing-loss-news',
    bgm: 'story-dark',
    chapter: '형주 상실의 비보',
    background: 'story-militia',
    speaker: '마량',
    text: '맥성의 길은 열렸지만 형주의 큰 성들은 이미 강동의 깃발 아래로 넘어갔습니다. 돌아온 전령들은 흩어진 잔병과 끊긴 나루, 그리고 다시 모이지 못한 깃발의 소식을 전했습니다.'
  },
  {
    id: 'forty-fifth-liu-bei-grief',
    bgm: 'story-dark',
    chapter: '복수의 칼끝',
    background: 'story-three-heroes',
    speaker: '유비',
    portrait: 'liuBei',
    text: '형주의 상실은 땅 하나를 잃은 일이 아니오. 함께 세운 뜻이 강동의 말과 불길에 찢긴 일이오. 이릉으로 가는 길을 열어, 무너진 의리를 다시 묻겠소.'
  },
  {
    id: 'forty-fifth-zhuge-warning',
    bgm: 'story-dark',
    chapter: '분노와 군략',
    background: 'story-resolve',
    speaker: '제갈량',
    text: '분노는 군을 움직이지만, 오래 버티게 하지는 못합니다. 오군은 산림과 물길을 이용해 긴 보급로를 태우려 할 것입니다. 먼저 이릉으로 향하는 동진로를 열고 진영을 흩어지지 않게 해야 합니다.'
  },
  {
    id: 'forty-fifth-sortie',
    bgm: 'battle-prep',
    chapter: '이릉 진격로',
    background: 'story-sortie',
    speaker: '유비',
    portrait: 'liuBei',
    text: '장강을 따라 깊이 들어가면 돌아올 길도 길어지오. 동진로의 숲과 나루를 안정시키고, 오군 선봉을 밀어 이릉 전쟁의 첫 진영을 세우시오.'
  }
];

export const fortyFifthBattleVictoryPages: StoryPage[] = [
  {
    id: 'forty-fifth-victory-road-camp',
    bgm: 'militia-theme',
    chapter: '세워진 복수의 진',
    background: 'story-sortie',
    text: '이릉으로 향하는 첫 진격로가 열렸습니다. 유비군은 강가와 숲 사이에 진영을 세웠지만, 긴 보급로와 뜨거운 여름 바람은 이미 다음 위기를 예고했습니다.'
  },
  {
    id: 'forty-fifth-lu-xun-watches',
    bgm: 'story-dark',
    chapter: '육손의 침묵',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '오군은 크게 맞붙지 않았습니다. 육손은 물러난 것이 아니라 기다리고 있습니다. 진영이 길게 늘어설수록, 불길 하나가 군 전체를 흔들 수 있습니다.'
  },
  {
    id: 'forty-fifth-next-yiling-main',
    bgm: 'story-dark',
    chapter: '이릉의 불씨',
    background: 'story-militia',
    speaker: '유비',
    portrait: 'liuBei',
    text: '첫 길은 열렸으나 전쟁은 이제 시작이오. 다음에는 흩어진 진영을 붙들고, 강동의 기다림이 무엇을 노리는지 확인해야 하오.'
  }
];

export const fortySixthBattleIntroPages: StoryPage[] = [
  {
    id: 'forty-sixth-camps-stretch',
    bgm: 'story-dark',
    chapter: '길어진 진영',
    background: 'story-militia',
    speaker: '황권',
    text: '이릉의 첫 진영은 세웠지만, 촉한의 군막은 강변과 숲길을 따라 너무 길게 늘어졌습니다. 물길은 멀고, 마른 풀은 높으며, 오군은 여전히 큰 싸움을 피하고 있습니다.'
  },
  {
    id: 'forty-sixth-lu-xun-fire',
    bgm: 'story-dark',
    chapter: '기다린 불씨',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '육손의 침묵은 물러남이 아니었습니다. 바람이 동쪽에서 불고 군막이 말랐을 때, 오군의 작은 횃불이 긴 진영 전체를 흔드는 칼이 되었습니다.'
  },
  {
    id: 'forty-sixth-liu-bei-orders',
    bgm: 'story-dark',
    chapter: '불길 속의 명령',
    background: 'story-resolve',
    speaker: '유비',
    portrait: 'liuBei',
    text: '불길이 먼저 달려든다면, 사람의 길을 먼저 열어야 하오. 진영을 버려도 병사를 버릴 수는 없소. 서쪽 퇴로와 강변 물길을 붙들어 백제성으로 물러날 길을 만드시오.'
  },
  {
    id: 'forty-sixth-sortie',
    bgm: 'battle-prep',
    chapter: '이릉 화공전',
    background: 'story-sortie',
    speaker: '유비',
    portrait: 'liuBei',
    text: '육손의 화공망이 진영을 갈라 놓았소. 불타는 군막 사이로 퇴로를 열고, 흩어진 병사를 모아 서쪽 협곡으로 빠져나가시오.'
  }
];

export const fortySixthBattleVictoryPages: StoryPage[] = [
  {
    id: 'forty-sixth-victory-fire-broken',
    bgm: 'story-dark',
    chapter: '불길을 뚫은 길',
    background: 'story-sortie',
    text: '불타는 군막 사이로 좁은 퇴로가 열렸습니다. 승리라 부르기에는 잃은 것이 많았지만, 유비의 깃발은 완전히 꺼지지 않았습니다.'
  },
  {
    id: 'forty-sixth-retreat-baidi',
    bgm: 'story-dark',
    chapter: '백제성으로',
    background: 'story-militia',
    speaker: '제갈량',
    text: '이릉의 불길은 복수의 속도를 꺾었습니다. 남은 병사들은 백제성으로 물러나며, 촉한의 다음 길이 전장에서 조정과 후계로 옮겨가고 있음을 느꼈습니다.'
  },
  {
    id: 'forty-sixth-next-baidi',
    bgm: 'story-dark',
    chapter: '남은 뜻',
    background: 'story-three-heroes',
    speaker: '유비',
    portrait: 'liuBei',
    text: '뜻을 세운 날은 멀어졌고, 손에 남은 것은 불탄 깃발뿐이오. 그러나 남은 이들이 있다면 뜻도 아직 끝나지 않았소. 다음 장에서는 백제성에서 남은 나라의 길을 정해야 하오.'
  }
];

export const baidiEntrustmentPages: StoryPage[] = [
  {
    id: 'baidi-entrustment-arrival',
    bgm: 'story-dark',
    chapter: '백제성의 밤',
    background: 'story-militia',
    speaker: '제갈량',
    text: '이릉의 불길을 지나 백제성에 닿은 촉한군은 승전의 북소리 대신 낮은 숨소리로 밤을 맞았습니다. 전장은 멀어졌지만, 나라가 잃은 무게는 성 안까지 따라왔습니다.'
  },
  {
    id: 'baidi-entrustment-liu-bei',
    bgm: 'story-dark',
    chapter: '남은 말',
    background: 'story-liu-bei',
    speaker: '유비',
    portrait: 'liuBei',
    text: '내가 사람을 얻어 나라를 세웠으나, 분노를 이기지 못해 사람을 잃었소. 공명, 남은 촉한을 그대에게 부탁하오. 후주가 따를 만하면 보필하고, 부족하면 나라의 뜻을 먼저 보시오.'
  },
  {
    id: 'baidi-entrustment-zhuge',
    bgm: 'battle-prep',
    chapter: '받아 든 짐',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '신은 감히 두 마음을 품지 않겠습니다. 폐하께서 남기신 뜻이 백성에게 닿을 때까지, 군영의 장부와 조정의 붓과 전장의 깃발을 모두 놓지 않겠습니다.'
  },
  {
    id: 'baidi-entrustment-officers',
    bgm: 'militia-theme',
    chapter: '새 질서',
    background: 'story-sortie',
    speaker: '조운',
    text: '장수들은 백제성 뜰에서 조용히 군례를 올렸습니다. 이제 유비의 분노가 남긴 상처를 수습하고, 제갈량을 중심으로 촉한의 다음 길을 다시 세워야 합니다.'
  },
  {
    id: 'baidi-entrustment-next',
    bgm: 'story-dark',
    chapter: '남쪽의 불안',
    background: 'story-militia',
    speaker: '황권',
    text: '이릉의 패전 뒤 촉한은 안팎으로 흔들리고 있습니다. 남중의 불안과 북방의 압박을 동시에 볼 수는 없습니다. 먼저 나라 안을 다독이고, 흩어진 장수들의 마음을 모아야 합니다.'
  }
];

export const fortySeventhBattleIntroPages: StoryPage[] = [
  {
    id: 'forty-seventh-southern-unrest',
    bgm: 'story-dark',
    chapter: '남중의 흔들림',
    background: 'story-militia',
    speaker: '황권',
    text: '백제성의 유탁 뒤 촉한은 아직 상처를 다 씻지 못했습니다. 그러나 남중의 여러 호족과 반란군은 바로 그 틈을 보며, 성도 남쪽의 길과 창고를 흔들기 시작했습니다.'
  },
  {
    id: 'forty-seventh-zhuge-policy',
    bgm: 'battle-prep',
    chapter: '먼저 안을 다스리다',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '북방을 논하기 전에 나라 안의 불안을 먼저 다스려야 합니다. 남중을 힘으로만 누르면 길은 열려도 마음은 닫힙니다. 반란의 길목을 끊고, 마을과 창고는 살려 두십시오.'
  },
  {
    id: 'forty-seventh-zhao-yun-vanguard',
    bgm: 'battle-prep',
    chapter: '남쪽 길의 선봉',
    background: 'story-sortie',
    speaker: '조운',
    text: '산길과 숲길이 겹친 전장이라 기병만 앞세울 수 없습니다. 왕평이 길을 보고, 황권이 보급을 재며, 마량이 마을의 말을 들어야 합니다. 저는 뒤처진 부대를 회수하겠습니다.'
  },
  {
    id: 'forty-seventh-sortie',
    bgm: 'battle-prep',
    chapter: '남중 안정로',
    background: 'story-sortie',
    speaker: '제갈량',
    text: '옹개와 남중 반란군이 밀림 길목에 진을 쳤습니다. 반란군 지휘선을 흩뜨리고, 마을과 창고를 확보해 남중 평정의 첫 발판을 세우십시오.'
  }
];

export const fortySeventhBattleVictoryPages: StoryPage[] = [
  {
    id: 'forty-seventh-victory-road-opened',
    bgm: 'militia-theme',
    chapter: '남쪽 길이 열리다',
    background: 'story-sortie',
    text: '밀림과 산길 사이의 반란군 지휘선이 흔들렸습니다. 촉한군은 마을을 약탈하지 않고 창고를 정리하며, 남중 평정이 단순한 추격전이 아님을 병사들에게 보였습니다.'
  },
  {
    id: 'forty-seventh-meng-huo-shadow',
    bgm: 'story-dark',
    chapter: '더 깊은 산',
    background: 'story-militia',
    speaker: '왕평',
    text: '옹개의 선봉은 물러났지만 남중의 산은 아직 깊습니다. 맹획의 이름이 여러 마을 사이에서 오가고 있고, 힘으로 꺾은 길 뒤에는 설득해야 할 마음이 남아 있습니다.'
  },
  {
    id: 'forty-seventh-next-nanman',
    bgm: 'story-dark',
    chapter: '남만 평정의 시작',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '첫 길은 열렸습니다. 이제 남중의 여러 세력을 모두 적으로 만들지 않으면서, 반란의 중심을 하나씩 마주해야 합니다. 다음 장에서는 맹획의 본대와 처음으로 맞섭니다.'
  }
];

export const fortyEighthBattleIntroPages: StoryPage[] = [
  {
    id: 'forty-eighth-meng-huo-gathers',
    bgm: 'story-dark',
    chapter: '맹획의 깃발',
    background: 'story-militia',
    speaker: '왕평',
    text: '옹개의 지휘선은 흩어졌지만 남중의 마을들은 아직 촉한군을 멀리서 바라봅니다. 깊은 숲 안쪽에서는 맹획이 여러 호족을 모아, 첫 패배를 갚겠다고 병력을 다시 세우고 있습니다.'
  },
  {
    id: 'forty-eighth-zhuge-amnesty',
    bgm: 'battle-prep',
    chapter: '힘과 회유',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '맹획을 쓰러뜨리는 것만으로는 남중을 얻을 수 없습니다. 반드시 생포하여 돌려보낼 길을 남기십시오. 마을과 포로 수용소를 지키면, 다음 싸움에서 칼보다 말이 먼저 닿을 것입니다.'
  },
  {
    id: 'forty-eighth-sortie',
    bgm: 'battle-prep',
    chapter: '맹획 본대전',
    background: 'story-sortie',
    speaker: '마량',
    text: '맹획의 본대는 숲길, 늪지, 산채를 함께 쓰고 있습니다. 조운과 마초가 돌격을 막고, 왕평이 지형을 읽으며, 황권이 포로와 군량의 장부를 흐트러뜨리지 않아야 합니다.'
  }
];

export const fortyEighthBattleVictoryPages: StoryPage[] = [
  {
    id: 'forty-eighth-victory-captured',
    bgm: 'militia-theme',
    chapter: '첫 생포',
    background: 'story-sortie',
    text: '맹획의 본대는 흩어졌고, 촉한군은 산채의 불길을 키우지 않은 채 포로와 마을 사람을 갈라 세웠습니다. 병사들은 적장을 베지 않고 생포하는 싸움이 왜 어려운지 처음으로 깨달았습니다.'
  },
  {
    id: 'forty-eighth-victory-release',
    bgm: 'story-dark',
    chapter: '돌려보내는 책략',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '맹획은 아직 진심으로 굴복하지 않았습니다. 그러나 억지 항복은 오래가지 않습니다. 오늘은 그를 돌려보내 남중의 사람들에게 촉한군이 약탈하러 온 군대가 아님을 보이겠습니다.'
  },
  {
    id: 'forty-eighth-next-capture',
    bgm: 'story-dark',
    chapter: '칠종칠금의 첫 장',
    background: 'story-militia',
    speaker: '마량',
    text: '맹획은 풀려났으나 산속의 호족들은 이제 촉한군의 태도를 보았습니다. 다음 싸움부터는 힘뿐 아니라 누구를 먼저 달래고 누구를 끝까지 추격할지 선택해야 합니다.'
  }
];

export const fortyNinthBattleIntroPages: StoryPage[] = [
  {
    id: 'forty-ninth-meng-huo-returns',
    bgm: 'story-dark',
    chapter: '돌아온 맹획',
    background: 'story-militia',
    speaker: '왕평',
    text: '맹획은 풀려나자마자 다시 산채를 모았습니다. 그러나 지난 싸움과 달리 마을 사람들은 촉한군이 약탈하지 않았다는 사실을 알고 있습니다. 이번 싸움은 그 마음의 흔들림을 전장 위에서 붙잡는 일입니다.'
  },
  {
    id: 'forty-ninth-second-capture-plan',
    bgm: 'battle-prep',
    chapter: '두 번째 생포',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '이번에도 베어서는 안 됩니다. 강가의 늪지와 산채 길목을 끊어 맹획을 다시 생포하고, 마을과 포로장을 지켜 그가 돌아갈 때 들을 말까지 남겨 두십시오.'
  },
  {
    id: 'forty-ninth-sortie',
    bgm: 'battle-prep',
    chapter: '칠종칠금 2차전',
    background: 'story-sortie',
    speaker: '마량',
    text: '맹획은 이번에 매복과 주술사를 앞세웠습니다. 왕평이 길을 읽고, 황권이 포로 장부를 지키며, 조운과 황충이 돌격과 고지 궁병을 끊어야 합니다. 회유의 말은 전열이 버텨야 닿습니다.'
  }
];

export const fortyNinthBattleVictoryPages: StoryPage[] = [
  {
    id: 'forty-ninth-victory-second-capture',
    bgm: 'militia-theme',
    chapter: '두 번째 생포',
    background: 'story-sortie',
    text: '맹획은 다시 포위되었고, 이번에도 촉한군은 진영을 불태우지 않았습니다. 포로장은 닫혔지만 약탈은 없었고, 마을 사람들은 어느 군대가 오래 남을 수 있는지를 보기 시작했습니다.'
  },
  {
    id: 'forty-ninth-victory-release-again',
    bgm: 'story-dark',
    chapter: '다시 풀어 보내다',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '두 번 잡아도 마음이 굽지 않는다면 다시 놓아 보낼 뿐입니다. 다만 이번에는 그가 돌아가는 길마다 촉한군이 지킨 마을과 포로들이 그의 말을 시험할 것입니다.'
  },
  {
    id: 'forty-ninth-next-southern-minds',
    bgm: 'story-dark',
    chapter: '남중의 마음',
    background: 'story-militia',
    speaker: '황권',
    text: '포로 명부와 군량 장부가 어긋나지 않았습니다. 다음 싸움에서는 맹획만이 아니라 그를 따르는 호족들의 마음도 흔들릴 것입니다. 회유는 이제 전투 뒤의 일이 아니라 전투 중의 목표가 되었습니다.'
  }
];

export const fiftiethBattleIntroPages: StoryPage[] = [
  {
    id: 'fiftieth-southern-clans-waver',
    bgm: 'story-dark',
    chapter: '흔들리는 호족들',
    background: 'story-militia',
    speaker: '황권',
    text: '맹획이 두 번 붙잡혔다가 풀려나자 남중의 호족들은 서로 다른 말을 하기 시작했습니다. 어떤 이는 촉한군의 군율을 두려워했고, 어떤 이는 맹획이 아직 꺾이지 않았다고 외쳤습니다.'
  },
  {
    id: 'fiftieth-third-capture-plan',
    bgm: 'battle-prep',
    chapter: '세 번째 회유',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '이번 싸움에서는 맹획만 다시 잡아서는 부족합니다. 그를 따르는 호족들이 보는 앞에서 마을과 포로장을 지키고, 회유를 받아들일 길을 전장 안에 남겨야 합니다.'
  },
  {
    id: 'fiftieth-sortie',
    bgm: 'battle-prep',
    chapter: '칠종칠금 3차전',
    background: 'story-sortie',
    speaker: '왕평',
    text: '산채는 더 깊고 늪지는 더 넓습니다. 마량이 호족의 말을 붙잡고, 황권이 장부를 흔들리지 않게 하며, 조운과 마초가 돌격을 막아야 맹획을 세 번째로 생포할 수 있습니다.'
  }
];

export const fiftiethBattleVictoryPages: StoryPage[] = [
  {
    id: 'fiftieth-victory-third-capture',
    bgm: 'militia-theme',
    chapter: '세 번째 생포',
    background: 'story-sortie',
    text: '맹획은 세 번째로 붙잡혔고, 그의 곁에 있던 호족들은 촉한군이 이번에도 마을을 태우지 않았다는 사실을 직접 보았습니다. 전장의 승리는 이제 남중 사람들의 말 속으로 번지기 시작했습니다.'
  },
  {
    id: 'fiftieth-victory-clan-choice',
    bgm: 'story-dark',
    chapter: '호족의 흔들림',
    background: 'story-militia',
    speaker: '마량',
    text: '몇몇 촌장은 더 싸워도 마을이 남지 않는다고 말하기 시작했습니다. 그러나 맹획은 아직 고개를 숙이지 않았습니다. 그를 다시 풀어 보내면, 이번에는 남중의 호족들이 먼저 서로를 설득할 것입니다.'
  },
  {
    id: 'fiftieth-next-persuasive-camp',
    bgm: 'story-dark',
    chapter: '전장 밖의 회유',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '남중을 얻는 길은 점점 분명해지고 있습니다. 다음 장에서는 맹획을 따르던 호족들과 직접 이야기를 나누고, 전투 전 선택이 전장 목표에 영향을 주는 흐름을 준비해야 합니다.'
  }
];

export const fiftyFirstBattleIntroPages: StoryPage[] = [
  {
    id: 'fifty-first-clan-council-result',
    bgm: 'story-dark',
    chapter: '회유가 전장으로',
    background: 'story-militia',
    speaker: '마량',
    text: '호족 회의 뒤 일부 촌장은 맹획을 따르되 끝까지 싸우지는 않겠다고 속내를 보였습니다. 그들이 물러날 길을 남겨 두면 다음 전투는 섬멸보다 설득에 가까워질 것입니다.'
  },
  {
    id: 'fifty-first-fourth-capture-plan',
    bgm: 'battle-prep',
    chapter: '네 번째 생포',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '이번에는 맹획의 본영뿐 아니라 오돌골의 등갑병과 독천 제사장들이 전장을 뒤덮을 것입니다. 화덕과 독천을 함부로 건드리지 말고, 회유 퇴로와 마을 보증을 함께 지키십시오.'
  },
  {
    id: 'fifty-first-sortie',
    bgm: 'battle-prep',
    chapter: '칠종칠금 4차전',
    background: 'story-sortie',
    speaker: '왕평',
    text: '숲길은 더 좁고 강물은 더 깊습니다. 마량이 호족의 말을 붙잡고, 황권이 보증 장부를 지키며, 왕평과 마대가 열어 둔 산길을 따라 맹획을 네 번째 생포해야 합니다.'
  }
];

export const fiftyFirstBattleVictoryPages: StoryPage[] = [
  {
    id: 'fifty-first-victory-fourth-capture',
    bgm: 'militia-theme',
    chapter: '네 번째 생포',
    background: 'story-sortie',
    text: '맹획은 네 번째로 포위되었고, 등갑병의 화덕과 독천 제사장들은 마을까지 밀려오지 못했습니다. 회유 퇴로로 물러난 호족들은 촉한군이 약속한 길을 지켰다는 사실을 직접 보았습니다.'
  },
  {
    id: 'fifty-first-victory-amnesty-route',
    bgm: 'story-dark',
    chapter: '열어 둔 길',
    background: 'story-militia',
    speaker: '황권',
    text: '돌아간 자와 끝까지 싸운 자의 이름이 장부에 나뉘었습니다. 이제 남중의 호족들은 맹획의 고집만이 아니라, 촉한군의 약속이 지켜지는지도 함께 따지게 될 것입니다.'
  },
  {
    id: 'fifty-first-next-deeper-nanzhong',
    bgm: 'story-dark',
    chapter: '더 깊은 남중',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '네 번 잡아도 맹획은 아직 남중 전체의 마음을 대표한다고 말합니다. 그렇다면 더 깊은 산채와 더 어려운 조건 앞에서도 같은 군율을 지켜 보여야 합니다.'
  }
];

export const fiftySecondBattleIntroPages: StoryPage[] = [
  {
    id: 'fifty-second-hardliner-split',
    bgm: 'story-dark',
    chapter: '강경파의 갈라짐',
    background: 'story-militia',
    speaker: '마량',
    text: '네 번째 회유 뒤 일부 호족은 맹획의 깃발 아래 남아 있으면서도 마을을 지키는 길을 찾고 있습니다. 반대로 강경파는 그 길을 배신이라 부르며 퇴로를 끊으려 합니다.'
  },
  {
    id: 'fifty-second-fifth-capture-plan',
    bgm: 'battle-prep',
    chapter: '다섯 번째 생포',
    background: 'story-three-heroes',
    speaker: '제갈량',
    text: '이번 전투는 맹획을 다시 잡는 것만으로는 부족합니다. 강경파 호족을 본대와 분리하고, 회유 길목과 마을 보증을 동시에 지키면 남중 안에서 싸움을 그만둘 명분이 더 커질 것입니다.'
  },
  {
    id: 'fifty-second-sortie',
    bgm: 'battle-prep',
    chapter: '칠종칠금 5차전',
    background: 'story-sortie',
    speaker: '왕평',
    text: '깊은 죽림과 협곡이 이어져 있습니다. 장수마다 맡을 길이 다릅니다. 마량과 황권은 말을 남기고, 왕평과 마대는 물러날 길을 열며, 조운과 황충은 추격을 막아야 합니다.'
  }
];

export const fiftySecondBattleVictoryPages: StoryPage[] = [
  {
    id: 'fifty-second-victory-fifth-capture',
    bgm: 'militia-theme',
    chapter: '다섯 번째 생포',
    background: 'story-sortie',
    text: '맹획은 다섯 번째로 포위되었고, 강경파 호족은 본대와 갈라졌습니다. 촉한군은 다시 마을과 퇴로를 지켰고, 돌아간 자들은 이제 맹획의 말만 듣지 않게 되었습니다.'
  },
  {
    id: 'fifty-second-victory-hardliner-ledger',
    bgm: 'story-dark',
    chapter: '갈라진 장부',
    background: 'story-militia',
    speaker: '황권',
    text: '끝까지 싸운 자와 물러난 자의 이름이 더 분명해졌습니다. 처벌의 장부가 아니라 약속의 장부로 남겨야 합니다. 그래야 다음 석방도 군율을 잃지 않습니다.'
  },
  {
    id: 'fifty-second-next-sixth-capture',
    bgm: 'story-dark',
    chapter: '여섯 번째 길',
    background: 'story-three-heroes',
    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', 'river', 'river', 'plain', 'plain', 'forest', 'plain', 'plain', 'plain', 'hill', 'hill', 'plain'],
    ['plain', 'plain', 'plain', 'road', 'plain', 'plain', 'hill', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'river', 'river', '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', 'river', 'road', 'plain', 'plain', 'hill', 'plain', 'plain', 'plain'],
    ['plain', 'road', 'forest', 'plain', 'plain', 'hill', 'plain', 'plain', 'forest', 'plain', 'plain', 'road', 'road', 'plain', 'plain', 'plain', 'river', 'river', '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 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<string, { x: number; y: number }> = {
  'liu-bei': { x: 2, y: 15 },
  'guan-yu': { x: 3, y: 15 },
  'zhang-fei': { x: 2, y: 16 }
};

export const secondBattleUnits: UnitData[] = [
  ...firstBattleUnits
    .filter((unit) => unit.faction === 'ally')
    .map((unit) => placeScenarioUnit(unit, secondBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  {
    id: 'pursuit-raider-a',
    name: '황건 추격병',
    faction: 'enemy',
    className: '황건병',
    classKey: 'yellowTurban',
    level: 2,
    exp: 12,
    hp: 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<string, { x: number; y: number }> = {
  '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<string, { x: number; y: number }> = {
  'liu-bei': { x: 2, y: 16 },
  'guan-yu': { x: 3, y: 16 },
  'zhang-fei': { x: 2, y: 17 }
};

export const fourthBattleUnits: UnitData[] = [
  ...firstBattleUnits
    .filter((unit) => unit.faction === 'ally')
    .map((unit) => placeScenarioUnit(unit, fourthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  {
    id: 'guangzong-main-vanguard-a',
    name: '황건 선봉',
    faction: 'enemy',
    className: '황건병',
    classKey: 'yellowTurban',
    level: 4,
    exp: 24,
    hp: 28,
    maxHp: 28,
    attack: 9,
    move: 3,
    stats: { might: 63, intelligence: 36, leadership: 48, agility: 53, luck: 45 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 24 },
      armor: { itemId: 'rebel-vest', level: 1, exp: 10 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 6,
    y: 14
  },
  {
    id: 'guangzong-main-vanguard-b',
    name: '황건 선봉',
    faction: 'enemy',
    className: '황건병',
    classKey: 'yellowTurban',
    level: 4,
    exp: 24,
    hp: 28,
    maxHp: 28,
    attack: 9,
    move: 3,
    stats: { might: 63, intelligence: 36, leadership: 48, agility: 53, luck: 45 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 24 },
      armor: { itemId: 'rebel-vest', level: 1, exp: 10 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 8,
    y: 12
  },
  {
    id: 'guangzong-main-bandit-a',
    name: '숲길 돌격병',
    faction: 'enemy',
    className: '도적',
    classKey: 'bandit',
    level: 4,
    exp: 26,
    hp: 29,
    maxHp: 29,
    attack: 10,
    move: 3,
    stats: { might: 66, intelligence: 34, leadership: 44, agility: 61, luck: 48 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 24 },
      armor: { itemId: 'rebel-vest', level: 1, exp: 10 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 5,
    y: 10
  },
  {
    id: 'guangzong-main-archer-a',
    name: '황건 궁병',
    faction: 'enemy',
    className: '궁병',
    classKey: 'archer',
    level: 4,
    exp: 26,
    hp: 24,
    maxHp: 24,
    attack: 10,
    move: 3,
    stats: { might: 60, intelligence: 48, leadership: 50, agility: 62, luck: 50 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 1, exp: 26 },
      armor: { itemId: 'cloth-armor', level: 1, exp: 10 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 9,
    y: 10
  },
  {
    id: 'guangzong-main-cavalry-a',
    name: '황건 기병',
    faction: 'enemy',
    className: '경기병',
    classKey: 'cavalry',
    level: 5,
    exp: 28,
    hp: 32,
    maxHp: 32,
    attack: 11,
    move: 5,
    stats: { might: 70, intelligence: 38, leadership: 52, agility: 72, luck: 51 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 28 },
      armor: { itemId: 'rebel-vest', level: 1, exp: 12 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 12,
    y: 9
  },
  {
    id: 'guangzong-main-guard-a',
    name: '본영 수비병',
    faction: 'enemy',
    className: '황건병',
    classKey: 'yellowTurban',
    level: 5,
    exp: 28,
    hp: 31,
    maxHp: 31,
    attack: 10,
    move: 3,
    stats: { might: 68, intelligence: 38, leadership: 54, agility: 55, luck: 49 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 28 },
      armor: { itemId: 'rebel-vest', level: 1, exp: 12 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 14,
    y: 7
  },
  {
    id: 'guangzong-main-archer-b',
    name: '본영 궁병',
    faction: 'enemy',
    className: '궁병',
    classKey: 'archer',
    level: 5,
    exp: 30,
    hp: 25,
    maxHp: 25,
    attack: 10,
    move: 3,
    stats: { might: 61, intelligence: 50, leadership: 51, agility: 63, luck: 51 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 1, exp: 30 },
      armor: { itemId: 'cloth-armor', level: 1, exp: 12 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 16,
    y: 6
  },
  {
    id: 'guangzong-main-cavalry-b',
    name: '황건 기병',
    faction: 'enemy',
    className: '경기병',
    classKey: 'cavalry',
    level: 5,
    exp: 30,
    hp: 33,
    maxHp: 33,
    attack: 11,
    move: 5,
    stats: { might: 71, intelligence: 38, leadership: 53, agility: 73, luck: 51 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 30 },
      armor: { itemId: 'rebel-vest', level: 1, exp: 12 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 18,
    y: 10
  },
  {
    id: 'guangzong-main-guard-b',
    name: '본영 수비병',
    faction: 'enemy',
    className: '황건병',
    classKey: 'yellowTurban',
    level: 5,
    exp: 30,
    hp: 32,
    maxHp: 32,
    attack: 10,
    move: 3,
    stats: { might: 69, intelligence: 39, leadership: 55, agility: 55, luck: 50 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 30 },
      armor: { itemId: 'rebel-vest', level: 1, exp: 12 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 18,
    y: 4
  },
  {
    id: 'guangzong-main-guard-c',
    name: '본영 수비병',
    faction: 'enemy',
    className: '황건병',
    classKey: 'yellowTurban',
    level: 5,
    exp: 30,
    hp: 32,
    maxHp: 32,
    attack: 10,
    move: 3,
    stats: { might: 69, intelligence: 39, leadership: 55, agility: 55, luck: 50 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 1, exp: 30 },
      armor: { itemId: 'rebel-vest', level: 1, exp: 12 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 14,
    y: 3
  },
  {
    id: 'guangzong-main-archer-c',
    name: '망루 궁병',
    faction: 'enemy',
    className: '궁병',
    classKey: 'archer',
    level: 5,
    exp: 32,
    hp: 26,
    maxHp: 26,
    attack: 11,
    move: 3,
    stats: { might: 62, intelligence: 52, leadership: 52, agility: 64, luck: 52 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 2, exp: 6 },
      armor: { itemId: 'cloth-armor', level: 1, exp: 12 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 16,
    y: 1
  },
  {
    id: 'guangzong-main-leader-zhang-jue',
    name: '장각',
    faction: 'enemy',
    className: '황건 대현량사',
    classKey: 'rebelLeader',
    level: 6,
    exp: 40,
    hp: 48,
    maxHp: 48,
    attack: 13,
    move: 3,
    stats: { might: 74, intelligence: 78, leadership: 82, agility: 58, luck: 64 },
    equipment: {
      weapon: { itemId: 'leader-axe', level: 2, exp: 16 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 4 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 15,
    y: 1
  }
];

const fifthBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 2, y: 16 },
  'guan-yu': { x: 3, y: 16 },
  'zhang-fei': { x: 2, y: 17 }
};

export const fifthBattleUnits: UnitData[] = [
  ...firstBattleUnits
    .filter((unit) => unit.faction === 'ally')
    .map((unit) => placeScenarioUnit(unit, fifthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  {
    id: 'sishui-vanguard-a',
    name: '서량 선봉',
    faction: 'enemy',
    className: '동탁 보병',
    classKey: 'yellowTurban',
    level: 5,
    exp: 30,
    hp: 32,
    maxHp: 32,
    attack: 10,
    move: 3,
    stats: { might: 68, intelligence: 38, leadership: 52, agility: 55, luck: 44 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 4 },
      armor: { itemId: 'rebel-vest', level: 1, exp: 16 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 6,
    y: 14
  },
  {
    id: 'sishui-vanguard-b',
    name: '서량 선봉',
    faction: 'enemy',
    className: '동탁 보병',
    classKey: 'yellowTurban',
    level: 5,
    exp: 30,
    hp: 32,
    maxHp: 32,
    attack: 10,
    move: 3,
    stats: { might: 68, intelligence: 37, leadership: 52, agility: 54, luck: 44 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 4 },
      armor: { itemId: 'rebel-vest', level: 1, exp: 16 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 8,
    y: 12
  },
  {
    id: 'sishui-raider-a',
    name: '산길 척후',
    faction: 'enemy',
    className: '척후병',
    classKey: 'bandit',
    level: 5,
    exp: 32,
    hp: 30,
    maxHp: 30,
    attack: 11,
    move: 4,
    stats: { might: 70, intelligence: 42, leadership: 48, agility: 66, luck: 52 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 8 },
      armor: { itemId: 'rebel-vest', level: 1, exp: 16 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 5,
    y: 9
  },
  {
    id: 'sishui-archer-a',
    name: '사수관 궁병',
    faction: 'enemy',
    className: '서량 궁병',
    classKey: 'archer',
    level: 5,
    exp: 32,
    hp: 27,
    maxHp: 27,
    attack: 11,
    move: 3,
    stats: { might: 63, intelligence: 50, leadership: 51, agility: 64, luck: 49 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 2, exp: 8 },
      armor: { itemId: 'cloth-armor', level: 1, exp: 16 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 10,
    y: 10
  },
  {
    id: 'sishui-cavalry-a',
    name: '서량 기병',
    faction: 'enemy',
    className: '서량 경기병',
    classKey: 'cavalry',
    level: 6,
    exp: 34,
    hp: 36,
    maxHp: 36,
    attack: 12,
    move: 5,
    stats: { might: 74, intelligence: 38, leadership: 54, agility: 76, luck: 50 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 10 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 2 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 12,
    y: 9
  },
  {
    id: 'sishui-guard-a',
    name: '관문 수비병',
    faction: 'enemy',
    className: '동탁 보병',
    classKey: 'yellowTurban',
    level: 6,
    exp: 34,
    hp: 35,
    maxHp: 35,
    attack: 11,
    move: 3,
    stats: { might: 72, intelligence: 40, leadership: 56, agility: 56, luck: 48 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 12 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 2 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 14,
    y: 7
  },
  {
    id: 'sishui-archer-b',
    name: '관문 궁병',
    faction: 'enemy',
    className: '서량 궁병',
    classKey: 'archer',
    level: 6,
    exp: 36,
    hp: 28,
    maxHp: 28,
    attack: 12,
    move: 3,
    stats: { might: 65, intelligence: 52, leadership: 53, agility: 65, luck: 50 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 2, exp: 12 },
      armor: { itemId: 'cloth-armor', level: 1, exp: 18 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 16,
    y: 6
  },
  {
    id: 'sishui-cavalry-b',
    name: '서량 기병',
    faction: 'enemy',
    className: '서량 경기병',
    classKey: 'cavalry',
    level: 6,
    exp: 36,
    hp: 37,
    maxHp: 37,
    attack: 12,
    move: 5,
    stats: { might: 75, intelligence: 39, leadership: 55, agility: 77, luck: 51 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 12 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 4 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 18,
    y: 10
  },
  {
    id: 'sishui-guard-b',
    name: '관문 수비병',
    faction: 'enemy',
    className: '동탁 보병',
    classKey: 'yellowTurban',
    level: 6,
    exp: 36,
    hp: 36,
    maxHp: 36,
    attack: 11,
    move: 3,
    stats: { might: 73, intelligence: 40, leadership: 57, agility: 56, luck: 49 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 14 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 4 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 16,
    y: 3
  },
  {
    id: 'sishui-gate-guard',
    name: '관문 친위병',
    faction: 'enemy',
    className: '동탁 보병',
    classKey: 'yellowTurban',
    level: 6,
    exp: 38,
    hp: 38,
    maxHp: 38,
    attack: 12,
    move: 3,
    stats: { might: 76, intelligence: 42, leadership: 60, agility: 57, luck: 50 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 18 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 8 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 14,
    y: 1
  },
  {
    id: 'sishui-leader-hu-zhen',
    name: '호진',
    faction: 'enemy',
    className: '동탁 장수',
    classKey: 'rebelLeader',
    level: 7,
    exp: 44,
    hp: 50,
    maxHp: 50,
    attack: 14,
    move: 3,
    stats: { might: 80, intelligence: 55, leadership: 72, agility: 60, luck: 54 },
    equipment: {
      weapon: { itemId: 'leader-axe', level: 2, exp: 20 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 10 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 15,
    y: 1
  }
];

const sixthBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 2, y: 16 },
  'guan-yu': { x: 3, y: 16 },
  'zhang-fei': { x: 2, y: 17 }
};

export const sixthBattleUnits: UnitData[] = [
  ...firstBattleUnits
    .filter((unit) => unit.faction === 'ally')
    .map((unit) => placeScenarioUnit(unit, sixthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  {
    id: 'jieqiao-skirmisher-a',
    name: '원소군 척후',
    faction: 'enemy',
    className: '척후병',
    classKey: 'bandit',
    level: 6,
    exp: 36,
    hp: 32,
    maxHp: 32,
    attack: 11,
    move: 4,
    stats: { might: 72, intelligence: 43, leadership: 50, agility: 68, luck: 50 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 14 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 6 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 5,
    y: 12
  },
  {
    id: 'jieqiao-infantry-a',
    name: '원소 보병',
    faction: 'enemy',
    className: '원소 보병',
    classKey: 'yellowTurban',
    level: 6,
    exp: 36,
    hp: 36,
    maxHp: 36,
    attack: 11,
    move: 3,
    stats: { might: 73, intelligence: 42, leadership: 58, agility: 56, luck: 49 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 14 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 6 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 7,
    y: 11
  },
  {
    id: 'jieqiao-archer-a',
    name: '원소 궁병',
    faction: 'enemy',
    className: '원소 궁병',
    classKey: 'archer',
    level: 6,
    exp: 38,
    hp: 29,
    maxHp: 29,
    attack: 12,
    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: 39,
    maxHp: 39,
    attack: 13,
    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: 12,
    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: 30,
    maxHp: 30,
    attack: 13,
    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: 40,
    maxHp: 40,
    attack: 13,
    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: 38,
    maxHp: 38,
    attack: 12,
    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: 41,
    maxHp: 41,
    attack: 13,
    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: 39,
    maxHp: 39,
    attack: 12,
    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: 31,
    maxHp: 31,
    attack: 13,
    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: 54,
    maxHp: 54,
    attack: 15,
    move: 3,
    stats: { might: 84, intelligence: 62, leadership: 78, agility: 62, luck: 56 },
    equipment: {
      weapon: { itemId: 'leader-axe', level: 2, exp: 26 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 14 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 17,
    y: 1
  }
];

const seventhBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 2, y: 16 },
  'guan-yu': { x: 3, y: 16 },
  'zhang-fei': { x: 2, y: 17 }
};

export const seventhBattleUnits: UnitData[] = [
  ...firstBattleUnits
    .filter((unit) => unit.faction === 'ally')
    .map((unit) => placeScenarioUnit(unit, seventhBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  {
    id: 'xuzhou-raider-a',
    name: '조조군 척후',
    faction: 'enemy',
    className: '조조 척후',
    classKey: 'bandit',
    level: 7,
    exp: 42,
    hp: 34,
    maxHp: 34,
    attack: 12,
    move: 4,
    stats: { might: 74, intelligence: 48, leadership: 54, agility: 70, luck: 52 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 18 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 8 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 5,
    y: 13
  },
  {
    id: 'xuzhou-infantry-a',
    name: '조조 보병',
    faction: 'enemy',
    className: '조조 보병',
    classKey: 'yellowTurban',
    level: 7,
    exp: 42,
    hp: 39,
    maxHp: 39,
    attack: 12,
    move: 3,
    stats: { might: 77, intelligence: 48, leadership: 64, agility: 58, luck: 52 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 18 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 8 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 7,
    y: 12
  },
  {
    id: 'xuzhou-archer-a',
    name: '조조 궁병',
    faction: 'enemy',
    className: '조조 궁병',
    classKey: 'archer',
    level: 7,
    exp: 44,
    hp: 31,
    maxHp: 31,
    attack: 13,
    move: 3,
    stats: { might: 69, intelligence: 58, leadership: 58, agility: 68, luck: 52 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 2, exp: 20 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 8 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 9,
    y: 11
  },
  {
    id: 'xuzhou-cavalry-a',
    name: '조조 기병',
    faction: 'enemy',
    className: '조조 경기병',
    classKey: 'cavalry',
    level: 8,
    exp: 46,
    hp: 42,
    maxHp: 42,
    attack: 14,
    move: 5,
    stats: { might: 82, intelligence: 46, leadership: 64, agility: 82, luck: 54 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 22 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 10 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 11,
    y: 9
  },
  {
    id: 'xuzhou-raider-b',
    name: '피난로 척후',
    faction: 'enemy',
    className: '조조 척후',
    classKey: 'bandit',
    level: 7,
    exp: 44,
    hp: 35,
    maxHp: 35,
    attack: 13,
    move: 4,
    stats: { might: 76, intelligence: 49, leadership: 55, agility: 71, luck: 53 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 20 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 8 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 6,
    y: 8
  },
  {
    id: 'xuzhou-archer-b',
    name: '마을 궁병',
    faction: 'enemy',
    className: '조조 궁병',
    classKey: 'archer',
    level: 8,
    exp: 46,
    hp: 32,
    maxHp: 32,
    attack: 14,
    move: 3,
    stats: { might: 70, intelligence: 60, leadership: 59, agility: 69, luck: 53 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 2, exp: 22 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 10 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 10,
    y: 7
  },
  {
    id: 'xuzhou-cavalry-b',
    name: '조조 기병',
    faction: 'enemy',
    className: '조조 경기병',
    classKey: 'cavalry',
    level: 8,
    exp: 48,
    hp: 43,
    maxHp: 43,
    attack: 14,
    move: 5,
    stats: { might: 83, intelligence: 47, leadership: 65, agility: 83, luck: 54 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 24 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 10 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 14,
    y: 8
  },
  {
    id: 'xuzhou-guard-a',
    name: '선봉 수비병',
    faction: 'enemy',
    className: '조조 보병',
    classKey: 'yellowTurban',
    level: 8,
    exp: 48,
    hp: 41,
    maxHp: 41,
    attack: 13,
    move: 3,
    stats: { might: 80, intelligence: 50, leadership: 67, agility: 60, luck: 53 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 24 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 10 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 15,
    y: 5
  },
  {
    id: 'xuzhou-cavalry-c',
    name: '측면 기병',
    faction: 'enemy',
    className: '조조 경기병',
    classKey: 'cavalry',
    level: 8,
    exp: 50,
    hp: 44,
    maxHp: 44,
    attack: 14,
    move: 5,
    stats: { might: 84, intelligence: 47, leadership: 66, agility: 84, luck: 55 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 26 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 12 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 19,
    y: 6
  },
  {
    id: 'xuzhou-guard-b',
    name: '선봉 수비병',
    faction: 'enemy',
    className: '조조 보병',
    classKey: 'yellowTurban',
    level: 8,
    exp: 50,
    hp: 42,
    maxHp: 42,
    attack: 13,
    move: 3,
    stats: { might: 81, intelligence: 50, leadership: 68, agility: 60, luck: 54 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 26 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 10 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 17,
    y: 3
  },
  {
    id: 'xuzhou-archer-c',
    name: '서주 길목 궁병',
    faction: 'enemy',
    className: '조조 궁병',
    classKey: 'archer',
    level: 8,
    exp: 50,
    hp: 33,
    maxHp: 33,
    attack: 14,
    move: 3,
    stats: { might: 71, intelligence: 61, leadership: 60, agility: 70, luck: 54 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 2, exp: 26 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 10 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 15,
    y: 1
  },
  {
    id: 'xuzhou-leader-xiahou-dun',
    name: '하후돈',
    faction: 'enemy',
    className: '조조군 장수',
    classKey: 'rebelLeader',
    level: 9,
    exp: 54,
    hp: 58,
    maxHp: 58,
    attack: 16,
    move: 4,
    stats: { might: 88, intelligence: 66, leadership: 82, agility: 66, luck: 58 },
    equipment: {
      weapon: { itemId: 'leader-axe', level: 2, exp: 30 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 16 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 16,
    y: 1
  }
];

export const xuzhouRecruitUnits: UnitData[] = [
  {
    id: 'jian-yong',
    name: '간옹',
    faction: 'ally',
    className: '책사',
    classKey: 'strategist',
    level: 4,
    exp: 12,
    hp: 26,
    maxHp: 26,
    attack: 7,
    move: 4,
    stats: { might: 42, intelligence: 78, leadership: 66, agility: 64, luck: 72 },
    equipment: {
      weapon: { itemId: 'training-sword', level: 1, exp: 8 },
      armor: { itemId: 'cloth-armor', level: 1, exp: 6 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 3,
    y: 17
  },
  {
    id: 'mi-zhu',
    name: '미축',
    faction: 'ally',
    className: '군량관',
    classKey: 'quartermaster',
    level: 4,
    exp: 8,
    hp: 28,
    maxHp: 28,
    attack: 7,
    move: 4,
    stats: { might: 40, intelligence: 74, leadership: 70, agility: 58, luck: 82 },
    equipment: {
      weapon: { itemId: 'training-sword', level: 1, exp: 6 },
      armor: { itemId: 'cloth-armor', level: 1, exp: 6 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 4,
    y: 17
  }
];

export const caoBreakRecruitUnits: UnitData[] = [
  {
    id: 'sun-qian',
    name: '손건',
    faction: 'ally',
    className: '책사',
    classKey: 'strategist',
    level: 5,
    exp: 10,
    hp: 27,
    maxHp: 27,
    attack: 7,
    move: 4,
    stats: { might: 38, intelligence: 82, leadership: 68, agility: 62, luck: 78 },
    equipment: {
      weapon: { itemId: 'training-sword', level: 1, exp: 8 },
      armor: { itemId: 'cloth-armor', level: 1, exp: 8 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 5,
    y: 20
  }
];

export const liuBiaoRecruitUnits: UnitData[] = [
  {
    id: 'zhao-yun',
    name: '조운',
    faction: 'ally',
    className: '백마 기병',
    classKey: 'cavalry',
    level: 7,
    exp: 18,
    hp: 36,
    maxHp: 36,
    attack: 12,
    move: 5,
    stats: { might: 88, intelligence: 76, leadership: 82, agility: 92, luck: 80 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 1, exp: 18 },
      armor: { itemId: 'lamellar-armor', level: 1, exp: 14 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 6,
    y: 21
  }
];

export const zhugeRecruitUnits: UnitData[] = [
  {
    id: 'zhuge-liang',
    name: '제갈량',
    faction: 'ally',
    className: '군사',
    classKey: 'strategist',
    level: 8,
    exp: 0,
    hp: 28,
    maxHp: 28,
    attack: 8,
    move: 4,
    stats: { might: 34, intelligence: 100, leadership: 88, agility: 74, luck: 86 },
    equipment: {
      weapon: { itemId: 'white-feather-fan', level: 1, exp: 0 },
      armor: { itemId: 'oath-robe', level: 1, exp: 0 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 7,
    y: 20
  }
];

export const jingzhouRecruitUnits: UnitData[] = [
  {
    id: 'ma-liang',
    name: '마량',
    faction: 'ally',
    className: '백미 책사',
    classKey: 'strategist',
    level: 11,
    exp: 0,
    hp: 30,
    maxHp: 30,
    attack: 8,
    move: 4,
    stats: { might: 36, intelligence: 92, leadership: 80, agility: 70, luck: 88 },
    equipment: {
      weapon: { itemId: 'white-feather-fan', level: 1, exp: 10 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 8 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 7,
    y: 22
  }
];

export const guiyangRecruitUnits: UnitData[] = [
  {
    id: 'yi-ji',
    name: '이적',
    faction: 'ally',
    className: '형주 문사',
    classKey: 'quartermaster',
    level: 12,
    exp: 0,
    hp: 32,
    maxHp: 32,
    attack: 8,
    move: 4,
    stats: { might: 38, intelligence: 88, leadership: 82, agility: 68, luck: 84 },
    equipment: {
      weapon: { itemId: 'white-feather-fan', level: 1, exp: 8 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 10 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 8,
    y: 22
  }
];

export const wulingRecruitUnits: UnitData[] = [
  {
    id: 'gong-zhi',
    name: '공지',
    faction: 'ally',
    className: '무릉 의병장',
    classKey: 'infantry',
    level: 13,
    exp: 0,
    hp: 40,
    maxHp: 40,
    attack: 12,
    move: 4,
    stats: { might: 76, intelligence: 72, leadership: 82, agility: 74, luck: 78 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 2, exp: 6 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 8 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 8,
    y: 23
  }
];

export const changshaRecruitUnits: UnitData[] = [
  {
    id: 'huang-zhong',
    name: '황충',
    faction: 'ally',
    className: '노장 궁기병',
    classKey: 'archer',
    level: 15,
    exp: 0,
    hp: 44,
    maxHp: 44,
    attack: 15,
    move: 4,
    stats: { might: 88, intelligence: 72, leadership: 86, agility: 78, luck: 76 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 3, exp: 12 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 14 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 8,
    y: 23
  },
  {
    id: 'wei-yan',
    name: '위연',
    faction: 'ally',
    className: '장사 돌격장',
    classKey: 'infantry',
    level: 15,
    exp: 0,
    hp: 48,
    maxHp: 48,
    attack: 16,
    move: 4,
    stats: { might: 90, intelligence: 64, leadership: 82, agility: 82, luck: 70 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 3, exp: 10 },
      armor: { itemId: 'reinforced-lamellar', level: 2, exp: 10 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 9,
    y: 24
  }
];

export const yizhouRecruitUnits: UnitData[] = [
  {
    id: 'pang-tong',
    name: '방통',
    faction: 'ally',
    className: '봉추 책사',
    classKey: 'strategist',
    level: 16,
    exp: 0,
    hp: 36,
    maxHp: 36,
    attack: 9,
    move: 4,
    stats: { might: 44, intelligence: 96, leadership: 88, agility: 72, luck: 82 },
    equipment: {
      weapon: { itemId: 'white-feather-fan', level: 2, exp: 16 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 12 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 8,
    y: 24
  }
];

export const fuPassRecruitUnits: UnitData[] = [
  {
    id: 'fa-zheng',
    name: '법정',
    faction: 'ally',
    className: '익주 모사',
    classKey: 'strategist',
    level: 17,
    exp: 0,
    hp: 38,
    maxHp: 38,
    attack: 9,
    move: 4,
    stats: { might: 42, intelligence: 94, leadership: 84, agility: 70, luck: 80 },
    equipment: {
      weapon: { itemId: 'white-feather-fan', level: 2, exp: 18 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 16 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 8,
    y: 25
  }
];

export const luoCastleRecruitUnits: UnitData[] = [
  {
    id: 'wu-yi',
    name: '오의',
    faction: 'ally',
    className: '익주 장군',
    classKey: 'infantry',
    level: 18,
    exp: 0,
    hp: 46,
    maxHp: 46,
    attack: 15,
    move: 4,
    stats: { might: 82, intelligence: 72, leadership: 86, agility: 74, luck: 78 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 3, exp: 16 },
      armor: { itemId: 'reinforced-lamellar', level: 2, exp: 18 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 9,
    y: 26
  }
];

export const luoCastleProperRecruitUnits: UnitData[] = [
  {
    id: 'yan-yan',
    name: '엄안',
    faction: 'ally',
    className: '익주 노장',
    classKey: 'archer',
    level: 19,
    exp: 0,
    hp: 42,
    maxHp: 42,
    attack: 14,
    move: 4,
    stats: { might: 78, intelligence: 70, leadership: 88, agility: 68, luck: 74 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 3, exp: 18 },
      armor: { itemId: 'reinforced-lamellar', level: 2, exp: 20 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 10,
    y: 27
  }
];

export const chengduPressureRecruitUnits: UnitData[] = [
  {
    id: 'li-yan',
    name: '이엄',
    faction: 'ally',
    className: '익주 수비장',
    classKey: 'infantry',
    level: 20,
    exp: 0,
    hp: 46,
    maxHp: 46,
    attack: 15,
    move: 4,
    stats: { might: 80, intelligence: 78, leadership: 88, agility: 70, luck: 72 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 3, exp: 24 },
      armor: { itemId: 'reinforced-lamellar', level: 3, exp: 12 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 11,
    y: 28
  }
];

export const chengduSurrenderRecruitUnits: UnitData[] = [
  {
    id: 'huang-quan',
    name: '황권',
    faction: 'ally',
    className: '익주 참모',
    classKey: 'strategist',
    level: 21,
    exp: 0,
    hp: 38,
    maxHp: 38,
    attack: 13,
    move: 4,
    stats: { might: 67, intelligence: 86, leadership: 82, agility: 64, luck: 74 },
    equipment: {
      weapon: { itemId: 'white-feather-fan', level: 3, exp: 18 },
      armor: { itemId: 'oath-robe', level: 3, exp: 8 },
      accessory: { itemId: 'war-manual', level: 2, exp: 12 }
    },
    x: 12,
    y: 30
  }
];

export const hanzhongOpeningRecruitUnits: UnitData[] = [
  {
    id: 'ma-chao',
    name: '마초',
    faction: 'ally',
    className: '서량 기병',
    classKey: 'cavalry',
    level: 23,
    exp: 0,
    hp: 52,
    maxHp: 52,
    attack: 18,
    move: 6,
    stats: { might: 92, intelligence: 62, leadership: 86, agility: 84, luck: 70 },
    equipment: {
      weapon: { itemId: 'sky-piercer-halberd', level: 4, exp: 22 },
      armor: { itemId: 'reinforced-lamellar', level: 3, exp: 18 },
      accessory: { itemId: 'bravery-token', level: 2, exp: 14 }
    },
    x: 13,
    y: 32
  }
];

export const hanzhongScoutRecruitUnits: UnitData[] = [
  {
    id: 'ma-dai',
    name: '마대',
    faction: 'ally',
    className: '서량 기병',
    classKey: 'cavalry',
    level: 24,
    exp: 0,
    hp: 50,
    maxHp: 50,
    attack: 17,
    move: 6,
    stats: { might: 86, intelligence: 58, leadership: 80, agility: 82, luck: 68 },
    equipment: {
      weapon: { itemId: 'western-cavalry-spear', level: 3, exp: 18 },
      armor: { itemId: 'lamellar-armor', level: 3, exp: 16 },
      accessory: { itemId: 'bravery-token', level: 2, exp: 10 }
    },
    x: 14,
    y: 34
  }
];

export const hanzhongMainRecruitUnits: UnitData[] = [
  {
    id: 'wang-ping',
    name: '왕평',
    faction: 'ally',
    className: '한중 보병',
    classKey: 'spearman',
    level: 25,
    exp: 0,
    hp: 54,
    maxHp: 54,
    attack: 17,
    move: 4,
    stats: { might: 82, intelligence: 70, leadership: 78, agility: 72, luck: 66 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 3, exp: 22 },
      armor: { itemId: 'reinforced-lamellar', level: 3, exp: 18 },
      accessory: { itemId: 'mountain-guide-scroll', level: 2, exp: 10 }
    },
    x: 15,
    y: 36
  }
];

const eighthBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 2, y: 17 },
  'guan-yu': { x: 3, y: 17 },
  'zhang-fei': { x: 2, y: 18 },
  'jian-yong': { x: 3, y: 18 },
  'mi-zhu': { x: 1, y: 18 }
};

export const eighthBattleUnits: UnitData[] = [
  ...[...firstBattleUnits.filter((unit) => unit.faction === 'ally'), ...xuzhouRecruitUnits].map((unit) =>
    placeScenarioUnit(unit, eighthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })
  ),
  {
    id: 'xiaopei-raider-a',
    name: '여포군 척후',
    faction: 'enemy',
    className: '기동 척후',
    classKey: 'cavalry',
    level: 8,
    exp: 52,
    hp: 43,
    maxHp: 43,
    attack: 15,
    move: 5,
    stats: { might: 82, intelligence: 50, leadership: 62, agility: 86, luck: 55 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 28 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 14 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 17,
    y: 9
  },
  {
    id: 'xiaopei-raider-b',
    name: '여포군 척후',
    faction: 'enemy',
    className: '기동 척후',
    classKey: 'cavalry',
    level: 8,
    exp: 54,
    hp: 44,
    maxHp: 44,
    attack: 15,
    move: 5,
    stats: { might: 83, intelligence: 50, leadership: 62, agility: 86, luck: 55 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 30 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 14 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 19,
    y: 10
  },
  {
    id: 'xiaopei-infantry-a',
    name: '소패 침투병',
    faction: 'enemy',
    className: '여포군 보병',
    classKey: 'yellowTurban',
    level: 8,
    exp: 50,
    hp: 42,
    maxHp: 42,
    attack: 13,
    move: 3,
    stats: { might: 78, intelligence: 50, leadership: 66, agility: 61, luck: 53 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 26 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 12 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 11,
    y: 12
  },
  {
    id: 'xiaopei-infantry-b',
    name: '소패 침투병',
    faction: 'enemy',
    className: '여포군 보병',
    classKey: 'yellowTurban',
    level: 8,
    exp: 52,
    hp: 43,
    maxHp: 43,
    attack: 13,
    move: 3,
    stats: { might: 79, intelligence: 50, leadership: 67, agility: 62, luck: 53 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 28 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 12 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 12,
    y: 14
  },
  {
    id: 'xiaopei-archer-a',
    name: '소패 궁병',
    faction: 'enemy',
    className: '여포군 궁병',
    classKey: 'archer',
    level: 8,
    exp: 52,
    hp: 34,
    maxHp: 34,
    attack: 14,
    move: 3,
    stats: { might: 70, intelligence: 62, leadership: 60, agility: 71, luck: 54 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 2, exp: 28 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 12 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 18,
    y: 7
  },
  {
    id: 'xiaopei-archer-b',
    name: '소패 궁병',
    faction: 'enemy',
    className: '여포군 궁병',
    classKey: 'archer',
    level: 9,
    exp: 54,
    hp: 35,
    maxHp: 35,
    attack: 15,
    move: 3,
    stats: { might: 72, intelligence: 63, leadership: 61, agility: 72, luck: 55 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 2, exp: 30 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 12 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 21,
    y: 14
  },
  {
    id: 'xiaopei-guard-a',
    name: '창고 습격병',
    faction: 'enemy',
    className: '여포군 보병',
    classKey: 'bandit',
    level: 8,
    exp: 50,
    hp: 38,
    maxHp: 38,
    attack: 14,
    move: 4,
    stats: { might: 79, intelligence: 48, leadership: 58, agility: 72, luck: 52 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 26 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 12 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 8,
    y: 11
  },
  {
    id: 'xiaopei-guard-b',
    name: '창고 습격병',
    faction: 'enemy',
    className: '여포군 보병',
    classKey: 'bandit',
    level: 8,
    exp: 52,
    hp: 39,
    maxHp: 39,
    attack: 14,
    move: 4,
    stats: { might: 80, intelligence: 48, leadership: 58, agility: 73, luck: 52 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 28 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 12 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 9,
    y: 14
  },
  {
    id: 'xiaopei-cavalry-a',
    name: '여포군 기병',
    faction: 'enemy',
    className: '여포군 기병',
    classKey: 'cavalry',
    level: 9,
    exp: 56,
    hp: 46,
    maxHp: 46,
    attack: 16,
    move: 5,
    stats: { might: 86, intelligence: 50, leadership: 66, agility: 88, luck: 56 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 32 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 16 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 23,
    y: 6
  },
  {
    id: 'xiaopei-cavalry-b',
    name: '여포군 기병',
    faction: 'enemy',
    className: '여포군 기병',
    classKey: 'cavalry',
    level: 9,
    exp: 58,
    hp: 47,
    maxHp: 47,
    attack: 16,
    move: 5,
    stats: { might: 87, intelligence: 50, leadership: 66, agility: 89, luck: 56 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 34 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 16 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 24,
    y: 15
  },
  {
    id: 'xiaopei-leader-gao-shun',
    name: '고순',
    faction: 'enemy',
    className: '여포군 선봉장',
    classKey: 'rebelLeader',
    level: 10,
    exp: 62,
    hp: 62,
    maxHp: 62,
    attack: 17,
    move: 4,
    stats: { might: 88, intelligence: 66, leadership: 86, agility: 68, luck: 58 },
    equipment: {
      weapon: { itemId: 'leader-axe', level: 2, exp: 34 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 18 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 22,
    y: 3
  }
];

const ninthBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 3, y: 17 },
  'guan-yu': { x: 4, y: 17 },
  'zhang-fei': { x: 3, y: 18 },
  'jian-yong': { x: 5, y: 18 },
  'mi-zhu': { x: 4, y: 19 }
};

export const ninthBattleUnits: UnitData[] = [
  ...[...firstBattleUnits.filter((unit) => unit.faction === 'ally'), ...xuzhouRecruitUnits].map((unit) =>
    placeScenarioUnit(unit, ninthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })
  ),
  {
    id: 'xuzhou-gate-traitor-a',
    name: '성문 배반병',
    faction: 'enemy',
    className: '서주 배반병',
    classKey: 'bandit',
    level: 9,
    exp: 56,
    hp: 40,
    maxHp: 40,
    attack: 15,
    move: 4,
    stats: { might: 80, intelligence: 48, leadership: 58, agility: 74, luck: 52 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 30 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 14 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 11,
    y: 12
  },
  {
    id: 'xuzhou-gate-traitor-b',
    name: '성문 배반병',
    faction: 'enemy',
    className: '서주 배반병',
    classKey: 'bandit',
    level: 9,
    exp: 58,
    hp: 41,
    maxHp: 41,
    attack: 15,
    move: 4,
    stats: { might: 81, intelligence: 49, leadership: 59, agility: 74, luck: 52 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 32 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 14 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 12,
    y: 14
  },
  {
    id: 'xuzhou-gate-infantry-a',
    name: '성문 수비병',
    faction: 'enemy',
    className: '조표 휘하 보병',
    classKey: 'yellowTurban',
    level: 9,
    exp: 56,
    hp: 44,
    maxHp: 44,
    attack: 14,
    move: 3,
    stats: { might: 80, intelligence: 52, leadership: 68, agility: 62, luck: 54 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 30 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 14 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 17,
    y: 10
  },
  {
    id: 'xuzhou-gate-infantry-b',
    name: '성문 수비병',
    faction: 'enemy',
    className: '조표 휘하 보병',
    classKey: 'yellowTurban',
    level: 9,
    exp: 58,
    hp: 45,
    maxHp: 45,
    attack: 14,
    move: 3,
    stats: { might: 81, intelligence: 52, leadership: 68, agility: 63, luck: 54 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 32 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 14 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 18,
    y: 12
  },
  {
    id: 'xuzhou-gate-archer-a',
    name: '성벽 궁병',
    faction: 'enemy',
    className: '성벽 궁병',
    classKey: 'archer',
    level: 9,
    exp: 58,
    hp: 36,
    maxHp: 36,
    attack: 15,
    move: 3,
    stats: { might: 72, intelligence: 64, leadership: 62, agility: 73, luck: 55 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 2, exp: 32 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 14 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 20,
    y: 7
  },
  {
    id: 'xuzhou-gate-archer-b',
    name: '성벽 궁병',
    faction: 'enemy',
    className: '성벽 궁병',
    classKey: 'archer',
    level: 9,
    exp: 60,
    hp: 37,
    maxHp: 37,
    attack: 15,
    move: 3,
    stats: { might: 73, intelligence: 64, leadership: 63, agility: 74, luck: 55 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 2, exp: 34 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 14 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 22,
    y: 13
  },
  {
    id: 'lubu-cavalry-a',
    name: '여포군 기병',
    faction: 'enemy',
    className: '여포군 기병',
    classKey: 'cavalry',
    level: 10,
    exp: 62,
    hp: 49,
    maxHp: 49,
    attack: 17,
    move: 5,
    stats: { might: 88, intelligence: 50, leadership: 68, agility: 90, luck: 57 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 36 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 18 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 23,
    y: 5
  },
  {
    id: 'lubu-cavalry-b',
    name: '여포군 기병',
    faction: 'enemy',
    className: '여포군 기병',
    classKey: 'cavalry',
    level: 10,
    exp: 64,
    hp: 50,
    maxHp: 50,
    attack: 17,
    move: 5,
    stats: { might: 89, intelligence: 50, leadership: 68, agility: 91, luck: 57 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 38 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 18 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 24,
    y: 16
  },
  {
    id: 'lubu-cavalry-c',
    name: '여포군 기병',
    faction: 'enemy',
    className: '여포군 기병',
    classKey: 'cavalry',
    level: 10,
    exp: 66,
    hp: 50,
    maxHp: 50,
    attack: 18,
    move: 5,
    stats: { might: 90, intelligence: 52, leadership: 70, agility: 91, luck: 58 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 40 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 18 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 21,
    y: 10
  },
  {
    id: 'xuzhou-leader-cao-bao',
    name: '조표',
    faction: 'enemy',
    className: '서주 성문장',
    classKey: 'rebelLeader',
    level: 10,
    exp: 68,
    hp: 64,
    maxHp: 64,
    attack: 17,
    move: 4,
    stats: { might: 84, intelligence: 60, leadership: 82, agility: 66, luck: 56 },
    equipment: {
      weapon: { itemId: 'leader-axe', level: 2, exp: 38 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 20 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 20,
    y: 10
  }
];

const tenthBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 3, y: 14 },
  'guan-yu': { x: 4, y: 15 },
  'zhang-fei': { x: 3, y: 16 },
  'jian-yong': { x: 5, y: 17 },
  'mi-zhu': { x: 4, y: 18 }
};

export const tenthBattleUnits: UnitData[] = [
  ...[...firstBattleUnits.filter((unit) => unit.faction === 'ally'), ...xuzhouRecruitUnits].map((unit) =>
    placeScenarioUnit(unit, tenthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })
  ),
  {
    id: 'xuzhou-escape-cavalry-a',
    name: '여포군 추격기병',
    faction: 'enemy',
    className: '여포군 기병',
    classKey: 'cavalry',
    level: 11,
    exp: 64,
    hp: 52,
    maxHp: 52,
    attack: 18,
    move: 5,
    stats: { might: 91, intelligence: 52, leadership: 70, agility: 92, luck: 58 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 42 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 20 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 21,
    y: 5
  },
  {
    id: 'xuzhou-escape-cavalry-b',
    name: '여포군 추격기병',
    faction: 'enemy',
    className: '여포군 기병',
    classKey: 'cavalry',
    level: 11,
    exp: 66,
    hp: 53,
    maxHp: 53,
    attack: 18,
    move: 5,
    stats: { might: 92, intelligence: 52, leadership: 70, agility: 93, luck: 58 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 44 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 20 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 23,
    y: 9
  },
  {
    id: 'xuzhou-escape-cavalry-c',
    name: '여포군 추격기병',
    faction: 'enemy',
    className: '여포군 기병',
    classKey: 'cavalry',
    level: 11,
    exp: 66,
    hp: 53,
    maxHp: 53,
    attack: 18,
    move: 5,
    stats: { might: 92, intelligence: 53, leadership: 71, agility: 93, luck: 59 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 46 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 20 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 22,
    y: 16
  },
  {
    id: 'xuzhou-escape-guard-a',
    name: '서주 점거병',
    faction: 'enemy',
    className: '여포군 보병',
    classKey: 'yellowTurban',
    level: 10,
    exp: 62,
    hp: 47,
    maxHp: 47,
    attack: 15,
    move: 3,
    stats: { might: 82, intelligence: 54, leadership: 69, agility: 63, luck: 55 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 36 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 18 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 12,
    y: 9
  },
  {
    id: 'xuzhou-escape-guard-b',
    name: '서주 점거병',
    faction: 'enemy',
    className: '여포군 보병',
    classKey: 'yellowTurban',
    level: 10,
    exp: 62,
    hp: 48,
    maxHp: 48,
    attack: 15,
    move: 3,
    stats: { might: 83, intelligence: 54, leadership: 70, agility: 64, luck: 55 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 38 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 18 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 13,
    y: 13
  },
  {
    id: 'xuzhou-escape-guard-c',
    name: '서주 점거병',
    faction: 'enemy',
    className: '여포군 보병',
    classKey: 'yellowTurban',
    level: 10,
    exp: 64,
    hp: 48,
    maxHp: 48,
    attack: 15,
    move: 3,
    stats: { might: 84, intelligence: 55, leadership: 70, agility: 64, luck: 56 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 40 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 18 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 15,
    y: 16
  },
  {
    id: 'xuzhou-escape-archer-a',
    name: '여포군 궁병',
    faction: 'enemy',
    className: '여포군 궁병',
    classKey: 'archer',
    level: 10,
    exp: 62,
    hp: 38,
    maxHp: 38,
    attack: 16,
    move: 3,
    stats: { might: 74, intelligence: 65, leadership: 63, agility: 74, luck: 56 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 2, exp: 38 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 16 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 17,
    y: 7
  },
  {
    id: 'xuzhou-escape-archer-b',
    name: '여포군 궁병',
    faction: 'enemy',
    className: '여포군 궁병',
    classKey: 'archer',
    level: 10,
    exp: 64,
    hp: 39,
    maxHp: 39,
    attack: 16,
    move: 3,
    stats: { might: 75, intelligence: 66, leadership: 64, agility: 75, luck: 56 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 2, exp: 40 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 16 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 18,
    y: 14
  },
  {
    id: 'xuzhou-escape-raider-a',
    name: '성내 배반병',
    faction: 'enemy',
    className: '성내 배반병',
    classKey: 'bandit',
    level: 10,
    exp: 62,
    hp: 43,
    maxHp: 43,
    attack: 16,
    move: 4,
    stats: { might: 84, intelligence: 52, leadership: 61, agility: 76, luck: 55 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 38 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 18 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 8,
    y: 10
  },
  {
    id: 'xuzhou-escape-raider-b',
    name: '성내 배반병',
    faction: 'enemy',
    className: '성내 배반병',
    classKey: 'bandit',
    level: 10,
    exp: 64,
    hp: 44,
    maxHp: 44,
    attack: 16,
    move: 4,
    stats: { might: 85, intelligence: 52, leadership: 62, agility: 77, luck: 55 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 40 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 18 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 10,
    y: 17
  },
  {
    id: 'xuzhou-escape-leader-song-xian',
    name: '송헌',
    faction: 'enemy',
    className: '여포군 선봉장',
    classKey: 'rebelLeader',
    level: 11,
    exp: 70,
    hp: 68,
    maxHp: 68,
    attack: 18,
    move: 4,
    stats: { might: 88, intelligence: 60, leadership: 84, agility: 72, luck: 58 },
    equipment: {
      weapon: { itemId: 'leader-axe', level: 2, exp: 42 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 22 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 20,
    y: 11
  }
];

const eleventhBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 3, y: 15 },
  'guan-yu': { x: 4, y: 14 },
  'zhang-fei': { x: 4, y: 16 },
  'jian-yong': { x: 5, y: 17 },
  'mi-zhu': { x: 3, y: 18 }
};

export const eleventhBattleUnits: UnitData[] = [
  ...[...firstBattleUnits.filter((unit) => unit.faction === 'ally'), ...xuzhouRecruitUnits].map((unit) =>
    placeScenarioUnit(unit, eleventhBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })
  ),
  {
    id: 'xudu-road-raider-a',
    name: '원술군 잔병',
    faction: 'enemy',
    className: '원술군 보병',
    classKey: 'yellowTurban',
    level: 11,
    exp: 68,
    hp: 50,
    maxHp: 50,
    attack: 16,
    move: 3,
    stats: { might: 84, intelligence: 54, leadership: 70, agility: 64, luck: 56 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 42 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 20 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 11,
    y: 12
  },
  {
    id: 'xudu-road-raider-b',
    name: '원술군 잔병',
    faction: 'enemy',
    className: '원술군 보병',
    classKey: 'yellowTurban',
    level: 11,
    exp: 70,
    hp: 51,
    maxHp: 51,
    attack: 16,
    move: 3,
    stats: { might: 85, intelligence: 55, leadership: 71, agility: 65, luck: 56 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 44 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 20 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 13,
    y: 16
  },
  {
    id: 'xudu-road-raider-c',
    name: '원술군 잔병',
    faction: 'enemy',
    className: '원술군 보병',
    classKey: 'yellowTurban',
    level: 11,
    exp: 70,
    hp: 51,
    maxHp: 51,
    attack: 16,
    move: 3,
    stats: { might: 85, intelligence: 55, leadership: 71, agility: 65, luck: 56 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 44 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 20 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 17,
    y: 11
  },
  {
    id: 'xudu-road-bandit-a',
    name: '군량 약탈병',
    faction: 'enemy',
    className: '원술군 약탈병',
    classKey: 'bandit',
    level: 11,
    exp: 68,
    hp: 45,
    maxHp: 45,
    attack: 17,
    move: 4,
    stats: { might: 86, intelligence: 53, leadership: 62, agility: 78, luck: 56 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 42 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 20 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 8,
    y: 8
  },
  {
    id: 'xudu-road-bandit-b',
    name: '군량 약탈병',
    faction: 'enemy',
    className: '원술군 약탈병',
    classKey: 'bandit',
    level: 11,
    exp: 70,
    hp: 46,
    maxHp: 46,
    attack: 17,
    move: 4,
    stats: { might: 87, intelligence: 53, leadership: 63, agility: 79, luck: 56 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 44 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 20 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 9,
    y: 18
  },
  {
    id: 'xudu-road-archer-a',
    name: '원술군 궁병',
    faction: 'enemy',
    className: '원술군 궁병',
    classKey: 'archer',
    level: 11,
    exp: 68,
    hp: 40,
    maxHp: 40,
    attack: 17,
    move: 3,
    stats: { might: 76, intelligence: 66, leadership: 64, agility: 76, luck: 57 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 2, exp: 42 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 18 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 16,
    y: 6
  },
  {
    id: 'xudu-road-archer-b',
    name: '원술군 궁병',
    faction: 'enemy',
    className: '원술군 궁병',
    classKey: 'archer',
    level: 11,
    exp: 70,
    hp: 41,
    maxHp: 41,
    attack: 17,
    move: 3,
    stats: { might: 77, intelligence: 67, leadership: 65, agility: 77, luck: 57 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 2, exp: 44 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 18 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 20,
    y: 15
  },
  {
    id: 'xudu-road-cavalry-a',
    name: '원술군 기병',
    faction: 'enemy',
    className: '원술군 기병',
    classKey: 'cavalry',
    level: 12,
    exp: 72,
    hp: 55,
    maxHp: 55,
    attack: 19,
    move: 5,
    stats: { might: 93, intelligence: 54, leadership: 72, agility: 94, luck: 59 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 48 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 22 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 21,
    y: 8
  },
  {
    id: 'xudu-road-cavalry-b',
    name: '원술군 기병',
    faction: 'enemy',
    className: '원술군 기병',
    classKey: 'cavalry',
    level: 12,
    exp: 74,
    hp: 56,
    maxHp: 56,
    attack: 19,
    move: 5,
    stats: { might: 94, intelligence: 54, leadership: 72, agility: 95, luck: 59 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 50 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 22 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 22,
    y: 17
  },
  {
    id: 'xudu-road-guard-a',
    name: '원술군 친위병',
    faction: 'enemy',
    className: '원술군 창병',
    classKey: 'spearman',
    level: 12,
    exp: 72,
    hp: 54,
    maxHp: 54,
    attack: 18,
    move: 3,
    stats: { might: 90, intelligence: 56, leadership: 76, agility: 68, luck: 58 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 48 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 22 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 23,
    y: 11
  },
  {
    id: 'xudu-road-guard-b',
    name: '원술군 친위병',
    faction: 'enemy',
    className: '원술군 창병',
    classKey: 'spearman',
    level: 12,
    exp: 74,
    hp: 55,
    maxHp: 55,
    attack: 18,
    move: 3,
    stats: { might: 91, intelligence: 56, leadership: 76, agility: 69, luck: 58 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 50 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 22 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 24,
    y: 13
  },
  {
    id: 'xudu-road-leader-ji-ling',
    name: '기령',
    faction: 'enemy',
    className: '원술군 대장',
    classKey: 'rebelLeader',
    level: 13,
    exp: 80,
    hp: 74,
    maxHp: 74,
    attack: 20,
    move: 4,
    stats: { might: 94, intelligence: 64, leadership: 88, agility: 74, luck: 60 },
    equipment: {
      weapon: { itemId: 'leader-axe', level: 2, exp: 52 },
      armor: { itemId: 'reinforced-lamellar', level: 2, exp: 24 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 24,
    y: 10
  }
];

const twelfthBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 3, y: 18 },
  'guan-yu': { x: 4, y: 17 },
  'zhang-fei': { x: 4, y: 19 },
  'jian-yong': { x: 5, y: 20 },
  'mi-zhu': { x: 3, y: 21 }
};

export const twelfthBattleUnits: UnitData[] = [
  ...[...firstBattleUnits.filter((unit) => unit.faction === 'ally'), ...xuzhouRecruitUnits].map((unit) =>
    placeScenarioUnit(unit, twelfthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })
  ),
  {
    id: 'xiapi-cavalry-a',
    name: '여포군 돌격기병',
    faction: 'enemy',
    className: '여포군 기병',
    classKey: 'cavalry',
    level: 13,
    exp: 76,
    hp: 58,
    maxHp: 58,
    attack: 20,
    move: 5,
    stats: { might: 95, intelligence: 54, leadership: 74, agility: 96, luck: 60 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 54 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 24 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 20,
    y: 5
  },
  {
    id: 'xiapi-cavalry-b',
    name: '여포군 돌격기병',
    faction: 'enemy',
    className: '여포군 기병',
    classKey: 'cavalry',
    level: 13,
    exp: 78,
    hp: 59,
    maxHp: 59,
    attack: 20,
    move: 5,
    stats: { might: 96, intelligence: 54, leadership: 74, agility: 97, luck: 60 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 56 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 24 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 23,
    y: 15
  },
  {
    id: 'xiapi-cavalry-c',
    name: '여포군 돌격기병',
    faction: 'enemy',
    className: '여포군 기병',
    classKey: 'cavalry',
    level: 13,
    exp: 78,
    hp: 59,
    maxHp: 59,
    attack: 20,
    move: 5,
    stats: { might: 96, intelligence: 55, leadership: 75, agility: 97, luck: 61 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 56 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 24 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 25,
    y: 10
  },
  {
    id: 'xiapi-dike-guard-a',
    name: '하비 둑길 수비병',
    faction: 'enemy',
    className: '여포군 보병',
    classKey: 'yellowTurban',
    level: 12,
    exp: 74,
    hp: 52,
    maxHp: 52,
    attack: 17,
    move: 3,
    stats: { might: 86, intelligence: 56, leadership: 72, agility: 65, luck: 57 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 50 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 22 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 12,
    y: 14
  },
  {
    id: 'xiapi-dike-guard-b',
    name: '하비 둑길 수비병',
    faction: 'enemy',
    className: '여포군 보병',
    classKey: 'yellowTurban',
    level: 12,
    exp: 76,
    hp: 53,
    maxHp: 53,
    attack: 17,
    move: 3,
    stats: { might: 87, intelligence: 56, leadership: 73, agility: 66, luck: 57 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 52 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 22 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 14,
    y: 18
  },
  {
    id: 'xiapi-dike-guard-c',
    name: '하비 둑길 수비병',
    faction: 'enemy',
    className: '여포군 보병',
    classKey: 'yellowTurban',
    level: 12,
    exp: 76,
    hp: 53,
    maxHp: 53,
    attack: 17,
    move: 3,
    stats: { might: 87, intelligence: 57, leadership: 73, agility: 66, luck: 57 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 52 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 22 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 17,
    y: 9
  },
  {
    id: 'xiapi-archer-a',
    name: '하비 성루 궁병',
    faction: 'enemy',
    className: '여포군 궁병',
    classKey: 'archer',
    level: 12,
    exp: 74,
    hp: 43,
    maxHp: 43,
    attack: 18,
    move: 3,
    stats: { might: 78, intelligence: 68, leadership: 66, agility: 78, luck: 58 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 2, exp: 50 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 20 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 22,
    y: 7
  },
  {
    id: 'xiapi-archer-b',
    name: '하비 성루 궁병',
    faction: 'enemy',
    className: '여포군 궁병',
    classKey: 'archer',
    level: 12,
    exp: 76,
    hp: 44,
    maxHp: 44,
    attack: 18,
    move: 3,
    stats: { might: 79, intelligence: 69, leadership: 67, agility: 79, luck: 58 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 2, exp: 52 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 20 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 24,
    y: 18
  },
  {
    id: 'xiapi-archer-c',
    name: '하비 성루 궁병',
    faction: 'enemy',
    className: '여포군 궁병',
    classKey: 'archer',
    level: 12,
    exp: 76,
    hp: 44,
    maxHp: 44,
    attack: 18,
    move: 3,
    stats: { might: 79, intelligence: 69, leadership: 67, agility: 79, luck: 58 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 2, exp: 52 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 20 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 19,
    y: 3
  },
  {
    id: 'xiapi-camp-raider-a',
    name: '여포군 기습병',
    faction: 'enemy',
    className: '여포군 기습병',
    classKey: 'bandit',
    level: 12,
    exp: 74,
    hp: 48,
    maxHp: 48,
    attack: 18,
    move: 4,
    stats: { might: 88, intelligence: 55, leadership: 64, agility: 81, luck: 58 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 50 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 22 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 9,
    y: 8
  },
  {
    id: 'xiapi-camp-raider-b',
    name: '여포군 기습병',
    faction: 'enemy',
    className: '여포군 기습병',
    classKey: 'bandit',
    level: 12,
    exp: 76,
    hp: 49,
    maxHp: 49,
    attack: 18,
    move: 4,
    stats: { might: 89, intelligence: 55, leadership: 64, agility: 82, luck: 58 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 52 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 22 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 11,
    y: 21
  },
  {
    id: 'xiapi-strategist-chen-gong',
    name: '진궁',
    faction: 'enemy',
    className: '여포군 책사',
    classKey: 'strategist',
    level: 13,
    exp: 82,
    hp: 52,
    maxHp: 52,
    attack: 18,
    move: 3,
    stats: { might: 62, intelligence: 96, leadership: 84, agility: 70, luck: 64 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 2, exp: 54 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 22 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 22,
    y: 12
  },
  {
    id: 'xiapi-leader-zhang-liao',
    name: '장료',
    faction: 'enemy',
    className: '여포군 선봉장',
    classKey: 'rebelLeader',
    level: 14,
    exp: 86,
    hp: 78,
    maxHp: 78,
    attack: 21,
    move: 5,
    stats: { might: 95, intelligence: 78, leadership: 92, agility: 86, luck: 63 },
    equipment: {
      weapon: { itemId: 'leader-axe', level: 2, exp: 58 },
      armor: { itemId: 'reinforced-lamellar', level: 2, exp: 26 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 24,
    y: 11
  }
];

const thirteenthBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 3, y: 19 },
  'guan-yu': { x: 4, y: 18 },
  'zhang-fei': { x: 4, y: 20 },
  'jian-yong': { x: 5, y: 19 },
  'mi-zhu': { x: 3, y: 21 }
};

export const thirteenthBattleUnits: UnitData[] = [
  ...[...firstBattleUnits.filter((unit) => unit.faction === 'ally'), ...xuzhouRecruitUnits].map((unit) =>
    placeScenarioUnit(unit, thirteenthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })
  ),
  {
    id: 'xiapi-final-cavalry-a',
    name: '여포군 돌격기병',
    faction: 'enemy',
    className: '여포군 기병',
    classKey: 'cavalry',
    level: 14,
    exp: 84,
    hp: 62,
    maxHp: 62,
    attack: 21,
    move: 5,
    stats: { might: 98, intelligence: 55, leadership: 76, agility: 99, luck: 62 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 60 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 26 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 15,
    y: 15
  },
  {
    id: 'xiapi-final-cavalry-b',
    name: '여포군 돌격기병',
    faction: 'enemy',
    className: '여포군 기병',
    classKey: 'cavalry',
    level: 14,
    exp: 84,
    hp: 62,
    maxHp: 62,
    attack: 21,
    move: 5,
    stats: { might: 98, intelligence: 55, leadership: 76, agility: 99, luck: 62 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 60 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 26 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 20,
    y: 7
  },
  {
    id: 'xiapi-final-cavalry-c',
    name: '여포군 돌격기병',
    faction: 'enemy',
    className: '여포군 기병',
    classKey: 'cavalry',
    level: 14,
    exp: 86,
    hp: 63,
    maxHp: 63,
    attack: 21,
    move: 5,
    stats: { might: 99, intelligence: 56, leadership: 77, agility: 100, luck: 63 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 62 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 26 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 25,
    y: 17
  },
  {
    id: 'xiapi-final-cavalry-d',
    name: '여포군 친위기병',
    faction: 'enemy',
    className: '여포군 기병',
    classKey: 'cavalry',
    level: 15,
    exp: 88,
    hp: 66,
    maxHp: 66,
    attack: 22,
    move: 5,
    stats: { might: 101, intelligence: 58, leadership: 80, agility: 101, luck: 64 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 64 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 28 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 27,
    y: 12
  },
  {
    id: 'xiapi-final-gate-guard-a',
    name: '하비 성문 수비병',
    faction: 'enemy',
    className: '여포군 보병',
    classKey: 'yellowTurban',
    level: 13,
    exp: 82,
    hp: 56,
    maxHp: 56,
    attack: 18,
    move: 3,
    stats: { might: 89, intelligence: 58, leadership: 75, agility: 68, luck: 59 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 56 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 24 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 18,
    y: 13
  },
  {
    id: 'xiapi-final-gate-guard-b',
    name: '하비 성문 수비병',
    faction: 'enemy',
    className: '여포군 보병',
    classKey: 'yellowTurban',
    level: 13,
    exp: 82,
    hp: 56,
    maxHp: 56,
    attack: 18,
    move: 3,
    stats: { might: 89, intelligence: 58, leadership: 75, agility: 68, luck: 59 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 56 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 24 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 19,
    y: 14
  },
  {
    id: 'xiapi-final-gate-guard-c',
    name: '하비 성문 수비병',
    faction: 'enemy',
    className: '여포군 보병',
    classKey: 'yellowTurban',
    level: 13,
    exp: 84,
    hp: 57,
    maxHp: 57,
    attack: 18,
    move: 3,
    stats: { might: 90, intelligence: 58, leadership: 76, agility: 69, luck: 59 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 58 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 24 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 23,
    y: 10
  },
  {
    id: 'xiapi-final-gate-guard-d',
    name: '하비 성문 수비병',
    faction: 'enemy',
    className: '여포군 보병',
    classKey: 'yellowTurban',
    level: 13,
    exp: 84,
    hp: 57,
    maxHp: 57,
    attack: 18,
    move: 3,
    stats: { might: 90, intelligence: 58, leadership: 76, agility: 69, luck: 59 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 58 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 24 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 24,
    y: 11
  },
  {
    id: 'xiapi-final-archer-a',
    name: '하비 성루 궁병',
    faction: 'enemy',
    className: '여포군 궁병',
    classKey: 'archer',
    level: 13,
    exp: 82,
    hp: 46,
    maxHp: 46,
    attack: 19,
    move: 3,
    stats: { might: 80, intelligence: 70, leadership: 68, agility: 82, luck: 60 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 2, exp: 56 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 22 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 22,
    y: 7
  },
  {
    id: 'xiapi-final-archer-b',
    name: '하비 성루 궁병',
    faction: 'enemy',
    className: '여포군 궁병',
    classKey: 'archer',
    level: 13,
    exp: 84,
    hp: 47,
    maxHp: 47,
    attack: 19,
    move: 3,
    stats: { might: 81, intelligence: 71, leadership: 69, agility: 83, luck: 60 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 2, exp: 58 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 22 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 25,
    y: 8
  },
  {
    id: 'xiapi-final-archer-c',
    name: '하비 성루 궁병',
    faction: 'enemy',
    className: '여포군 궁병',
    classKey: 'archer',
    level: 13,
    exp: 84,
    hp: 47,
    maxHp: 47,
    attack: 19,
    move: 3,
    stats: { might: 81, intelligence: 71, leadership: 69, agility: 83, luck: 60 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 2, exp: 58 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 22 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 27,
    y: 15
  },
  {
    id: 'xiapi-final-raider-a',
    name: '여포군 성내 기습병',
    faction: 'enemy',
    className: '여포군 기습병',
    classKey: 'bandit',
    level: 13,
    exp: 82,
    hp: 52,
    maxHp: 52,
    attack: 19,
    move: 4,
    stats: { might: 91, intelligence: 57, leadership: 67, agility: 85, luck: 61 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 56 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 24 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 11,
    y: 10
  },
  {
    id: 'xiapi-final-raider-b',
    name: '여포군 성내 기습병',
    faction: 'enemy',
    className: '여포군 기습병',
    classKey: 'bandit',
    level: 13,
    exp: 84,
    hp: 53,
    maxHp: 53,
    attack: 19,
    move: 4,
    stats: { might: 92, intelligence: 57, leadership: 67, agility: 86, luck: 61 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 58 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 24 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 12,
    y: 21
  },
  {
    id: 'xiapi-final-strategist-chen-gong',
    name: '진궁',
    faction: 'enemy',
    className: '여포군 책사',
    classKey: 'strategist',
    level: 14,
    exp: 90,
    hp: 56,
    maxHp: 56,
    attack: 19,
    move: 3,
    stats: { might: 64, intelligence: 98, leadership: 88, agility: 72, luck: 66 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 2, exp: 60 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 24 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 25,
    y: 11
  },
  {
    id: 'xiapi-final-leader-lu-bu',
    name: '여포',
    faction: 'enemy',
    className: '비장군',
    classKey: 'rebelLeader',
    level: 16,
    exp: 96,
    hp: 94,
    maxHp: 94,
    attack: 25,
    move: 5,
    stats: { might: 108, intelligence: 46, leadership: 88, agility: 102, luck: 65 },
    equipment: {
      weapon: { itemId: 'sky-piercer-halberd', level: 3, exp: 20 },
      armor: { itemId: 'reinforced-lamellar', level: 2, exp: 32 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 28,
    y: 11
  }
];

const fourteenthBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 3, y: 19 },
  'guan-yu': { x: 4, y: 18 },
  'zhang-fei': { x: 4, y: 20 },
  'jian-yong': { x: 5, y: 19 },
  'mi-zhu': { x: 3, y: 21 },
  'sun-qian': { x: 5, y: 21 }
};

export const fourteenthBattleUnits: UnitData[] = [
  ...[...firstBattleUnits.filter((unit) => unit.faction === 'ally'), ...xuzhouRecruitUnits, ...caoBreakRecruitUnits].map((unit) =>
    placeScenarioUnit(unit, fourteenthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })
  ),
  {
    id: 'cao-break-scout-a',
    name: '조조군 척후',
    faction: 'enemy',
    className: '조조 척후',
    classKey: 'bandit',
    level: 14,
    exp: 86,
    hp: 52,
    maxHp: 52,
    attack: 19,
    move: 4,
    stats: { might: 88, intelligence: 61, leadership: 66, agility: 86, luck: 62 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 62 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 26 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 11,
    y: 15
  },
  {
    id: 'cao-break-scout-b',
    name: '조조군 척후',
    faction: 'enemy',
    className: '조조 척후',
    classKey: 'bandit',
    level: 14,
    exp: 86,
    hp: 52,
    maxHp: 52,
    attack: 19,
    move: 4,
    stats: { might: 88, intelligence: 61, leadership: 66, agility: 86, luck: 62 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 62 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 26 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 13,
    y: 20
  },
  {
    id: 'cao-break-infantry-a',
    name: '조조 보병',
    faction: 'enemy',
    className: '조조 보병',
    classKey: 'yellowTurban',
    level: 14,
    exp: 86,
    hp: 58,
    maxHp: 58,
    attack: 18,
    move: 3,
    stats: { might: 90, intelligence: 60, leadership: 76, agility: 68, luck: 60 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 62 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 26 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 15,
    y: 13
  },
  {
    id: 'cao-break-infantry-b',
    name: '조조 보병',
    faction: 'enemy',
    className: '조조 보병',
    classKey: 'yellowTurban',
    level: 14,
    exp: 88,
    hp: 59,
    maxHp: 59,
    attack: 18,
    move: 3,
    stats: { might: 91, intelligence: 60, leadership: 77, agility: 69, luck: 60 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 64 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 28 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 16,
    y: 14
  },
  {
    id: 'cao-break-infantry-c',
    name: '조조 보병',
    faction: 'enemy',
    className: '조조 보병',
    classKey: 'yellowTurban',
    level: 14,
    exp: 88,
    hp: 59,
    maxHp: 59,
    attack: 18,
    move: 3,
    stats: { might: 91, intelligence: 60, leadership: 77, agility: 69, luck: 60 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 64 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 28 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 19,
    y: 10
  },
  {
    id: 'cao-break-infantry-d',
    name: '조조 보병',
    faction: 'enemy',
    className: '조조 보병',
    classKey: 'yellowTurban',
    level: 15,
    exp: 90,
    hp: 61,
    maxHp: 61,
    attack: 19,
    move: 3,
    stats: { might: 92, intelligence: 61, leadership: 79, agility: 70, luck: 61 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 66 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 30 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 22,
    y: 15
  },
  {
    id: 'cao-break-archer-a',
    name: '조조 궁병',
    faction: 'enemy',
    className: '조조 궁병',
    classKey: 'archer',
    level: 14,
    exp: 86,
    hp: 48,
    maxHp: 48,
    attack: 19,
    move: 3,
    stats: { might: 81, intelligence: 72, leadership: 70, agility: 82, luck: 61 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 2, exp: 62 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 24 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 18,
    y: 8
  },
  {
    id: 'cao-break-archer-b',
    name: '조조 궁병',
    faction: 'enemy',
    className: '조조 궁병',
    classKey: 'archer',
    level: 14,
    exp: 88,
    hp: 49,
    maxHp: 49,
    attack: 19,
    move: 3,
    stats: { might: 82, intelligence: 73, leadership: 71, agility: 83, luck: 61 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 2, exp: 64 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 26 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 24,
    y: 9
  },
  {
    id: 'cao-break-archer-c',
    name: '조조 궁병',
    faction: 'enemy',
    className: '조조 궁병',
    classKey: 'archer',
    level: 14,
    exp: 88,
    hp: 49,
    maxHp: 49,
    attack: 19,
    move: 3,
    stats: { might: 82, intelligence: 73, leadership: 71, agility: 83, luck: 61 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 2, exp: 64 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 26 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 26,
    y: 16
  },
  {
    id: 'cao-break-cavalry-a',
    name: '조조 기병',
    faction: 'enemy',
    className: '조조 경기병',
    classKey: 'cavalry',
    level: 15,
    exp: 90,
    hp: 66,
    maxHp: 66,
    attack: 22,
    move: 5,
    stats: { might: 100, intelligence: 58, leadership: 80, agility: 100, luck: 63 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 66 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 30 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 20,
    y: 6
  },
  {
    id: 'cao-break-cavalry-b',
    name: '조조 기병',
    faction: 'enemy',
    className: '조조 경기병',
    classKey: 'cavalry',
    level: 15,
    exp: 90,
    hp: 66,
    maxHp: 66,
    attack: 22,
    move: 5,
    stats: { might: 100, intelligence: 58, leadership: 80, agility: 100, luck: 63 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 66 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 30 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 25,
    y: 13
  },
  {
    id: 'cao-break-cavalry-c',
    name: '조조 기병',
    faction: 'enemy',
    className: '조조 경기병',
    classKey: 'cavalry',
    level: 15,
    exp: 92,
    hp: 68,
    maxHp: 68,
    attack: 22,
    move: 5,
    stats: { might: 101, intelligence: 59, leadership: 81, agility: 101, luck: 64 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 68 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 32 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 28,
    y: 18
  },
  {
    id: 'cao-break-guard-a',
    name: '서주 관문 수비대',
    faction: 'enemy',
    className: '조조 수비대',
    classKey: 'yellowTurban',
    level: 15,
    exp: 92,
    hp: 64,
    maxHp: 64,
    attack: 19,
    move: 3,
    stats: { might: 93, intelligence: 64, leadership: 82, agility: 70, luck: 62 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 68 },
      armor: { itemId: 'reinforced-lamellar', level: 2, exp: 32 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 25,
    y: 11
  },
  {
    id: 'cao-break-guard-b',
    name: '서주 관문 수비대',
    faction: 'enemy',
    className: '조조 수비대',
    classKey: 'yellowTurban',
    level: 15,
    exp: 92,
    hp: 64,
    maxHp: 64,
    attack: 19,
    move: 3,
    stats: { might: 93, intelligence: 64, leadership: 82, agility: 70, luck: 62 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 68 },
      armor: { itemId: 'reinforced-lamellar', level: 2, exp: 32 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 26,
    y: 12
  },
  {
    id: 'cao-break-leader-che-zhou',
    name: '차주',
    faction: 'enemy',
    className: '조조군 장수',
    classKey: 'rebelLeader',
    level: 17,
    exp: 98,
    hp: 88,
    maxHp: 88,
    attack: 24,
    move: 4,
    stats: { might: 102, intelligence: 72, leadership: 92, agility: 78, luck: 65 },
    equipment: {
      weapon: { itemId: 'leader-axe', level: 3, exp: 10 },
      armor: { itemId: 'reinforced-lamellar', level: 2, exp: 36 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 27,
    y: 11
  }
];

const fifteenthBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 3, y: 18 },
  'guan-yu': { x: 4, y: 17 },
  'zhang-fei': { x: 4, y: 19 },
  'jian-yong': { x: 5, y: 18 },
  'mi-zhu': { x: 3, y: 20 },
  'sun-qian': { x: 5, y: 20 }
};

export const fifteenthBattleUnits: UnitData[] = [
  ...[...firstBattleUnits.filter((unit) => unit.faction === 'ally'), ...xuzhouRecruitUnits, ...caoBreakRecruitUnits].map((unit) =>
    placeScenarioUnit(unit, fifteenthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })
  ),
  {
    id: 'yuan-refuge-scout-a',
    name: '조조군 척후',
    faction: 'enemy',
    className: '추격 척후',
    classKey: 'bandit',
    level: 15,
    exp: 92,
    hp: 54,
    maxHp: 54,
    attack: 20,
    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: 54,
    maxHp: 54,
    attack: 20,
    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: 62,
    maxHp: 62,
    attack: 20,
    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: 62,
    maxHp: 62,
    attack: 20,
    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: 64,
    maxHp: 64,
    attack: 21,
    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: 64,
    maxHp: 64,
    attack: 21,
    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: 50,
    maxHp: 50,
    attack: 20,
    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: 50,
    maxHp: 50,
    attack: 20,
    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: 52,
    maxHp: 52,
    attack: 21,
    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: 70,
    maxHp: 70,
    attack: 22,
    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: 70,
    maxHp: 70,
    attack: 22,
    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: 70,
    maxHp: 70,
    attack: 22,
    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: 54,
    maxHp: 54,
    attack: 22,
    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: 92,
    maxHp: 92,
    attack: 26,
    move: 4,
    stats: { might: 104, intelligence: 58, leadership: 90, agility: 82, luck: 64 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 3, exp: 18 },
      armor: { itemId: 'reinforced-lamellar', level: 2, exp: 42 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 31,
    y: 12
  }
];

const sixteenthBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 3, y: 20 },
  'guan-yu': { x: 4, y: 19 },
  'zhang-fei': { x: 4, y: 21 },
  'jian-yong': { x: 5, y: 20 },
  'mi-zhu': { x: 3, y: 22 },
  'sun-qian': { x: 5, y: 22 },
  'zhao-yun': { x: 6, y: 21 }
};

export const sixteenthBattleUnits: UnitData[] = [
  ...[
    ...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
    ...xuzhouRecruitUnits,
    ...caoBreakRecruitUnits,
    ...liuBiaoRecruitUnits
  ].map((unit) => placeScenarioUnit(unit, sixteenthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  {
    id: 'liu-biao-road-scout-a',
    name: '조조군 척후',
    faction: 'enemy',
    className: '추격 척후',
    classKey: 'bandit',
    level: 16,
    exp: 8,
    hp: 56,
    maxHp: 56,
    attack: 21,
    move: 4,
    stats: { might: 92, intelligence: 62, leadership: 70, agility: 90, luck: 63 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 72 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 34 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 10,
    y: 20
  },
  {
    id: 'liu-biao-road-scout-b',
    name: '조조군 척후',
    faction: 'enemy',
    className: '추격 척후',
    classKey: 'bandit',
    level: 16,
    exp: 8,
    hp: 56,
    maxHp: 56,
    attack: 21,
    move: 4,
    stats: { might: 92, intelligence: 62, leadership: 70, agility: 90, luck: 63 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 2, exp: 72 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 34 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 12,
    y: 22
  },
  {
    id: 'liu-biao-road-infantry-a',
    name: '조조 보병',
    faction: 'enemy',
    className: '추격 보병',
    classKey: 'yellowTurban',
    level: 16,
    exp: 10,
    hp: 66,
    maxHp: 66,
    attack: 22,
    move: 3,
    stats: { might: 96, intelligence: 64, leadership: 82, agility: 72, luck: 62 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 2, exp: 74 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 36 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 15,
    y: 16
  },
  {
    id: 'liu-biao-road-infantry-b',
    name: '조조 보병',
    faction: 'enemy',
    className: '추격 보병',
    classKey: 'yellowTurban',
    level: 16,
    exp: 10,
    hp: 66,
    maxHp: 66,
    attack: 22,
    move: 3,
    stats: { might: 96, intelligence: 64, leadership: 82, agility: 72, luck: 62 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 2, exp: 74 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 36 },
      accessory: { itemId: 'yellow-scarf-charm', level: 1, exp: 0 }
    },
    x: 17,
    y: 18
  },
  {
    id: 'liu-biao-road-infantry-c',
    name: '조조 보병',
    faction: 'enemy',
    className: '관문 보병',
    classKey: 'yellowTurban',
    level: 17,
    exp: 12,
    hp: 68,
    maxHp: 68,
    attack: 23,
    move: 3,
    stats: { might: 98, intelligence: 65, leadership: 84, agility: 72, luck: 63 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 2, exp: 78 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 38 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 24,
    y: 12
  },
  {
    id: 'liu-biao-road-infantry-d',
    name: '조조 보병',
    faction: 'enemy',
    className: '관문 보병',
    classKey: 'yellowTurban',
    level: 17,
    exp: 12,
    hp: 68,
    maxHp: 68,
    attack: 23,
    move: 3,
    stats: { might: 98, intelligence: 65, leadership: 84, agility: 72, luck: 63 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 2, exp: 78 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 38 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 25,
    y: 15
  },
  {
    id: 'liu-biao-road-archer-a',
    name: '조조 궁병',
    faction: 'enemy',
    className: '추격 궁병',
    classKey: 'archer',
    level: 16,
    exp: 10,
    hp: 52,
    maxHp: 52,
    attack: 21,
    move: 3,
    stats: { might: 84, intelligence: 76, leadership: 74, agility: 86, luck: 64 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 2, exp: 72 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 34 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 17,
    y: 12
  },
  {
    id: 'liu-biao-road-archer-b',
    name: '조조 궁병',
    faction: 'enemy',
    className: '관문 궁병',
    classKey: 'archer',
    level: 17,
    exp: 12,
    hp: 54,
    maxHp: 54,
    attack: 22,
    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: 54,
    maxHp: 54,
    attack: 22,
    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: 54,
    maxHp: 54,
    attack: 22,
    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: 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: 21,
    y: 17
  },
  {
    id: 'liu-biao-road-cavalry-d',
    name: '조조 기병',
    faction: 'enemy',
    className: '관문 기병',
    classKey: 'cavalry',
    level: 18,
    exp: 14,
    hp: 74,
    maxHp: 74,
    attack: 25,
    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: 74,
    maxHp: 74,
    attack: 24,
    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: 74,
    maxHp: 74,
    attack: 24,
    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: 58,
    maxHp: 58,
    attack: 23,
    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: 98,
    maxHp: 98,
    attack: 27,
    move: 4,
    stats: { might: 106, intelligence: 74, leadership: 96, agility: 80, luck: 66 },
    equipment: {
      weapon: { itemId: 'leader-axe', level: 3, exp: 24 },
      armor: { itemId: 'reinforced-lamellar', level: 2, exp: 46 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 31,
    y: 14
  }
];

const seventeenthBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 3, y: 21 },
  'guan-yu': { x: 4, y: 20 },
  'zhang-fei': { x: 4, y: 22 },
  'jian-yong': { x: 5, y: 21 },
  'mi-zhu': { x: 3, y: 23 },
  'sun-qian': { x: 5, y: 23 },
  'zhao-yun': { x: 6, y: 22 }
};

export const seventeenthBattleUnits: UnitData[] = [
  ...[
    ...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
    ...xuzhouRecruitUnits,
    ...caoBreakRecruitUnits,
    ...liuBiaoRecruitUnits
  ].map((unit) => placeScenarioUnit(unit, seventeenthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  {
    id: 'wolong-road-scout-a',
    name: '산길 척후',
    faction: 'enemy',
    className: '형주 척후',
    classKey: 'bandit',
    level: 18,
    exp: 16,
    hp: 58,
    maxHp: 58,
    attack: 22,
    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: 58,
    maxHp: 58,
    attack: 22,
    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: 70,
    maxHp: 70,
    attack: 24,
    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: 70,
    maxHp: 70,
    attack: 24,
    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: 74,
    maxHp: 74,
    attack: 25,
    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: 74,
    maxHp: 74,
    attack: 25,
    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: 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: 22,
    y: 10
  },
  {
    id: 'wolong-road-archer-c',
    name: '형주 궁병',
    faction: 'enemy',
    className: '초가 궁병',
    classKey: 'archer',
    level: 19,
    exp: 20,
    hp: 58,
    maxHp: 58,
    attack: 24,
    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: 76,
    maxHp: 76,
    attack: 26,
    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: 76,
    maxHp: 76,
    attack: 26,
    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: 78,
    maxHp: 78,
    attack: 25,
    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: 78,
    maxHp: 78,
    attack: 25,
    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: 60,
    maxHp: 60,
    attack: 24,
    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: 104,
    maxHp: 104,
    attack: 28,
    move: 4,
    stats: { might: 108, intelligence: 76, leadership: 98, agility: 82, luck: 66 },
    equipment: {
      weapon: { itemId: 'leader-axe', level: 3, exp: 32 },
      armor: { itemId: 'reinforced-lamellar', level: 2, exp: 52 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 31,
    y: 14
  }
];

const eighteenthBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 3, y: 18 },
  'guan-yu': { x: 4, y: 17 },
  'zhang-fei': { x: 4, y: 19 },
  'jian-yong': { x: 5, y: 18 },
  'mi-zhu': { x: 3, y: 20 },
  'sun-qian': { x: 5, y: 20 },
  'zhao-yun': { x: 6, y: 17 },
  'zhuge-liang': { x: 6, y: 19 }
};

export const eighteenthBattleUnits: UnitData[] = [
  ...[
    ...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
    ...xuzhouRecruitUnits,
    ...caoBreakRecruitUnits,
    ...liuBiaoRecruitUnits,
    ...zhugeRecruitUnits
  ].map((unit) => placeScenarioUnit(unit, eighteenthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  {
    id: 'bowang-scout-a',
    name: '조조군 척후',
    faction: 'enemy',
    className: '선봉 척후',
    classKey: 'bandit',
    level: 20,
    exp: 24,
    hp: 62,
    maxHp: 62,
    attack: 24,
    move: 4,
    stats: { might: 98, intelligence: 70, leadership: 76, agility: 94, luck: 66 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 3, exp: 10 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 62 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 12,
    y: 18
  },
  {
    id: 'bowang-scout-b',
    name: '조조군 척후',
    faction: 'enemy',
    className: '선봉 척후',
    classKey: 'bandit',
    level: 20,
    exp: 24,
    hp: 62,
    maxHp: 62,
    attack: 24,
    move: 4,
    stats: { might: 98, intelligence: 70, leadership: 76, agility: 94, luck: 66 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 3, exp: 10 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 62 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 14,
    y: 20
  },
  {
    id: 'bowang-infantry-a',
    name: '조조군 보병',
    faction: 'enemy',
    className: '박망 보병',
    classKey: 'yellowTurban',
    level: 20,
    exp: 26,
    hp: 76,
    maxHp: 76,
    attack: 26,
    move: 3,
    stats: { might: 104, intelligence: 72, leadership: 88, agility: 76, luck: 66 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 3, exp: 12 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 66 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 17,
    y: 17
  },
  {
    id: 'bowang-infantry-b',
    name: '조조군 보병',
    faction: 'enemy',
    className: '박망 보병',
    classKey: 'yellowTurban',
    level: 20,
    exp: 26,
    hp: 76,
    maxHp: 76,
    attack: 26,
    move: 3,
    stats: { might: 104, intelligence: 72, leadership: 88, agility: 76, luck: 66 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 3, exp: 12 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 66 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 18,
    y: 19
  },
  {
    id: 'bowang-infantry-c',
    name: '조조군 보병',
    faction: 'enemy',
    className: '길목 보병',
    classKey: 'yellowTurban',
    level: 21,
    exp: 28,
    hp: 80,
    maxHp: 80,
    attack: 27,
    move: 3,
    stats: { might: 106, intelligence: 74, leadership: 90, agility: 78, luck: 67 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 3, exp: 16 },
      armor: { itemId: 'reinforced-lamellar', level: 2, exp: 68 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 25,
    y: 14
  },
  {
    id: 'bowang-infantry-d',
    name: '조조군 보병',
    faction: 'enemy',
    className: '길목 보병',
    classKey: 'yellowTurban',
    level: 21,
    exp: 28,
    hp: 80,
    maxHp: 80,
    attack: 27,
    move: 3,
    stats: { might: 106, intelligence: 74, leadership: 90, agility: 78, luck: 67 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 3, exp: 16 },
      armor: { itemId: 'reinforced-lamellar', level: 2, exp: 68 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 26,
    y: 17
  },
  {
    id: 'bowang-archer-a',
    name: '조조군 궁병',
    faction: 'enemy',
    className: '숲길 궁병',
    classKey: 'archer',
    level: 20,
    exp: 24,
    hp: 60,
    maxHp: 60,
    attack: 25,
    move: 3,
    stats: { might: 92, intelligence: 82, leadership: 82, agility: 90, luck: 68 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 3, exp: 10 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 58 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 19,
    y: 14
  },
  {
    id: 'bowang-archer-b',
    name: '조조군 궁병',
    faction: 'enemy',
    className: '숲길 궁병',
    classKey: 'archer',
    level: 20,
    exp: 24,
    hp: 60,
    maxHp: 60,
    attack: 25,
    move: 3,
    stats: { might: 92, intelligence: 82, leadership: 82, agility: 90, luck: 68 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 3, exp: 10 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 58 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 23,
    y: 12
  },
  {
    id: 'bowang-archer-c',
    name: '조조군 궁병',
    faction: 'enemy',
    className: '후방 궁병',
    classKey: 'archer',
    level: 21,
    exp: 26,
    hp: 62,
    maxHp: 62,
    attack: 26,
    move: 3,
    stats: { might: 94, intelligence: 84, leadership: 84, agility: 90, luck: 68 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 3, exp: 14 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 62 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 29,
    y: 15
  },
  {
    id: 'bowang-cavalry-a',
    name: '조조군 기병',
    faction: 'enemy',
    className: '추격 기병',
    classKey: 'cavalry',
    level: 21,
    exp: 28,
    hp: 82,
    maxHp: 82,
    attack: 28,
    move: 5,
    stats: { might: 108, intelligence: 70, leadership: 86, agility: 98, luck: 68 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 3, exp: 18 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 68 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 15,
    y: 16
  },
  {
    id: 'bowang-cavalry-b',
    name: '조조군 기병',
    faction: 'enemy',
    className: '추격 기병',
    classKey: 'cavalry',
    level: 21,
    exp: 28,
    hp: 82,
    maxHp: 82,
    attack: 28,
    move: 5,
    stats: { might: 108, intelligence: 70, leadership: 86, agility: 98, luck: 68 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 3, exp: 18 },
      armor: { itemId: 'lamellar-armor', level: 2, exp: 68 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 21,
    y: 18
  },
  {
    id: 'bowang-cavalry-c',
    name: '조조군 기병',
    faction: 'enemy',
    className: '후속 기병',
    classKey: 'cavalry',
    level: 22,
    exp: 30,
    hp: 86,
    maxHp: 86,
    attack: 29,
    move: 5,
    stats: { might: 110, intelligence: 72, leadership: 88, agility: 100, luck: 68 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 3, exp: 20 },
      armor: { itemId: 'reinforced-lamellar', level: 2, exp: 70 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 28,
    y: 18
  },
  {
    id: 'bowang-guard-a',
    name: '조조군 정예',
    faction: 'enemy',
    className: '하후돈 친위',
    classKey: 'yellowTurban',
    level: 22,
    exp: 30,
    hp: 88,
    maxHp: 88,
    attack: 29,
    move: 3,
    stats: { might: 110, intelligence: 76, leadership: 96, agility: 80, luck: 68 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 3, exp: 24 },
      armor: { itemId: 'reinforced-lamellar', level: 2, exp: 74 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 31,
    y: 13
  },
  {
    id: 'bowang-guard-b',
    name: '조조군 정예',
    faction: 'enemy',
    className: '하후돈 친위',
    classKey: 'yellowTurban',
    level: 22,
    exp: 30,
    hp: 88,
    maxHp: 88,
    attack: 29,
    move: 3,
    stats: { might: 110, intelligence: 76, leadership: 96, agility: 80, luck: 68 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 3, exp: 24 },
      armor: { itemId: 'reinforced-lamellar', level: 2, exp: 74 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 32,
    y: 16
  },
  {
    id: 'bowang-strategist-a',
    name: '조조군 군리',
    faction: 'enemy',
    className: '군리',
    classKey: 'archer',
    level: 21,
    exp: 28,
    hp: 64,
    maxHp: 64,
    attack: 26,
    move: 3,
    stats: { might: 76, intelligence: 94, leadership: 86, agility: 82, luck: 70 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 3, exp: 18 },
      armor: { itemId: 'cloth-armor', level: 2, exp: 64 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 30,
    y: 12
  },
  {
    id: 'bowang-leader-xiahou-dun',
    name: '하후돈',
    faction: 'enemy',
    className: '조조군 선봉장',
    classKey: 'rebelLeader',
    level: 23,
    exp: 34,
    hp: 118,
    maxHp: 118,
    attack: 31,
    move: 4,
    stats: { might: 116, intelligence: 78, leadership: 104, agility: 86, luck: 72 },
    equipment: {
      weapon: { itemId: 'leader-axe', level: 3, exp: 44 },
      armor: { itemId: 'reinforced-lamellar', level: 3, exp: 12 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 33,
    y: 15
  }
];

const nineteenthBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 4, y: 22 },
  'guan-yu': { x: 5, y: 20 },
  'zhang-fei': { x: 6, y: 22 },
  'jian-yong': { x: 3, y: 23 },
  'mi-zhu': { x: 4, y: 24 },
  'sun-qian': { x: 6, y: 24 },
  'zhao-yun': { x: 8, y: 20 },
  'zhuge-liang': { x: 5, y: 23 }
};

export const nineteenthBattleUnits: UnitData[] = [
  ...[
    ...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
    ...xuzhouRecruitUnits,
    ...caoBreakRecruitUnits,
    ...liuBiaoRecruitUnits,
    ...zhugeRecruitUnits
  ].map((unit) => placeScenarioUnit(unit, nineteenthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  {
    id: 'changban-scout-a',
    name: '조조군 척후',
    faction: 'enemy',
    className: '추격 척후',
    classKey: 'bandit',
    level: 22,
    exp: 30,
    hp: 66,
    maxHp: 66,
    attack: 25,
    move: 4,
    stats: { might: 98, intelligence: 72, leadership: 78, agility: 98, luck: 68 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 3, exp: 22 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 70 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 13,
    y: 21
  },
  {
    id: 'changban-scout-b',
    name: '조조군 척후',
    faction: 'enemy',
    className: '측면 척후',
    classKey: 'bandit',
    level: 22,
    exp: 30,
    hp: 66,
    maxHp: 66,
    attack: 25,
    move: 4,
    stats: { might: 98, intelligence: 72, leadership: 78, agility: 98, luck: 68 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 3, exp: 22 },
      armor: { itemId: 'rebel-vest', level: 2, exp: 70 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 12,
    y: 24
  },
  {
    id: 'changban-cavalry-a',
    name: '호표 추격기',
    faction: 'enemy',
    className: '조조 경기병',
    classKey: 'cavalry',
    level: 23,
    exp: 32,
    hp: 88,
    maxHp: 88,
    attack: 30,
    move: 5,
    stats: { might: 112, intelligence: 72, leadership: 90, agility: 106, luck: 70 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 3, exp: 28 },
      armor: { itemId: 'lamellar-armor', level: 3, exp: 4 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 16,
    y: 18
  },
  {
    id: 'changban-cavalry-b',
    name: '호표 추격기',
    faction: 'enemy',
    className: '조조 경기병',
    classKey: 'cavalry',
    level: 23,
    exp: 32,
    hp: 88,
    maxHp: 88,
    attack: 30,
    move: 5,
    stats: { might: 112, intelligence: 72, leadership: 90, agility: 106, luck: 70 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 3, exp: 28 },
      armor: { itemId: 'lamellar-armor', level: 3, exp: 4 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 17,
    y: 22
  },
  {
    id: 'changban-cavalry-c',
    name: '조조군 선봉기',
    faction: 'enemy',
    className: '선봉 기병',
    classKey: 'cavalry',
    level: 24,
    exp: 34,
    hp: 92,
    maxHp: 92,
    attack: 31,
    move: 5,
    stats: { might: 114, intelligence: 74, leadership: 92, agility: 108, luck: 70 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 3, exp: 34 },
      armor: { itemId: 'lamellar-armor', level: 3, exp: 10 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 22,
    y: 17
  },
  {
    id: 'changban-cavalry-d',
    name: '조조군 선봉기',
    faction: 'enemy',
    className: '선봉 기병',
    classKey: 'cavalry',
    level: 24,
    exp: 34,
    hp: 92,
    maxHp: 92,
    attack: 31,
    move: 5,
    stats: { might: 114, intelligence: 74, leadership: 92, agility: 108, luck: 70 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 3, exp: 34 },
      armor: { itemId: 'lamellar-armor', level: 3, exp: 10 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 25,
    y: 21
  },
  {
    id: 'changban-infantry-a',
    name: '조조 보병',
    faction: 'enemy',
    className: '추격 보병',
    classKey: 'yellowTurban',
    level: 22,
    exp: 30,
    hp: 82,
    maxHp: 82,
    attack: 27,
    move: 3,
    stats: { might: 106, intelligence: 74, leadership: 92, agility: 78, luck: 68 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 3, exp: 26 },
      armor: { itemId: 'lamellar-armor', level: 3, exp: 2 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 18,
    y: 16
  },
  {
    id: 'changban-infantry-b',
    name: '조조 보병',
    faction: 'enemy',
    className: '추격 보병',
    classKey: 'yellowTurban',
    level: 22,
    exp: 30,
    hp: 82,
    maxHp: 82,
    attack: 27,
    move: 3,
    stats: { might: 106, intelligence: 74, leadership: 92, agility: 78, luck: 68 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 3, exp: 26 },
      armor: { itemId: 'lamellar-armor', level: 3, exp: 2 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 20,
    y: 20
  },
  {
    id: 'changban-infantry-c',
    name: '장판 보병',
    faction: 'enemy',
    className: '다리목 보병',
    classKey: 'yellowTurban',
    level: 23,
    exp: 32,
    hp: 86,
    maxHp: 86,
    attack: 28,
    move: 3,
    stats: { might: 108, intelligence: 76, leadership: 94, agility: 80, luck: 69 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 3, exp: 30 },
      armor: { itemId: 'reinforced-lamellar', level: 3, exp: 6 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 26,
    y: 16
  },
  {
    id: 'changban-infantry-d',
    name: '장판 보병',
    faction: 'enemy',
    className: '다리목 보병',
    classKey: 'yellowTurban',
    level: 23,
    exp: 32,
    hp: 86,
    maxHp: 86,
    attack: 28,
    move: 3,
    stats: { might: 108, intelligence: 76, leadership: 94, agility: 80, luck: 69 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 3, exp: 30 },
      armor: { itemId: 'reinforced-lamellar', level: 3, exp: 6 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 28,
    y: 20
  },
  {
    id: 'changban-archer-a',
    name: '조조 궁병',
    faction: 'enemy',
    className: '언덕 궁병',
    classKey: 'archer',
    level: 22,
    exp: 30,
    hp: 64,
    maxHp: 64,
    attack: 27,
    move: 3,
    stats: { might: 94, intelligence: 86, leadership: 84, agility: 92, luck: 70 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 3, exp: 24 },
      armor: { itemId: 'cloth-armor', level: 3, exp: 0 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 21,
    y: 14
  },
  {
    id: 'changban-archer-b',
    name: '조조 궁병',
    faction: 'enemy',
    className: '강변 궁병',
    classKey: 'archer',
    level: 22,
    exp: 30,
    hp: 64,
    maxHp: 64,
    attack: 27,
    move: 3,
    stats: { might: 94, intelligence: 86, leadership: 84, agility: 92, luck: 70 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 3, exp: 24 },
      armor: { itemId: 'cloth-armor', level: 3, exp: 0 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 24,
    y: 23
  },
  {
    id: 'changban-archer-c',
    name: '조조 궁병',
    faction: 'enemy',
    className: '후방 궁병',
    classKey: 'archer',
    level: 23,
    exp: 32,
    hp: 66,
    maxHp: 66,
    attack: 28,
    move: 3,
    stats: { might: 96, intelligence: 88, leadership: 86, agility: 94, luck: 70 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 3, exp: 30 },
      armor: { itemId: 'cloth-armor', level: 3, exp: 4 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 31,
    y: 18
  },
  {
    id: 'changban-guard-a',
    name: '조조 친위',
    faction: 'enemy',
    className: '호표 친위',
    classKey: 'yellowTurban',
    level: 24,
    exp: 34,
    hp: 94,
    maxHp: 94,
    attack: 30,
    move: 3,
    stats: { might: 114, intelligence: 78, leadership: 102, agility: 84, luck: 70 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 3, exp: 38 },
      armor: { itemId: 'reinforced-lamellar', level: 3, exp: 14 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 33,
    y: 16
  },
  {
    id: 'changban-guard-b',
    name: '조조 친위',
    faction: 'enemy',
    className: '호표 친위',
    classKey: 'yellowTurban',
    level: 24,
    exp: 34,
    hp: 94,
    maxHp: 94,
    attack: 30,
    move: 3,
    stats: { might: 114, intelligence: 78, leadership: 102, agility: 84, luck: 70 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 3, exp: 38 },
      armor: { itemId: 'reinforced-lamellar', level: 3, exp: 14 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 33,
    y: 20
  },
  {
    id: 'changban-strategist-a',
    name: '조조군 군리',
    faction: 'enemy',
    className: '군리',
    classKey: 'archer',
    level: 23,
    exp: 32,
    hp: 68,
    maxHp: 68,
    attack: 27,
    move: 3,
    stats: { might: 76, intelligence: 96, leadership: 88, agility: 84, luck: 72 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 3, exp: 34 },
      armor: { itemId: 'cloth-armor', level: 3, exp: 8 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 31,
    y: 14
  },
  {
    id: 'changban-leader-cao-chun',
    name: '조순',
    faction: 'enemy',
    className: '호표기장',
    classKey: 'rebelLeader',
    level: 25,
    exp: 38,
    hp: 126,
    maxHp: 126,
    attack: 33,
    move: 5,
    stats: { might: 118, intelligence: 82, leadership: 110, agility: 96, luck: 74 },
    equipment: {
      weapon: { itemId: 'leader-axe', level: 3, exp: 52 },
      armor: { itemId: 'reinforced-lamellar', level: 3, exp: 22 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 35,
    y: 18
  }
];

const twentiethBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 4, y: 22 },
  'guan-yu': { x: 5, y: 20 },
  'zhang-fei': { x: 6, y: 23 },
  'jian-yong': { x: 3, y: 24 },
  'mi-zhu': { x: 5, y: 25 },
  'sun-qian': { x: 7, y: 22 },
  'zhao-yun': { x: 8, y: 20 },
  '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: 70,
    maxHp: 70,
    attack: 27,
    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: 13,
    y: 21
  },
  {
    id: 'envoy-road-scout-b',
    name: '조조군 척후',
    faction: 'enemy',
    className: '강변 척후',
    classKey: 'bandit',
    level: 24,
    exp: 34,
    hp: 70,
    maxHp: 70,
    attack: 27,
    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: 24
  },
  {
    id: 'envoy-road-cavalry-a',
    name: '조조 추격기',
    faction: 'enemy',
    className: '추격 기병',
    classKey: 'cavalry',
    level: 25,
    exp: 36,
    hp: 94,
    maxHp: 94,
    attack: 32,
    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: 17,
    y: 19
  },
  {
    id: 'envoy-road-cavalry-b',
    name: '조조 추격기',
    faction: 'enemy',
    className: '추격 기병',
    classKey: 'cavalry',
    level: 25,
    exp: 36,
    hp: 94,
    maxHp: 94,
    attack: 32,
    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: 18,
    y: 23
  },
  {
    id: 'envoy-road-cavalry-c',
    name: '문빙 기병',
    faction: 'enemy',
    className: '나루 기병',
    classKey: 'cavalry',
    level: 26,
    exp: 38,
    hp: 98,
    maxHp: 98,
    attack: 33,
    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: 98,
    maxHp: 98,
    attack: 33,
    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: 88,
    maxHp: 88,
    attack: 29,
    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: 88,
    maxHp: 88,
    attack: 29,
    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: 92,
    maxHp: 92,
    attack: 30,
    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: 92,
    maxHp: 92,
    attack: 30,
    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: 68,
    maxHp: 68,
    attack: 29,
    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: 68,
    maxHp: 68,
    attack: 29,
    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: 70,
    maxHp: 70,
    attack: 30,
    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: 100,
    maxHp: 100,
    attack: 32,
    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: 100,
    maxHp: 100,
    attack: 32,
    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: 72,
    maxHp: 72,
    attack: 29,
    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: 132,
    maxHp: 132,
    attack: 34,
    move: 4,
    stats: { might: 120, intelligence: 86, leadership: 112, agility: 90, luck: 76 },
    equipment: {
      weapon: { itemId: 'leader-axe', level: 4, exp: 4 },
      armor: { itemId: 'reinforced-lamellar', level: 3, exp: 36 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 37,
    y: 17
  }
];

const twentyFirstBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 4, y: 24 },
  'guan-yu': { x: 6, y: 22 },
  'zhang-fei': { x: 6, y: 25 },
  'jian-yong': { x: 3, y: 26 },
  'mi-zhu': { x: 5, y: 27 },
  'sun-qian': { x: 8, y: 24 },
  'zhao-yun': { x: 8, y: 21 },
  'zhuge-liang': { x: 6, y: 23 }
};

export const twentyFirstBattleUnits: UnitData[] = [
  ...[
    ...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
    ...xuzhouRecruitUnits,
    ...caoBreakRecruitUnits,
    ...liuBiaoRecruitUnits,
    ...zhugeRecruitUnits
  ].map((unit) => placeScenarioUnit(unit, twentyFirstBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  {
    id: 'redcliff-vanguard-scout-a',
    name: '조조 수군 척후',
    faction: 'enemy',
    className: '수군 척후',
    classKey: 'bandit',
    level: 26,
    exp: 38,
    hp: 74,
    maxHp: 74,
    attack: 29,
    move: 4,
    stats: { might: 106, intelligence: 78, leadership: 84, agility: 104, luck: 72 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 3, exp: 52 },
      armor: { itemId: 'rebel-vest', level: 3, exp: 28 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 14,
    y: 22
  },
  {
    id: 'redcliff-vanguard-scout-b',
    name: '조조 수군 척후',
    faction: 'enemy',
    className: '강변 척후',
    classKey: 'bandit',
    level: 26,
    exp: 38,
    hp: 74,
    maxHp: 74,
    attack: 29,
    move: 4,
    stats: { might: 106, intelligence: 78, leadership: 84, agility: 104, luck: 72 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 3, exp: 52 },
      armor: { itemId: 'rebel-vest', level: 3, exp: 28 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 15,
    y: 26
  },
  {
    id: 'redcliff-vanguard-marine-a',
    name: '조조 수군 보병',
    faction: 'enemy',
    className: '갑판 보병',
    classKey: 'yellowTurban',
    level: 26,
    exp: 38,
    hp: 96,
    maxHp: 96,
    attack: 31,
    move: 3,
    stats: { might: 116, intelligence: 80, leadership: 98, agility: 86, luck: 72 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 3, exp: 58 },
      armor: { itemId: 'lamellar-armor', level: 3, exp: 34 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 19,
    y: 20
  },
  {
    id: 'redcliff-vanguard-marine-b',
    name: '조조 수군 보병',
    faction: 'enemy',
    className: '갑판 보병',
    classKey: 'yellowTurban',
    level: 26,
    exp: 38,
    hp: 96,
    maxHp: 96,
    attack: 31,
    move: 3,
    stats: { might: 116, intelligence: 80, leadership: 98, agility: 86, luck: 72 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 3, exp: 58 },
      armor: { itemId: 'lamellar-armor', level: 3, exp: 34 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 21,
    y: 23
  },
  {
    id: 'redcliff-vanguard-marine-c',
    name: '조조 수군 보병',
    faction: 'enemy',
    className: '포구 보병',
    classKey: 'yellowTurban',
    level: 27,
    exp: 40,
    hp: 100,
    maxHp: 100,
    attack: 32,
    move: 3,
    stats: { might: 118, intelligence: 82, leadership: 100, agility: 88, luck: 73 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 3, exp: 64 },
      armor: { itemId: 'reinforced-lamellar', level: 3, exp: 38 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 27,
    y: 18
  },
  {
    id: 'redcliff-vanguard-marine-d',
    name: '조조 수군 보병',
    faction: 'enemy',
    className: '포구 보병',
    classKey: 'yellowTurban',
    level: 27,
    exp: 40,
    hp: 100,
    maxHp: 100,
    attack: 32,
    move: 3,
    stats: { might: 118, intelligence: 82, leadership: 100, agility: 88, luck: 73 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 3, exp: 64 },
      armor: { itemId: 'reinforced-lamellar', level: 3, exp: 38 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 29,
    y: 22
  },
  {
    id: 'redcliff-vanguard-archer-a',
    name: '조조 선상 궁병',
    faction: 'enemy',
    className: '선상 궁병',
    classKey: 'archer',
    level: 26,
    exp: 38,
    hp: 72,
    maxHp: 72,
    attack: 31,
    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: 72,
    maxHp: 72,
    attack: 31,
    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: 74,
    maxHp: 74,
    attack: 32,
    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: 102,
    maxHp: 102,
    attack: 34,
    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: 102,
    maxHp: 102,
    attack: 34,
    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: 106,
    maxHp: 106,
    attack: 35,
    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: 108,
    maxHp: 108,
    attack: 34,
    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: 108,
    maxHp: 108,
    attack: 34,
    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: 76,
    maxHp: 76,
    attack: 31,
    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: 76,
    maxHp: 76,
    attack: 31,
    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: 140,
    maxHp: 140,
    attack: 36,
    move: 4,
    stats: { might: 124, intelligence: 88, leadership: 116, agility: 92, luck: 78 },
    equipment: {
      weapon: { itemId: 'leader-axe', level: 4, exp: 14 },
      armor: { itemId: 'reinforced-lamellar', level: 4, exp: 4 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 39,
    y: 19
  }
];

const twentySecondBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 4, y: 23 },
  'guan-yu': { x: 6, y: 21 },
  'zhang-fei': { x: 6, y: 25 },
  'jian-yong': { x: 3, y: 26 },
  'mi-zhu': { x: 5, y: 27 },
  'sun-qian': { x: 8, y: 23 },
  'zhao-yun': { x: 8, y: 20 },
  'zhuge-liang': { x: 6, y: 22 }
};

export const twentySecondBattleUnits: UnitData[] = [
  ...[
    ...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
    ...xuzhouRecruitUnits,
    ...caoBreakRecruitUnits,
    ...liuBiaoRecruitUnits,
    ...zhugeRecruitUnits
  ].map((unit) => placeScenarioUnit(unit, twentySecondBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  {
    id: 'redcliff-fire-scout-a',
    name: '조조 화선 감시병',
    faction: 'enemy',
    className: '강안 척후',
    classKey: 'bandit',
    level: 28,
    exp: 42,
    hp: 78,
    maxHp: 78,
    attack: 31,
    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: 78,
    maxHp: 78,
    attack: 31,
    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: 102,
    maxHp: 102,
    attack: 33,
    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: 102,
    maxHp: 102,
    attack: 33,
    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: 106,
    maxHp: 106,
    attack: 34,
    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: 14
  },
  {
    id: 'redcliff-fire-marine-d',
    name: '조조 갑판 보병',
    faction: 'enemy',
    className: '연환선 보병',
    classKey: 'yellowTurban',
    level: 29,
    exp: 46,
    hp: 106,
    maxHp: 106,
    attack: 34,
    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: 76,
    maxHp: 76,
    attack: 33,
    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: 22,
    y: 15
  },
  {
    id: 'redcliff-fire-archer-b',
    name: '조조 선상 궁병',
    faction: 'enemy',
    className: '선상 궁병',
    classKey: 'archer',
    level: 28,
    exp: 42,
    hp: 76,
    maxHp: 76,
    attack: 33,
    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: 78,
    maxHp: 78,
    attack: 34,
    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: 78,
    maxHp: 78,
    attack: 34,
    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: 110,
    maxHp: 110,
    attack: 36,
    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: 110,
    maxHp: 110,
    attack: 36,
    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: 27,
    y: 24
  },
  {
    id: 'redcliff-fire-cavalry-c',
    name: '조조 강안 기병',
    faction: 'enemy',
    className: '강북 기병',
    classKey: 'cavalry',
    level: 30,
    exp: 48,
    hp: 114,
    maxHp: 114,
    attack: 37,
    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: 116,
    maxHp: 116,
    attack: 36,
    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: 116,
    maxHp: 116,
    attack: 36,
    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: 82,
    maxHp: 82,
    attack: 33,
    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: 82,
    maxHp: 82,
    attack: 33,
    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: 156,
    maxHp: 156,
    attack: 39,
    move: 4,
    stats: { might: 130, intelligence: 118, leadership: 132, agility: 96, luck: 82 },
    equipment: {
      weapon: { itemId: 'leader-axe', level: 4, exp: 42 },
      armor: { itemId: 'reinforced-lamellar', level: 4, exp: 34 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 41,
    y: 14
  }
];

const twentyThirdBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 4, y: 25 },
  'guan-yu': { x: 6, y: 23 },
  'zhang-fei': { x: 6, y: 27 },
  'jian-yong': { x: 3, y: 28 },
  'mi-zhu': { x: 5, y: 29 },
  'sun-qian': { x: 8, y: 25 },
  'zhao-yun': { x: 8, y: 22 },
  'zhuge-liang': { x: 6, y: 24 }
};

export const twentyThirdBattleUnits: UnitData[] = [
  ...[
    ...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
    ...xuzhouRecruitUnits,
    ...caoBreakRecruitUnits,
    ...liuBiaoRecruitUnits,
    ...zhugeRecruitUnits
  ].map((unit) => placeScenarioUnit(unit, twentyThirdBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  {
    id: 'jing-south-scout-a',
    name: '형주 남부 척후',
    faction: 'enemy',
    className: '남부 척후',
    classKey: 'bandit',
    level: 30,
    exp: 48,
    hp: 82,
    maxHp: 82,
    attack: 33,
    move: 4,
    stats: { might: 114, intelligence: 84, leadership: 90, agility: 110, luck: 76 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 18 },
      armor: { itemId: 'rebel-vest', level: 4, exp: 8 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 13,
    y: 24
  },
  {
    id: 'jing-south-scout-b',
    name: '형주 남부 척후',
    faction: 'enemy',
    className: '마을 척후',
    classKey: 'bandit',
    level: 30,
    exp: 48,
    hp: 82,
    maxHp: 82,
    attack: 33,
    move: 4,
    stats: { might: 114, intelligence: 84, leadership: 90, agility: 110, luck: 76 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 18 },
      armor: { itemId: 'rebel-vest', level: 4, exp: 8 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 14,
    y: 28
  },
  {
    id: 'jing-south-infantry-a',
    name: '영릉 가병',
    faction: 'enemy',
    className: '영릉 가병',
    classKey: 'yellowTurban',
    level: 31,
    exp: 50,
    hp: 108,
    maxHp: 108,
    attack: 35,
    move: 3,
    stats: { might: 124, intelligence: 84, leadership: 104, agility: 92, luck: 76 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 4, exp: 30 },
      armor: { itemId: 'lamellar-armor', level: 4, exp: 18 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 18,
    y: 22
  },
  {
    id: 'jing-south-infantry-b',
    name: '영릉 가병',
    faction: 'enemy',
    className: '마을 가병',
    classKey: 'yellowTurban',
    level: 31,
    exp: 50,
    hp: 108,
    maxHp: 108,
    attack: 35,
    move: 3,
    stats: { might: 124, intelligence: 84, leadership: 104, agility: 92, luck: 76 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 4, exp: 30 },
      armor: { itemId: 'lamellar-armor', level: 4, exp: 18 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 20,
    y: 25
  },
  {
    id: 'jing-south-infantry-c',
    name: '영릉 가병',
    faction: 'enemy',
    className: '관문 가병',
    classKey: 'yellowTurban',
    level: 31,
    exp: 52,
    hp: 110,
    maxHp: 110,
    attack: 35,
    move: 3,
    stats: { might: 125, intelligence: 85, leadership: 106, agility: 92, luck: 76 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 4, exp: 34 },
      armor: { itemId: 'reinforced-lamellar', level: 4, exp: 20 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 28,
    y: 18
  },
  {
    id: 'jing-south-infantry-d',
    name: '영릉 가병',
    faction: 'enemy',
    className: '관문 가병',
    classKey: 'yellowTurban',
    level: 31,
    exp: 52,
    hp: 110,
    maxHp: 110,
    attack: 35,
    move: 3,
    stats: { might: 125, intelligence: 85, leadership: 106, agility: 92, luck: 76 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 4, exp: 34 },
      armor: { itemId: 'reinforced-lamellar', level: 4, exp: 20 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 30,
    y: 21
  },
  {
    id: 'jing-south-archer-a',
    name: '영릉 궁병',
    faction: 'enemy',
    className: '마을 궁병',
    classKey: 'archer',
    level: 30,
    exp: 48,
    hp: 80,
    maxHp: 80,
    attack: 34,
    move: 3,
    stats: { might: 108, intelligence: 98, leadership: 94, agility: 106, luck: 78 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 4, exp: 26 },
      armor: { itemId: 'cloth-armor', level: 4, exp: 16 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 18,
    y: 18
  },
  {
    id: 'jing-south-archer-b',
    name: '영릉 궁병',
    faction: 'enemy',
    className: '언덕 궁병',
    classKey: 'archer',
    level: 31,
    exp: 50,
    hp: 82,
    maxHp: 82,
    attack: 35,
    move: 3,
    stats: { might: 110, intelligence: 100, leadership: 96, agility: 108, luck: 78 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 4, exp: 32 },
      armor: { itemId: 'cloth-armor', level: 4, exp: 20 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 25,
    y: 16
  },
  {
    id: 'jing-south-archer-c',
    name: '영릉 궁병',
    faction: 'enemy',
    className: '성채 궁병',
    classKey: 'archer',
    level: 31,
    exp: 52,
    hp: 84,
    maxHp: 84,
    attack: 35,
    move: 3,
    stats: { might: 110, intelligence: 100, leadership: 96, agility: 108, luck: 78 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 4, exp: 36 },
      armor: { itemId: 'cloth-armor', level: 4, exp: 22 },
      accessory: { itemId: 'wind-quiver', level: 1, exp: 0 }
    },
    x: 36,
    y: 14
  },
  {
    id: 'jing-south-cavalry-a',
    name: '영릉 기병',
    faction: 'enemy',
    className: '남부 기병',
    classKey: 'cavalry',
    level: 31,
    exp: 52,
    hp: 116,
    maxHp: 116,
    attack: 37,
    move: 5,
    stats: { might: 130, intelligence: 84, leadership: 104, agility: 122, luck: 78 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 4, exp: 40 },
      armor: { itemId: 'lamellar-armor', level: 4, exp: 24 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 17,
    y: 29
  },
  {
    id: 'jing-south-cavalry-b',
    name: '영릉 기병',
    faction: 'enemy',
    className: '남부 기병',
    classKey: 'cavalry',
    level: 31,
    exp: 52,
    hp: 116,
    maxHp: 116,
    attack: 37,
    move: 5,
    stats: { might: 130, intelligence: 84, leadership: 104, agility: 122, luck: 78 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 4, exp: 40 },
      armor: { itemId: 'lamellar-armor', level: 4, exp: 24 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 26,
    y: 27
  },
  {
    id: 'jing-south-cavalry-c',
    name: '영릉 기병',
    faction: 'enemy',
    className: '성채 기병',
    classKey: 'cavalry',
    level: 32,
    exp: 54,
    hp: 120,
    maxHp: 120,
    attack: 38,
    move: 5,
    stats: { might: 132, intelligence: 86, leadership: 106, agility: 124, luck: 79 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 4, exp: 46 },
      armor: { itemId: 'reinforced-lamellar', level: 4, exp: 28 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 35,
    y: 23
  },
  {
    id: 'jing-south-guard-a',
    name: '형도영 친위',
    faction: 'enemy',
    className: '영릉 친위',
    classKey: 'yellowTurban',
    level: 32,
    exp: 56,
    hp: 122,
    maxHp: 122,
    attack: 38,
    move: 3,
    stats: { might: 132, intelligence: 88, leadership: 112, agility: 96, luck: 80 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 4, exp: 52 },
      armor: { itemId: 'reinforced-lamellar', level: 4, exp: 34 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 38,
    y: 16
  },
  {
    id: 'jing-south-guard-b',
    name: '형도영 친위',
    faction: 'enemy',
    className: '영릉 친위',
    classKey: 'yellowTurban',
    level: 32,
    exp: 56,
    hp: 122,
    maxHp: 122,
    attack: 38,
    move: 3,
    stats: { might: 132, intelligence: 88, leadership: 112, agility: 96, luck: 80 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 4, exp: 52 },
      armor: { itemId: 'reinforced-lamellar', level: 4, exp: 34 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 39,
    y: 19
  },
  {
    id: 'jing-south-strategist-a',
    name: '영릉 문객',
    faction: 'enemy',
    className: '남부 문객',
    classKey: 'archer',
    level: 31,
    exp: 52,
    hp: 86,
    maxHp: 86,
    attack: 34,
    move: 3,
    stats: { might: 84, intelligence: 106, leadership: 100, agility: 92, luck: 80 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 4, exp: 44 },
      armor: { itemId: 'cloth-armor', level: 4, exp: 28 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 36,
    y: 13
  },
  {
    id: 'jing-south-strategist-b',
    name: '영릉 문객',
    faction: 'enemy',
    className: '남부 문객',
    classKey: 'archer',
    level: 31,
    exp: 52,
    hp: 86,
    maxHp: 86,
    attack: 34,
    move: 3,
    stats: { might: 84, intelligence: 106, leadership: 100, agility: 92, luck: 80 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 4, exp: 44 },
      armor: { itemId: 'cloth-armor', level: 4, exp: 28 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 40,
    y: 14
  },
  {
    id: 'jing-south-leader-xing-daorong',
    name: '형도영',
    faction: 'enemy',
    className: '영릉 맹장',
    classKey: 'rebelLeader',
    level: 33,
    exp: 58,
    hp: 164,
    maxHp: 164,
    attack: 41,
    move: 4,
    stats: { might: 136, intelligence: 76, leadership: 118, agility: 96, luck: 80 },
    equipment: {
      weapon: { itemId: 'leader-axe', level: 4, exp: 58 },
      armor: { itemId: 'reinforced-lamellar', level: 4, exp: 40 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 42,
    y: 17
  }
];

const twentyFourthBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 5, y: 24 },
  'guan-yu': { x: 7, y: 22 },
  'zhang-fei': { x: 7, y: 27 },
  'jian-yong': { x: 4, y: 28 },
  'mi-zhu': { x: 5, y: 29 },
  'sun-qian': { x: 9, y: 25 },
  'zhao-yun': { x: 9, y: 22 },
  'zhuge-liang': { x: 6, y: 24 },
  'ma-liang': { x: 8, y: 26 }
};

export const twentyFourthBattleUnits: UnitData[] = [
  ...[
    ...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
    ...xuzhouRecruitUnits,
    ...caoBreakRecruitUnits,
    ...liuBiaoRecruitUnits,
    ...zhugeRecruitUnits,
    ...jingzhouRecruitUnits
  ].map((unit) => placeScenarioUnit(unit, twentyFourthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  {
    id: 'guiyang-scout-a',
    name: '계양 산길 척후',
    faction: 'enemy',
    className: '산길 척후',
    classKey: 'bandit',
    level: 31,
    exp: 50,
    hp: 86,
    maxHp: 86,
    attack: 34,
    move: 4,
    stats: { might: 116, intelligence: 86, leadership: 92, agility: 112, luck: 78 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 22 },
      armor: { itemId: 'rebel-vest', level: 4, exp: 10 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 15,
    y: 23
  },
  {
    id: 'guiyang-scout-b',
    name: '계양 산길 척후',
    faction: 'enemy',
    className: '서문 척후',
    classKey: 'bandit',
    level: 31,
    exp: 50,
    hp: 86,
    maxHp: 86,
    attack: 34,
    move: 4,
    stats: { might: 116, intelligence: 86, leadership: 92, agility: 112, luck: 78 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 22 },
      armor: { itemId: 'rebel-vest', level: 4, exp: 10 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 17,
    y: 28
  },
  {
    id: 'guiyang-infantry-a',
    name: '계양 보병',
    faction: 'enemy',
    className: '계양 보병',
    classKey: 'yellowTurban',
    level: 32,
    exp: 52,
    hp: 112,
    maxHp: 112,
    attack: 36,
    move: 3,
    stats: { might: 126, intelligence: 86, leadership: 108, agility: 94, luck: 78 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 4, exp: 34 },
      armor: { itemId: 'lamellar-armor', level: 4, exp: 20 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 22,
    y: 21
  },
  {
    id: 'guiyang-infantry-b',
    name: '계양 보병',
    faction: 'enemy',
    className: '마을 보병',
    classKey: 'yellowTurban',
    level: 32,
    exp: 52,
    hp: 112,
    maxHp: 112,
    attack: 36,
    move: 3,
    stats: { might: 126, intelligence: 86, leadership: 108, agility: 94, luck: 78 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 4, exp: 34 },
      armor: { itemId: 'lamellar-armor', level: 4, exp: 20 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 24,
    y: 25
  },
  {
    id: 'guiyang-infantry-c',
    name: '계양 보병',
    faction: 'enemy',
    className: '성문 보병',
    classKey: 'yellowTurban',
    level: 33,
    exp: 54,
    hp: 116,
    maxHp: 116,
    attack: 37,
    move: 3,
    stats: { might: 128, intelligence: 86, leadership: 110, agility: 94, luck: 78 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 4, exp: 38 },
      armor: { itemId: 'reinforced-lamellar', level: 4, exp: 22 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 35,
    y: 18
  },
  {
    id: 'guiyang-infantry-d',
    name: '계양 보병',
    faction: 'enemy',
    className: '성문 보병',
    classKey: 'yellowTurban',
    level: 33,
    exp: 54,
    hp: 116,
    maxHp: 116,
    attack: 37,
    move: 3,
    stats: { might: 128, intelligence: 86, leadership: 110, agility: 94, luck: 78 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 4, exp: 38 },
      armor: { itemId: 'reinforced-lamellar', level: 4, exp: 22 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 38,
    y: 21
  },
  {
    id: 'guiyang-archer-a',
    name: '계양 궁병',
    faction: 'enemy',
    className: '계양 궁병',
    classKey: 'archer',
    level: 32,
    exp: 50,
    hp: 84,
    maxHp: 84,
    attack: 34,
    move: 3,
    stats: { might: 88, intelligence: 92, leadership: 96, agility: 104, luck: 80 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 4, exp: 32 },
      armor: { itemId: 'cloth-armor', level: 4, exp: 18 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 28,
    y: 17
  },
  {
    id: 'guiyang-archer-b',
    name: '계양 궁병',
    faction: 'enemy',
    className: '언덕 궁병',
    classKey: 'archer',
    level: 32,
    exp: 50,
    hp: 84,
    maxHp: 84,
    attack: 34,
    move: 3,
    stats: { might: 88, intelligence: 92, leadership: 96, agility: 104, luck: 80 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 4, exp: 32 },
      armor: { itemId: 'cloth-armor', level: 4, exp: 18 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 31,
    y: 22
  },
  {
    id: 'guiyang-archer-c',
    name: '계양 궁병',
    faction: 'enemy',
    className: '성루 궁병',
    classKey: 'archer',
    level: 33,
    exp: 52,
    hp: 86,
    maxHp: 86,
    attack: 35,
    move: 3,
    stats: { might: 90, intelligence: 94, leadership: 98, agility: 104, luck: 80 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 4, exp: 36 },
      armor: { itemId: 'cloth-armor', level: 4, exp: 20 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 41,
    y: 16
  },
  {
    id: 'guiyang-cavalry-a',
    name: '계양 기병',
    faction: 'enemy',
    className: '계양 기병',
    classKey: 'cavalry',
    level: 33,
    exp: 54,
    hp: 122,
    maxHp: 122,
    attack: 38,
    move: 5,
    stats: { might: 130, intelligence: 86, leadership: 108, agility: 112, luck: 82 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 4, exp: 40 },
      armor: { itemId: 'lamellar-armor', level: 4, exp: 24 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 26,
    y: 28
  },
  {
    id: 'guiyang-cavalry-b',
    name: '계양 기병',
    faction: 'enemy',
    className: '남문 기병',
    classKey: 'cavalry',
    level: 33,
    exp: 54,
    hp: 122,
    maxHp: 122,
    attack: 38,
    move: 5,
    stats: { might: 130, intelligence: 86, leadership: 108, agility: 112, luck: 82 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 4, exp: 40 },
      armor: { itemId: 'lamellar-armor', level: 4, exp: 24 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 34,
    y: 26
  },
  {
    id: 'guiyang-cavalry-c',
    name: '계양 기병',
    faction: 'enemy',
    className: '성채 기병',
    classKey: 'cavalry',
    level: 34,
    exp: 56,
    hp: 126,
    maxHp: 126,
    attack: 39,
    move: 5,
    stats: { might: 132, intelligence: 88, leadership: 110, agility: 114, luck: 82 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 4, exp: 42 },
      armor: { itemId: 'reinforced-lamellar', level: 4, exp: 26 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 39,
    y: 24
  },
  {
    id: 'guiyang-guard-a',
    name: '조범 친위대',
    faction: 'enemy',
    className: '계양 친위대',
    classKey: 'yellowTurban',
    level: 34,
    exp: 58,
    hp: 124,
    maxHp: 124,
    attack: 39,
    move: 3,
    stats: { might: 132, intelligence: 88, leadership: 114, agility: 96, luck: 82 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 4, exp: 44 },
      armor: { itemId: 'reinforced-lamellar', level: 4, exp: 30 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 42,
    y: 18
  },
  {
    id: 'guiyang-guard-b',
    name: '조범 친위대',
    faction: 'enemy',
    className: '계양 친위대',
    classKey: 'yellowTurban',
    level: 34,
    exp: 58,
    hp: 124,
    maxHp: 124,
    attack: 39,
    move: 3,
    stats: { might: 132, intelligence: 88, leadership: 114, agility: 96, luck: 82 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 4, exp: 44 },
      armor: { itemId: 'reinforced-lamellar', level: 4, exp: 30 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 43,
    y: 21
  },
  {
    id: 'guiyang-strategist-a',
    name: '계양 책사',
    faction: 'enemy',
    className: '계양 책사',
    classKey: 'archer',
    level: 33,
    exp: 54,
    hp: 88,
    maxHp: 88,
    attack: 35,
    move: 3,
    stats: { might: 86, intelligence: 108, leadership: 100, agility: 92, luck: 82 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 4, exp: 34 },
      armor: { itemId: 'cloth-armor', level: 4, exp: 18 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 37,
    y: 16
  },
  {
    id: 'guiyang-strategist-b',
    name: '계양 책사',
    faction: 'enemy',
    className: '성내 책사',
    classKey: 'archer',
    level: 33,
    exp: 54,
    hp: 88,
    maxHp: 88,
    attack: 35,
    move: 3,
    stats: { might: 86, intelligence: 108, leadership: 100, agility: 92, luck: 82 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 4, exp: 34 },
      armor: { itemId: 'cloth-armor', level: 4, exp: 18 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 40,
    y: 19
  },
  {
    id: 'guiyang-leader-zhao-fan',
    name: '조범',
    faction: 'enemy',
    className: '계양 태수',
    classKey: 'rebelLeader',
    level: 35,
    exp: 60,
    hp: 172,
    maxHp: 172,
    attack: 42,
    move: 4,
    stats: { might: 134, intelligence: 96, leadership: 122, agility: 98, luck: 84 },
    equipment: {
      weapon: { itemId: 'leader-axe', level: 4, exp: 62 },
      armor: { itemId: 'reinforced-lamellar', level: 4, exp: 44 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 44,
    y: 19
  }
];

const twentyFifthBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 4, y: 28 },
  'guan-yu': { x: 6, y: 26 },
  'zhang-fei': { x: 6, y: 30 },
  'jian-yong': { x: 3, y: 31 },
  'mi-zhu': { x: 4, y: 32 },
  'sun-qian': { x: 8, y: 29 },
  'zhao-yun': { x: 8, y: 26 },
  'zhuge-liang': { x: 5, y: 28 },
  'ma-liang': { x: 7, y: 31 },
  'yi-ji': { x: 9, y: 28 }
};

export const twentyFifthBattleUnits: UnitData[] = [
  ...[
    ...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
    ...xuzhouRecruitUnits,
    ...caoBreakRecruitUnits,
    ...liuBiaoRecruitUnits,
    ...zhugeRecruitUnits,
    ...jingzhouRecruitUnits,
    ...guiyangRecruitUnits
  ].map((unit) => placeScenarioUnit(unit, twentyFifthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  {
    id: 'wuling-scout-a',
    name: '무릉 산길 척후',
    faction: 'enemy',
    className: '산길 척후',
    classKey: 'bandit',
    level: 34,
    exp: 52,
    hp: 92,
    maxHp: 92,
    attack: 36,
    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: 92,
    maxHp: 92,
    attack: 36,
    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: 96,
    maxHp: 96,
    attack: 37,
    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: 102,
    maxHp: 102,
    attack: 37,
    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: 102,
    maxHp: 102,
    attack: 37,
    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: 106,
    maxHp: 106,
    attack: 38,
    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: 120,
    maxHp: 120,
    attack: 39,
    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: 120,
    maxHp: 120,
    attack: 39,
    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: 126,
    maxHp: 126,
    attack: 40,
    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: 126,
    maxHp: 126,
    attack: 40,
    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: 90,
    maxHp: 90,
    attack: 36,
    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: 90,
    maxHp: 90,
    attack: 36,
    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: 94,
    maxHp: 94,
    attack: 37,
    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: 130,
    maxHp: 130,
    attack: 41,
    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: 130,
    maxHp: 130,
    attack: 41,
    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: 132,
    maxHp: 132,
    attack: 42,
    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: 132,
    maxHp: 132,
    attack: 42,
    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: 94,
    maxHp: 94,
    attack: 37,
    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: 184,
    maxHp: 184,
    attack: 44,
    move: 4,
    stats: { might: 140, intelligence: 98, leadership: 126, agility: 100, luck: 84 },
    equipment: {
      weapon: { itemId: 'leader-axe', level: 4, exp: 68 },
      armor: { itemId: 'reinforced-lamellar', level: 4, exp: 48 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 46,
    y: 14
  }
];

const twentySixthBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 4, y: 27 },
  'guan-yu': { x: 6, y: 25 },
  'zhang-fei': { x: 6, y: 29 },
  'jian-yong': { x: 3, y: 30 },
  'mi-zhu': { x: 4, y: 31 },
  'sun-qian': { x: 8, y: 28 },
  'zhao-yun': { x: 8, y: 25 },
  'zhuge-liang': { x: 5, y: 27 },
  'ma-liang': { x: 7, y: 30 },
  'yi-ji': { x: 9, y: 27 },
  'gong-zhi': { x: 9, y: 30 }
};

export const twentySixthBattleUnits: UnitData[] = [
  ...[
    ...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
    ...xuzhouRecruitUnits,
    ...caoBreakRecruitUnits,
    ...liuBiaoRecruitUnits,
    ...zhugeRecruitUnits,
    ...jingzhouRecruitUnits,
    ...guiyangRecruitUnits,
    ...wulingRecruitUnits
  ].map((unit) => placeScenarioUnit(unit, twentySixthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  {
    id: 'changsha-scout-a',
    name: '장사 척후',
    faction: 'enemy',
    className: '장사 척후',
    classKey: 'bandit',
    level: 37,
    exp: 56,
    hp: 100,
    maxHp: 100,
    attack: 38,
    move: 4,
    stats: { might: 124, intelligence: 90, leadership: 100, agility: 118, luck: 82 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 36 },
      armor: { itemId: 'rebel-vest', level: 4, exp: 22 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 14,
    y: 25
  },
  {
    id: 'changsha-scout-b',
    name: '장사 척후',
    faction: 'enemy',
    className: '서문 척후',
    classKey: 'bandit',
    level: 37,
    exp: 56,
    hp: 100,
    maxHp: 100,
    attack: 38,
    move: 4,
    stats: { might: 124, intelligence: 90, leadership: 100, agility: 118, luck: 82 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 36 },
      armor: { itemId: 'rebel-vest', level: 4, exp: 22 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 17,
    y: 30
  },
  {
    id: 'changsha-infantry-a',
    name: '장사 보병',
    faction: 'enemy',
    className: '장사 보병',
    classKey: 'yellowTurban',
    level: 38,
    exp: 58,
    hp: 130,
    maxHp: 130,
    attack: 42,
    move: 3,
    stats: { might: 138, intelligence: 90, leadership: 116, agility: 98, luck: 82 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 4, exp: 50 },
      armor: { itemId: 'lamellar-armor', level: 4, exp: 34 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 23,
    y: 24
  },
  {
    id: 'changsha-infantry-b',
    name: '장사 보병',
    faction: 'enemy',
    className: '마을 보병',
    classKey: 'yellowTurban',
    level: 38,
    exp: 58,
    hp: 130,
    maxHp: 130,
    attack: 42,
    move: 3,
    stats: { might: 138, intelligence: 90, leadership: 116, agility: 98, luck: 82 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 4, exp: 50 },
      armor: { itemId: 'lamellar-armor', level: 4, exp: 34 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 26,
    y: 28
  },
  {
    id: 'changsha-infantry-c',
    name: '장사 보병',
    faction: 'enemy',
    className: '성문 보병',
    classKey: 'yellowTurban',
    level: 39,
    exp: 60,
    hp: 136,
    maxHp: 136,
    attack: 43,
    move: 3,
    stats: { might: 140, intelligence: 90, leadership: 118, agility: 98, luck: 82 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 4, exp: 54 },
      armor: { itemId: 'reinforced-lamellar', level: 4, exp: 38 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 34,
    y: 20
  },
  {
    id: 'changsha-infantry-d',
    name: '장사 보병',
    faction: 'enemy',
    className: '성내 보병',
    classKey: 'yellowTurban',
    level: 39,
    exp: 60,
    hp: 136,
    maxHp: 136,
    attack: 43,
    move: 3,
    stats: { might: 140, intelligence: 90, leadership: 118, agility: 98, luck: 82 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 4, exp: 54 },
      armor: { itemId: 'reinforced-lamellar', level: 4, exp: 38 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 39,
    y: 17
  },
  {
    id: 'changsha-archer-a',
    name: '장사 궁병',
    faction: 'enemy',
    className: '장사 궁병',
    classKey: 'archer',
    level: 38,
    exp: 58,
    hp: 98,
    maxHp: 98,
    attack: 39,
    move: 3,
    stats: { might: 96, intelligence: 98, leadership: 104, agility: 112, luck: 84 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 4, exp: 46 },
      armor: { itemId: 'cloth-armor', level: 4, exp: 28 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 28,
    y: 20
  },
  {
    id: 'changsha-archer-b',
    name: '장사 궁병',
    faction: 'enemy',
    className: '성루 궁병',
    classKey: 'archer',
    level: 38,
    exp: 58,
    hp: 98,
    maxHp: 98,
    attack: 39,
    move: 3,
    stats: { might: 96, intelligence: 98, leadership: 104, agility: 112, luck: 84 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 4, exp: 46 },
      armor: { itemId: 'cloth-armor', level: 4, exp: 28 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 37,
    y: 13
  },
  {
    id: 'changsha-archer-c',
    name: '장사 궁병',
    faction: 'enemy',
    className: '동문 궁병',
    classKey: 'archer',
    level: 39,
    exp: 60,
    hp: 102,
    maxHp: 102,
    attack: 40,
    move: 3,
    stats: { might: 98, intelligence: 100, leadership: 106, agility: 114, luck: 84 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 4, exp: 50 },
      armor: { itemId: 'cloth-armor', level: 4, exp: 30 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 44,
    y: 19
  },
  {
    id: 'changsha-cavalry-a',
    name: '장사 기병',
    faction: 'enemy',
    className: '장사 기병',
    classKey: 'cavalry',
    level: 39,
    exp: 60,
    hp: 138,
    maxHp: 138,
    attack: 44,
    move: 5,
    stats: { might: 140, intelligence: 90, leadership: 116, agility: 118, luck: 84 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 4, exp: 56 },
      armor: { itemId: 'lamellar-armor', level: 4, exp: 36 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 31,
    y: 29
  },
  {
    id: 'changsha-cavalry-b',
    name: '장사 기병',
    faction: 'enemy',
    className: '동문 기병',
    classKey: 'cavalry',
    level: 39,
    exp: 60,
    hp: 138,
    maxHp: 138,
    attack: 44,
    move: 5,
    stats: { might: 140, intelligence: 90, leadership: 116, agility: 118, luck: 84 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 4, exp: 56 },
      armor: { itemId: 'lamellar-armor', level: 4, exp: 36 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 42,
    y: 28
  },
  {
    id: 'changsha-guard-a',
    name: '한현 친위대',
    faction: 'enemy',
    className: '장사 친위대',
    classKey: 'yellowTurban',
    level: 40,
    exp: 62,
    hp: 144,
    maxHp: 144,
    attack: 45,
    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: 144,
    maxHp: 144,
    attack: 45,
    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: 102,
    maxHp: 102,
    attack: 40,
    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: 102,
    maxHp: 102,
    attack: 40,
    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: 156,
    maxHp: 156,
    attack: 48,
    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: 152,
    maxHp: 152,
    attack: 47,
    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: 190,
    maxHp: 190,
    attack: 46,
    move: 4,
    stats: { might: 138, intelligence: 104, leadership: 130, agility: 100, luck: 84 },
    equipment: {
      weapon: { itemId: 'leader-axe', level: 5, exp: 10 },
      armor: { itemId: 'reinforced-lamellar', level: 5, exp: 8 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 48,
    y: 16
  }
];

const twentySeventhBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 4, y: 30 },
  'guan-yu': { x: 6, y: 29 },
  'zhang-fei': { x: 5, y: 32 },
  'jian-yong': { x: 3, y: 33 },
  'mi-zhu': { x: 4, y: 34 },
  'sun-qian': { x: 7, y: 33 },
  'zhao-yun': { x: 8, y: 30 },
  'zhuge-liang': { x: 5, y: 30 },
  'ma-liang': { x: 8, y: 34 },
  'yi-ji': { x: 9, y: 32 },
  'gong-zhi': { x: 10, y: 34 },
  'huang-zhong': { x: 7, y: 31 },
  'wei-yan': { x: 9, y: 29 }
};

export const twentySeventhBattleUnits: UnitData[] = [
  ...[
    ...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
    ...xuzhouRecruitUnits,
    ...caoBreakRecruitUnits,
    ...liuBiaoRecruitUnits,
    ...zhugeRecruitUnits,
    ...jingzhouRecruitUnits,
    ...guiyangRecruitUnits,
    ...wulingRecruitUnits,
    ...changshaRecruitUnits
  ].map((unit) => placeScenarioUnit(unit, twentySeventhBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  {
    id: 'yizhou-scout-a',
    name: '익주 척후',
    faction: 'enemy',
    className: '산길 척후',
    classKey: 'bandit',
    level: 41,
    exp: 62,
    hp: 106,
    maxHp: 106,
    attack: 40,
    move: 4,
    stats: { might: 128, intelligence: 92, leadership: 104, agility: 120, luck: 84 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 42 },
      armor: { itemId: 'rebel-vest', level: 4, exp: 28 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 16,
    y: 30
  },
  {
    id: 'yizhou-scout-b',
    name: '익주 척후',
    faction: 'enemy',
    className: '관문 척후',
    classKey: 'bandit',
    level: 41,
    exp: 62,
    hp: 106,
    maxHp: 106,
    attack: 40,
    move: 4,
    stats: { might: 128, intelligence: 92, leadership: 104, agility: 120, luck: 84 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 4, exp: 42 },
      armor: { itemId: 'rebel-vest', level: 4, exp: 28 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 20,
    y: 28
  },
  {
    id: 'yizhou-infantry-a',
    name: '익주 보병',
    faction: 'enemy',
    className: '원군로 보병',
    classKey: 'yellowTurban',
    level: 42,
    exp: 64,
    hp: 140,
    maxHp: 140,
    attack: 44,
    move: 3,
    stats: { might: 142, intelligence: 92, leadership: 120, agility: 100, luck: 84 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 4, exp: 58 },
      armor: { itemId: 'lamellar-armor', level: 4, exp: 42 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 24,
    y: 27
  },
  {
    id: 'yizhou-infantry-b',
    name: '익주 보병',
    faction: 'enemy',
    className: '고개 보병',
    classKey: 'yellowTurban',
    level: 42,
    exp: 64,
    hp: 140,
    maxHp: 140,
    attack: 44,
    move: 3,
    stats: { might: 142, intelligence: 92, leadership: 120, agility: 100, luck: 84 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 4, exp: 58 },
      armor: { itemId: 'lamellar-armor', level: 4, exp: 42 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 28,
    y: 24
  },
  {
    id: 'yizhou-infantry-c',
    name: '익주 보병',
    faction: 'enemy',
    className: '관문 보병',
    classKey: 'yellowTurban',
    level: 43,
    exp: 66,
    hp: 148,
    maxHp: 148,
    attack: 46,
    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: 148,
    maxHp: 148,
    attack: 46,
    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: 108,
    maxHp: 108,
    attack: 43,
    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: 108,
    maxHp: 108,
    attack: 43,
    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: 148,
    maxHp: 148,
    attack: 47,
    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: 148,
    maxHp: 148,
    attack: 47,
    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: 154,
    maxHp: 154,
    attack: 49,
    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: 158,
    maxHp: 158,
    attack: 49,
    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: 158,
    maxHp: 158,
    attack: 49,
    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: 108,
    maxHp: 108,
    attack: 43,
    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: 108,
    maxHp: 108,
    attack: 43,
    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: 112,
    maxHp: 112,
    attack: 42,
    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: 112,
    maxHp: 112,
    attack: 42,
    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: 204,
    maxHp: 204,
    attack: 50,
    move: 4,
    stats: { might: 150, intelligence: 112, leadership: 136, agility: 106, luck: 88 },
    equipment: {
      weapon: { itemId: 'leader-axe', level: 5, exp: 20 },
      armor: { itemId: 'reinforced-lamellar', level: 5, exp: 16 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 50,
    y: 16
  }
];

const twentyEighthBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 4, y: 32 },
  'guan-yu': { x: 6, y: 31 },
  'zhang-fei': { x: 5, y: 34 },
  'jian-yong': { x: 3, y: 35 },
  'mi-zhu': { x: 4, y: 36 },
  'sun-qian': { x: 7, y: 35 },
  'zhao-yun': { x: 8, y: 32 },
  'zhuge-liang': { x: 5, y: 32 },
  'ma-liang': { x: 8, y: 36 },
  'yi-ji': { x: 9, y: 34 },
  'gong-zhi': { x: 10, y: 36 },
  'huang-zhong': { x: 7, y: 33 },
  'wei-yan': { x: 10, y: 31 },
  'pang-tong': { x: 9, y: 33 }
};

export const twentyEighthBattleUnits: UnitData[] = [
  ...[
    ...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
    ...xuzhouRecruitUnits,
    ...caoBreakRecruitUnits,
    ...liuBiaoRecruitUnits,
    ...zhugeRecruitUnits,
    ...jingzhouRecruitUnits,
    ...guiyangRecruitUnits,
    ...wulingRecruitUnits,
    ...changshaRecruitUnits,
    ...yizhouRecruitUnits
  ].map((unit) => placeScenarioUnit(unit, twentyEighthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  {
    id: 'fupass-scout-a',
    name: '부수관 척후',
    faction: 'enemy',
    className: '관문 척후',
    classKey: 'bandit',
    level: 44,
    exp: 68,
    hp: 112,
    maxHp: 112,
    attack: 43,
    move: 4,
    stats: { might: 134, intelligence: 96, leadership: 110, agility: 126, luck: 86 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 6 },
      armor: { itemId: 'rebel-vest', level: 4, exp: 40 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 16,
    y: 32
  },
  {
    id: 'fupass-scout-b',
    name: '부수관 척후',
    faction: 'enemy',
    className: '서문 척후',
    classKey: 'bandit',
    level: 44,
    exp: 68,
    hp: 112,
    maxHp: 112,
    attack: 43,
    move: 4,
    stats: { might: 134, intelligence: 96, leadership: 110, agility: 126, luck: 86 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 6 },
      armor: { itemId: 'rebel-vest', level: 4, exp: 40 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 21,
    y: 30
  },
  {
    id: 'fupass-infantry-a',
    name: '부수관 보병',
    faction: 'enemy',
    className: '산문 보병',
    classKey: 'yellowTurban',
    level: 45,
    exp: 70,
    hp: 154,
    maxHp: 154,
    attack: 48,
    move: 3,
    stats: { might: 150, intelligence: 96, leadership: 128, agility: 104, luck: 86 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 5, exp: 18 },
      armor: { itemId: 'lamellar-armor', level: 5, exp: 8 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 25,
    y: 29
  },
  {
    id: 'fupass-infantry-b',
    name: '부수관 보병',
    faction: 'enemy',
    className: '협곡 보병',
    classKey: 'yellowTurban',
    level: 45,
    exp: 70,
    hp: 154,
    maxHp: 154,
    attack: 48,
    move: 3,
    stats: { might: 150, intelligence: 96, leadership: 128, agility: 104, luck: 86 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 5, exp: 18 },
      armor: { itemId: 'lamellar-armor', level: 5, exp: 8 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 30,
    y: 26
  },
  {
    id: 'fupass-infantry-c',
    name: '부수관 보병',
    faction: 'enemy',
    className: '관문 보병',
    classKey: 'yellowTurban',
    level: 46,
    exp: 72,
    hp: 162,
    maxHp: 162,
    attack: 50,
    move: 3,
    stats: { might: 154, intelligence: 98, leadership: 132, agility: 106, luck: 86 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 5, exp: 26 },
      armor: { itemId: 'reinforced-lamellar', level: 5, exp: 14 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 38,
    y: 23
  },
  {
    id: 'fupass-infantry-d',
    name: '부수관 보병',
    faction: 'enemy',
    className: '성문 보병',
    classKey: 'yellowTurban',
    level: 46,
    exp: 72,
    hp: 162,
    maxHp: 162,
    attack: 50,
    move: 3,
    stats: { might: 154, intelligence: 98, leadership: 132, agility: 106, luck: 86 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 5, exp: 26 },
      armor: { itemId: 'reinforced-lamellar', level: 5, exp: 14 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 44,
    y: 19
  },
  {
    id: 'fupass-archer-a',
    name: '부수관 궁병',
    faction: 'enemy',
    className: '산루 궁병',
    classKey: 'archer',
    level: 45,
    exp: 70,
    hp: 112,
    maxHp: 112,
    attack: 45,
    move: 3,
    stats: { might: 108, intelligence: 108, leadership: 114, agility: 122, luck: 88 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 5, exp: 14 },
      armor: { itemId: 'cloth-armor', level: 5, exp: 4 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 30,
    y: 22
  },
  {
    id: 'fupass-archer-b',
    name: '부수관 궁병',
    faction: 'enemy',
    className: '관문 궁병',
    classKey: 'archer',
    level: 46,
    exp: 72,
    hp: 116,
    maxHp: 116,
    attack: 46,
    move: 3,
    stats: { might: 110, intelligence: 110, leadership: 116, agility: 124, luck: 88 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 5, exp: 22 },
      armor: { itemId: 'cloth-armor', level: 5, exp: 10 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 42,
    y: 16
  },
  {
    id: 'fupass-archer-c',
    name: '부수관 궁병',
    faction: 'enemy',
    className: '성루 궁병',
    classKey: 'archer',
    level: 46,
    exp: 72,
    hp: 116,
    maxHp: 116,
    attack: 46,
    move: 3,
    stats: { might: 110, intelligence: 110, leadership: 116, agility: 124, luck: 88 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 5, exp: 22 },
      armor: { itemId: 'cloth-armor', level: 5, exp: 10 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 50,
    y: 20
  },
  {
    id: 'fupass-cavalry-a',
    name: '부수관 기병',
    faction: 'enemy',
    className: '고개 기병',
    classKey: 'cavalry',
    level: 46,
    exp: 72,
    hp: 162,
    maxHp: 162,
    attack: 51,
    move: 5,
    stats: { might: 154, intelligence: 98, leadership: 130, agility: 126, luck: 88 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 5, exp: 28 },
      armor: { itemId: 'lamellar-armor', level: 5, exp: 16 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 23,
    y: 34
  },
  {
    id: 'fupass-cavalry-b',
    name: '부수관 기병',
    faction: 'enemy',
    className: '관문 기병',
    classKey: 'cavalry',
    level: 46,
    exp: 72,
    hp: 162,
    maxHp: 162,
    attack: 51,
    move: 5,
    stats: { might: 154, intelligence: 98, leadership: 130, agility: 126, luck: 88 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 5, exp: 28 },
      armor: { itemId: 'lamellar-armor', level: 5, exp: 16 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 40,
    y: 29
  },
  {
    id: 'fupass-cavalry-c',
    name: '부수관 기병',
    faction: 'enemy',
    className: '성문 기병',
    classKey: 'cavalry',
    level: 47,
    exp: 74,
    hp: 170,
    maxHp: 170,
    attack: 53,
    move: 5,
    stats: { might: 158, intelligence: 100, leadership: 134, agility: 128, luck: 88 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 5, exp: 36 },
      armor: { itemId: 'lamellar-armor', level: 5, exp: 24 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 49,
    y: 27
  },
  {
    id: 'fupass-guard-a',
    name: '고패 친위대',
    faction: 'enemy',
    className: '관문 친위대',
    classKey: 'yellowTurban',
    level: 47,
    exp: 74,
    hp: 174,
    maxHp: 174,
    attack: 53,
    move: 3,
    stats: { might: 160, intelligence: 100, leadership: 138, agility: 108, luck: 88 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 5, exp: 40 },
      armor: { itemId: 'reinforced-lamellar', level: 5, exp: 26 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 47,
    y: 17
  },
  {
    id: 'fupass-guard-b',
    name: '고패 친위대',
    faction: 'enemy',
    className: '성문 친위대',
    classKey: 'yellowTurban',
    level: 47,
    exp: 74,
    hp: 174,
    maxHp: 174,
    attack: 53,
    move: 3,
    stats: { might: 160, intelligence: 100, leadership: 138, agility: 108, luck: 88 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 5, exp: 40 },
      armor: { itemId: 'reinforced-lamellar', level: 5, exp: 26 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 51,
    y: 19
  },
  {
    id: 'fupass-strategist-a',
    name: '부수관 책사',
    faction: 'enemy',
    className: '관문 책사',
    classKey: 'archer',
    level: 46,
    exp: 72,
    hp: 116,
    maxHp: 116,
    attack: 46,
    move: 3,
    stats: { might: 94, intelligence: 124, leadership: 116, agility: 100, luck: 88 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 5, exp: 24 },
      armor: { itemId: 'cloth-armor', level: 5, exp: 12 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 43,
    y: 14
  },
  {
    id: 'fupass-strategist-b',
    name: '부수관 책사',
    faction: 'enemy',
    className: '성문 책사',
    classKey: 'archer',
    level: 46,
    exp: 72,
    hp: 116,
    maxHp: 116,
    attack: 46,
    move: 3,
    stats: { might: 94, intelligence: 124, leadership: 116, agility: 100, luck: 88 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 5, exp: 24 },
      armor: { itemId: 'cloth-armor', level: 5, exp: 12 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 51,
    y: 23
  },
  {
    id: 'fupass-ambusher-a',
    name: '산길 복병',
    faction: 'enemy',
    className: '서쪽 복병',
    classKey: 'bandit',
    level: 45,
    exp: 70,
    hp: 120,
    maxHp: 120,
    attack: 45,
    move: 4,
    stats: { might: 140, intelligence: 98, leadership: 112, agility: 128, luck: 86 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 18 },
      armor: { itemId: 'rebel-vest', level: 5, exp: 4 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 31,
    y: 34
  },
  {
    id: 'fupass-ambusher-b',
    name: '산길 복병',
    faction: 'enemy',
    className: '북쪽 복병',
    classKey: 'bandit',
    level: 45,
    exp: 70,
    hp: 120,
    maxHp: 120,
    attack: 45,
    move: 4,
    stats: { might: 140, intelligence: 98, leadership: 112, agility: 128, luck: 86 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 18 },
      armor: { itemId: 'rebel-vest', level: 5, exp: 4 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 35,
    y: 8
  },
  {
    id: 'fupass-ambusher-c',
    name: '산길 복병',
    faction: 'enemy',
    className: '남쪽 복병',
    classKey: 'bandit',
    level: 45,
    exp: 70,
    hp: 120,
    maxHp: 120,
    attack: 45,
    move: 4,
    stats: { might: 140, intelligence: 98, leadership: 112, agility: 128, luck: 86 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 18 },
      armor: { itemId: 'rebel-vest', level: 5, exp: 4 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 45,
    y: 31
  },
  {
    id: 'fupass-leader-gao-pei',
    name: '고패',
    faction: 'enemy',
    className: '부수관 수장',
    classKey: 'rebelLeader',
    level: 48,
    exp: 78,
    hp: 222,
    maxHp: 222,
    attack: 55,
    move: 4,
    stats: { might: 162, intelligence: 116, leadership: 144, agility: 110, luck: 90 },
    equipment: {
      weapon: { itemId: 'leader-axe', level: 5, exp: 34 },
      armor: { itemId: 'reinforced-lamellar', level: 5, exp: 30 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 52,
    y: 18
  }
];

const twentyNinthBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 4, y: 34 },
  'guan-yu': { x: 6, y: 33 },
  'zhang-fei': { x: 5, y: 36 },
  'jian-yong': { x: 3, y: 37 },
  'mi-zhu': { x: 4, y: 38 },
  'sun-qian': { x: 7, y: 37 },
  'zhao-yun': { x: 8, y: 34 },
  'zhuge-liang': { x: 5, y: 34 },
  'ma-liang': { x: 8, y: 38 },
  'yi-ji': { x: 9, y: 36 },
  'gong-zhi': { x: 10, y: 38 },
  'huang-zhong': { x: 7, y: 35 },
  'wei-yan': { x: 10, y: 33 },
  'pang-tong': { x: 9, y: 35 },
  'fa-zheng': { x: 11, y: 36 }
};

export const twentyNinthBattleUnits: UnitData[] = [
  ...[
    ...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
    ...xuzhouRecruitUnits,
    ...caoBreakRecruitUnits,
    ...liuBiaoRecruitUnits,
    ...zhugeRecruitUnits,
    ...jingzhouRecruitUnits,
    ...guiyangRecruitUnits,
    ...wulingRecruitUnits,
    ...changshaRecruitUnits,
    ...yizhouRecruitUnits,
    ...fuPassRecruitUnits
  ].map((unit) => placeScenarioUnit(unit, twentyNinthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  {
    id: 'luo-scout-a',
    name: '낙성 척후',
    faction: 'enemy',
    className: '외곽 척후',
    classKey: 'bandit',
    level: 47,
    exp: 74,
    hp: 122,
    maxHp: 122,
    attack: 46,
    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: 122,
    maxHp: 122,
    attack: 46,
    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: 168,
    maxHp: 168,
    attack: 52,
    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: 168,
    maxHp: 168,
    attack: 52,
    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: 176,
    maxHp: 176,
    attack: 54,
    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: 176,
    maxHp: 176,
    attack: 54,
    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: 120,
    maxHp: 120,
    attack: 48,
    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: 124,
    maxHp: 124,
    attack: 49,
    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: 124,
    maxHp: 124,
    attack: 49,
    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: 178,
    maxHp: 178,
    attack: 55,
    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: 178,
    maxHp: 178,
    attack: 55,
    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: 186,
    maxHp: 186,
    attack: 57,
    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: 188,
    maxHp: 188,
    attack: 57,
    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: 188,
    maxHp: 188,
    attack: 57,
    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: 124,
    maxHp: 124,
    attack: 49,
    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: 124,
    maxHp: 124,
    attack: 49,
    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: 128,
    maxHp: 128,
    attack: 48,
    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: 128,
    maxHp: 128,
    attack: 48,
    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: 190,
    maxHp: 190,
    attack: 56,
    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: 238,
    maxHp: 238,
    attack: 59,
    move: 4,
    stats: { might: 170, intelligence: 118, leadership: 152, agility: 116, luck: 92 },
    equipment: {
      weapon: { itemId: 'leader-axe', level: 5, exp: 48 },
      armor: { itemId: 'reinforced-lamellar', level: 5, exp: 48 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 54,
    y: 18
  }
];

const thirtiethBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 4, y: 36 },
  'guan-yu': { x: 5, y: 34 },
  'zhang-fei': { x: 4, y: 38 },
  'jian-yong': { x: 3, y: 39 },
  'mi-zhu': { x: 5, y: 40 },
  'sun-qian': { x: 7, y: 39 },
  'zhao-yun': { x: 8, y: 36 },
  'zhuge-liang': { x: 6, y: 35 },
  'ma-liang': { x: 8, y: 40 },
  'yi-ji': { x: 9, y: 38 },
  'gong-zhi': { x: 10, y: 40 },
  'huang-zhong': { x: 7, y: 37 },
  'wei-yan': { x: 10, y: 35 },
  'pang-tong': { x: 9, y: 36 },
  'fa-zheng': { x: 11, y: 38 },
  'wu-yi': { x: 12, y: 36 }
};

export const thirtiethBattleUnits: UnitData[] = [
  ...[
    ...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
    ...xuzhouRecruitUnits,
    ...caoBreakRecruitUnits,
    ...liuBiaoRecruitUnits,
    ...zhugeRecruitUnits,
    ...jingzhouRecruitUnits,
    ...guiyangRecruitUnits,
    ...wulingRecruitUnits,
    ...changshaRecruitUnits,
    ...yizhouRecruitUnits,
    ...fuPassRecruitUnits,
    ...luoCastleRecruitUnits
  ].map((unit) => placeScenarioUnit(unit, thirtiethBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  {
    id: 'luofeng-scout-a',
    name: '낙봉 척후',
    faction: 'enemy',
    className: '비탈 척후',
    classKey: 'bandit',
    level: 50,
    exp: 82,
    hp: 132,
    maxHp: 132,
    attack: 50,
    move: 4,
    stats: { might: 150, intelligence: 106, leadership: 122, agility: 136, luck: 90 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 42 },
      armor: { itemId: 'rebel-vest', level: 5, exp: 28 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 18,
    y: 35
  },
  {
    id: 'luofeng-scout-b',
    name: '낙봉 척후',
    faction: 'enemy',
    className: '동쪽 척후',
    classKey: 'bandit',
    level: 50,
    exp: 82,
    hp: 132,
    maxHp: 132,
    attack: 50,
    move: 4,
    stats: { might: 150, intelligence: 106, leadership: 122, agility: 136, luck: 90 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 42 },
      armor: { itemId: 'rebel-vest', level: 5, exp: 28 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 22,
    y: 33
  },
  {
    id: 'luofeng-scout-c',
    name: '낙봉 척후',
    faction: 'enemy',
    className: '북쪽 척후',
    classKey: 'bandit',
    level: 50,
    exp: 82,
    hp: 132,
    maxHp: 132,
    attack: 50,
    move: 4,
    stats: { might: 150, intelligence: 106, leadership: 122, agility: 136, luck: 90 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 42 },
      armor: { itemId: 'rebel-vest', level: 5, exp: 28 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 19,
    y: 28
  },
  {
    id: 'luofeng-infantry-a',
    name: '낙봉 보병',
    faction: 'enemy',
    className: '비탈 보병',
    classKey: 'yellowTurban',
    level: 51,
    exp: 84,
    hp: 184,
    maxHp: 184,
    attack: 58,
    move: 3,
    stats: { might: 170, intelligence: 108, leadership: 148, agility: 114, luck: 90 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 5, exp: 62 },
      armor: { itemId: 'reinforced-lamellar', level: 5, exp: 48 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 28,
    y: 31
  },
  {
    id: 'luofeng-infantry-b',
    name: '낙봉 보병',
    faction: 'enemy',
    className: '협로 보병',
    classKey: 'yellowTurban',
    level: 51,
    exp: 84,
    hp: 184,
    maxHp: 184,
    attack: 58,
    move: 3,
    stats: { might: 170, intelligence: 108, leadership: 148, agility: 114, luck: 90 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 5, exp: 62 },
      armor: { itemId: 'reinforced-lamellar', level: 5, exp: 48 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 34,
    y: 28
  },
  {
    id: 'luofeng-infantry-c',
    name: '낙봉 보병',
    faction: 'enemy',
    className: '산문 보병',
    classKey: 'yellowTurban',
    level: 52,
    exp: 86,
    hp: 192,
    maxHp: 192,
    attack: 60,
    move: 3,
    stats: { might: 174, intelligence: 110, leadership: 152, agility: 116, luck: 90 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 5, exp: 70 },
      armor: { itemId: 'reinforced-lamellar', level: 5, exp: 56 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 40,
    y: 24
  },
  {
    id: 'luofeng-infantry-d',
    name: '낙봉 보병',
    faction: 'enemy',
    className: '후미 보병',
    classKey: 'yellowTurban',
    level: 52,
    exp: 86,
    hp: 192,
    maxHp: 192,
    attack: 60,
    move: 3,
    stats: { might: 174, intelligence: 110, leadership: 152, agility: 116, luck: 90 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 5, exp: 70 },
      armor: { itemId: 'reinforced-lamellar', level: 5, exp: 56 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 46,
    y: 20
  },
  {
    id: 'luofeng-archer-a',
    name: '낙봉 궁병',
    faction: 'enemy',
    className: '매복 궁병',
    classKey: 'archer',
    level: 51,
    exp: 84,
    hp: 132,
    maxHp: 132,
    attack: 51,
    move: 3,
    stats: { might: 118, intelligence: 120, leadership: 126, agility: 132, luck: 92 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 5, exp: 48 },
      armor: { itemId: 'cloth-armor', level: 5, exp: 32 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 31,
    y: 27
  },
  {
    id: 'luofeng-archer-b',
    name: '낙봉 궁병',
    faction: 'enemy',
    className: '고지 궁병',
    classKey: 'archer',
    level: 51,
    exp: 84,
    hp: 132,
    maxHp: 132,
    attack: 51,
    move: 3,
    stats: { might: 118, intelligence: 120, leadership: 126, agility: 132, luck: 92 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 5, exp: 48 },
      armor: { itemId: 'cloth-armor', level: 5, exp: 32 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 39,
    y: 22
  },
  {
    id: 'luofeng-archer-c',
    name: '낙봉 궁병',
    faction: 'enemy',
    className: '성루 궁병',
    classKey: 'archer',
    level: 52,
    exp: 86,
    hp: 136,
    maxHp: 136,
    attack: 52,
    move: 3,
    stats: { might: 120, intelligence: 122, leadership: 128, agility: 134, luck: 92 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 5, exp: 56 },
      armor: { itemId: 'cloth-armor', level: 5, exp: 40 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 47,
    y: 17
  },
  {
    id: 'luofeng-archer-d',
    name: '낙봉 궁병',
    faction: 'enemy',
    className: '후방 궁병',
    classKey: 'archer',
    level: 52,
    exp: 86,
    hp: 136,
    maxHp: 136,
    attack: 52,
    move: 3,
    stats: { might: 120, intelligence: 122, leadership: 128, agility: 134, luck: 92 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 5, exp: 56 },
      armor: { itemId: 'cloth-armor', level: 5, exp: 40 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 52,
    y: 24
  },
  {
    id: 'luofeng-cavalry-a',
    name: '낙봉 기병',
    faction: 'enemy',
    className: '협곡 기병',
    classKey: 'cavalry',
    level: 52,
    exp: 86,
    hp: 194,
    maxHp: 194,
    attack: 61,
    move: 5,
    stats: { might: 176, intelligence: 110, leadership: 148, agility: 138, luck: 92 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 5, exp: 66 },
      armor: { itemId: 'lamellar-armor', level: 5, exp: 52 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 25,
    y: 38
  },
  {
    id: 'luofeng-cavalry-b',
    name: '낙봉 기병',
    faction: 'enemy',
    className: '동쪽 기병',
    classKey: 'cavalry',
    level: 52,
    exp: 86,
    hp: 194,
    maxHp: 194,
    attack: 61,
    move: 5,
    stats: { might: 176, intelligence: 110, leadership: 148, agility: 138, luck: 92 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 5, exp: 66 },
      armor: { itemId: 'lamellar-armor', level: 5, exp: 52 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 42,
    y: 31
  },
  {
    id: 'luofeng-cavalry-c',
    name: '낙봉 기병',
    faction: 'enemy',
    className: '후방 기병',
    classKey: 'cavalry',
    level: 53,
    exp: 88,
    hp: 202,
    maxHp: 202,
    attack: 63,
    move: 5,
    stats: { might: 180, intelligence: 112, leadership: 152, agility: 140, luck: 92 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 5, exp: 74 },
      armor: { itemId: 'lamellar-armor', level: 5, exp: 60 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    x: 51,
    y: 29
  },
  {
    id: 'luofeng-guard-a',
    name: '장임 친위대',
    faction: 'enemy',
    className: '낙봉 친위대',
    classKey: 'yellowTurban',
    level: 53,
    exp: 88,
    hp: 204,
    maxHp: 204,
    attack: 63,
    move: 3,
    stats: { might: 182, intelligence: 112, leadership: 158, agility: 118, luck: 92 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 5, exp: 78 },
      armor: { itemId: 'reinforced-lamellar', level: 5, exp: 64 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 53,
    y: 18
  },
  {
    id: 'luofeng-guard-b',
    name: '장임 친위대',
    faction: 'enemy',
    className: '성문 친위대',
    classKey: 'yellowTurban',
    level: 53,
    exp: 88,
    hp: 204,
    maxHp: 204,
    attack: 63,
    move: 3,
    stats: { might: 182, intelligence: 112, leadership: 158, agility: 118, luck: 92 },
    equipment: {
      weapon: { itemId: 'iron-spear', level: 5, exp: 78 },
      armor: { itemId: 'reinforced-lamellar', level: 5, exp: 64 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 55,
    y: 22
  },
  {
    id: 'luofeng-strategist-a',
    name: '낙봉 책사',
    faction: 'enemy',
    className: '매복 책사',
    classKey: 'archer',
    level: 52,
    exp: 86,
    hp: 136,
    maxHp: 136,
    attack: 52,
    move: 3,
    stats: { might: 98, intelligence: 136, leadership: 126, agility: 106, luck: 92 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 5, exp: 58 },
      armor: { itemId: 'cloth-armor', level: 5, exp: 42 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 48,
    y: 15
  },
  {
    id: 'luofeng-strategist-b',
    name: '낙봉 책사',
    faction: 'enemy',
    className: '후방 책사',
    classKey: 'archer',
    level: 52,
    exp: 86,
    hp: 136,
    maxHp: 136,
    attack: 52,
    move: 3,
    stats: { might: 98, intelligence: 136, leadership: 126, agility: 106, luck: 92 },
    equipment: {
      weapon: { itemId: 'short-bow', level: 5, exp: 58 },
      armor: { itemId: 'cloth-armor', level: 5, exp: 42 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 55,
    y: 26
  },
  {
    id: 'luofeng-ambusher-a',
    name: '낙봉 복병',
    faction: 'enemy',
    className: '남쪽 복병',
    classKey: 'bandit',
    level: 51,
    exp: 84,
    hp: 140,
    maxHp: 140,
    attack: 52,
    move: 4,
    stats: { might: 154, intelligence: 108, leadership: 124, agility: 140, luck: 90 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 50 },
      armor: { itemId: 'rebel-vest', level: 5, exp: 36 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 30,
    y: 36
  },
  {
    id: 'luofeng-ambusher-b',
    name: '낙봉 복병',
    faction: 'enemy',
    className: '북쪽 복병',
    classKey: 'bandit',
    level: 51,
    exp: 84,
    hp: 140,
    maxHp: 140,
    attack: 52,
    move: 4,
    stats: { might: 154, intelligence: 108, leadership: 124, agility: 140, luck: 90 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 50 },
      armor: { itemId: 'rebel-vest', level: 5, exp: 36 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 35,
    y: 15
  },
  {
    id: 'luofeng-ambusher-c',
    name: '낙봉 복병',
    faction: 'enemy',
    className: '동쪽 복병',
    classKey: 'bandit',
    level: 52,
    exp: 86,
    hp: 146,
    maxHp: 146,
    attack: 54,
    move: 4,
    stats: { might: 158, intelligence: 110, leadership: 126, agility: 142, luck: 90 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 58 },
      armor: { itemId: 'rebel-vest', level: 5, exp: 44 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 44,
    y: 34
  },
  {
    id: 'luofeng-ambusher-d',
    name: '낙봉 복병',
    faction: 'enemy',
    className: '절벽 복병',
    classKey: 'bandit',
    level: 52,
    exp: 86,
    hp: 146,
    maxHp: 146,
    attack: 54,
    move: 4,
    stats: { might: 158, intelligence: 110, leadership: 126, agility: 142, luck: 90 },
    equipment: {
      weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 58 },
      armor: { itemId: 'rebel-vest', level: 5, exp: 44 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    x: 50,
    y: 10
  },
  {
    id: 'luofeng-leader-zhang-ren',
    name: '장임',
    faction: 'enemy',
    className: '낙봉파 주장',
    classKey: 'rebelLeader',
    level: 54,
    exp: 90,
    hp: 256,
    maxHp: 256,
    attack: 66,
    move: 4,
    stats: { might: 184, intelligence: 124, leadership: 162, agility: 120, luck: 94 },
    equipment: {
      weapon: { itemId: 'leader-axe', level: 5, exp: 66 },
      armor: { itemId: 'reinforced-lamellar', level: 5, exp: 66 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    x: 56,
    y: 20
  }
];

const thirtyFirstBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 4, y: 39 },
  'guan-yu': { x: 5, y: 37 },
  'zhang-fei': { x: 4, y: 41 },
  'jian-yong': { x: 3, y: 42 },
  'mi-zhu': { x: 5, y: 42 },
  'sun-qian': { x: 7, y: 41 },
  'zhao-yun': { x: 8, y: 38 },
  'zhuge-liang': { x: 6, y: 37 },
  'ma-liang': { x: 8, y: 42 },
  'yi-ji': { x: 9, y: 40 },
  'gong-zhi': { x: 10, y: 42 },
  'huang-zhong': { x: 7, y: 39 },
  'wei-yan': { x: 10, y: 37 },
  'pang-tong': { x: 9, y: 38 },
  'fa-zheng': { x: 11, y: 40 },
  'wu-yi': { x: 12, y: 38 }
};

const createThirtyFirstEnemyUnit = (
  id: string,
  name: string,
  className: string,
  classKey: UnitClassKey,
  level: number,
  hp: number,
  attack: number,
  x: number,
  y: number
): UnitData => {
  const equipmentByClass: Record<UnitClassKey, UnitData['equipment']> = {
    lord: {
      weapon: { itemId: 'twin-oath-blades', level: 5, exp: 70 },
      armor: { itemId: 'reinforced-lamellar', level: 5, exp: 62 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    infantry: {
      weapon: { itemId: 'iron-spear', level: 5, exp: 74 },
      armor: { itemId: 'reinforced-lamellar', level: 5, exp: 66 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    cavalry: {
      weapon: { itemId: 'iron-spear', level: 5, exp: 78 },
      armor: { itemId: 'lamellar-armor', level: 5, exp: 68 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    spearman: {
      weapon: { itemId: 'iron-spear', level: 5, exp: 76 },
      armor: { itemId: 'reinforced-lamellar', level: 5, exp: 66 },
      accessory: { itemId: 'bravery-token', level: 1, exp: 0 }
    },
    archer: {
      weapon: { itemId: 'short-bow', level: 5, exp: 72 },
      armor: { itemId: 'cloth-armor', level: 5, exp: 58 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    strategist: {
      weapon: { itemId: 'white-feather-fan', level: 5, exp: 64 },
      armor: { itemId: 'cloth-armor', level: 5, exp: 54 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    quartermaster: {
      weapon: { itemId: 'white-feather-fan', level: 5, exp: 56 },
      armor: { itemId: 'cloth-armor', level: 5, exp: 48 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    bandit: {
      weapon: { itemId: 'yellow-turban-saber', level: 5, exp: 66 },
      armor: { itemId: 'rebel-vest', level: 5, exp: 54 },
      accessory: { itemId: 'grain-pouch', level: 1, exp: 0 }
    },
    yellowTurban: {
      weapon: { itemId: 'iron-spear', level: 5, exp: 78 },
      armor: { itemId: 'reinforced-lamellar', level: 5, exp: 68 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    },
    rebelLeader: {
      weapon: { itemId: 'leader-axe', level: 5, exp: 82 },
      armor: { itemId: 'reinforced-lamellar', level: 5, exp: 76 },
      accessory: { itemId: 'war-manual', level: 1, exp: 0 }
    }
  };
  const moveByClass: Record<UnitClassKey, number> = {
    lord: 4,
    infantry: 3,
    cavalry: 5,
    spearman: 3,
    archer: 3,
    strategist: 4,
    quartermaster: 4,
    bandit: 4,
    yellowTurban: 3,
    rebelLeader: 4
  };
  const statLift = Math.max(0, level - 52) * 2;

  return {
    id,
    name,
    faction: 'enemy',
    className,
    classKey,
    level,
    exp: Math.min(98, 84 + statLift),
    hp,
    maxHp: hp,
    attack,
    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
  };
};

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, 148, 55, 18, 39),
  createThirtyFirstEnemyUnit('luo-main-scout-b', '낙성 정찰병', '수로 정찰병', 'bandit', 53, 148, 55, 23, 36),
  createThirtyFirstEnemyUnit('luo-main-infantry-a', '낙성 보병', '외성 보병', 'yellowTurban', 54, 210, 66, 28, 34),
  createThirtyFirstEnemyUnit('luo-main-infantry-b', '낙성 보병', '외성 보병', 'yellowTurban', 54, 210, 66, 33, 32),
  createThirtyFirstEnemyUnit('luo-main-infantry-c', '낙성 보병', '성문 보병', 'yellowTurban', 55, 220, 68, 40, 28),
  createThirtyFirstEnemyUnit('luo-main-infantry-d', '낙성 보병', '성문 보병', 'yellowTurban', 55, 220, 68, 44, 26),
  createThirtyFirstEnemyUnit('luo-main-infantry-e', '낙성 보병', '내성 보병', 'yellowTurban', 56, 230, 70, 51, 23),
  createThirtyFirstEnemyUnit('luo-main-archer-a', '낙성 궁병', '외벽 궁병', 'archer', 54, 146, 55, 31, 29),
  createThirtyFirstEnemyUnit('luo-main-archer-b', '낙성 궁병', '성벽 궁병', 'archer', 55, 152, 56, 42, 22),
  createThirtyFirstEnemyUnit('luo-main-archer-c', '낙성 궁병', '성벽 궁병', 'archer', 55, 152, 56, 49, 18),
  createThirtyFirstEnemyUnit('luo-main-archer-d', '낙성 궁병', '내성 궁병', 'archer', 56, 158, 58, 55, 24),
  createThirtyFirstEnemyUnit('luo-main-cavalry-a', '낙성 기병', '우익 기병', 'cavalry', 55, 220, 70, 29, 40),
  createThirtyFirstEnemyUnit('luo-main-cavalry-b', '낙성 기병', '좌익 기병', 'cavalry', 55, 220, 70, 39, 36),
  createThirtyFirstEnemyUnit('luo-main-cavalry-c', '낙성 기병', '내성 기병', 'cavalry', 56, 232, 72, 53, 29),
  createThirtyFirstEnemyUnit('luo-main-guard-a', '장임 친위대', '성문 친위대', 'yellowTurban', 56, 236, 72, 48, 21),
  createThirtyFirstEnemyUnit('luo-main-guard-b', '장임 친위대', '성문 친위대', 'yellowTurban', 56, 236, 72, 51, 20),
  createThirtyFirstEnemyUnit('luo-main-guard-c', '장임 친위대', '내성 친위대', 'yellowTurban', 57, 246, 74, 56, 19),
  createThirtyFirstEnemyUnit('luo-main-strategist-a', '낙성 책사', '성문 책사', 'strategist', 55, 150, 56, 45, 18),
  createThirtyFirstEnemyUnit('luo-main-strategist-b', '낙성 책사', '내성 책사', 'strategist', 56, 156, 58, 55, 15),
  createThirtyFirstEnemyUnit('luo-main-ambusher-a', '낙성 복병', '남벽 복병', 'bandit', 54, 156, 58, 34, 39),
  createThirtyFirstEnemyUnit('luo-main-ambusher-b', '낙성 복병', '동문 복병', 'bandit', 54, 156, 58, 48, 32),
  createThirtyFirstEnemyUnit('luo-main-ambusher-c', '낙성 복병', '북벽 복병', 'bandit', 55, 164, 60, 57, 11),
  createThirtyFirstEnemyUnit('luo-main-veteran-yan-yan', '엄안', '익주 노장', 'archer', 57, 210, 68, 50, 22),
  createThirtyFirstEnemyUnit('luo-main-officer-a', '낙성 부장', '성문 부장', 'rebelLeader', 57, 260, 75, 54, 20),
  createThirtyFirstEnemyUnit('luo-main-leader-zhang-ren', '장임', '낙성 본성 주장', 'rebelLeader', 58, 286, 78, 58, 18)
];

const thirtySecondBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 4, y: 40 },
  'guan-yu': { x: 5, y: 38 },
  'zhang-fei': { x: 4, y: 42 },
  'jian-yong': { x: 3, y: 43 },
  'mi-zhu': { x: 5, y: 44 },
  'sun-qian': { x: 7, y: 43 },
  'zhao-yun': { x: 8, y: 39 },
  'zhuge-liang': { x: 6, y: 38 },
  'ma-liang': { x: 8, y: 44 },
  'yi-ji': { x: 9, y: 41 },
  'gong-zhi': { x: 10, y: 44 },
  'huang-zhong': { x: 7, y: 40 },
  'wei-yan': { x: 10, y: 38 },
  'pang-tong': { x: 9, y: 39 },
  'fa-zheng': { x: 11, y: 41 },
  'wu-yi': { x: 12, y: 39 },
  'yan-yan': { x: 11, y: 37 }
};

export const thirtySecondBattleUnits: UnitData[] = [
  ...[
    ...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
    ...xuzhouRecruitUnits,
    ...caoBreakRecruitUnits,
    ...liuBiaoRecruitUnits,
    ...zhugeRecruitUnits,
    ...jingzhouRecruitUnits,
    ...guiyangRecruitUnits,
    ...wulingRecruitUnits,
    ...changshaRecruitUnits,
    ...yizhouRecruitUnits,
    ...fuPassRecruitUnits,
    ...luoCastleRecruitUnits,
    ...luoCastleProperRecruitUnits
  ].map((unit) => placeScenarioUnit(unit, thirtySecondBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  createThirtyFirstEnemyUnit('chengdu-scout-a', '성도 정찰병', '남로 정찰병', 'bandit', 56, 164, 60, 18, 39),
  createThirtyFirstEnemyUnit('chengdu-scout-b', '성도 정찰병', '수로 정찰병', 'bandit', 56, 164, 60, 24, 36),
  createThirtyFirstEnemyUnit('chengdu-scout-c', '성도 정찰병', '산길 정찰병', 'bandit', 57, 172, 62, 31, 35),
  createThirtyFirstEnemyUnit('chengdu-infantry-a', '면죽관 보병', '외곽 보병', 'yellowTurban', 57, 236, 74, 29, 33),
  createThirtyFirstEnemyUnit('chengdu-infantry-b', '면죽관 보병', '외곽 보병', 'yellowTurban', 57, 236, 74, 34, 31),
  createThirtyFirstEnemyUnit('chengdu-infantry-c', '면죽관 보병', '관문 보병', 'yellowTurban', 58, 246, 76, 41, 27),
  createThirtyFirstEnemyUnit('chengdu-infantry-d', '면죽관 보병', '관문 보병', 'yellowTurban', 58, 246, 76, 45, 25),
  createThirtyFirstEnemyUnit('chengdu-infantry-e', '성도 보병', '내곽 보병', 'yellowTurban', 59, 256, 78, 53, 22),
  createThirtyFirstEnemyUnit('chengdu-infantry-f', '성도 보병', '창고 보병', 'yellowTurban', 59, 256, 78, 57, 25),
  createThirtyFirstEnemyUnit('chengdu-archer-a', '면죽관 궁병', '숲길 궁병', 'archer', 57, 160, 60, 31, 29),
  createThirtyFirstEnemyUnit('chengdu-archer-b', '면죽관 궁병', '성벽 궁병', 'archer', 58, 166, 62, 43, 21),
  createThirtyFirstEnemyUnit('chengdu-archer-c', '성도 궁병', '고지 궁병', 'archer', 58, 166, 62, 50, 18),
  createThirtyFirstEnemyUnit('chengdu-archer-d', '성도 궁병', '창고 궁병', 'archer', 59, 174, 64, 58, 23),
  createThirtyFirstEnemyUnit('chengdu-cavalry-a', '성도 기병', '우익 기병', 'cavalry', 58, 246, 78, 28, 41),
  createThirtyFirstEnemyUnit('chengdu-cavalry-b', '성도 기병', '좌익 기병', 'cavalry', 58, 246, 78, 40, 36),
  createThirtyFirstEnemyUnit('chengdu-cavalry-c', '성도 기병', '내성 기병', 'cavalry', 59, 258, 80, 55, 30),
  createThirtyFirstEnemyUnit('chengdu-guard-a', '이엄 친위대', '관문 친위대', 'yellowTurban', 59, 266, 80, 48, 22),
  createThirtyFirstEnemyUnit('chengdu-guard-b', '이엄 친위대', '관문 친위대', 'yellowTurban', 59, 266, 80, 52, 21),
  createThirtyFirstEnemyUnit('chengdu-guard-c', '이엄 친위대', '성도 친위대', 'yellowTurban', 60, 276, 82, 58, 19),
  createThirtyFirstEnemyUnit('chengdu-strategist-a', '성도 책사', '항복 반대파', 'strategist', 58, 166, 62, 45, 18),
  createThirtyFirstEnemyUnit('chengdu-strategist-b', '성도 책사', '창고 책사', 'strategist', 59, 174, 64, 55, 15),
  createThirtyFirstEnemyUnit('chengdu-ambusher-a', '성도 복병', '남벽 복병', 'bandit', 57, 174, 64, 35, 39),
  createThirtyFirstEnemyUnit('chengdu-ambusher-b', '성도 복병', '동문 복병', 'bandit', 57, 174, 64, 49, 33),
  createThirtyFirstEnemyUnit('chengdu-ambusher-c', '성도 복병', '북벽 복병', 'bandit', 58, 182, 66, 59, 11),
  createThirtyFirstEnemyUnit('chengdu-officer-fei-guan', '비관', '익주 부장', 'rebelLeader', 60, 286, 84, 55, 20),
  createThirtyFirstEnemyUnit('chengdu-leader-li-yan', '이엄', '면죽관 수비장', 'rebelLeader', 61, 306, 86, 60, 18)
];

const thirtyThirdBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 4, y: 42 },
  'guan-yu': { x: 5, y: 40 },
  'zhang-fei': { x: 4, y: 44 },
  'jian-yong': { x: 3, y: 45 },
  'mi-zhu': { x: 5, y: 46 },
  'sun-qian': { x: 7, y: 45 },
  'zhao-yun': { x: 8, y: 41 },
  'zhuge-liang': { x: 6, y: 40 },
  'ma-liang': { x: 8, y: 46 },
  'yi-ji': { x: 9, y: 43 },
  'gong-zhi': { x: 10, y: 46 },
  'huang-zhong': { x: 7, y: 42 },
  'wei-yan': { x: 10, y: 40 },
  'pang-tong': { x: 9, y: 41 },
  'fa-zheng': { x: 11, y: 43 },
  'wu-yi': { x: 12, y: 41 },
  'yan-yan': { x: 11, y: 39 },
  'li-yan': { x: 13, y: 40 }
};

export const thirtyThirdBattleUnits: UnitData[] = [
  ...[
    ...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
    ...xuzhouRecruitUnits,
    ...caoBreakRecruitUnits,
    ...liuBiaoRecruitUnits,
    ...zhugeRecruitUnits,
    ...jingzhouRecruitUnits,
    ...guiyangRecruitUnits,
    ...wulingRecruitUnits,
    ...changshaRecruitUnits,
    ...yizhouRecruitUnits,
    ...fuPassRecruitUnits,
    ...luoCastleRecruitUnits,
    ...luoCastleProperRecruitUnits,
    ...chengduPressureRecruitUnits
  ].map((unit) => placeScenarioUnit(unit, thirtyThirdBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  createThirtyFirstEnemyUnit('chengdu-final-scout-a', '성도 척후', '남문 척후', 'bandit', 60, 182, 66, 19, 41),
  createThirtyFirstEnemyUnit('chengdu-final-scout-b', '성도 척후', '서문 척후', 'bandit', 60, 182, 66, 25, 39),
  createThirtyFirstEnemyUnit('chengdu-final-scout-c', '성도 척후', '수로 척후', 'bandit', 61, 190, 68, 32, 37),
  createThirtyFirstEnemyUnit('chengdu-final-infantry-a', '성도 보병', '외곽 보병', 'yellowTurban', 61, 266, 82, 31, 34),
  createThirtyFirstEnemyUnit('chengdu-final-infantry-b', '성도 보병', '외곽 보병', 'yellowTurban', 61, 266, 82, 36, 33),
  createThirtyFirstEnemyUnit('chengdu-final-infantry-c', '성도 보병', '남문 보병', 'yellowTurban', 62, 276, 84, 43, 28),
  createThirtyFirstEnemyUnit('chengdu-final-infantry-d', '성도 보병', '남문 보병', 'yellowTurban', 62, 276, 84, 47, 27),
  createThirtyFirstEnemyUnit('chengdu-final-infantry-e', '유장 친위대', '성문 친위대', 'yellowTurban', 63, 288, 86, 55, 23),
  createThirtyFirstEnemyUnit('chengdu-final-infantry-f', '유장 친위대', '창고 친위대', 'yellowTurban', 63, 288, 86, 60, 25),
  createThirtyFirstEnemyUnit('chengdu-final-archer-a', '성도 궁병', '성벽 궁병', 'archer', 61, 182, 66, 34, 31),
  createThirtyFirstEnemyUnit('chengdu-final-archer-b', '성도 궁병', '남문 궁병', 'archer', 62, 190, 68, 46, 23),
  createThirtyFirstEnemyUnit('chengdu-final-archer-c', '성도 궁병', '고지 궁병', 'archer', 62, 190, 68, 52, 18),
  createThirtyFirstEnemyUnit('chengdu-final-archer-d', '성도 궁병', '창고 궁병', 'archer', 63, 198, 70, 61, 20),
  createThirtyFirstEnemyUnit('chengdu-final-cavalry-a', '성도 기병', '우익 기병', 'cavalry', 62, 276, 86, 28, 43),
  createThirtyFirstEnemyUnit('chengdu-final-cavalry-b', '성도 기병', '좌익 기병', 'cavalry', 62, 276, 86, 43, 38),
  createThirtyFirstEnemyUnit('chengdu-final-cavalry-c', '성도 기병', '내성 기병', 'cavalry', 63, 288, 88, 58, 31),
  createThirtyFirstEnemyUnit('chengdu-final-guard-a', '황권 친위대', '권고 반대파', 'yellowTurban', 63, 300, 88, 50, 22),
  createThirtyFirstEnemyUnit('chengdu-final-guard-b', '황권 친위대', '권고 반대파', 'yellowTurban', 63, 300, 88, 54, 21),
  createThirtyFirstEnemyUnit('chengdu-final-guard-c', '황권 친위대', '성도 친위대', 'yellowTurban', 64, 312, 90, 60, 18),
  createThirtyFirstEnemyUnit('chengdu-final-strategist-a', '성도 책사', '항복 반대파', 'strategist', 62, 190, 68, 48, 19),
  createThirtyFirstEnemyUnit('chengdu-final-strategist-b', '성도 책사', '유장 사자', 'strategist', 63, 198, 70, 57, 16),
  createThirtyFirstEnemyUnit('chengdu-final-ambusher-a', '성도 복병', '남벽 복병', 'bandit', 61, 190, 70, 37, 41),
  createThirtyFirstEnemyUnit('chengdu-final-ambusher-b', '성도 복병', '동문 복병', 'bandit', 61, 190, 70, 51, 35),
  createThirtyFirstEnemyUnit('chengdu-final-ambusher-c', '성도 복병', '북벽 복병', 'bandit', 62, 198, 72, 62, 12),
  createThirtyFirstEnemyUnit('chengdu-final-officer-a', '성도 부장', '남문 부장', 'rebelLeader', 64, 318, 92, 58, 22),
  createThirtyFirstEnemyUnit('chengdu-final-leader-huang-quan', '황권', '성도 수비 참모', 'rebelLeader', 65, 336, 94, 62, 18)
];

const thirtyFourthBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 4, y: 44 },
  'guan-yu': { x: 5, y: 42 },
  'zhang-fei': { x: 4, y: 46 },
  'jian-yong': { x: 3, y: 47 },
  'mi-zhu': { x: 5, y: 48 },
  'sun-qian': { x: 7, y: 47 },
  'zhao-yun': { x: 8, y: 43 },
  'zhuge-liang': { x: 6, y: 42 },
  'ma-liang': { x: 8, y: 48 },
  'yi-ji': { x: 9, y: 45 },
  'gong-zhi': { x: 10, y: 48 },
  'huang-zhong': { x: 7, y: 44 },
  'wei-yan': { x: 10, y: 42 },
  'pang-tong': { x: 9, y: 43 },
  'fa-zheng': { x: 11, y: 45 },
  'wu-yi': { x: 12, y: 43 },
  'yan-yan': { x: 11, y: 41 },
  'li-yan': { x: 13, y: 42 },
  'huang-quan': { x: 14, y: 44 }
};

export const thirtyFourthBattleUnits: UnitData[] = [
  ...[
    ...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
    ...xuzhouRecruitUnits,
    ...caoBreakRecruitUnits,
    ...liuBiaoRecruitUnits,
    ...zhugeRecruitUnits,
    ...jingzhouRecruitUnits,
    ...guiyangRecruitUnits,
    ...wulingRecruitUnits,
    ...changshaRecruitUnits,
    ...yizhouRecruitUnits,
    ...fuPassRecruitUnits,
    ...luoCastleRecruitUnits,
    ...luoCastleProperRecruitUnits,
    ...chengduPressureRecruitUnits,
    ...chengduSurrenderRecruitUnits
  ].map((unit) => placeScenarioUnit(unit, thirtyFourthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  createThirtyFirstEnemyUnit('jiameng-scout-a', '한중 척후', '산길 척후', 'bandit', 64, 198, 72, 18, 43),
  createThirtyFirstEnemyUnit('jiameng-scout-b', '한중 척후', '관문 척후', 'bandit', 64, 198, 72, 26, 41),
  createThirtyFirstEnemyUnit('jiameng-scout-c', '한중 척후', '수로 척후', 'bandit', 65, 206, 74, 34, 39),
  createThirtyFirstEnemyUnit('jiameng-infantry-a', '장로 보병', '외곽 보병', 'yellowTurban', 65, 288, 88, 33, 36),
  createThirtyFirstEnemyUnit('jiameng-infantry-b', '장로 보병', '외곽 보병', 'yellowTurban', 65, 288, 88, 38, 35),
  createThirtyFirstEnemyUnit('jiameng-infantry-c', '가맹관 보병', '관문 보병', 'yellowTurban', 66, 300, 90, 45, 30),
  createThirtyFirstEnemyUnit('jiameng-infantry-d', '가맹관 보병', '관문 보병', 'yellowTurban', 66, 300, 90, 49, 29),
  createThirtyFirstEnemyUnit('jiameng-archer-a', '한중 궁병', '산허리 궁병', 'archer', 65, 206, 74, 36, 32),
  createThirtyFirstEnemyUnit('jiameng-archer-b', '한중 궁병', '관문 궁병', 'archer', 66, 214, 76, 47, 24),
  createThirtyFirstEnemyUnit('jiameng-archer-c', '한중 궁병', '고지 궁병', 'archer', 66, 214, 76, 55, 19),
  createThirtyFirstEnemyUnit('jiameng-cavalry-a', '서량 기병', '좌익 기병', 'cavalry', 66, 304, 92, 30, 45),
  createThirtyFirstEnemyUnit('jiameng-cavalry-b', '서량 기병', '우익 기병', 'cavalry', 66, 304, 92, 44, 40),
  createThirtyFirstEnemyUnit('jiameng-cavalry-c', '서량 기병', '돌격 기병', 'cavalry', 67, 316, 94, 56, 33),
  createThirtyFirstEnemyUnit('jiameng-cavalry-d', '서량 기병', '친위 기병', 'cavalry', 67, 316, 94, 61, 26),
  createThirtyFirstEnemyUnit('jiameng-guard-a', '마초 친위대', '돌격 친위대', 'yellowTurban', 67, 326, 96, 53, 24),
  createThirtyFirstEnemyUnit('jiameng-guard-b', '마초 친위대', '관문 친위대', 'yellowTurban', 67, 326, 96, 58, 23),
  createThirtyFirstEnemyUnit('jiameng-strategist-a', '한중 책사', '장로 사자', 'strategist', 66, 214, 76, 50, 20),
  createThirtyFirstEnemyUnit('jiameng-strategist-b', '한중 책사', '관문 책사', 'strategist', 67, 222, 78, 60, 18),
  createThirtyFirstEnemyUnit('jiameng-ambusher-a', '한중 복병', '남령 복병', 'bandit', 65, 206, 76, 39, 43),
  createThirtyFirstEnemyUnit('jiameng-ambusher-b', '한중 복병', '동령 복병', 'bandit', 65, 206, 76, 52, 37),
  createThirtyFirstEnemyUnit('jiameng-officer-pang-de', '방덕', '서량 부장', 'rebelLeader', 68, 344, 98, 59, 25),
  createThirtyFirstEnemyUnit('jiameng-leader-ma-chao', '마초', '서량 기병장', 'rebelLeader', 69, 364, 102, 63, 20)
];

const thirtyFifthBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 4, y: 46 },
  'guan-yu': { x: 5, y: 44 },
  'zhang-fei': { x: 4, y: 48 },
  'jian-yong': { x: 3, y: 49 },
  'mi-zhu': { x: 5, y: 50 },
  'sun-qian': { x: 7, y: 49 },
  'zhao-yun': { x: 8, y: 45 },
  'zhuge-liang': { x: 6, y: 44 },
  'ma-liang': { x: 8, y: 50 },
  'yi-ji': { x: 9, y: 47 },
  'gong-zhi': { x: 10, y: 50 },
  'huang-zhong': { x: 7, y: 46 },
  'wei-yan': { x: 10, y: 44 },
  'pang-tong': { x: 9, y: 45 },
  'fa-zheng': { x: 11, y: 47 },
  'wu-yi': { x: 12, y: 45 },
  'yan-yan': { x: 11, y: 43 },
  'li-yan': { x: 13, y: 44 },
  'huang-quan': { x: 14, y: 46 },
  'ma-chao': { x: 13, y: 42 }
};

export const thirtyFifthBattleUnits: UnitData[] = [
  ...[
    ...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
    ...xuzhouRecruitUnits,
    ...caoBreakRecruitUnits,
    ...liuBiaoRecruitUnits,
    ...zhugeRecruitUnits,
    ...jingzhouRecruitUnits,
    ...guiyangRecruitUnits,
    ...wulingRecruitUnits,
    ...changshaRecruitUnits,
    ...yizhouRecruitUnits,
    ...fuPassRecruitUnits,
    ...luoCastleRecruitUnits,
    ...luoCastleProperRecruitUnits,
    ...chengduPressureRecruitUnits,
    ...chengduSurrenderRecruitUnits,
    ...hanzhongOpeningRecruitUnits
  ].map((unit) => placeScenarioUnit(unit, thirtyFifthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  createThirtyFirstEnemyUnit('yangping-scout-a', '양평관 척후', '서쪽 척후', 'bandit', 68, 214, 76, 19, 45),
  createThirtyFirstEnemyUnit('yangping-scout-b', '양평관 척후', '강변 척후', 'bandit', 68, 214, 76, 27, 43),
  createThirtyFirstEnemyUnit('yangping-scout-c', '양평관 척후', '산허리 척후', 'bandit', 69, 222, 78, 36, 41),
  createThirtyFirstEnemyUnit('yangping-infantry-a', '장로 보병', '서문 보병', 'yellowTurban', 69, 316, 94, 35, 38),
  createThirtyFirstEnemyUnit('yangping-infantry-b', '장로 보병', '강변 보병', 'yellowTurban', 69, 316, 94, 40, 37),
  createThirtyFirstEnemyUnit('yangping-infantry-c', '양평관 보병', '관문 보병', 'yellowTurban', 70, 328, 96, 47, 33),
  createThirtyFirstEnemyUnit('yangping-infantry-d', '양평관 보병', '관문 보병', 'yellowTurban', 70, 328, 96, 51, 31),
  createThirtyFirstEnemyUnit('yangping-infantry-e', '한중 보병', '창고 보병', 'yellowTurban', 71, 340, 98, 61, 28),
  createThirtyFirstEnemyUnit('yangping-archer-a', '한중 궁병', '서벽 궁병', 'archer', 69, 222, 78, 38, 35),
  createThirtyFirstEnemyUnit('yangping-archer-b', '한중 궁병', '관문 궁병', 'archer', 70, 230, 80, 50, 27),
  createThirtyFirstEnemyUnit('yangping-archer-c', '한중 궁병', '고지 궁병', 'archer', 70, 230, 80, 58, 22),
  createThirtyFirstEnemyUnit('yangping-archer-d', '한중 궁병', '창고 궁병', 'archer', 71, 238, 82, 64, 30),
  createThirtyFirstEnemyUnit('yangping-cavalry-a', '한중 기병', '좌익 기병', 'cavalry', 70, 332, 98, 31, 47),
  createThirtyFirstEnemyUnit('yangping-cavalry-b', '한중 기병', '우익 기병', 'cavalry', 70, 332, 98, 45, 42),
  createThirtyFirstEnemyUnit('yangping-cavalry-c', '한중 기병', '돌격 기병', 'cavalry', 71, 344, 100, 57, 36),
  createThirtyFirstEnemyUnit('yangping-cavalry-d', '한중 기병', '친위 기병', 'cavalry', 71, 344, 100, 65, 31),
  createThirtyFirstEnemyUnit('yangping-guard-a', '장로 친위대', '서문 친위대', 'yellowTurban', 71, 356, 102, 55, 27),
  createThirtyFirstEnemyUnit('yangping-guard-b', '장로 친위대', '창고 친위대', 'yellowTurban', 71, 356, 102, 62, 26),
  createThirtyFirstEnemyUnit('yangping-strategist-a', '한중 책사', '도술 책사', 'strategist', 70, 230, 80, 53, 23),
  createThirtyFirstEnemyUnit('yangping-strategist-b', '한중 책사', '장로 사자', 'strategist', 71, 238, 82, 64, 20),
  createThirtyFirstEnemyUnit('yangping-ambusher-a', '한중 복병', '남령 복병', 'bandit', 69, 224, 80, 41, 45),
  createThirtyFirstEnemyUnit('yangping-ambusher-b', '한중 복병', '동령 복병', 'bandit', 69, 224, 80, 54, 39),
  createThirtyFirstEnemyUnit('yangping-officer-yan-pu', '염포', '한중 참모', 'strategist', 72, 252, 86, 60, 24),
  createThirtyFirstEnemyUnit('yangping-leader-zhang-wei', '장위', '양평관 선봉장', 'rebelLeader', 73, 382, 108, 66, 24)
];

const thirtySixthBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 4, y: 48 },
  'guan-yu': { x: 5, y: 46 },
  'zhang-fei': { x: 4, y: 50 },
  'jian-yong': { x: 3, y: 51 },
  'mi-zhu': { x: 5, y: 52 },
  'sun-qian': { x: 7, y: 51 },
  'zhao-yun': { x: 8, y: 47 },
  'zhuge-liang': { x: 6, y: 46 },
  'ma-liang': { x: 8, y: 52 },
  'yi-ji': { x: 9, y: 49 },
  'gong-zhi': { x: 10, y: 52 },
  'huang-zhong': { x: 7, y: 48 },
  'wei-yan': { x: 10, y: 46 },
  'pang-tong': { x: 9, y: 47 },
  'fa-zheng': { x: 11, y: 49 },
  'wu-yi': { x: 12, y: 47 },
  'yan-yan': { x: 11, y: 45 },
  'li-yan': { x: 13, y: 46 },
  'huang-quan': { x: 14, y: 48 },
  'ma-chao': { x: 13, y: 44 },
  'ma-dai': { x: 15, y: 45 }
};

export const thirtySixthBattleUnits: UnitData[] = [
  ...[
    ...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
    ...xuzhouRecruitUnits,
    ...caoBreakRecruitUnits,
    ...liuBiaoRecruitUnits,
    ...zhugeRecruitUnits,
    ...jingzhouRecruitUnits,
    ...guiyangRecruitUnits,
    ...wulingRecruitUnits,
    ...changshaRecruitUnits,
    ...yizhouRecruitUnits,
    ...fuPassRecruitUnits,
    ...luoCastleRecruitUnits,
    ...luoCastleProperRecruitUnits,
    ...chengduPressureRecruitUnits,
    ...chengduSurrenderRecruitUnits,
    ...hanzhongOpeningRecruitUnits,
    ...hanzhongScoutRecruitUnits
  ].map((unit) => placeScenarioUnit(unit, thirtySixthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  createThirtyFirstEnemyUnit('dingjun-scout-a', '정군산 척후', '서령 척후', 'bandit', 72, 238, 82, 20, 47),
  createThirtyFirstEnemyUnit('dingjun-scout-b', '정군산 척후', '산길 척후', 'bandit', 72, 238, 82, 29, 45),
  createThirtyFirstEnemyUnit('dingjun-scout-c', '정군산 척후', '강변 척후', 'bandit', 73, 246, 84, 38, 43),
  createThirtyFirstEnemyUnit('dingjun-infantry-a', '조조 보병', '서령 보병', 'yellowTurban', 73, 348, 100, 36, 40),
  createThirtyFirstEnemyUnit('dingjun-infantry-b', '조조 보병', '중턱 보병', 'yellowTurban', 73, 348, 100, 42, 39),
  createThirtyFirstEnemyUnit('dingjun-infantry-c', '하후연 보병', '능선 보병', 'yellowTurban', 74, 360, 104, 49, 35),
  createThirtyFirstEnemyUnit('dingjun-infantry-d', '하후연 보병', '본진 보병', 'yellowTurban', 74, 360, 104, 53, 33),
  createThirtyFirstEnemyUnit('dingjun-infantry-e', '정군산 보병', '창고 보병', 'yellowTurban', 75, 372, 106, 63, 30),
  createThirtyFirstEnemyUnit('dingjun-archer-a', '조조 궁병', '서벽 궁병', 'archer', 73, 246, 84, 39, 37),
  createThirtyFirstEnemyUnit('dingjun-archer-b', '조조 궁병', '능선 궁병', 'archer', 74, 254, 86, 51, 29),
  createThirtyFirstEnemyUnit('dingjun-archer-c', '조조 궁병', '고지 궁병', 'archer', 74, 254, 86, 60, 24),
  createThirtyFirstEnemyUnit('dingjun-archer-d', '조조 궁병', '창고 궁병', 'archer', 75, 262, 88, 66, 32),
  createThirtyFirstEnemyUnit('dingjun-cavalry-a', '조조 기병', '좌익 기병', 'cavalry', 74, 364, 104, 32, 49),
  createThirtyFirstEnemyUnit('dingjun-cavalry-b', '조조 기병', '우익 기병', 'cavalry', 74, 364, 104, 47, 44),
  createThirtyFirstEnemyUnit('dingjun-cavalry-c', '하후연 기병', '돌격 기병', 'cavalry', 75, 376, 106, 59, 38),
  createThirtyFirstEnemyUnit('dingjun-cavalry-d', '하후연 기병', '친위 기병', 'cavalry', 75, 376, 106, 67, 33),
  createThirtyFirstEnemyUnit('dingjun-guard-a', '하후연 친위대', '능선 친위대', 'yellowTurban', 75, 388, 108, 56, 29),
  createThirtyFirstEnemyUnit('dingjun-guard-b', '하후연 친위대', '본진 친위대', 'yellowTurban', 75, 388, 108, 64, 28),
  createThirtyFirstEnemyUnit('dingjun-strategist-a', '조조 책사', '고지 책사', 'strategist', 74, 254, 88, 54, 25),
  createThirtyFirstEnemyUnit('dingjun-strategist-b', '조조 책사', '본진 책사', 'strategist', 75, 262, 90, 66, 22),
  createThirtyFirstEnemyUnit('dingjun-ambusher-a', '조조 복병', '남령 복병', 'bandit', 73, 248, 86, 43, 47),
  createThirtyFirstEnemyUnit('dingjun-ambusher-b', '조조 복병', '동령 복병', 'bandit', 73, 248, 86, 56, 41),
  createThirtyFirstEnemyUnit('dingjun-officer-zhang-he', '장합', '조조 선봉장', 'cavalry', 76, 392, 112, 61, 27),
  createThirtyFirstEnemyUnit('dingjun-officer-wang-ping', '왕평', '한중 길잡이', 'spearman', 75, 330, 100, 58, 31),
  createThirtyFirstEnemyUnit('dingjun-leader-xiahou-yuan', '하후연', '정군산 주장', 'rebelLeader', 77, 418, 116, 68, 25)
];

const thirtySeventhBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 4, y: 50 },
  'guan-yu': { x: 5, y: 48 },
  'zhang-fei': { x: 4, y: 52 },
  'jian-yong': { x: 3, y: 53 },
  'mi-zhu': { x: 5, y: 54 },
  'sun-qian': { x: 7, y: 53 },
  'zhao-yun': { x: 8, y: 49 },
  'zhuge-liang': { x: 6, y: 48 },
  'ma-liang': { x: 8, y: 54 },
  'yi-ji': { x: 9, y: 51 },
  'gong-zhi': { x: 10, y: 54 },
  'huang-zhong': { x: 7, y: 50 },
  'wei-yan': { x: 10, y: 48 },
  'pang-tong': { x: 9, y: 49 },
  'fa-zheng': { x: 11, y: 51 },
  'wu-yi': { x: 12, y: 49 },
  'yan-yan': { x: 11, y: 47 },
  'li-yan': { x: 13, y: 48 },
  'huang-quan': { x: 14, y: 50 },
  'ma-chao': { x: 13, y: 46 },
  'ma-dai': { x: 15, y: 47 },
  'wang-ping': { x: 16, y: 49 }
};

export const thirtySeventhBattleUnits: UnitData[] = [
  ...[
    ...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
    ...xuzhouRecruitUnits,
    ...caoBreakRecruitUnits,
    ...liuBiaoRecruitUnits,
    ...zhugeRecruitUnits,
    ...jingzhouRecruitUnits,
    ...guiyangRecruitUnits,
    ...wulingRecruitUnits,
    ...changshaRecruitUnits,
    ...yizhouRecruitUnits,
    ...fuPassRecruitUnits,
    ...luoCastleRecruitUnits,
    ...luoCastleProperRecruitUnits,
    ...chengduPressureRecruitUnits,
    ...chengduSurrenderRecruitUnits,
    ...hanzhongOpeningRecruitUnits,
    ...hanzhongScoutRecruitUnits,
    ...hanzhongMainRecruitUnits
  ].map((unit) => placeScenarioUnit(unit, thirtySeventhBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  createThirtyFirstEnemyUnit('hanzhong-scout-a', '조조 척후', '서곡 척후', 'bandit', 76, 254, 88, 21, 49),
  createThirtyFirstEnemyUnit('hanzhong-scout-b', '조조 척후', '강변 척후', 'bandit', 76, 254, 88, 30, 47),
  createThirtyFirstEnemyUnit('hanzhong-scout-c', '조조 척후', '북로 척후', 'bandit', 77, 262, 90, 40, 45),
  createThirtyFirstEnemyUnit('hanzhong-infantry-a', '조조 보병', '서곡 보병', 'yellowTurban', 77, 386, 110, 36, 42),
  createThirtyFirstEnemyUnit('hanzhong-infantry-b', '조조 보병', '중로 보병', 'yellowTurban', 77, 386, 110, 42, 40),
  createThirtyFirstEnemyUnit('hanzhong-infantry-c', '한중 보병', '능선 보병', 'yellowTurban', 78, 398, 114, 49, 37),
  createThirtyFirstEnemyUnit('hanzhong-infantry-d', '한중 보병', '창고 보병', 'yellowTurban', 78, 398, 114, 56, 34),
  createThirtyFirstEnemyUnit('hanzhong-infantry-e', '조조 보병', '본진 보병', 'yellowTurban', 79, 410, 116, 64, 29),
  createThirtyFirstEnemyUnit('hanzhong-infantry-f', '조조 보병', '퇴로 보병', 'yellowTurban', 79, 410, 116, 69, 24),
  createThirtyFirstEnemyUnit('hanzhong-archer-a', '조조 궁병', '서벽 궁병', 'archer', 77, 270, 92, 39, 39),
  createThirtyFirstEnemyUnit('hanzhong-archer-b', '조조 궁병', '능선 궁병', 'archer', 78, 278, 94, 51, 31),
  createThirtyFirstEnemyUnit('hanzhong-archer-c', '조조 궁병', '고지 궁병', 'archer', 78, 278, 94, 60, 26),
  createThirtyFirstEnemyUnit('hanzhong-archer-d', '조조 궁병', '본진 궁병', 'archer', 79, 286, 96, 68, 22),
  createThirtyFirstEnemyUnit('hanzhong-archer-e', '조조 궁병', '퇴로 궁병', 'archer', 79, 286, 96, 70, 31),
  createThirtyFirstEnemyUnit('hanzhong-cavalry-a', '조조 기병', '좌익 기병', 'cavalry', 78, 410, 116, 31, 50),
  createThirtyFirstEnemyUnit('hanzhong-cavalry-b', '조조 기병', '우익 기병', 'cavalry', 78, 410, 116, 47, 46),
  createThirtyFirstEnemyUnit('hanzhong-cavalry-c', '조조 기병', '돌격 기병', 'cavalry', 79, 422, 118, 59, 40),
  createThirtyFirstEnemyUnit('hanzhong-cavalry-d', '조조 기병', '친위 기병', 'cavalry', 79, 422, 118, 66, 36),
  createThirtyFirstEnemyUnit('hanzhong-cavalry-e', '조조 기병', '북로 기병', 'cavalry', 80, 434, 120, 71, 28),
  createThirtyFirstEnemyUnit('hanzhong-guard-a', '조조 친위대', '능선 친위대', 'yellowTurban', 80, 444, 122, 57, 31),
  createThirtyFirstEnemyUnit('hanzhong-guard-b', '조조 친위대', '본진 친위대', 'yellowTurban', 80, 444, 122, 65, 27),
  createThirtyFirstEnemyUnit('hanzhong-guard-c', '조조 친위대', '퇴로 친위대', 'yellowTurban', 81, 456, 124, 70, 20),
  createThirtyFirstEnemyUnit('hanzhong-strategist-a', '조조 책사', '능선 책사', 'strategist', 78, 278, 96, 54, 27),
  createThirtyFirstEnemyUnit('hanzhong-strategist-b', '조조 책사', '본진 책사', 'strategist', 79, 286, 98, 66, 24),
  createThirtyFirstEnemyUnit('hanzhong-strategist-c', '조조 책사', '퇴로 책사', 'strategist', 80, 294, 100, 71, 18),
  createThirtyFirstEnemyUnit('hanzhong-ambusher-a', '조조 복병', '남령 복병', 'bandit', 77, 264, 92, 43, 49),
  createThirtyFirstEnemyUnit('hanzhong-ambusher-b', '조조 복병', '동령 복병', 'bandit', 77, 264, 92, 56, 43),
  createThirtyFirstEnemyUnit('hanzhong-officer-zhang-he', '장합', '조조 선봉장', 'cavalry', 81, 462, 126, 62, 31),
  createThirtyFirstEnemyUnit('hanzhong-officer-xu-huang', '서황', '조조 우장군', 'rebelLeader', 82, 474, 128, 67, 26),
  createThirtyFirstEnemyUnit('hanzhong-leader-cao-cao', '조조', '위왕', 'rebelLeader', 84, 520, 138, 70, 18)
];

const thirtyEighthBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 5, y: 51 },
  'guan-yu': { x: 9, y: 46 },
  'zhang-fei': { x: 6, y: 53 },
  'jian-yong': { x: 4, y: 54 },
  'mi-zhu': { x: 8, y: 52 },
  'sun-qian': { x: 7, y: 55 },
  'zhao-yun': { x: 11, y: 49 },
  'zhuge-liang': { x: 8, y: 48 },
  'ma-liang': { x: 10, y: 51 },
  'yi-ji': { x: 12, y: 54 },
  'gong-zhi': { x: 13, y: 52 },
  'huang-zhong': { x: 14, y: 48 },
  'wei-yan': { x: 12, y: 46 },
  'pang-tong': { x: 9, y: 49 },
  'fa-zheng': { x: 15, y: 51 },
  'wu-yi': { x: 16, y: 48 },
  'yan-yan': { x: 17, y: 50 },
  'li-yan': { x: 15, y: 46 },
  'huang-quan': { x: 18, y: 52 },
  'ma-chao': { x: 19, y: 47 },
  'ma-dai': { x: 20, y: 49 },
  'wang-ping': { x: 18, y: 45 }
};

export const thirtyEighthBattleUnits: UnitData[] = [
  ...[
    ...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
    ...xuzhouRecruitUnits,
    ...caoBreakRecruitUnits,
    ...liuBiaoRecruitUnits,
    ...zhugeRecruitUnits,
    ...jingzhouRecruitUnits,
    ...guiyangRecruitUnits,
    ...wulingRecruitUnits,
    ...changshaRecruitUnits,
    ...yizhouRecruitUnits,
    ...fuPassRecruitUnits,
    ...luoCastleRecruitUnits,
    ...luoCastleProperRecruitUnits,
    ...chengduPressureRecruitUnits,
    ...chengduSurrenderRecruitUnits,
    ...hanzhongOpeningRecruitUnits,
    ...hanzhongScoutRecruitUnits,
    ...hanzhongMainRecruitUnits
  ].map((unit) => placeScenarioUnit(unit, thirtyEighthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  createThirtyFirstEnemyUnit('jing-defense-wu-scout-a', '오군 척후', '강변 척후', 'bandit', 82, 286, 96, 24, 47),
  createThirtyFirstEnemyUnit('jing-defense-wu-scout-b', '오군 척후', '나루 척후', 'bandit', 82, 286, 96, 32, 45),
  createThirtyFirstEnemyUnit('jing-defense-wei-scout-a', '위군 척후', '북로 척후', 'bandit', 82, 286, 96, 42, 43),
  createThirtyFirstEnemyUnit('jing-defense-wei-scout-b', '위군 척후', '성채 척후', 'bandit', 83, 294, 98, 51, 40),
  createThirtyFirstEnemyUnit('jing-defense-wu-infantry-a', '오군 보병', '나루 보병', 'yellowTurban', 83, 432, 122, 37, 39),
  createThirtyFirstEnemyUnit('jing-defense-wu-infantry-b', '오군 보병', '강변 보병', 'yellowTurban', 83, 432, 122, 44, 38),
  createThirtyFirstEnemyUnit('jing-defense-wei-infantry-a', '위군 보병', '북문 보병', 'yellowTurban', 84, 444, 124, 53, 35),
  createThirtyFirstEnemyUnit('jing-defense-wei-infantry-b', '위군 보병', '성채 보병', 'yellowTurban', 84, 444, 124, 61, 31),
  createThirtyFirstEnemyUnit('jing-defense-wei-infantry-c', '위군 보병', '봉화 보병', 'yellowTurban', 85, 456, 126, 68, 26),
  createThirtyFirstEnemyUnit('jing-defense-wu-archer-a', '오군 궁병', '강안 궁병', 'archer', 83, 298, 100, 39, 41),
  createThirtyFirstEnemyUnit('jing-defense-wu-archer-b', '오군 궁병', '나루 궁병', 'archer', 84, 306, 102, 48, 36),
  createThirtyFirstEnemyUnit('jing-defense-wei-archer-a', '위군 궁병', '성벽 궁병', 'archer', 84, 306, 102, 58, 28),
  createThirtyFirstEnemyUnit('jing-defense-wei-archer-b', '위군 궁병', '봉화 궁병', 'archer', 85, 314, 104, 70, 23),
  createThirtyFirstEnemyUnit('jing-defense-wu-cavalry-a', '오군 기병', '강변 기병', 'cavalry', 84, 446, 126, 31, 49),
  createThirtyFirstEnemyUnit('jing-defense-wu-cavalry-b', '오군 기병', '나루 기병', 'cavalry', 84, 446, 126, 46, 44),
  createThirtyFirstEnemyUnit('jing-defense-wei-cavalry-a', '위군 기병', '북로 기병', 'cavalry', 85, 458, 128, 59, 38),
  createThirtyFirstEnemyUnit('jing-defense-wei-cavalry-b', '위군 기병', '성채 기병', 'cavalry', 85, 458, 128, 68, 33),
  createThirtyFirstEnemyUnit('jing-defense-wu-guard-a', '오군 수비대', '나루 수비대', 'yellowTurban', 85, 468, 130, 55, 34),
  createThirtyFirstEnemyUnit('jing-defense-wu-guard-b', '오군 수비대', '강안 수비대', 'yellowTurban', 85, 468, 130, 63, 36),
  createThirtyFirstEnemyUnit('jing-defense-wei-guard-a', '위군 친위대', '성채 친위대', 'yellowTurban', 86, 480, 132, 66, 25),
  createThirtyFirstEnemyUnit('jing-defense-wei-guard-b', '위군 친위대', '북문 친위대', 'yellowTurban', 86, 480, 132, 71, 20),
  createThirtyFirstEnemyUnit('jing-defense-wu-strategist-a', '오군 책사', '강동 설객', 'strategist', 84, 306, 104, 52, 37),
  createThirtyFirstEnemyUnit('jing-defense-wu-strategist-b', '오군 책사', '나루 책사', 'strategist', 85, 314, 106, 66, 35),
  createThirtyFirstEnemyUnit('jing-defense-wei-strategist-a', '위군 책사', '북로 책사', 'strategist', 85, 314, 106, 63, 24),
  createThirtyFirstEnemyUnit('jing-defense-ambusher-a', '오군 복병', '남안 복병', 'bandit', 83, 300, 102, 36, 51),
  createThirtyFirstEnemyUnit('jing-defense-ambusher-b', '위군 복병', '서림 복병', 'bandit', 83, 300, 102, 49, 46),
  createThirtyFirstEnemyUnit('jing-defense-ambusher-c', '오군 복병', '동림 복병', 'bandit', 84, 308, 104, 60, 42),
  createThirtyFirstEnemyUnit('jing-defense-officer-lu-xun', '육손', '강동 참모', 'strategist', 86, 330, 112, 64, 37),
  createThirtyFirstEnemyUnit('jing-defense-officer-cao-ren', '조인', '위군 수비장', 'rebelLeader', 87, 500, 136, 70, 23),
  createThirtyFirstEnemyUnit('jing-defense-leader-lu-meng', '여몽', '오군 도독', 'rebelLeader', 88, 520, 140, 72, 35)
];

const thirtyNinthBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 5, y: 54 },
  'guan-yu': { x: 10, y: 49 },
  'zhang-fei': { x: 6, y: 56 },
  'jian-yong': { x: 4, y: 57 },
  'mi-zhu': { x: 8, y: 55 },
  'sun-qian': { x: 9, y: 58 },
  'zhao-yun': { x: 13, y: 52 },
  'zhuge-liang': { x: 9, y: 51 },
  'ma-liang': { x: 12, y: 54 },
  'yi-ji': { x: 14, y: 57 },
  'gong-zhi': { x: 15, y: 55 },
  'huang-zhong': { x: 16, y: 50 },
  'wei-yan': { x: 14, y: 48 },
  'pang-tong': { x: 11, y: 52 },
  'fa-zheng': { x: 17, y: 54 },
  'wu-yi': { x: 18, y: 51 },
  'yan-yan': { x: 19, y: 53 },
  'li-yan': { x: 17, y: 48 },
  'huang-quan': { x: 20, y: 55 },
  'ma-chao': { x: 21, y: 49 },
  'ma-dai': { x: 22, y: 51 },
  'wang-ping': { x: 20, y: 47 }
};

export const thirtyNinthBattleUnits: UnitData[] = [
  ...[
    ...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
    ...xuzhouRecruitUnits,
    ...caoBreakRecruitUnits,
    ...liuBiaoRecruitUnits,
    ...zhugeRecruitUnits,
    ...jingzhouRecruitUnits,
    ...guiyangRecruitUnits,
    ...wulingRecruitUnits,
    ...changshaRecruitUnits,
    ...yizhouRecruitUnits,
    ...fuPassRecruitUnits,
    ...luoCastleRecruitUnits,
    ...luoCastleProperRecruitUnits,
    ...chengduPressureRecruitUnits,
    ...chengduSurrenderRecruitUnits,
    ...hanzhongOpeningRecruitUnits,
    ...hanzhongScoutRecruitUnits,
    ...hanzhongMainRecruitUnits
  ].map((unit) => placeScenarioUnit(unit, thirtyNinthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  createThirtyFirstEnemyUnit('fan-castle-scout-a', '조조군 척후', '강변 척후', 'bandit', 85, 306, 102, 28, 51),
  createThirtyFirstEnemyUnit('fan-castle-scout-b', '조조군 척후', '제방 척후', 'bandit', 85, 306, 102, 35, 48),
  createThirtyFirstEnemyUnit('fan-castle-scout-c', '조조군 척후', '북문 척후', 'bandit', 86, 314, 104, 50, 42),
  createThirtyFirstEnemyUnit('fan-castle-infantry-a', '번성 보병', '하류 보병', 'yellowTurban', 86, 462, 130, 40, 44),
  createThirtyFirstEnemyUnit('fan-castle-infantry-b', '번성 보병', '중로 보병', 'yellowTurban', 86, 462, 130, 48, 41),
  createThirtyFirstEnemyUnit('fan-castle-infantry-c', '번성 보병', '성문 보병', 'yellowTurban', 87, 474, 132, 57, 35),
  createThirtyFirstEnemyUnit('fan-castle-infantry-d', '번성 보병', '보루 보병', 'yellowTurban', 87, 474, 132, 63, 31),
  createThirtyFirstEnemyUnit('fan-castle-infantry-e', '번성 보병', '상류 보병', 'yellowTurban', 88, 486, 134, 69, 25),
  createThirtyFirstEnemyUnit('fan-castle-archer-a', '번성 궁병', '제방 궁병', 'archer', 86, 322, 108, 43, 46),
  createThirtyFirstEnemyUnit('fan-castle-archer-b', '번성 궁병', '강안 궁병', 'archer', 87, 330, 110, 53, 38),
  createThirtyFirstEnemyUnit('fan-castle-archer-c', '번성 궁병', '북문 궁병', 'archer', 87, 330, 110, 62, 33),
  createThirtyFirstEnemyUnit('fan-castle-archer-d', '번성 궁병', '보루 궁병', 'archer', 88, 338, 112, 71, 27),
  createThirtyFirstEnemyUnit('fan-castle-archer-e', '번성 궁병', '성벽 궁병', 'archer', 88, 338, 112, 73, 19),
  createThirtyFirstEnemyUnit('fan-castle-cavalry-a', '방덕 기병', '좌익 기병', 'cavalry', 87, 474, 134, 32, 52),
  createThirtyFirstEnemyUnit('fan-castle-cavalry-b', '방덕 기병', '중앙 기병', 'cavalry', 87, 474, 134, 47, 47),
  createThirtyFirstEnemyUnit('fan-castle-cavalry-c', '방덕 기병', '우익 기병', 'cavalry', 88, 486, 136, 58, 41),
  createThirtyFirstEnemyUnit('fan-castle-cavalry-d', '방덕 기병', '북로 기병', 'cavalry', 88, 486, 136, 68, 35),
  createThirtyFirstEnemyUnit('fan-castle-guard-a', '번성 친위대', '외곽 친위대', 'yellowTurban', 89, 512, 140, 59, 32),
  createThirtyFirstEnemyUnit('fan-castle-guard-b', '번성 친위대', '성문 친위대', 'yellowTurban', 89, 512, 140, 66, 28),
  createThirtyFirstEnemyUnit('fan-castle-guard-c', '번성 친위대', '수문 친위대', 'yellowTurban', 90, 524, 142, 70, 22),
  createThirtyFirstEnemyUnit('fan-castle-guard-d', '번성 친위대', '내성 친위대', 'yellowTurban', 90, 524, 142, 74, 17),
  createThirtyFirstEnemyUnit('fan-castle-strategist-a', '조조군 책사', '수로 책사', 'strategist', 87, 338, 114, 55, 39),
  createThirtyFirstEnemyUnit('fan-castle-strategist-b', '조조군 책사', '성문 책사', 'strategist', 88, 346, 116, 66, 30),
  createThirtyFirstEnemyUnit('fan-castle-strategist-c', '조조군 책사', '상류 책사', 'strategist', 89, 354, 118, 72, 21),
  createThirtyFirstEnemyUnit('fan-castle-ambusher-a', '번성 복병', '숲길 복병', 'bandit', 86, 316, 106, 38, 53),
  createThirtyFirstEnemyUnit('fan-castle-ambusher-b', '번성 복병', '둑길 복병', 'bandit', 87, 324, 108, 52, 45),
  createThirtyFirstEnemyUnit('fan-castle-ambusher-c', '번성 복병', '나루 복병', 'bandit', 87, 324, 108, 64, 40),
  createThirtyFirstEnemyUnit('fan-castle-officer-yu-jin', '우금', '조조군 도독', 'rebelLeader', 90, 540, 144, 69, 24),
  createThirtyFirstEnemyUnit('fan-castle-officer-cao-ren', '조인', '번성 수비장', 'rebelLeader', 91, 552, 146, 73, 18),
  createThirtyFirstEnemyUnit('fan-castle-leader-pang-de', '방덕', '번성 선봉장', 'cavalry', 92, 566, 150, 71, 31)
];

const fortiethBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 5, y: 56 },
  'guan-yu': { x: 11, y: 51 },
  'zhang-fei': { x: 6, y: 58 },
  'jian-yong': { x: 4, y: 59 },
  'mi-zhu': { x: 8, y: 57 },
  'sun-qian': { x: 9, y: 60 },
  'zhao-yun': { x: 14, y: 54 },
  'zhuge-liang': { x: 9, y: 53 },
  'ma-liang': { x: 13, y: 56 },
  'yi-ji': { x: 15, y: 59 },
  'gong-zhi': { x: 16, y: 57 },
  'huang-zhong': { x: 17, y: 52 },
  'wei-yan': { x: 15, y: 50 },
  'pang-tong': { x: 12, y: 54 },
  'fa-zheng': { x: 18, y: 56 },
  'wu-yi': { x: 19, y: 53 },
  'yan-yan': { x: 20, y: 55 },
  'li-yan': { x: 18, y: 50 },
  'huang-quan': { x: 21, y: 57 },
  'ma-chao': { x: 22, y: 51 },
  'ma-dai': { x: 23, y: 53 },
  'wang-ping': { x: 21, y: 49 }
};

export const fortiethBattleUnits: UnitData[] = [
  ...[
    ...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
    ...xuzhouRecruitUnits,
    ...caoBreakRecruitUnits,
    ...liuBiaoRecruitUnits,
    ...zhugeRecruitUnits,
    ...jingzhouRecruitUnits,
    ...guiyangRecruitUnits,
    ...wulingRecruitUnits,
    ...changshaRecruitUnits,
    ...yizhouRecruitUnits,
    ...fuPassRecruitUnits,
    ...luoCastleRecruitUnits,
    ...luoCastleProperRecruitUnits,
    ...chengduPressureRecruitUnits,
    ...chengduSurrenderRecruitUnits,
    ...hanzhongOpeningRecruitUnits,
    ...hanzhongScoutRecruitUnits,
    ...hanzhongMainRecruitUnits
  ].map((unit) => placeScenarioUnit(unit, fortiethBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  createThirtyFirstEnemyUnit('han-river-scout-a', '우금군 척후', '둑길 척후', 'bandit', 88, 326, 108, 30, 53),
  createThirtyFirstEnemyUnit('han-river-scout-b', '우금군 척후', '수문 척후', 'bandit', 88, 326, 108, 38, 50),
  createThirtyFirstEnemyUnit('han-river-scout-c', '우금군 척후', '상류 척후', 'bandit', 89, 334, 110, 55, 44),
  createThirtyFirstEnemyUnit('han-river-infantry-a', '우금군 보병', '하류 보병', 'yellowTurban', 89, 492, 138, 42, 46),
  createThirtyFirstEnemyUnit('han-river-infantry-b', '우금군 보병', '둑길 보병', 'yellowTurban', 89, 492, 138, 50, 43),
  createThirtyFirstEnemyUnit('han-river-infantry-c', '우금군 보병', '중앙 보병', 'yellowTurban', 90, 504, 140, 59, 37),
  createThirtyFirstEnemyUnit('han-river-infantry-d', '우금군 보병', '수로 보병', 'yellowTurban', 90, 504, 140, 66, 33),
  createThirtyFirstEnemyUnit('han-river-infantry-e', '우금군 보병', '상류 보병', 'yellowTurban', 91, 516, 142, 72, 27),
  createThirtyFirstEnemyUnit('han-river-archer-a', '우금군 궁병', '제방 궁병', 'archer', 89, 346, 116, 45, 48),
  createThirtyFirstEnemyUnit('han-river-archer-b', '우금군 궁병', '나루 궁병', 'archer', 90, 354, 118, 55, 40),
  createThirtyFirstEnemyUnit('han-river-archer-c', '우금군 궁병', '중앙 궁병', 'archer', 90, 354, 118, 64, 35),
  createThirtyFirstEnemyUnit('han-river-archer-d', '우금군 궁병', '성벽 궁병', 'archer', 91, 362, 120, 73, 29),
  createThirtyFirstEnemyUnit('han-river-archer-e', '우금군 궁병', '상류 궁병', 'archer', 91, 362, 120, 75, 21),
  createThirtyFirstEnemyUnit('han-river-cavalry-a', '방덕 기병', '좌익 기병', 'cavalry', 90, 504, 142, 34, 54),
  createThirtyFirstEnemyUnit('han-river-cavalry-b', '방덕 기병', '둑길 기병', 'cavalry', 90, 504, 142, 49, 49),
  createThirtyFirstEnemyUnit('han-river-cavalry-c', '방덕 기병', '중앙 기병', 'cavalry', 91, 516, 144, 60, 43),
  createThirtyFirstEnemyUnit('han-river-cavalry-d', '방덕 기병', '상류 기병', 'cavalry', 91, 516, 144, 70, 37),
  createThirtyFirstEnemyUnit('han-river-guard-a', '우금군 친위대', '수문 친위대', 'yellowTurban', 92, 548, 148, 61, 34),
  createThirtyFirstEnemyUnit('han-river-guard-b', '우금군 친위대', '본진 친위대', 'yellowTurban', 92, 548, 148, 68, 30),
  createThirtyFirstEnemyUnit('han-river-guard-c', '우금군 친위대', '우금 친위대', 'yellowTurban', 93, 560, 150, 72, 24),
  createThirtyFirstEnemyUnit('han-river-guard-d', '우금군 친위대', '성문 친위대', 'yellowTurban', 93, 560, 150, 76, 18),
  createThirtyFirstEnemyUnit('han-river-strategist-a', '조조군 책사', '수위 책사', 'strategist', 90, 362, 122, 57, 41),
  createThirtyFirstEnemyUnit('han-river-strategist-b', '조조군 책사', '본진 책사', 'strategist', 91, 370, 124, 68, 32),
  createThirtyFirstEnemyUnit('han-river-strategist-c', '조조군 책사', '상류 책사', 'strategist', 92, 378, 126, 74, 23),
  createThirtyFirstEnemyUnit('han-river-ambusher-a', '둑길 복병', '진흙 복병', 'bandit', 89, 336, 112, 40, 55),
  createThirtyFirstEnemyUnit('han-river-ambusher-b', '둑길 복병', '제방 복병', 'bandit', 90, 344, 114, 54, 47),
  createThirtyFirstEnemyUnit('han-river-ambusher-c', '둑길 복병', '나루 복병', 'bandit', 90, 344, 114, 66, 42),
  createThirtyFirstEnemyUnit('han-river-officer-pang-de', '방덕', '조조군 선봉장', 'cavalry', 93, 584, 154, 72, 34),
  createThirtyFirstEnemyUnit('han-river-officer-cao-ren', '조인', '번성 수비장', 'rebelLeader', 94, 588, 154, 76, 19),
  createThirtyFirstEnemyUnit('han-river-leader-yu-jin', '우금', '칠군 총대장', 'rebelLeader', 95, 612, 158, 73, 26)
];

const fortyFirstBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 5, y: 58 },
  'guan-yu': { x: 12, y: 53 },
  'zhang-fei': { x: 6, y: 60 },
  'jian-yong': { x: 4, y: 61 },
  'mi-zhu': { x: 8, y: 59 },
  'sun-qian': { x: 9, y: 62 },
  'zhao-yun': { x: 15, y: 56 },
  'zhuge-liang': { x: 9, y: 55 },
  'ma-liang': { x: 14, y: 58 },
  'yi-ji': { x: 16, y: 61 },
  'gong-zhi': { x: 17, y: 59 },
  'huang-zhong': { x: 18, y: 54 },
  'wei-yan': { x: 16, y: 52 },
  'pang-tong': { x: 13, y: 56 },
  'fa-zheng': { x: 19, y: 58 },
  'wu-yi': { x: 20, y: 55 },
  'yan-yan': { x: 21, y: 57 },
  'li-yan': { x: 19, y: 52 },
  'huang-quan': { x: 22, y: 59 },
  'ma-chao': { x: 23, y: 53 },
  'ma-dai': { x: 24, y: 55 },
  'wang-ping': { x: 22, y: 51 }
};

export const fortyFirstBattleUnits: UnitData[] = [
  ...[
    ...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
    ...xuzhouRecruitUnits,
    ...caoBreakRecruitUnits,
    ...liuBiaoRecruitUnits,
    ...zhugeRecruitUnits,
    ...jingzhouRecruitUnits,
    ...guiyangRecruitUnits,
    ...wulingRecruitUnits,
    ...changshaRecruitUnits,
    ...yizhouRecruitUnits,
    ...fuPassRecruitUnits,
    ...luoCastleRecruitUnits,
    ...luoCastleProperRecruitUnits,
    ...chengduPressureRecruitUnits,
    ...chengduSurrenderRecruitUnits,
    ...hanzhongOpeningRecruitUnits,
    ...hanzhongScoutRecruitUnits,
    ...hanzhongMainRecruitUnits
  ].map((unit) => placeScenarioUnit(unit, fortyFirstBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  createThirtyFirstEnemyUnit('fan-siege-scout-a', '번성 척후', '남문 척후', 'bandit', 91, 354, 116, 31, 54),
  createThirtyFirstEnemyUnit('fan-siege-scout-b', '번성 척후', '수문 척후', 'bandit', 91, 354, 116, 42, 50),
  createThirtyFirstEnemyUnit('fan-siege-scout-c', '번성 척후', '동문 척후', 'bandit', 92, 362, 118, 55, 43),
  createThirtyFirstEnemyUnit('fan-siege-scout-d', '강동 척후', '나루 척후', 'bandit', 92, 362, 118, 26, 56),
  createThirtyFirstEnemyUnit('fan-siege-infantry-a', '번성 보병', '하류 보병', 'yellowTurban', 92, 528, 146, 44, 48),
  createThirtyFirstEnemyUnit('fan-siege-infantry-b', '번성 보병', '외성 보병', 'yellowTurban', 92, 528, 146, 53, 43),
  createThirtyFirstEnemyUnit('fan-siege-infantry-c', '번성 보병', '남문 보병', 'yellowTurban', 93, 540, 148, 62, 37),
  createThirtyFirstEnemyUnit('fan-siege-infantry-d', '번성 보병', '동문 보병', 'yellowTurban', 93, 540, 148, 69, 31),
  createThirtyFirstEnemyUnit('fan-siege-infantry-e', '번성 보병', '내성 보병', 'yellowTurban', 94, 552, 150, 75, 24),
  createThirtyFirstEnemyUnit('fan-siege-infantry-f', '번성 보병', '북문 보병', 'yellowTurban', 94, 552, 150, 78, 16),
  createThirtyFirstEnemyUnit('fan-siege-archer-a', '번성 궁병', '제방 궁병', 'archer', 92, 378, 124, 46, 50),
  createThirtyFirstEnemyUnit('fan-siege-archer-b', '번성 궁병', '외성 궁병', 'archer', 93, 386, 126, 56, 41),
  createThirtyFirstEnemyUnit('fan-siege-archer-c', '번성 궁병', '성벽 궁병', 'archer', 93, 386, 126, 66, 34),
  createThirtyFirstEnemyUnit('fan-siege-archer-d', '번성 궁병', '내성 궁병', 'archer', 94, 394, 128, 74, 28),
  createThirtyFirstEnemyUnit('fan-siege-archer-e', '번성 궁병', '북문 궁병', 'archer', 94, 394, 128, 79, 20),
  createThirtyFirstEnemyUnit('fan-siege-archer-f', '강동 궁병', '강안 궁병', 'archer', 93, 386, 126, 32, 57),
  createThirtyFirstEnemyUnit('fan-siege-cavalry-a', '방덕 기병', '결사 기병', 'cavalry', 94, 552, 150, 38, 55),
  createThirtyFirstEnemyUnit('fan-siege-cavalry-b', '방덕 기병', '중앙 기병', 'cavalry', 94, 552, 150, 51, 48),
  createThirtyFirstEnemyUnit('fan-siege-cavalry-c', '방덕 기병', '동문 기병', 'cavalry', 95, 564, 152, 64, 40),
  createThirtyFirstEnemyUnit('fan-siege-cavalry-d', '조조군 기병', '북로 기병', 'cavalry', 95, 564, 152, 73, 34),
  createThirtyFirstEnemyUnit('fan-siege-cavalry-e', '강동 기병', '나루 기병', 'cavalry', 94, 552, 150, 35, 59),
  createThirtyFirstEnemyUnit('fan-siege-guard-a', '번성 친위대', '외성 친위대', 'yellowTurban', 96, 596, 158, 63, 35),
  createThirtyFirstEnemyUnit('fan-siege-guard-b', '번성 친위대', '성문 친위대', 'yellowTurban', 96, 596, 158, 70, 30),
  createThirtyFirstEnemyUnit('fan-siege-guard-c', '번성 친위대', '수문 친위대', 'yellowTurban', 97, 608, 160, 74, 22),
  createThirtyFirstEnemyUnit('fan-siege-guard-d', '번성 친위대', '내성 친위대', 'yellowTurban', 97, 608, 160, 79, 17),
  createThirtyFirstEnemyUnit('fan-siege-guard-e', '번성 친위대', '조인 친위대', 'yellowTurban', 98, 620, 162, 77, 12),
  createThirtyFirstEnemyUnit('fan-siege-strategist-a', '번성 책사', '수문 책사', 'strategist', 94, 394, 130, 58, 39),
  createThirtyFirstEnemyUnit('fan-siege-strategist-b', '번성 책사', '성문 책사', 'strategist', 95, 402, 132, 69, 26),
  createThirtyFirstEnemyUnit('fan-siege-strategist-c', '강동 책사', '나루 책사', 'strategist', 94, 394, 130, 30, 53),
  createThirtyFirstEnemyUnit('fan-siege-ambusher-a', '성벽 복병', '무너진 담 복병', 'bandit', 92, 364, 120, 47, 45),
  createThirtyFirstEnemyUnit('fan-siege-ambusher-b', '성벽 복병', '마른 해자 복병', 'bandit', 93, 372, 122, 60, 38),
  createThirtyFirstEnemyUnit('fan-siege-ambusher-c', '강동 복병', '강안 복병', 'bandit', 93, 372, 122, 27, 60),
  createThirtyFirstEnemyUnit('fan-siege-officer-pang-de', '방덕', '결사 선봉장', 'cavalry', 98, 648, 168, 61, 32),
  createThirtyFirstEnemyUnit('fan-siege-officer-lu-meng', '여몽', '강동 정찰장', 'rebelLeader', 96, 612, 160, 33, 61),
  createThirtyFirstEnemyUnit('fan-siege-leader-cao-ren', '조인', '번성 수비장', 'rebelLeader', 99, 676, 172, 78, 18)
];

const fortySecondBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 6, y: 59 },
  'guan-yu': { x: 13, y: 54 },
  'zhang-fei': { x: 7, y: 61 },
  'jian-yong': { x: 5, y: 62 },
  'mi-zhu': { x: 9, y: 60 },
  'sun-qian': { x: 10, y: 63 },
  'zhao-yun': { x: 16, y: 57 },
  'zhuge-liang': { x: 10, y: 56 },
  'ma-liang': { x: 15, y: 59 },
  'yi-ji': { x: 17, y: 62 },
  'gong-zhi': { x: 18, y: 60 },
  'huang-zhong': { x: 19, y: 55 },
  'wei-yan': { x: 17, y: 53 },
  'pang-tong': { x: 14, y: 57 },
  'fa-zheng': { x: 20, y: 59 },
  'wu-yi': { x: 21, y: 56 },
  'yan-yan': { x: 22, y: 58 },
  'li-yan': { x: 20, y: 53 },
  'huang-quan': { x: 23, y: 60 },
  'ma-chao': { x: 24, y: 54 },
  'ma-dai': { x: 25, y: 56 },
  'wang-ping': { x: 23, y: 52 }
};

export const fortySecondBattleUnits: 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)
];

const fortyThirdBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 8, y: 61 },
  'guan-yu': { x: 15, y: 56 },
  'zhang-fei': { x: 8, y: 63 },
  'jian-yong': { x: 6, y: 64 },
  'mi-zhu': { x: 11, y: 61 },
  'sun-qian': { x: 12, y: 64 },
  'zhao-yun': { x: 18, y: 58 },
  'zhuge-liang': { x: 12, y: 57 },
  'ma-liang': { x: 17, y: 61 },
  'yi-ji': { x: 19, y: 64 },
  'gong-zhi': { x: 20, y: 62 },
  'huang-zhong': { x: 22, y: 56 },
  'wei-yan': { x: 19, y: 54 },
  'pang-tong': { x: 15, y: 59 },
  'fa-zheng': { x: 23, y: 61 },
  'wu-yi': { x: 24, y: 57 },
  'yan-yan': { x: 25, y: 59 },
  'li-yan': { x: 22, y: 53 },
  'huang-quan': { x: 26, y: 62 },
  'ma-chao': { x: 27, y: 55 },
  'ma-dai': { x: 28, y: 57 },
  'wang-ping': { x: 25, y: 52 }
};

export const fortyThirdBattleUnits: 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)
];

const fortyFourthBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 24, y: 45 },
  'guan-yu': { x: 30, y: 38 },
  'zhang-fei': { x: 24, y: 49 },
  'jian-yong': { x: 20, y: 50 },
  'mi-zhu': { x: 23, y: 43 },
  'sun-qian': { x: 22, y: 53 },
  'zhao-yun': { x: 33, y: 42 },
  'zhuge-liang': { x: 25, y: 41 },
  'ma-liang': { x: 31, y: 45 },
  'yi-ji': { x: 28, y: 51 },
  'gong-zhi': { x: 29, y: 54 },
  'huang-zhong': { x: 35, y: 36 },
  'wei-yan': { x: 32, y: 34 },
  'pang-tong': { x: 27, y: 47 },
  'fa-zheng': { x: 36, y: 46 },
  'wu-yi': { x: 38, y: 41 },
  'yan-yan': { x: 39, y: 44 },
  'li-yan': { x: 35, y: 32 },
  'huang-quan': { x: 40, y: 48 },
  'ma-chao': { x: 41, y: 36 },
  'ma-dai': { x: 43, y: 39 },
  'wang-ping': { x: 37, y: 34 }
};

export const fortyFourthBattleUnits: 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)
];

const fortyFifthBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 14, y: 36 },
  'guan-yu': { x: 10, y: 41 },
  'zhang-fei': { x: 16, y: 39 },
  'jian-yong': { x: 9, y: 44 },
  'mi-zhu': { x: 11, y: 35 },
  'sun-qian': { x: 12, y: 47 },
  'zhao-yun': { x: 18, y: 34 },
  'zhuge-liang': { x: 8, y: 38 },
  'ma-liang': { x: 13, y: 32 },
  'yi-ji': { x: 10, y: 50 },
  'gong-zhi': { x: 17, y: 49 },
  'huang-zhong': { x: 20, y: 37 },
  'wei-yan': { x: 19, y: 42 },
  'pang-tong': { x: 12, y: 29 },
  'fa-zheng': { x: 15, y: 30 },
  'wu-yi': { x: 21, y: 45 },
  'yan-yan': { x: 22, y: 39 },
  'li-yan': { x: 17, y: 27 },
  'huang-quan': { x: 8, y: 33 },
  'ma-chao': { x: 23, y: 34 },
  'ma-dai': { x: 24, y: 38 },
  'wang-ping': { x: 19, y: 31 }
};

export const fortyFifthBattleUnits: UnitData[] = [
  ...[
    ...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
    ...xuzhouRecruitUnits,
    ...caoBreakRecruitUnits,
    ...liuBiaoRecruitUnits,
    ...zhugeRecruitUnits,
    ...jingzhouRecruitUnits,
    ...guiyangRecruitUnits,
    ...wulingRecruitUnits,
    ...changshaRecruitUnits,
    ...yizhouRecruitUnits,
    ...fuPassRecruitUnits,
    ...luoCastleRecruitUnits,
    ...luoCastleProperRecruitUnits,
    ...chengduPressureRecruitUnits,
    ...chengduSurrenderRecruitUnits,
    ...hanzhongOpeningRecruitUnits,
    ...hanzhongScoutRecruitUnits,
    ...hanzhongMainRecruitUnits
  ].map((unit) => placeScenarioUnit(unit, fortyFifthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  createThirtyFirstEnemyUnit('yiling-wu-scout-a', '오군 척후', '강변 척후', 'bandit', 108, 448, 144, 36, 23),
  createThirtyFirstEnemyUnit('yiling-wu-scout-b', '오군 척후', '숲길 척후', 'bandit', 108, 448, 144, 45, 31),
  createThirtyFirstEnemyUnit('yiling-wu-scout-c', '오군 척후', '나루 척후', 'bandit', 109, 456, 146, 57, 49),
  createThirtyFirstEnemyUnit('yiling-wu-scout-d', '오군 척후', '남안 척후', 'bandit', 109, 456, 146, 73, 58),
  createThirtyFirstEnemyUnit('yiling-wu-infantry-a', '오군 보병', '동진로 보병', 'yellowTurban', 109, 654, 170, 42, 28),
  createThirtyFirstEnemyUnit('yiling-wu-infantry-b', '오군 보병', '숲길 보병', 'yellowTurban', 109, 654, 170, 49, 35),
  createThirtyFirstEnemyUnit('yiling-wu-infantry-c', '오군 보병', '강변 보병', 'yellowTurban', 110, 666, 172, 56, 44),
  createThirtyFirstEnemyUnit('yiling-wu-infantry-d', '오군 보병', '남로 보병', 'yellowTurban', 110, 666, 172, 65, 52),
  createThirtyFirstEnemyUnit('yiling-wu-infantry-e', '오군 보병', '협곡 보병', 'yellowTurban', 111, 678, 174, 74, 39),
  createThirtyFirstEnemyUnit('yiling-wu-infantry-f', '오군 보병', '후위 보병', 'yellowTurban', 111, 678, 174, 82, 47),
  createThirtyFirstEnemyUnit('yiling-wu-archer-a', '오군 궁병', '숲그늘 궁병', 'archer', 109, 492, 150, 38, 20),
  createThirtyFirstEnemyUnit('yiling-wu-archer-b', '오군 궁병', '동진 궁병', 'archer', 110, 500, 152, 52, 29),
  createThirtyFirstEnemyUnit('yiling-wu-archer-c', '오군 궁병', '강안 궁병', 'archer', 110, 500, 152, 61, 42),
  createThirtyFirstEnemyUnit('yiling-wu-archer-d', '오군 궁병', '남안 궁병', 'archer', 111, 508, 154, 71, 55),
  createThirtyFirstEnemyUnit('yiling-wu-archer-e', '오군 궁병', '고지 궁병', 'archer', 111, 508, 154, 78, 34),
  createThirtyFirstEnemyUnit('yiling-wu-archer-f', '오군 궁병', '화살 진지', 'archer', 112, 516, 156, 84, 50),
  createThirtyFirstEnemyUnit('yiling-wu-cavalry-a', '오군 기병', '강북 기병', 'cavalry', 110, 668, 172, 43, 18),
  createThirtyFirstEnemyUnit('yiling-wu-cavalry-b', '오군 기병', '숲끝 기병', 'cavalry', 110, 668, 172, 58, 24),
  createThirtyFirstEnemyUnit('yiling-wu-cavalry-c', '오군 기병', '남로 기병', 'cavalry', 111, 680, 174, 69, 45),
  createThirtyFirstEnemyUnit('yiling-wu-cavalry-d', '오군 기병', '추격 기병', 'cavalry', 111, 680, 174, 84, 39),
  createThirtyFirstEnemyUnit('yiling-wu-marine-a', '오군 수군', '강변 수군', 'yellowTurban', 110, 672, 172, 39, 60),
  createThirtyFirstEnemyUnit('yiling-wu-marine-b', '오군 수군', '나루 수군', 'yellowTurban', 111, 684, 174, 51, 63),
  createThirtyFirstEnemyUnit('yiling-wu-marine-c', '오군 수군', '동쪽 수군', 'yellowTurban', 112, 696, 176, 67, 66),
  createThirtyFirstEnemyUnit('yiling-wu-ambusher-a', '오군 복병', '숲속 복병', 'bandit', 109, 468, 148, 34, 35),
  createThirtyFirstEnemyUnit('yiling-wu-ambusher-b', '오군 복병', '협곡 복병', 'bandit', 110, 476, 150, 46, 42),
  createThirtyFirstEnemyUnit('yiling-wu-ambusher-c', '오군 복병', '강안 복병', 'bandit', 110, 476, 150, 59, 55),
  createThirtyFirstEnemyUnit('yiling-wu-ambusher-d', '오군 복병', '후방 복병', 'bandit', 111, 484, 152, 76, 61),
  createThirtyFirstEnemyUnit('yiling-wu-ambusher-e', '오군 복병', '화공 준비대', 'bandit', 112, 492, 154, 80, 27),
  createThirtyFirstEnemyUnit('yiling-wu-guard-a', '오군 친위대', '전초 친위대', 'yellowTurban', 112, 704, 178, 64, 32),
  createThirtyFirstEnemyUnit('yiling-wu-guard-b', '오군 친위대', '강안 친위대', 'yellowTurban', 112, 704, 178, 72, 43),
  createThirtyFirstEnemyUnit('yiling-wu-guard-c', '오군 친위대', '후위 친위대', 'yellowTurban', 113, 716, 180, 85, 57),
  createThirtyFirstEnemyUnit('yiling-strategist-a', '오군 책사', '화계 책사', 'strategist', 112, 532, 160, 62, 26),
  createThirtyFirstEnemyUnit('yiling-strategist-b', '오군 책사', '진영 책사', 'strategist', 113, 540, 162, 74, 51),
  createThirtyFirstEnemyUnit('yiling-strategist-c', '오군 책사', '수로 책사', 'strategist', 113, 540, 162, 58, 64),
  createThirtyFirstEnemyUnit('yiling-officer-gan-ning-remnant', '감녕 잔부', '강안 돌격장', 'rebelLeader', 112, 712, 180, 53, 58),
  createThirtyFirstEnemyUnit('yiling-officer-zhu-ran', '주연', '이릉 전초장', 'rebelLeader', 114, 736, 184, 76, 36),
  createThirtyFirstEnemyUnit('yiling-officer-pan-zhang', '반장', '형주 추격장', 'rebelLeader', 113, 728, 182, 70, 24),
  createThirtyFirstEnemyUnit('yiling-officer-ma-zhong', '마충', '밀림 매복장', 'bandit', 113, 548, 164, 49, 48),
  createThirtyFirstEnemyUnit('yiling-leader-lu-xun', '육손', '오군 대도독', 'rebelLeader', 115, 768, 190, 84, 32)
];

const fortySixthBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'liu-bei': { x: 18, y: 41 },
  'guan-yu': { x: 13, y: 46 },
  'zhang-fei': { x: 20, y: 44 },
  'jian-yong': { x: 15, y: 51 },
  'mi-zhu': { x: 13, y: 39 },
  'sun-qian': { x: 16, y: 54 },
  'zhao-yun': { x: 24, y: 38 },
  'zhuge-liang': { x: 12, y: 43 },
  'ma-liang': { x: 17, y: 35 },
  'yi-ji': { x: 11, y: 56 },
  'gong-zhi': { x: 21, y: 56 },
  'huang-zhong': { x: 26, y: 42 },
  'wei-yan': { x: 27, y: 47 },
  'pang-tong': { x: 14, y: 32 },
  'fa-zheng': { x: 19, y: 33 },
  'wu-yi': { x: 28, y: 50 },
  'yan-yan': { x: 30, y: 45 },
  'li-yan': { x: 22, y: 30 },
  'huang-quan': { x: 10, y: 37 },
  'ma-chao': { x: 31, y: 39 },
  'ma-dai': { x: 32, y: 43 },
  'wang-ping': { x: 24, y: 34 }
};

export const fortySixthBattleUnits: UnitData[] = [
  ...[
    ...firstBattleUnits.filter((unit) => unit.faction === 'ally'),
    ...xuzhouRecruitUnits,
    ...caoBreakRecruitUnits,
    ...liuBiaoRecruitUnits,
    ...zhugeRecruitUnits,
    ...jingzhouRecruitUnits,
    ...guiyangRecruitUnits,
    ...wulingRecruitUnits,
    ...changshaRecruitUnits,
    ...yizhouRecruitUnits,
    ...fuPassRecruitUnits,
    ...luoCastleRecruitUnits,
    ...luoCastleProperRecruitUnits,
    ...chengduPressureRecruitUnits,
    ...chengduSurrenderRecruitUnits,
    ...hanzhongOpeningRecruitUnits,
    ...hanzhongScoutRecruitUnits,
    ...hanzhongMainRecruitUnits
  ].map((unit) => placeScenarioUnit(unit, fortySixthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
  createThirtyFirstEnemyUnit('yiling-fire-scout-a', '오군 척후', '불길 척후', 'bandit', 114, 480, 150, 36, 26),
  createThirtyFirstEnemyUnit('yiling-fire-scout-b', '오군 척후', '강변 척후', 'bandit', 114, 480, 150, 48, 57),
  createThirtyFirstEnemyUnit('yiling-fire-scout-c', '오군 척후', '서쪽 척후', 'bandit', 115, 488, 152, 30, 34),
  createThirtyFirstEnemyUnit('yiling-fire-scout-d', '오군 척후', '협곡 척후', 'bandit', 115, 488, 152, 64, 33),
  createThirtyFirstEnemyUnit('yiling-fire-infantry-a', '오군 보병', '불길 보병', 'yellowTurban', 115, 690, 178, 42, 31),
  createThirtyFirstEnemyUnit('yiling-fire-infantry-b', '오군 보병', '진영 보병', 'yellowTurban', 115, 690, 178, 51, 38),
  createThirtyFirstEnemyUnit('yiling-fire-infantry-c', '오군 보병', '강안 보병', 'yellowTurban', 116, 702, 180, 58, 53),
  createThirtyFirstEnemyUnit('yiling-fire-infantry-d', '오군 보병', '남안 보병', 'yellowTurban', 116, 702, 180, 70, 61),
  createThirtyFirstEnemyUnit('yiling-fire-infantry-e', '오군 보병', '협곡 보병', 'yellowTurban', 117, 714, 182, 76, 37),
  createThirtyFirstEnemyUnit('yiling-fire-infantry-f', '오군 보병', '후위 보병', 'yellowTurban', 117, 714, 182, 86, 48),
  createThirtyFirstEnemyUnit('yiling-fire-archer-a', '오군 궁병', '화살 불씨', 'archer', 115, 530, 160, 39, 22),
  createThirtyFirstEnemyUnit('yiling-fire-archer-b', '오군 궁병', '숲그늘 궁병', 'archer', 116, 538, 162, 54, 29),
  createThirtyFirstEnemyUnit('yiling-fire-archer-c', '오군 궁병', '강안 궁병', 'archer', 116, 538, 162, 61, 48),
  createThirtyFirstEnemyUnit('yiling-fire-archer-d', '오군 궁병', '남안 궁병', 'archer', 117, 546, 164, 75, 58),
  createThirtyFirstEnemyUnit('yiling-fire-archer-e', '오군 궁병', '고지 궁병', 'archer', 117, 546, 164, 82, 30),
  createThirtyFirstEnemyUnit('yiling-fire-archer-f', '오군 궁병', '퇴로 궁병', 'archer', 118, 554, 166, 88, 43),
  createThirtyFirstEnemyUnit('yiling-fire-cavalry-a', '오군 기병', '불길 추격대', 'cavalry', 116, 704, 180, 44, 19),
  createThirtyFirstEnemyUnit('yiling-fire-cavalry-b', '오군 기병', '숲끝 기병', 'cavalry', 116, 704, 180, 62, 24),
  createThirtyFirstEnemyUnit('yiling-fire-cavalry-c', '오군 기병', '남로 기병', 'cavalry', 117, 716, 182, 73, 45),
  createThirtyFirstEnemyUnit('yiling-fire-cavalry-d', '오군 기병', '퇴로 추격대', 'cavalry', 117, 716, 182, 88, 35),
  createThirtyFirstEnemyUnit('yiling-fire-marine-a', '오군 수군', '강변 수군', 'yellowTurban', 116, 708, 180, 42, 64),
  createThirtyFirstEnemyUnit('yiling-fire-marine-b', '오군 수군', '물길 차단대', 'yellowTurban', 117, 720, 182, 56, 67),
  createThirtyFirstEnemyUnit('yiling-fire-marine-c', '오군 수군', '동쪽 수군', 'yellowTurban', 118, 732, 184, 72, 69),
  createThirtyFirstEnemyUnit('yiling-fire-ambusher-a', '오군 복병', '불붙임 복병', 'bandit', 115, 500, 154, 35, 39),
  createThirtyFirstEnemyUnit('yiling-fire-ambusher-b', '오군 복병', '군막 복병', 'bandit', 116, 508, 156, 47, 44),
  createThirtyFirstEnemyUnit('yiling-fire-ambusher-c', '오군 복병', '강안 복병', 'bandit', 116, 508, 156, 59, 59),
  createThirtyFirstEnemyUnit('yiling-fire-ambusher-d', '오군 복병', '후방 복병', 'bandit', 117, 516, 158, 80, 62),
  createThirtyFirstEnemyUnit('yiling-fire-ambusher-e', '오군 복병', '서쪽 차단대', 'bandit', 117, 516, 158, 28, 50),
  createThirtyFirstEnemyUnit('yiling-fire-guard-a', '오군 친위대', '화공 친위대', 'yellowTurban', 118, 742, 186, 66, 34),
  createThirtyFirstEnemyUnit('yiling-fire-guard-b', '오군 친위대', '강안 친위대', 'yellowTurban', 118, 742, 186, 78, 51),
  createThirtyFirstEnemyUnit('yiling-fire-guard-c', '오군 친위대', '대도독 친위대', 'yellowTurban', 119, 754, 188, 87, 56),
  createThirtyFirstEnemyUnit('yiling-fire-strategist-a', '오군 책사', '화계 책사', 'strategist', 118, 570, 168, 63, 28),
  createThirtyFirstEnemyUnit('yiling-fire-strategist-b', '오군 책사', '연소 책사', 'strategist', 119, 578, 170, 72, 47),
  createThirtyFirstEnemyUnit('yiling-fire-strategist-c', '오군 책사', '수로 책사', 'strategist', 119, 578, 170, 57, 65),
  createThirtyFirstEnemyUnit('yiling-fire-officer-zhu-ran', '주연', '화공 선봉장', 'rebelLeader', 120, 776, 192, 78, 40),
  createThirtyFirstEnemyUnit('yiling-fire-officer-han-dang', '한당', '강안 노장', 'rebelLeader', 119, 762, 190, 66, 58),
  createThirtyFirstEnemyUnit('yiling-fire-officer-pan-zhang', '반장', '추격 지휘관', 'rebelLeader', 119, 762, 190, 72, 24),
  createThirtyFirstEnemyUnit('yiling-fire-officer-ma-zhong', '마충', '밀림 차단장', 'bandit', 119, 578, 170, 49, 50),
  createThirtyFirstEnemyUnit('yiling-fire-leader-lu-xun', '육손', '화공 대도독', 'rebelLeader', 122, 812, 198, 86, 31)
];

const fortySeventhBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'guan-yu': { x: 14, y: 49 },
  'zhang-fei': { x: 18, y: 50 },
  'jian-yong': { x: 10, y: 55 },
  'mi-zhu': { x: 12, y: 52 },
  'sun-qian': { x: 14, y: 57 },
  'zhao-yun': { x: 20, y: 46 },
  'zhuge-liang': { x: 12, y: 47 },
  'ma-liang': { x: 16, y: 44 },
  'yi-ji': { x: 11, y: 60 },
  'gong-zhi': { x: 18, y: 58 },
  'huang-zhong': { x: 23, y: 48 },
  'wei-yan': { x: 25, y: 52 },
  'pang-tong': { x: 15, y: 41 },
  'fa-zheng': { x: 19, y: 42 },
  'wu-yi': { x: 27, y: 55 },
  'yan-yan': { x: 29, y: 50 },
  'li-yan': { x: 22, y: 39 },
  'huang-quan': { x: 10, y: 45 },
  'ma-chao': { x: 31, y: 47 },
  'ma-dai': { x: 33, y: 51 },
  'wang-ping': { x: 24, y: 43 }
};

export const fortySeventhBattleUnits: 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)
];

const fortyEighthBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'guan-yu': { x: 12, y: 56 },
  'zhang-fei': { x: 16, y: 57 },
  'jian-yong': { x: 8, y: 61 },
  'mi-zhu': { x: 10, y: 59 },
  'sun-qian': { x: 13, y: 63 },
  'zhao-yun': { x: 20, y: 53 },
  'zhuge-liang': { x: 10, y: 54 },
  'ma-liang': { x: 14, y: 51 },
  'yi-ji': { x: 9, y: 66 },
  'gong-zhi': { x: 17, y: 64 },
  'huang-zhong': { x: 23, y: 55 },
  'wei-yan': { x: 27, y: 58 },
  'pang-tong': { x: 13, y: 48 },
  'fa-zheng': { x: 18, y: 49 },
  'wu-yi': { x: 29, y: 62 },
  'yan-yan': { x: 31, y: 56 },
  'li-yan': { x: 23, y: 46 },
  'huang-quan': { x: 8, y: 52 },
  'ma-chao': { x: 34, y: 53 },
  'ma-dai': { x: 36, y: 57 },
  'wang-ping': { x: 25, y: 50 }
};

export const fortyEighthBattleUnits: 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)
];

const fortyNinthBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'guan-yu': { x: 12, y: 59 },
  'zhang-fei': { x: 17, y: 61 },
  'jian-yong': { x: 8, y: 65 },
  'mi-zhu': { x: 10, y: 63 },
  'sun-qian': { x: 14, y: 67 },
  'zhao-yun': { x: 22, y: 56 },
  'zhuge-liang': { x: 11, y: 56 },
  'ma-liang': { x: 15, y: 53 },
  'yi-ji': { x: 9, y: 70 },
  'gong-zhi': { x: 18, y: 68 },
  'huang-zhong': { x: 25, y: 57 },
  'wei-yan': { x: 30, y: 61 },
  'pang-tong': { x: 13, y: 50 },
  'fa-zheng': { x: 19, y: 51 },
  'wu-yi': { x: 32, y: 66 },
  'yan-yan': { x: 35, y: 59 },
  'li-yan': { x: 24, y: 49 },
  'huang-quan': { x: 8, y: 54 },
  'ma-chao': { x: 37, y: 56 },
  'ma-dai': { x: 39, y: 61 },
  'wang-ping': { x: 27, y: 52 }
};

export const fortyNinthBattleUnits: 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)
];

const fiftiethBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'guan-yu': { x: 13, y: 61 },
  'zhang-fei': { x: 18, y: 63 },
  'jian-yong': { x: 9, y: 68 },
  'mi-zhu': { x: 11, y: 66 },
  'sun-qian': { x: 15, y: 70 },
  'zhao-yun': { x: 23, y: 58 },
  'zhuge-liang': { x: 12, y: 58 },
  'ma-liang': { x: 16, y: 55 },
  'yi-ji': { x: 9, y: 73 },
  'gong-zhi': { x: 19, y: 71 },
  'huang-zhong': { x: 26, y: 59 },
  'wei-yan': { x: 31, y: 63 },
  'pang-tong': { x: 14, y: 52 },
  'fa-zheng': { x: 20, y: 53 },
  'wu-yi': { x: 33, y: 68 },
  'yan-yan': { x: 36, y: 61 },
  'li-yan': { x: 25, y: 51 },
  'huang-quan': { x: 9, y: 56 },
  'ma-chao': { x: 38, y: 58 },
  'ma-dai': { x: 41, y: 63 },
  'wang-ping': { x: 28, y: 54 }
};

export const fiftiethBattleUnits: 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)
];

const fiftyFirstBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'guan-yu': { x: 14, y: 63 },
  'zhang-fei': { x: 19, y: 65 },
  'jian-yong': { x: 10, y: 70 },
  'mi-zhu': { x: 12, y: 68 },
  'sun-qian': { x: 16, y: 72 },
  'zhao-yun': { x: 24, y: 60 },
  'zhuge-liang': { x: 13, y: 60 },
  'ma-liang': { x: 17, y: 57 },
  'yi-ji': { x: 10, y: 75 },
  'gong-zhi': { x: 20, y: 73 },
  'huang-zhong': { x: 27, y: 61 },
  'wei-yan': { x: 32, y: 65 },
  'pang-tong': { x: 15, y: 54 },
  'fa-zheng': { x: 21, y: 55 },
  'wu-yi': { x: 34, y: 70 },
  'yan-yan': { x: 37, y: 63 },
  'li-yan': { x: 26, y: 53 },
  'huang-quan': { x: 10, y: 58 },
  'ma-chao': { x: 39, y: 60 },
  'ma-dai': { x: 42, y: 65 },
  'wang-ping': { x: 29, y: 56 }
};

export const fiftyFirstBattleUnits: 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)
];

const fiftySecondBattleAllyPositions: Record<string, { x: number; y: number }> = {
  'guan-yu': { x: 15, y: 65 },
  'zhang-fei': { x: 20, y: 67 },
  'jian-yong': { x: 11, y: 72 },
  'mi-zhu': { x: 13, y: 70 },
  'sun-qian': { x: 17, y: 74 },
  'zhao-yun': { x: 25, y: 62 },
  'zhuge-liang': { x: 14, y: 62 },
  'ma-liang': { x: 18, y: 59 },
  'yi-ji': { x: 11, y: 77 },
  'gong-zhi': { x: 21, y: 75 },
  'huang-zhong': { x: 28, y: 63 },
  'wei-yan': { x: 33, y: 67 },
  'pang-tong': { x: 16, y: 56 },
  'fa-zheng': { x: 22, y: 57 },
  'wu-yi': { x: 35, y: 72 },
  'yan-yan': { x: 38, y: 65 },
  'li-yan': { x: 27, y: 55 },
  'huang-quan': { x: 11, y: 60 },
  'ma-chao': { x: 40, y: 62 },
  'ma-dai': { x: 43, y: 67 },
  'wang-ping': { x: 30, y: 58 }
};

export const fiftySecondBattleUnits: 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 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 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
);

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) {
        return 'river';
      }
      if ((x === 27 || x === 28) && y >= 4 && y <= 21) {
        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 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]
  };
}
