Cover campaign reward resettlement
This commit is contained in:
@@ -25,7 +25,15 @@ const server = await createServer({
|
|||||||
});
|
});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const { campaignStorageKey, loadCampaignState, normalizeCampaignSortieItemAssignments } = await server.ssrLoadModule('/src/game/state/campaignState.ts');
|
const {
|
||||||
|
campaignStorageKey,
|
||||||
|
getCampaignState,
|
||||||
|
loadCampaignState,
|
||||||
|
normalizeCampaignSortieItemAssignments,
|
||||||
|
resetCampaignState,
|
||||||
|
setFirstBattleReport
|
||||||
|
} = await server.ssrLoadModule('/src/game/state/campaignState.ts');
|
||||||
|
const { battleScenarios } = await server.ssrLoadModule('/src/game/data/battles.ts');
|
||||||
|
|
||||||
storage.clear();
|
storage.clear();
|
||||||
const empty = loadCampaignState();
|
const empty = loadCampaignState();
|
||||||
@@ -49,6 +57,49 @@ try {
|
|||||||
`Expected launch sortie supplies to share save normalization rules: ${JSON.stringify(normalizedLaunchSupplies)}`
|
`Expected launch sortie supplies to share save normalization rules: ${JSON.stringify(normalizedLaunchSupplies)}`
|
||||||
);
|
);
|
||||||
|
|
||||||
|
resetCampaignState();
|
||||||
|
const firstScenario = battleScenarios['first-battle-zhuo-commandery'];
|
||||||
|
const alliedFirstBattleUnits = firstScenario.units.filter((unit) => unit.faction === 'ally');
|
||||||
|
const firstBattleReport = {
|
||||||
|
battleId: firstScenario.id,
|
||||||
|
battleTitle: firstScenario.title,
|
||||||
|
outcome: 'victory',
|
||||||
|
turnNumber: 5,
|
||||||
|
rewardGold: 100,
|
||||||
|
defeatedEnemies: 2,
|
||||||
|
totalEnemies: 4,
|
||||||
|
objectives: [],
|
||||||
|
units: alliedFirstBattleUnits,
|
||||||
|
bonds: firstScenario.bonds.map((bond) => ({ ...bond, battleExp: 0 })),
|
||||||
|
itemRewards: ['Bean x2'],
|
||||||
|
campaignRewards: { supplies: ['Bean x2'], equipment: [], reputation: [], recruits: [], unlocks: [] },
|
||||||
|
completedCampDialogues: [],
|
||||||
|
completedCampVisits: [],
|
||||||
|
createdAt: '2026-07-03T09:00:00.000Z'
|
||||||
|
};
|
||||||
|
setFirstBattleReport(firstBattleReport);
|
||||||
|
setFirstBattleReport(firstBattleReport);
|
||||||
|
const repeatedSettlement = getCampaignState();
|
||||||
|
assert(
|
||||||
|
repeatedSettlement.gold === 100 &&
|
||||||
|
repeatedSettlement.inventory.Bean === 2 &&
|
||||||
|
repeatedSettlement.battleHistory[firstScenario.id]?.rewardGold === 100,
|
||||||
|
`Expected repeated battle report settlement to avoid duplicate gold/items: ${JSON.stringify(repeatedSettlement)}`
|
||||||
|
);
|
||||||
|
setFirstBattleReport({
|
||||||
|
...firstBattleReport,
|
||||||
|
rewardGold: 140,
|
||||||
|
itemRewards: ['Bean x3', 'Wine'],
|
||||||
|
campaignRewards: { supplies: ['Bean x3', 'Wine'], equipment: [], reputation: [], recruits: [], unlocks: [] }
|
||||||
|
});
|
||||||
|
const revisedSettlement = getCampaignState();
|
||||||
|
assert(
|
||||||
|
revisedSettlement.gold === 140 &&
|
||||||
|
revisedSettlement.inventory.Bean === 3 &&
|
||||||
|
revisedSettlement.inventory.Wine === 1,
|
||||||
|
`Expected revised battle report settlement to replace previous rewards instead of stacking: ${JSON.stringify(revisedSettlement)}`
|
||||||
|
);
|
||||||
|
|
||||||
storage.clear();
|
storage.clear();
|
||||||
storage.set(
|
storage.set(
|
||||||
campaignStorageKey,
|
campaignStorageKey,
|
||||||
@@ -502,7 +553,7 @@ try {
|
|||||||
const fallback = loadCampaignState();
|
const fallback = loadCampaignState();
|
||||||
assert(fallback.step === 'second-camp' && fallback.activeSaveSlot === 2, `Expected valid slotted save fallback: ${JSON.stringify(fallback)}`);
|
assert(fallback.step === 'second-camp' && fallback.activeSaveSlot === 2, `Expected valid slotted save fallback: ${JSON.stringify(fallback)}`);
|
||||||
|
|
||||||
console.log('Verified campaign save normalization, malformed-field/roster-equipment/bond-roster/report-reference/sortie-roster/latest-history/detail recovery, unknown-step/report/history recovery, unsupported-version rejection, and slotted fallback.');
|
console.log('Verified campaign save normalization, reward resettlement, malformed-field/roster-equipment/bond-roster/report-reference/sortie-roster/latest-history/detail recovery, unknown-step/report/history recovery, unsupported-version rejection, and slotted fallback.');
|
||||||
} finally {
|
} finally {
|
||||||
await server.close();
|
await server.close();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user