diff --git a/scripts/verify-campaign-save-normalization.mjs b/scripts/verify-campaign-save-normalization.mjs index eed2da1..24e3aa1 100644 --- a/scripts/verify-campaign-save-normalization.mjs +++ b/scripts/verify-campaign-save-normalization.mjs @@ -199,7 +199,7 @@ try { ], completedCampDialogues: ['dialogue-a', 17, 'dialogue-a', ''], completedCampVisits: 'visit-a', - inventory: { bean: '3', wine: -2, empty: 0 }, + inventory: { bean: '3', ' bean ': '4', ['\uCF69']: '200', [' \uCF69 ']: '20', wine: -2, empty: 0 }, selectedSortieUnitIds: { corrupted: true }, sortieFormationAssignments: 'front', sortieItemAssignments: { @@ -230,7 +230,10 @@ try { `Expected malformed completion lists to keep unique strings only: ${JSON.stringify(malformed)}` ); assert( - malformed.inventory.bean === 3 && + malformed.inventory.bean === 7 && + malformed.inventory['\uCF69'] === 120 && + malformed.inventory[' bean '] === undefined && + malformed.inventory[' \uCF69 '] === undefined && malformed.inventory.wine === undefined && malformed.sortieItemAssignments['liu-bei']?.bean === 2 && malformed.sortieItemAssignments['liu-bei']?.salve === 1 && diff --git a/src/game/state/campaignState.ts b/src/game/state/campaignState.ts index 6061eec..b1b5c28 100644 --- a/src/game/state/campaignState.ts +++ b/src/game/state/campaignState.ts @@ -901,9 +901,12 @@ function normalizeNonNegativeInteger(value: unknown) { function normalizeInventory(value: unknown) { return Object.entries(recordOrEmpty(value)).reduce>((inventory, [itemId, amount]) => { + const normalizedItemId = itemId.replace(/\s+/g, ' ').trim(); const normalizedAmount = normalizeNonNegativeInteger(amount); - if (itemId && normalizedAmount > 0) { - inventory[itemId] = normalizedAmount; + if (normalizedItemId && normalizedAmount > 0) { + const nextAmount = (inventory[normalizedItemId] ?? 0) + normalizedAmount; + const cap = campaignInventoryCaps[normalizedItemId]; + inventory[normalizedItemId] = cap ? Math.min(nextAmount, cap) : nextAmount; } return inventory; }, {});