feat: unify victory reward experience

This commit is contained in:
2026-07-18 14:33:29 +09:00
parent 1df324ecd2
commit 134a509938
6 changed files with 1385 additions and 129 deletions

View File

@@ -26,10 +26,13 @@ const server = await createServer({
try {
const {
acknowledgeCampaignVictoryReward,
campaignVictoryRewardPresentation,
campaignStorageKey,
applyCampBondExp,
applyCampVisitReward,
getCampaignState,
getPendingCampaignVictoryRewardReport,
hasCampaignSave,
loadCampaignState,
normalizeCampaignReserveTrainingAssignments,
@@ -999,6 +1002,32 @@ try {
repeatedSettlement.battleHistory[firstScenario.id]?.campaignRewards?.unlocks[0]?.battleId === 'second-battle-yellow-turban-pursuit',
`Expected campaign unlock rewards to survive repeated battle report settlement: ${JSON.stringify(repeatedSettlement)}`
);
const pendingVictoryRewardReport = getPendingCampaignVictoryRewardReport();
assert(
pendingVictoryRewardReport?.battleId === firstScenario.id &&
pendingVictoryRewardReport.rewardGold === firstBattleReport.rewardGold &&
pendingVictoryRewardReport.campaignRewards?.equipment[0] === firstBattleReport.campaignRewards.equipment[0],
`Expected an unacknowledged victory to expose its persisted reward report: ${JSON.stringify(pendingVictoryRewardReport)}`
);
const acknowledgedVictoryReward = acknowledgeCampaignVictoryReward(firstScenario.id);
const repeatedVictoryRewardAcknowledgement = acknowledgeCampaignVictoryReward(firstScenario.id);
const acknowledgedVictoryRewardSave = JSON.parse(storage.get(campaignStorageKey));
assert(
JSON.stringify(acknowledgedVictoryReward.acknowledgedVictoryRewardBattleIds) === JSON.stringify([firstScenario.id]) &&
JSON.stringify(repeatedVictoryRewardAcknowledgement.acknowledgedVictoryRewardBattleIds) === JSON.stringify([firstScenario.id]) &&
getPendingCampaignVictoryRewardReport() === undefined &&
acknowledgedVictoryRewardSave.acknowledgedVictoryRewardBattleIds.includes(firstScenario.id),
`Expected victory reward acknowledgement to persist once and suppress repeat arrival prompts: ${JSON.stringify({ acknowledgedVictoryReward, repeatedVictoryRewardAcknowledgement, acknowledgedVictoryRewardSave })}`
);
const corruptedFutureAcknowledgementSave = JSON.parse(storage.get(campaignStorageKey));
corruptedFutureAcknowledgementSave.acknowledgedVictoryRewardBattleIds.push('second-battle-yellow-turban-pursuit');
storage.set(campaignStorageKey, JSON.stringify(corruptedFutureAcknowledgementSave));
const normalizedFutureAcknowledgementSave = loadCampaignState();
assert(
normalizedFutureAcknowledgementSave.acknowledgedVictoryRewardBattleIds.includes(firstScenario.id) &&
!normalizedFutureAcknowledgementSave.acknowledgedVictoryRewardBattleIds.includes('second-battle-yellow-turban-pursuit'),
`Expected acknowledgement normalization to retain recorded victories while rejecting future known battle ids without a victory: ${JSON.stringify(normalizedFutureAcknowledgementSave.acknowledgedVictoryRewardBattleIds)}`
);
setFirstBattleReport({
...firstBattleReport,
rewardGold: 140,
@@ -1243,8 +1272,13 @@ try {
setCampaignSortieOrderSelection(firstScenario.id, 'elite');
const firstOrderCanonicalReport = setFirstBattleReport(orderBattleReport);
const firstOrderSettlement = getCampaignState();
const firstOrderRewardPresentation = campaignVictoryRewardPresentation(firstOrderCanonicalReport);
assert(
firstOrderCanonicalReport?.sortieOrder?.rewardGranted === true &&
firstOrderRewardPresentation.baseRewardGold === 100 &&
firstOrderRewardPresentation.rewardGold === 280 &&
firstOrderRewardPresentation.sortieOrderBonus?.rewardGold === 180 &&
firstOrderRewardPresentation.itemRewards.includes('상처약 1') &&
firstOrderSettlement.gold === 280 &&
firstOrderSettlement.inventory.Bean === 2 &&
firstOrderSettlement.inventory['Iron Sword'] === 1 &&