From ed4cc207a6b1c5349058c7c0a0388617a0614546 Mon Sep 17 00:00:00 2001 From: Wickedness Date: Sun, 5 Jul 2026 17:56:14 +0900 Subject: [PATCH] Verify recruit reward settlement --- .../verify-campaign-save-normalization.mjs | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/scripts/verify-campaign-save-normalization.mjs b/scripts/verify-campaign-save-normalization.mjs index dc2d3d6..cb01413 100644 --- a/scripts/verify-campaign-save-normalization.mjs +++ b/scripts/verify-campaign-save-normalization.mjs @@ -38,6 +38,7 @@ try { setFirstBattleReport } = 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'); const { normalizeSortieFormationAssignments } = await server.ssrLoadModule('/src/game/data/sortieDeployment.ts'); storage.clear(); @@ -249,6 +250,43 @@ try { `Expected max-level visit bond exp to cap instead of wrapping: ${JSON.stringify(maxedVisitState)}` ); + resetCampaignState(); + const seventhScenario = battleScenarios['seventh-battle-xuzhou-rescue']; + const seventhAlliedUnits = seventhScenario.units.filter((unit) => unit.faction === 'ally'); + const campaignRecruitNameById = new Map(campaignRecruitUnits.map((unit) => [unit.id, unit.name])); + const seventhRecruitRewards = (seventhScenario.campaignReward?.recruits ?? []).map((unitId) => ({ + unitId, + name: campaignRecruitNameById.get(unitId) ?? unitId + })); + const seventhEquipmentRewards = seventhScenario.campaignReward?.equipment ?? []; + const seventhBattleReport = { + battleId: seventhScenario.id, + battleTitle: seventhScenario.title, + outcome: 'victory', + turnNumber: 7, + rewardGold: 180, + defeatedEnemies: 5, + totalEnemies: 8, + objectives: [], + units: seventhAlliedUnits, + bonds: seventhScenario.bonds.map((bond) => ({ ...bond, battleExp: 0 })), + itemRewards: seventhEquipmentRewards, + campaignRewards: { supplies: [], equipment: seventhEquipmentRewards, reputation: [], recruits: seventhRecruitRewards, unlocks: [] }, + completedCampDialogues: [], + completedCampVisits: [], + createdAt: '2026-07-03T11:00:00.000Z' + }; + setFirstBattleReport(seventhBattleReport); + setFirstBattleReport(seventhBattleReport); + const repeatedRecruitSettlement = getCampaignState(); + const repeatedRecruitRosterIds = repeatedRecruitSettlement.roster.map((unit) => unit.id); + assert( + seventhRecruitRewards.every((recruit) => repeatedRecruitRosterIds.includes(recruit.unitId)) && + seventhRecruitRewards.every((recruit) => repeatedRecruitRosterIds.filter((unitId) => unitId === recruit.unitId).length === 1) && + repeatedRecruitSettlement.battleHistory[seventhScenario.id]?.campaignRewards?.recruits.length === seventhRecruitRewards.length, + `Expected campaign recruit rewards to merge from templates once during repeated settlement: ${JSON.stringify(repeatedRecruitSettlement)}` + ); + storage.clear(); storage.set( campaignStorageKey,