Normalize campaign reward labels

This commit is contained in:
2026-07-05 14:41:47 +09:00
parent 1b1a203ef1
commit ce79166f96
2 changed files with 16 additions and 4 deletions

View File

@@ -642,7 +642,7 @@ try {
}))
],
mvp: { unitId: 'liu-bei', name: 'Liu Bei', damageDealt: '1000000', defeats: '2' },
itemRewards: ['Bean', 'Bean', 10, 'x'.repeat(97)],
itemRewards: ['Bean', 'Bean', 'Bean -2', 'Bean +0', 10, 'x'.repeat(97)],
campaignRewards: {
supplies: [' Bean ', 'Bean', 20, 'x'.repeat(97)],
equipment: [' Iron Sword ', 'Iron Sword'],
@@ -753,7 +753,7 @@ try {
battleTitle: ' ',
outcome: 'victory',
rewardGold: '120',
itemRewards: ['Bean', 12, 'Bean'],
itemRewards: ['Bean', 12, 'Bean', 'Bean -2', 'Bean +0'],
campaignRewards: {
supplies: { corrupted: true },
equipment: ['Iron Sword'],

View File

@@ -906,6 +906,17 @@ function uniqueStrings(value: unknown): string[] {
].slice(0, maxCampaignStringListEntries);
}
function normalizeRewardStrings(value: unknown): string[] {
return [
...new Set(
arrayOrEmpty<unknown>(value)
.filter((entry): entry is string => typeof entry === 'string')
.map((entry) => entry.replace(/\s+/g, ' ').trim())
.filter((entry) => entry.length > 0 && entry.length <= maxCampaignStringListLength && Boolean(parseRewardLabel(entry)))
)
].slice(0, maxCampaignStringListEntries);
}
function uniqueByKey<T>(entries: T[], keyForEntry: (entry: T) => string) {
const seen = new Set<string>();
return entries.filter((entry) => {
@@ -1083,7 +1094,7 @@ function normalizeCampaignBattleSettlement(value: unknown): CampaignBattleSettle
battleTitle,
outcome: settlement.outcome,
rewardGold: normalizeNonNegativeInteger(settlement.rewardGold),
itemRewards: uniqueStrings(settlement.itemRewards),
itemRewards: normalizeRewardStrings(settlement.itemRewards),
campaignRewards: cloneCampaignRewardSnapshot(settlement.campaignRewards, battleId),
objectives: normalizeLimitedArray(settlement.objectives, normalizeBattleObjectiveSnapshot, maxCampaignBattleObjectiveEntries),
units: normalizeLimitedArray(settlement.units, normalizeCampaignUnitProgressSnapshot, maxCampaignBattleUnitEntries),
@@ -1289,7 +1300,7 @@ function normalizeFirstBattleReport(report: unknown): FirstBattleReport | undefi
units: normalizeLimitedArray(report.units, normalizeUnitDataSnapshot, maxCampaignBattleUnitEntries),
bonds: normalizeLimitedArray(report.bonds, normalizeCampBondSnapshot, maxCampaignBattleBondEntries),
mvp: normalizeCampMvpSnapshot(report.mvp),
itemRewards: uniqueStrings(report.itemRewards),
itemRewards: normalizeRewardStrings(report.itemRewards),
campaignRewards: cloneCampaignRewardSnapshot(
isPlainObject(report.campaignRewards) ? report.campaignRewards as CampaignRewardSnapshot : undefined,
battleId
@@ -1653,6 +1664,7 @@ function cloneCampaignState(state: CampaignState): CampaignState {
function cloneReport(report: FirstBattleReport): FirstBattleReport {
const cloned = JSON.parse(JSON.stringify(report)) as FirstBattleReport;
cloned.itemRewards = normalizeRewardStrings(cloned.itemRewards);
cloned.completedCampDialogues = uniqueStrings(cloned.completedCampDialogues);
cloned.completedCampVisits = uniqueStrings(cloned.completedCampVisits);
if (cloned.campaignRewards) {