feat: align campaign audiovisual story flow

This commit is contained in:
2026-07-23 02:14:59 +09:00
parent 8bda36d46d
commit a9e401aedf
18 changed files with 1405 additions and 243 deletions

View File

@@ -29,6 +29,7 @@ try {
acknowledgeCampaignVictoryReward,
campaignVictoryRewardPresentation,
campaignStorageKey,
completeCampaignAftermath,
dismissCampaignVictoryRewardNotice,
applyCampBondExp,
applyCampVisitReward,
@@ -51,7 +52,8 @@ try {
setCampaignReserveTrainingAssignment,
setCampaignSortieOrderSelection,
setCampaignSortieResonanceSelection,
setFirstBattleReport
setFirstBattleReport,
summarizeCampaignProgress
} = await server.ssrLoadModule('/src/game/state/campaignState.ts');
const { battleScenarios } = await server.ssrLoadModule('/src/game/data/battles.ts');
const { campaignRecruitUnits } = await server.ssrLoadModule('/src/game/data/scenario.ts');
@@ -851,6 +853,22 @@ try {
createdAt: '2026-07-03T09:00:00.000Z'
};
setFirstBattleReport(firstBattleReport);
const pendingAftermathState = loadCampaignState();
assert(
pendingAftermathState.pendingAftermathBattleId === firstScenario.id &&
pendingAftermathState.step === 'first-camp' &&
summarizeCampaignProgress(pendingAftermathState).meta === '승리 후 이야기',
`Expected a settled victory to preserve its pending aftermath across save reloads: ${JSON.stringify(pendingAftermathState)}`
);
const completedAftermathState = completeCampaignAftermath(firstScenario.id);
assert(
completedAftermathState.pendingAftermathBattleId === undefined &&
completedAftermathState.step === 'first-camp' &&
summarizeCampaignProgress(completedAftermathState).meta === '승리 후 군영' &&
completedAftermathState.firstBattleReport?.battleId === firstScenario.id &&
completedAftermathState.battleHistory[firstScenario.id]?.outcome === 'victory',
`Expected completing the aftermath to clear only its resume marker: ${JSON.stringify(completedAftermathState)}`
);
const preJianYongSave = JSON.parse(storage.get(campaignStorageKey));
preJianYongSave.roster = preJianYongSave.roster.filter((unit) => unit.id !== 'jian-yong');
preJianYongSave.bonds = preJianYongSave.bonds.filter((bond) => bond.id !== 'liu-bei__jian-yong');