diff --git a/scripts/verify-campaign-save-normalization.mjs b/scripts/verify-campaign-save-normalization.mjs index d7846ee..25e5d6a 100644 --- a/scripts/verify-campaign-save-normalization.mjs +++ b/scripts/verify-campaign-save-normalization.mjs @@ -446,6 +446,7 @@ try { gold: 320, firstBattleReport: { battleId: 'first-battle-zhuo-commandery', + battleTitle: ' ', outcome: 'victory', turnNumber: '4', rewardGold: '120', @@ -542,7 +543,7 @@ try { ); assert( malformedReport.firstBattleReport?.battleId === 'first-battle-zhuo-commandery' && - malformedReport.firstBattleReport.battleTitle.length > 0 && + malformedReport.firstBattleReport.battleTitle === firstScenario.title && malformedReport.firstBattleReport.turnNumber === 4 && malformedReport.firstBattleReport.objectives.length === 24 && malformedReport.firstBattleReport.objectives[0].rewardGold === 80 && @@ -609,7 +610,7 @@ try { battleHistory: { 'wrong-history-key': { battleId: 'first-battle-zhuo-commandery', - battleTitle: 'Zhuo Commandery', + battleTitle: ' ', outcome: 'victory', rewardGold: '120', itemRewards: ['Bean', 12, 'Bean'], @@ -724,6 +725,7 @@ try { assert( Object.keys(malformedHistory.battleHistory).length === 1 && malformedHistory.battleHistory['first-battle-zhuo-commandery']?.rewardGold === 120 && + malformedHistory.battleHistory['first-battle-zhuo-commandery']?.battleTitle === firstScenario.title && malformedHistory.battleHistory['wrong-history-key'] === undefined, `Expected malformed battle history entries to be filtered while valid settlements are keyed by battleId: ${JSON.stringify(malformedHistory)}` ); diff --git a/src/game/state/campaignState.ts b/src/game/state/campaignState.ts index 584362b..4fb9042 100644 --- a/src/game/state/campaignState.ts +++ b/src/game/state/campaignState.ts @@ -1008,12 +1008,12 @@ function normalizeCampaignBattleSettlement(value: unknown): CampaignBattleSettle const settlement = value as Partial; const battleId = typeof settlement.battleId === 'string' ? settlement.battleId : ''; + const battleTitle = normalizeDisplayString(settlement.battleTitle) || battleScenarios[battleId as BattleScenarioId]?.title; const completedAt = normalizeCampaignTimestamp(settlement.completedAt); if ( battleId.length === 0 || !(battleId in battleScenarios) || - typeof settlement.battleTitle !== 'string' || - settlement.battleTitle.length === 0 || + !battleTitle || (settlement.outcome !== 'victory' && settlement.outcome !== 'defeat') || !completedAt ) { @@ -1022,7 +1022,7 @@ function normalizeCampaignBattleSettlement(value: unknown): CampaignBattleSettle return { battleId, - battleTitle: normalizeDisplayString(settlement.battleTitle), + battleTitle, outcome: settlement.outcome, rewardGold: normalizeNonNegativeInteger(settlement.rewardGold), itemRewards: uniqueStrings(settlement.itemRewards), @@ -1198,17 +1198,14 @@ function normalizeFirstBattleReport(report: unknown): FirstBattleReport | undefi return undefined; } - const battleTitle = - typeof report.battleTitle === 'string' && report.battleTitle.length > 0 - ? report.battleTitle - : battleScenarios[battleId as BattleScenarioId]?.title; + const battleTitle = normalizeDisplayString(report.battleTitle) || battleScenarios[battleId as BattleScenarioId]?.title; if (!battleTitle) { return undefined; } return { battleId, - battleTitle: normalizeDisplayString(battleTitle), + battleTitle, outcome: report.outcome, turnNumber: normalizeNonNegativeInteger(report.turnNumber), rewardGold: normalizeNonNegativeInteger(report.rewardGold),