Add Changban refuge sortie chapter

This commit is contained in:
2026-06-23 06:33:37 +09:00
parent 2d4b08558d
commit 697ce8837d
11 changed files with 1047 additions and 23 deletions

View File

@@ -27,6 +27,10 @@ import {
ninthBattleMap,
ninthBattleUnits,
ninthBattleVictoryPages,
nineteenthBattleBonds,
nineteenthBattleMap,
nineteenthBattleUnits,
nineteenthBattleVictoryPages,
tenthBattleBonds,
tenthBattleMap,
tenthBattleUnits,
@@ -95,7 +99,8 @@ export type BattleScenarioId =
| 'fifteenth-battle-yuan-refuge-road'
| 'sixteenth-battle-liu-biao-refuge'
| 'seventeenth-battle-wolong-visit-road'
| 'eighteenth-battle-bowang-ambush';
| 'eighteenth-battle-bowang-ambush'
| 'nineteenth-battle-changban-refuge';
export type BattleObjectiveKind = 'defeat-leader' | 'keep-unit-alive' | 'secure-terrain' | 'quick-victory';
@@ -1088,6 +1093,69 @@ export const eighteenthBattleScenario: BattleScenarioDefinition = {
nextCampScene: 'CampScene'
};
export const nineteenthBattleScenario: BattleScenarioDefinition = {
id: 'nineteenth-battle-changban-refuge',
title: '장판파 피난로',
victoryConditionLabel: '조순 퇴각',
defeatConditionLabel: '유비 또는 조운 퇴각',
openingObjectiveLines: [
'조조군 호표기가 피난 행렬을 따라 장판파로 들이칩니다. 백성을 버리지 않으려면 남쪽 피난로와 다리목을 동시에 지켜야 합니다.',
'조운은 넓은 길을 오가며 흩어진 병력을 모을 수 있고, 장비는 다리목을 막아 추격 기병을 늦추기 좋습니다. 제갈량과 손건은 전후 강동 사절 명분을 정리합니다.',
'조순을 퇴각시키고 유비와 조운을 지키십시오. 피난민 마을을 확보하면 다음 강동 사절 준비가 안정됩니다.'
],
map: nineteenthBattleMap,
units: nineteenthBattleUnits,
bonds: nineteenthBattleBonds,
mapTextureKey: 'battle-map-nineteenth',
leaderUnitId: 'changban-leader-cao-chun',
quickVictoryTurnLimit: 28,
baseVictoryGold: 2220,
objectives: [
{
id: 'leader',
kind: 'defeat-leader',
label: '조순 퇴각',
rewardGold: 1440,
unitId: 'changban-leader-cao-chun'
},
{
id: 'liu-bei',
kind: 'keep-unit-alive',
label: '유비 생존',
rewardGold: 480,
unitId: 'liu-bei'
},
{
id: 'zhao-yun',
kind: 'keep-unit-alive',
label: '조운 생존',
rewardGold: 620,
unitId: 'zhao-yun'
},
{
id: 'refugee-village',
kind: 'secure-terrain',
label: '피난민 마을 확보',
rewardGold: 820,
terrain: 'village'
},
{
id: 'quick',
kind: 'quick-victory',
label: '28턴 이내 승리',
rewardGold: 620,
maxTurn: 28
}
],
defeatConditions: [
{ kind: 'unit-defeated', unitId: 'liu-bei' },
{ kind: 'unit-defeated', unitId: 'zhao-yun' }
],
itemRewards: ['콩 7', '상처약 5', '탁주 2', '피난로 지도 +1', '강동 풍문 +1'],
victoryPages: nineteenthBattleVictoryPages,
nextCampScene: 'CampScene'
};
export const defaultBattleScenarioId: BattleScenarioId = firstBattleScenario.id;
export const battleScenarios: Record<BattleScenarioId, BattleScenarioDefinition> = {
@@ -1108,7 +1176,8 @@ export const battleScenarios: Record<BattleScenarioId, BattleScenarioDefinition>
'fifteenth-battle-yuan-refuge-road': fifteenthBattleScenario,
'sixteenth-battle-liu-biao-refuge': sixteenthBattleScenario,
'seventeenth-battle-wolong-visit-road': seventeenthBattleScenario,
'eighteenth-battle-bowang-ambush': eighteenthBattleScenario
'eighteenth-battle-bowang-ambush': eighteenthBattleScenario,
'nineteenth-battle-changban-refuge': nineteenthBattleScenario
};
export const defaultBattleScenario = battleScenarios[defaultBattleScenarioId];

View File

@@ -9,6 +9,7 @@ import {
fourteenthBattleScenario,
fourthBattleScenario,
ninthBattleScenario,
nineteenthBattleScenario,
secondBattleScenario,
seventhBattleScenario,
sixthBattleScenario,
@@ -38,6 +39,8 @@ import {
fourthBattleVictoryPages,
ninthBattleIntroPages,
ninthBattleVictoryPages,
nineteenthBattleIntroPages,
nineteenthBattleVictoryPages,
secondBattleIntroPages,
secondBattleVictoryPages,
seventhBattleIntroPages,
@@ -249,13 +252,24 @@ const sortieFlows: Record<string, SortieFlow> = {
},
[eighteenthBattleScenario.id]: {
afterBattleId: eighteenthBattleScenario.id,
eyebrow: '다음 장 준비',
title: '강동으로 부는 바람',
eyebrow: '다음 장',
title: nineteenthBattleScenario.title,
description:
'박망파에서 조조군 선봉을 늦춘 유비군은 더 큰 남하를 막기 위해 강동과 손잡을 길을 찾아야 합니다. 다음 흐름은 장판파와 강동 사절, 그리고 적벽대전으로 이어집니다.',
rewardHint: '다음 장: 장판파와 강동 사절 준비 중',
pages: eighteenthBattleVictoryPages,
unavailableNotice: '장판파와 강동 사절 장은 다음 작업에서 이어집니다. 군영에서 제갈량의 책략과 장수들의 출전 구성을 정비하십시오.'
'박망파에서 조조군 선봉을 늦췄지만 대군의 남하는 계속됩니다. 신야의 백성을 데리고 장판파 피난로를 열어야 강동 사절로 이어질 시간을 벌 수 있습니다.',
rewardHint: `예상 보상: ${nineteenthBattleScenario.title} 개방 / 장판파 피난로 확보`,
nextBattleId: nineteenthBattleScenario.id,
campaignStep: 'nineteenth-battle',
pages: [...eighteenthBattleVictoryPages, ...nineteenthBattleIntroPages]
},
[nineteenthBattleScenario.id]: {
afterBattleId: nineteenthBattleScenario.id,
eyebrow: '다음 장 준비',
title: '강동 사절 준비',
description:
'장판파에서 피난로를 열어 백성과 군을 다시 모았습니다. 이제 제갈량과 손건은 강동으로 보낼 말과 증거를 정리하고, 손권과 마주할 준비를 해야 합니다.',
rewardHint: '다음 장: 강동 사절과 적벽대전 준비 중',
pages: nineteenthBattleVictoryPages,
unavailableNotice: '강동 사절과 적벽대전 장은 다음 작업에서 이어집니다. 군영에서 출전 후보, 공명, 보급을 정비하십시오.'
}
};

View File

@@ -1197,6 +1197,69 @@ export const eighteenthBattleVictoryPages: StoryPage[] = [
}
];
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 firstBattleMap: BattleMap = {
width: 20,
height: 18,
@@ -1450,6 +1513,12 @@ export const eighteenthBattleMap: BattleMap = {
terrain: createEighteenthBattleTerrain()
};
export const nineteenthBattleMap: BattleMap = {
width: 38,
height: 28,
terrain: createNineteenthBattleTerrain()
};
export const firstBattleUnits: UnitData[] = [
{
id: 'liu-bei',
@@ -6792,6 +6861,384 @@ export const eighteenthBattleUnits: UnitData[] = [
}
];
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
}
];
export const firstBattleBonds: BattleBond[] = [
{
id: 'liu-bei__guan-yu',
@@ -6942,6 +7389,7 @@ export const seventeenthBattleBonds: BattleBond[] = sixteenthBattleBonds.map(clo
export const eighteenthBattleBonds: BattleBond[] = [...sixteenthBattleBonds, ...zhugeRecruitBonds].map(
cloneBattleBondForScenario
);
export const nineteenthBattleBonds: BattleBond[] = [...eighteenthBattleBonds].map(cloneBattleBondForScenario);
function createEighthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 22 }, (_, y) =>
@@ -7450,6 +7898,62 @@ function createEighteenthBattleTerrain(): TerrainType[][] {
);
}
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 placeScenarioUnit(unit: UnitData, position: { x: number; y: number }): UnitData {
return {
...cloneUnitForScenario(unit),