Add Weishui camps chapter

This commit is contained in:
2026-06-24 18:38:21 +09:00
parent 84a1eccb5d
commit 40078eabe3
12 changed files with 866 additions and 85 deletions

View File

@@ -13,6 +13,7 @@ import sixtiethBattleMapUrl from '../../assets/images/battle/sixtieth-battle-map
import sixtyFirstBattleMapUrl from '../../assets/images/battle/sixty-first-battle-map.svg';
import sixtySecondBattleMapUrl from '../../assets/images/battle/sixty-second-battle-map.svg';
import sixtyThirdBattleMapUrl from '../../assets/images/battle/sixty-third-battle-map.svg';
import sixtyFourthBattleMapUrl from '../../assets/images/battle/sixty-fourth-battle-map.svg';
import fiftySeventhBattleMapUrl from '../../assets/images/battle/fifty-seventh-battle-map.svg';
import fiftySixthBattleMapUrl from '../../assets/images/battle/fifty-sixth-battle-map.svg';
import fifthBattleMapUrl from '../../assets/images/battle/fifth-battle-map.svg';
@@ -124,6 +125,7 @@ export const battleMapAssets: Record<string, string> = {
'battle-map-sixty-first': sixtyFirstBattleMapUrl,
'battle-map-sixty-second': sixtySecondBattleMapUrl,
'battle-map-sixty-third': sixtyThirdBattleMapUrl,
'battle-map-sixty-fourth': sixtyFourthBattleMapUrl,
'battle-map-fifty-seventh': fiftySeventhBattleMapUrl,
'battle-map-fifty-sixth': fiftySixthBattleMapUrl
};

View File

@@ -51,6 +51,10 @@ import {
sixtyThirdBattleMap,
sixtyThirdBattleUnits,
sixtyThirdBattleVictoryPages,
sixtyFourthBattleBonds,
sixtyFourthBattleMap,
sixtyFourthBattleUnits,
sixtyFourthBattleVictoryPages,
fiftySeventhBattleBonds,
fiftySeventhBattleMap,
fiftySeventhBattleUnits,
@@ -320,7 +324,8 @@ export type BattleScenarioId =
| 'sixtieth-battle-wudu-yinping'
| 'sixty-first-battle-hanzhong-rain-defense'
| 'sixty-second-battle-qishan-renewed-offensive'
| 'sixty-third-battle-lucheng-pursuit';
| 'sixty-third-battle-lucheng-pursuit'
| 'sixty-fourth-battle-weishui-camps';
export type BattleObjectiveKind = 'defeat-leader' | 'pacify-leader' | 'keep-unit-alive' | 'secure-terrain' | 'quick-victory';
@@ -4263,6 +4268,73 @@ export const sixtyThirdBattleScenario: BattleScenarioDefinition = {
nextCampScene: 'CampScene'
};
export const sixtyFourthBattleScenario: BattleScenarioDefinition = {
id: 'sixty-fourth-battle-weishui-camps',
title: '위수 진영전',
victoryConditionLabel: '위수 남안 진영 확보와 봉화 차단',
defeatConditionLabel: '제갈량 퇴각 또는 보급 수레 붕괴',
openingObjectiveLines: [
'노성 추격 뒤에도 사마의는 위수 북안에 진영을 겹겹이 세우고 시간을 벌고 있습니다. 촉한군은 강을 성급히 넘기보다 남안의 진영과 물목, 봉화선을 먼저 끊어야 합니다.',
'강유와 왕평은 낮은 길과 회수 표식을 맡고, 황권과 이엄은 긴 수레길을 전장 기준으로 맞춥니다. 위연과 마대는 장합의 기병이 뒤를 물기 전에 진영 사이를 흔들어야 합니다.',
'사마의의 위수 본영, 장합의 물목 추격대, 곽회의 봉화선을 동시에 늦추십시오. 강가 마을과 보급 진영을 지키면 다음 북방 공세가 더 깊게 이어집니다.'
],
map: sixtyFourthBattleMap,
units: sixtyFourthBattleUnits,
bonds: sixtyFourthBattleBonds,
mapTextureKey: 'battle-map-sixty-fourth',
leaderUnitId: 'northern-tenth-leader-sima-yi',
quickVictoryTurnLimit: 128,
baseVictoryGold: 20560,
objectives: [
{
id: 'break-sima-yi-weishui-camps',
kind: 'defeat-leader',
label: '사마의 위수 본영 압박',
rewardGold: 14600,
unitId: 'northern-tenth-leader-sima-yi'
},
{
id: 'stop-zhang-he-crossing-raid',
kind: 'defeat-leader',
label: '장합 물목 추격 저지',
rewardGold: 8840,
unitId: 'northern-tenth-officer-zhang-he'
},
{
id: 'silence-guo-huai-weishui-beacons',
kind: 'defeat-leader',
label: '곽회 위수 봉화 차단',
rewardGold: 8220,
unitId: 'northern-tenth-officer-guo-huai'
},
{
id: 'hold-weishui-supply-camps',
kind: 'secure-terrain',
label: '위수 보급 진영 확보',
rewardGold: 6880,
terrain: 'camp'
},
{
id: 'reassure-river-villages',
kind: 'secure-terrain',
label: '강가 마을 안심',
rewardGold: 6660,
terrain: 'village'
},
{
id: 'quick',
kind: 'quick-victory',
label: '128턴 이내 위수 진영 장악',
rewardGold: 4540,
maxTurn: 128
}
],
defeatConditions: [{ kind: 'unit-defeated', unitId: 'zhuge-liang' }],
itemRewards: ['금 138', '상처약 106', '군주 52', '위수 진영 장부 1', '강안 봉화 기록 1'],
victoryPages: sixtyFourthBattleVictoryPages,
nextCampScene: 'CampScene'
};
export const defaultBattleScenarioId: BattleScenarioId = firstBattleScenario.id;
export const battleScenarios: Record<BattleScenarioId, BattleScenarioDefinition> = {
@@ -4328,7 +4400,8 @@ export const battleScenarios: Record<BattleScenarioId, BattleScenarioDefinition>
'sixtieth-battle-wudu-yinping': sixtiethBattleScenario,
'sixty-first-battle-hanzhong-rain-defense': sixtyFirstBattleScenario,
'sixty-second-battle-qishan-renewed-offensive': sixtySecondBattleScenario,
'sixty-third-battle-lucheng-pursuit': sixtyThirdBattleScenario
'sixty-third-battle-lucheng-pursuit': sixtyThirdBattleScenario,
'sixty-fourth-battle-weishui-camps': sixtyFourthBattleScenario
};
export const defaultBattleScenario = battleScenarios[defaultBattleScenarioId];

View File

@@ -18,6 +18,7 @@ import {
sixtyFirstBattleScenario,
sixtySecondBattleScenario,
sixtyThirdBattleScenario,
sixtyFourthBattleScenario,
fortiethBattleScenario,
fortyFirstBattleScenario,
fortySecondBattleScenario,
@@ -87,6 +88,8 @@ import {
sixtySecondBattleVictoryPages,
sixtyThirdBattleIntroPages,
sixtyThirdBattleVictoryPages,
sixtyFourthBattleIntroPages,
sixtyFourthBattleVictoryPages,
fiftyFirstBattleIntroPages,
fiftyFirstBattleVictoryPages,
fiftySecondBattleIntroPages,
@@ -925,13 +928,24 @@ const sortieFlows: Record<string, SortieFlow> = {
},
[sixtyThirdBattleScenario.id]: {
afterBattleId: sixtyThirdBattleScenario.id,
eyebrow: '다음 장 준비',
title: '노성 추격 이후',
eyebrow: '다음 장',
title: sixtyFourthBattleScenario.title,
description:
'노성 추격로와 회수 표식은 지켜 냈지만 북방 전선은 여전히 길고 무겁습니다. 다음 계산에서는 얻은 길을 지키는 장부와 더 깊은 공세를 다시 맞춰야 합니다.',
rewardHint: '다음 목표: 북방 전선 재정비 / 다음 북벌 공격로 검토',
pages: sixtyThirdBattleVictoryPages,
unavailableNotice: '노성 추격 이후의 다음 북벌 전투는 이어지는 작업에서 확장합니다. 현재는 회수 표식, 장합 추격 저지, 노성 주변 보급과 민심 정비를 확인할 수 있습니다.'
'노성 추격로와 회수 표식은 지켰지만 사마의는 위수 북안에 진영을 겹겹이 세웠습니다. 이번에는 강을 무리하게 넘기보다 남안 진영, 물목, 봉화선을 먼저 끊어 다음 공세의 발판을 만들어야 합니다.',
rewardHint: `예상 보상: ${sixtyFourthBattleScenario.title} 개방 / 위수 진영 장부`,
nextBattleId: sixtyFourthBattleScenario.id,
campaignStep: 'sixty-fourth-battle',
pages: [...sixtyThirdBattleVictoryPages, ...sixtyFourthBattleIntroPages]
},
[sixtyFourthBattleScenario.id]: {
afterBattleId: sixtyFourthBattleScenario.id,
eyebrow: '다음 장 준비',
title: '위수 진영 이후',
description:
'위수 남안 진영과 봉화선은 흔들었지만, 북방의 길은 아직 끝나지 않았습니다. 다음 계산에서는 강가 장기전의 보급, 사마의 본영 압박, 장합의 재추격을 다시 나누어야 합니다.',
rewardHint: '다음 목표: 위수 전선 재정비 / 다음 북방 공세 검토',
pages: sixtyFourthBattleVictoryPages,
unavailableNotice: '위수 진영 이후의 다음 북방 전투는 이어지는 작업에서 확장합니다. 현재는 위수 진영 확보, 장합 물목 추격 저지, 곽회 봉화 차단과 강가 보급 정비를 확인할 수 있습니다.'
},
'northern-campaign-prep-camp-legacy': {
afterBattleId: fiftyFourthBattleScenario.id,

View File

@@ -4013,6 +4013,59 @@ export const sixtyThirdBattleVictoryPages: StoryPage[] = [
}
];
export const sixtyFourthBattleIntroPages: StoryPage[] = [
{
id: 'sixty-fourth-weishui-camp-council',
bgm: 'story-dark',
chapter: '위수 진영',
background: 'story-weishui-camps',
speaker: '제갈량',
text: '노성 추격으로 돌아올 길은 지켰으나, 사마의는 위수 북안에 여러 진영을 겹겹이 세웠습니다. 강을 건너기보다 먼저 적의 진영 사이를 흔들어 보급 표식과 물목을 빼앗아야 합니다.'
},
{
id: 'sixty-fourth-river-camps-ledger',
bgm: 'battle-prep',
chapter: '강가의 장부',
background: 'story-weishui-camps',
speaker: '황권',
text: '위수까지 나아가면 길은 넓어지지만 수레는 더 느려집니다. 진영 하나를 깨는 것보다, 얻은 진영에 군량과 표식을 남겨 다음 부대가 길을 잃지 않게 하는 일이 먼저입니다.'
},
{
id: 'sixty-fourth-zhanghe-crossing-threat',
bgm: 'story-dark',
chapter: '장합의 물목',
background: 'story-weishui-camps',
speaker: '강유',
text: '장합은 정면에서 기다리지 않을 것입니다. 강안의 낮은 길과 물목을 이용해 뒤를 물고, 곽회는 봉화로 사마의의 본영에 시간을 벌어 줄 것입니다. 이번 출전은 돌파와 회수, 진영 확보가 한꺼번에 얽힙니다.'
}
];
export const sixtyFourthBattleVictoryPages: StoryPage[] = [
{
id: 'sixty-fourth-victory-river-camps-held',
bgm: 'militia-theme',
chapter: '위수 진영 확보',
background: 'story-weishui-camps',
text: '촉한군은 위수 남안의 진영을 빼앗고 장합의 물목 추격을 늦췄습니다. 사마의의 본영은 여전히 멀지만, 강가의 표식과 군량 장부가 처음으로 북방 깊숙한 곳에 남았습니다.'
},
{
id: 'sixty-fourth-victory-signal-lines',
bgm: 'story-dark',
chapter: '꺼진 봉화',
background: 'story-weishui-camps',
speaker: '마량',
text: '곽회의 봉화는 늦어졌고, 강가 마을에는 촉한군이 지나간 까닭을 적은 고시문이 붙었습니다. 병사들은 이긴 길보다 돌아올 표식을 먼저 확인하며 다음 명령을 기다렸습니다.'
},
{
id: 'sixty-fourth-next-northern-plan',
bgm: 'story-dark',
chapter: '더 먼 북방',
background: 'story-weishui-camps',
speaker: '제갈량',
text: '위수 진영을 얻었다 해도 북방의 끝은 아직 보이지 않습니다. 강을 끼고 오래 싸울 사람, 수레를 붙들 사람, 적의 다음 계책을 먼저 읽을 사람을 다시 나누어야 합니다.'
}
];
export const firstBattleMap: BattleMap = {
width: 20,
height: 18,
@@ -4536,6 +4589,12 @@ export const sixtyThirdBattleMap: BattleMap = {
terrain: createSixtyThirdBattleTerrain()
};
export const sixtyFourthBattleMap: BattleMap = {
width: 128,
height: 110,
terrain: createSixtyFourthBattleTerrain()
};
export const firstBattleUnits: UnitData[] = [
{
id: 'liu-bei',
@@ -18032,6 +18091,103 @@ export const sixtyThirdBattleUnits: UnitData[] = [
...sixtyThirdEnemySpecs.map((spec) => createThirtyFirstEnemyUnit(...spec))
];
const sixtyFourthBattleAllyPositions: Record<string, { x: number; y: number }> = {
'guan-yu': { x: 17, y: 98 },
'zhang-fei': { x: 25, y: 101 },
'jian-yong': { x: 8, y: 106 },
'mi-zhu': { x: 14, y: 107 },
'sun-qian': { x: 20, y: 107 },
'zhao-yun': { x: 32, y: 96 },
'zhuge-liang': { x: 19, y: 93 },
'ma-liang': { x: 26, y: 90 },
'yi-ji': { x: 8, y: 108 },
'gong-zhi': { x: 30, y: 105 },
'huang-zhong': { x: 40, y: 94 },
'wei-yan': { x: 46, y: 95 },
'pang-tong': { x: 16, y: 89 },
'fa-zheng': { x: 30, y: 88 },
'wu-yi': { x: 49, y: 103 },
'yan-yan': { x: 53, y: 96 },
'li-yan': { x: 35, y: 87 },
'huang-quan': { x: 13, y: 92 },
'ma-chao': { x: 56, y: 92 },
'ma-dai': { x: 61, y: 99 },
'wang-ping': { x: 42, y: 87 },
'jiang-wei': { x: 36, y: 90 }
};
const sixtyFourthEnemySpecs: ReadonlyArray<
readonly [string, string, string, UnitClassKey, number, number, number, number, number]
> = [
['northern-tenth-scout-a', '위수 서안 척후병', '서쪽 강안 정찰', 'bandit', 232, 1120, 306, 50, 90],
['northern-tenth-scout-b', '수레길 척후병', '수레길 정찰', 'bandit', 232, 1120, 306, 63, 86],
['northern-tenth-scout-c', '물목 척후병', '중앙 물목 정찰', 'bandit', 233, 1132, 308, 77, 80],
['northern-tenth-scout-d', '봉화 척후병', '동쪽 봉화 정찰', 'bandit', 233, 1132, 308, 91, 72],
['northern-tenth-scout-e', '곽회 전초 척후병', '차단로 정찰', 'bandit', 234, 1144, 310, 106, 60],
['northern-tenth-scout-f', '위수 뒤 척후병', '북쪽 진영 정찰', 'bandit', 234, 1144, 310, 124, 38],
['northern-tenth-infantry-a', '위군 강안 보병', '서쪽 강안 보병', 'yellowTurban', 233, 1700, 404, 57, 85],
['northern-tenth-infantry-b', '위군 수레길 보병', '수레길 보병', 'yellowTurban', 233, 1700, 404, 70, 82],
['northern-tenth-infantry-c', '위군 물목 보병', '중앙 물목 보병', 'yellowTurban', 234, 1720, 408, 84, 75],
['northern-tenth-infantry-d', '위군 봉화 보병', '봉화대 보병', 'yellowTurban', 234, 1720, 408, 98, 68],
['northern-tenth-infantry-e', '곽회 차단 보병', '차단로 보병', 'yellowTurban', 235, 1740, 412, 110, 55],
['northern-tenth-infantry-f', '위수 본영 보병', '본영 보병', 'yellowTurban', 235, 1740, 412, 121, 45],
['northern-tenth-infantry-g', '강가 수레 차단병', '수레 차단 보병', 'yellowTurban', 236, 1760, 416, 94, 91],
['northern-tenth-infantry-h', '북쪽 진문 보병', '진문 보병', 'yellowTurban', 236, 1760, 416, 126, 27],
['northern-tenth-archer-a', '위수 서안 궁병', '서쪽 능선 궁병', 'archer', 233, 1230, 334, 66, 77],
['northern-tenth-archer-b', '수레길 궁병', '수레길 궁병', 'archer', 233, 1230, 334, 79, 71],
['northern-tenth-archer-c', '물목 궁병', '중앙 물목 궁병', 'archer', 234, 1242, 336, 93, 63],
['northern-tenth-archer-d', '봉화대 궁병', '봉화 궁병', 'archer', 235, 1254, 338, 106, 52],
['northern-tenth-archer-e', '본영 궁병', '위수 본영 궁병', 'archer', 235, 1254, 338, 118, 35],
['northern-tenth-archer-f', '북쪽 절벽 궁병', '절벽 궁병', 'archer', 236, 1266, 340, 126, 19],
['northern-tenth-cavalry-a', '장합 물목 기병', '서쪽 물목 기병', 'cavalry', 234, 1780, 428, 52, 78],
['northern-tenth-cavalry-b', '장합 물목 기병', '수레길 추격 기병', 'cavalry', 234, 1780, 428, 65, 75],
['northern-tenth-cavalry-c', '장합 물목 기병', '중앙 추격 기병', 'cavalry', 235, 1802, 432, 82, 67],
['northern-tenth-cavalry-d', '곽회 차단 기병', '동쪽 차단 기병', 'cavalry', 236, 1824, 436, 98, 59],
['northern-tenth-cavalry-e', '사마의 예비 기병', '본영 예비 기병', 'cavalry', 236, 1824, 436, 114, 45],
['northern-tenth-cavalry-f', '북쪽 절벽 기병', '절벽 차단 기병', 'cavalry', 237, 1846, 440, 126, 30],
['northern-tenth-camp-guard-a', '위수 서안 수비대', '서쪽 진영 수비', 'yellowTurban', 234, 1720, 410, 44, 64],
['northern-tenth-camp-guard-b', '수레 표식 수비대', '표식 수비', 'yellowTurban', 234, 1720, 410, 61, 60],
['northern-tenth-camp-guard-c', '물목 수비대', '중앙 물목 수비', 'yellowTurban', 235, 1740, 414, 79, 53],
['northern-tenth-camp-guard-d', '봉화 길 수비대', '봉화 길 수비', 'yellowTurban', 235, 1740, 414, 97, 44],
['northern-tenth-camp-guard-e', '사마의 본영 수비대', '본영 수비', 'yellowTurban', 236, 1760, 418, 113, 36],
['northern-tenth-camp-guard-f', '북쪽 절벽 수비대', '절벽 수비', 'yellowTurban', 236, 1760, 418, 126, 23],
['northern-tenth-strategist-a', '위군 위수 군리', '강안 장부 군리', 'strategist', 234, 1320, 354, 82, 60],
['northern-tenth-strategist-b', '위군 보급 군리', '수레 차단 군리', 'strategist', 235, 1332, 356, 98, 48],
['northern-tenth-strategist-c', '사마의 본영 군리', '본영 장부 군리', 'strategist', 235, 1332, 356, 114, 38],
['northern-tenth-strategist-d', '곽회 봉화 군리', '봉화 장부 군리', 'strategist', 236, 1344, 358, 121, 68],
['northern-tenth-officer-river', '위수 진영장', '위수 진영 장수', 'rebelLeader', 238, 1840, 440, 88, 82],
['northern-tenth-officer-supply', '강가 수레 차단장', '수레 차단 장수', 'rebelLeader', 238, 1840, 440, 108, 74],
['northern-tenth-officer-guo-huai', '곽회', '봉화 차단 장수', 'rebelLeader', 237, 1820, 436, 118, 72],
['northern-tenth-officer-relay', '봉화 연락장', '위수 뒤 봉화 장수', 'rebelLeader', 237, 1820, 436, 121, 54],
['northern-tenth-officer-zhang-he', '장합', '위수 물목 추격대장', 'rebelLeader', 239, 1880, 446, 124, 33],
['northern-tenth-leader-sima-yi', '사마의', '위수 진영 총지휘', 'rebelLeader', 240, 1920, 452, 120, 45]
];
export const sixtyFourthBattleUnits: UnitData[] = [
...[
...firstBattleUnits.filter((unit) => unit.faction === 'ally' && unit.id !== 'liu-bei'),
...xuzhouRecruitUnits,
...caoBreakRecruitUnits,
...liuBiaoRecruitUnits,
...zhugeRecruitUnits,
...jingzhouRecruitUnits,
...guiyangRecruitUnits,
...wulingRecruitUnits,
...changshaRecruitUnits,
...yizhouRecruitUnits,
...fuPassRecruitUnits,
...luoCastleRecruitUnits,
...luoCastleProperRecruitUnits,
...chengduPressureRecruitUnits,
...chengduSurrenderRecruitUnits,
...hanzhongOpeningRecruitUnits,
...hanzhongScoutRecruitUnits,
...hanzhongMainRecruitUnits,
...jiangWeiRecruitUnits
].map((unit) => placeScenarioUnit(unit, sixtyFourthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
...sixtyFourthEnemySpecs.map((spec) => createThirtyFirstEnemyUnit(...spec))
];
export const firstBattleBonds: BattleBond[] = [
{
id: 'liu-bei__guan-yu',
@@ -19469,6 +19625,46 @@ export const sixtyThirdBattleBonds: BattleBond[] = [
...northernNinthBattleBonds
].map(cloneBattleBondForScenario);
export const northernTenthBattleBonds: BattleBond[] = [
{
id: 'jiang-wei__wang-ping_northern-tenth',
unitIds: ['jiang-wei', 'wang-ping'],
title: '물목과 정지선',
level: 58,
exp: 0,
description: '강유의 낮은 길 판단과 왕평의 정지선이 맞물리면, 위수 물목을 넘볼 때도 돌아올 표식을 잃지 않습니다.'
},
{
id: 'zhuge-liang__huang-quan_northern-tenth',
unitIds: ['zhuge-liang', 'huang-quan'],
title: '강가의 장부',
level: 56,
exp: 0,
description: '제갈량의 전선 계산과 황권의 군량 장부가 함께 움직이면, 강을 낀 장기전에서도 수레가 먼저 무너지지 않습니다.'
},
{
id: 'wei-yan__ma-dai_northern-tenth',
unitIds: ['wei-yan', 'ma-dai'],
title: '돌파와 측면',
level: 52,
exp: 0,
description: '위연의 돌파와 마대의 측면 기동은 위수 진영 사이를 흔들어 장합의 추격 기병을 분산시킵니다.'
},
{
id: 'zhao-yun__li-yan_northern-tenth',
unitIds: ['zhao-yun', 'li-yan'],
title: '예비대와 수레',
level: 50,
exp: 0,
description: '조운의 예비대 회수와 이엄의 운송 기준이 맞으면, 깊어진 진영전에서도 보급 수레를 버리지 않고 물릴 수 있습니다.'
}
];
export const sixtyFourthBattleBonds: BattleBond[] = [
...sixtyThirdBattleBonds,
...northernTenthBattleBonds
].map(cloneBattleBondForScenario);
function createEighthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 22 }, (_, y) =>
Array.from({ length: 26 }, (_, x): TerrainType => {
@@ -23027,6 +23223,87 @@ function createSixtyThirdBattleTerrain(): TerrainType[][] {
);
}
function createSixtyFourthBattleTerrain(): TerrainType[][] {
return Array.from({ length: 110 }, (_, y) =>
Array.from({ length: 128 }, (_, x): TerrainType => {
if (
(x >= 2 && x <= 126 && y >= 21 && y <= 32) ||
(x >= 2 && x <= 126 && y >= 36 && y <= 45)
) {
return 'river';
}
if (
(x >= 7 && x <= 90 && y >= 95 && y <= 101) ||
(x >= 24 && x <= 108 && y >= 83 && y <= 91) ||
(x >= 48 && x <= 116 && y >= 71 && y <= 81) ||
(x >= 78 && x <= 124 && y >= 58 && y <= 70) ||
(x >= 99 && x <= 127 && y >= 44 && y <= 56) ||
(x >= 33 && x <= 43 && y >= 75 && y <= 105) ||
(x >= 59 && x <= 69 && y >= 61 && y <= 96) ||
(x >= 88 && x <= 99 && y >= 47 && y <= 86) ||
(x >= 102 && x <= 112 && y >= 27 && y <= 72) ||
(x >= 43 && x <= 88 && y >= 87 && y <= 93)
) {
return 'road';
}
if (
(x >= 0 && x <= 40 && y >= 65 && y <= 98) ||
(x >= 44 && x <= 86 && y >= 80 && y <= 101) ||
(x >= 92 && x <= 127 && y >= 74 && y <= 100) ||
(x >= 16 && x <= 45 && y >= 48 && y <= 69) ||
(x >= 102 && x <= 127 && y >= 57 && y <= 78) ||
(x >= 118 && x <= 127 && y >= 30 && y <= 53)
) {
return 'forest';
}
if (
(x >= 0 && x <= 55 && y <= 19) ||
(x >= 47 && x <= 98 && y <= 22) ||
(x >= 90 && x <= 127 && y <= 27) ||
(x >= 100 && x <= 127 && y >= 50 && y <= 78)
) {
return 'hill';
}
if (
(x <= 2 && y <= 101) ||
(x >= 125 && y <= 94) ||
(x >= 41 && x <= 48 && y >= 0 && y <= 70) ||
(x >= 80 && x <= 87 && y >= 0 && y <= 53) ||
(x >= 64 && x <= 72 && y >= 90 && y <= 109)
) {
return 'cliff';
}
if (
(x >= 13 && x <= 33 && y >= 91 && y <= 101) ||
(x >= 45 && x <= 68 && y >= 78 && y <= 90) ||
(x >= 84 && x <= 105 && y >= 64 && y <= 76) ||
(x >= 106 && x <= 125 && y >= 48 && y <= 62) ||
(x >= 113 && x <= 127 && y >= 31 && y <= 41)
) {
return 'village';
}
if (
(x >= 22 && x <= 52 && y >= 85 && y <= 99) ||
(x >= 57 && x <= 86 && y >= 72 && y <= 85) ||
(x >= 92 && x <= 118 && y >= 58 && y <= 71) ||
(x >= 101 && x <= 122 && y >= 28 && y <= 44)
) {
return 'camp';
}
if (
(x >= 51 && x <= 74 && y >= 52 && y <= 68) ||
(x >= 75 && x <= 104 && y >= 42 && y <= 58) ||
(x >= 97 && x <= 124 && y >= 51 && y <= 67) ||
(x >= 106 && x <= 127 && y >= 16 && y <= 40) ||
(x >= 113 && x <= 127 && y >= 70 && y <= 88)
) {
return 'fort';
}
return 'plain';
})
);
}
function placeScenarioUnit(unit: UnitData, position: { x: number; y: number }): UnitData {
return {
...cloneUnitForScenario(unit),

View File

@@ -20,6 +20,7 @@ import storyChencangSiegeUrl from '../../assets/images/story/19-chencang-siege.p
import storyWuduYinpingUrl from '../../assets/images/story/20-wudu-yinping.png';
import storyHanzhongRainDefenseUrl from '../../assets/images/story/21-hanzhong-rain-defense.png';
import storyLuchengPursuitUrl from '../../assets/images/story/22-lucheng-pursuit.png';
import storyWeishuiCampsUrl from '../../assets/images/story/23-weishui-camps.png';
export const storyBackgroundAssets: Record<string, string> = {
'story-chaos': storyChaosUrl,
@@ -44,5 +45,6 @@ export const storyBackgroundAssets: Record<string, string> = {
'story-wudu-yinping': storyWuduYinpingUrl,
'story-hanzhong-rain': storyHanzhongRainDefenseUrl,
'story-lucheng-pursuit': storyLuchengPursuitUrl,
'story-weishui-camps': storyWeishuiCampsUrl,
'story-resolve': storyLiuBeiUrl
};