generated from nhcarrigan/template
fix: patch quest and boss rewards on sync to restore unlock conditions
This commit is contained in:
@@ -566,6 +566,63 @@ const injectMissingExplorationAreas = (state: GameState): number => {
|
||||
return added;
|
||||
};
|
||||
|
||||
/**
|
||||
* Patches rewards on existing quests whose reward lists have grown since the
|
||||
* save was created (e.g. A new upgrade added as a reward to an old quest).
|
||||
* @param state - The player's current game state (mutated in place).
|
||||
* @returns The total number of individual rewards that were added.
|
||||
*/
|
||||
const patchQuestRewards = (state: GameState): number => {
|
||||
const defaultQuestMap = new Map(defaultQuests.map((quest) => {
|
||||
return [ quest.id, quest ] as const;
|
||||
}));
|
||||
let added = 0;
|
||||
for (const savedQuest of state.quests) {
|
||||
const defaultQuest = defaultQuestMap.get(savedQuest.id);
|
||||
if (defaultQuest === undefined) {
|
||||
continue;
|
||||
}
|
||||
const existingKeys = new Set(savedQuest.rewards.map((reward) => {
|
||||
return `${reward.type}:${String(reward.targetId ?? reward.amount ?? "")}`;
|
||||
}));
|
||||
for (const reward of defaultQuest.rewards) {
|
||||
const key = `${reward.type}:${String(reward.targetId ?? reward.amount ?? "")}`;
|
||||
if (!existingKeys.has(key)) {
|
||||
savedQuest.rewards.push(structuredClone(reward));
|
||||
added = added + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return added;
|
||||
};
|
||||
|
||||
/**
|
||||
* Patches upgradeRewards on existing bosses whose reward lists have grown
|
||||
* since the save was created.
|
||||
* @param state - The player's current game state (mutated in place).
|
||||
* @returns The total number of upgrade reward IDs that were added.
|
||||
*/
|
||||
const patchBossUpgradeRewards = (state: GameState): number => {
|
||||
const defaultBossMap = new Map(defaultBosses.map((boss) => {
|
||||
return [ boss.id, boss ] as const;
|
||||
}));
|
||||
let added = 0;
|
||||
for (const savedBoss of state.bosses) {
|
||||
const defaultBoss = defaultBossMap.get(savedBoss.id);
|
||||
if (defaultBoss === undefined) {
|
||||
continue;
|
||||
}
|
||||
const existingIds = new Set(savedBoss.upgradeRewards);
|
||||
for (const upgradeId of defaultBoss.upgradeRewards) {
|
||||
if (!existingIds.has(upgradeId)) {
|
||||
savedBoss.upgradeRewards.push(upgradeId);
|
||||
added = added + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return added;
|
||||
};
|
||||
|
||||
/* eslint-disable stylistic/max-len -- Long function call lines cannot be shortened without losing alignment */
|
||||
/**
|
||||
* Syncs a player's save with the current game data, injecting any content
|
||||
@@ -579,8 +636,10 @@ const syncNewContent = (
|
||||
achievementsAdded: number;
|
||||
adventurersAdded: number;
|
||||
bossesAdded: number;
|
||||
bossRewardsPatched: number;
|
||||
equipmentAdded: number;
|
||||
explorationAreasAdded: number;
|
||||
questRewardsPatched: number;
|
||||
questsAdded: number;
|
||||
upgradesAdded: number;
|
||||
zonesAdded: number;
|
||||
@@ -588,9 +647,11 @@ const syncNewContent = (
|
||||
return {
|
||||
achievementsAdded: injectMissingEntries(state.achievements, defaultAchievements),
|
||||
adventurersAdded: injectMissingEntries(state.adventurers, defaultAdventurers),
|
||||
bossRewardsPatched: patchBossUpgradeRewards(state),
|
||||
bossesAdded: injectMissingEntries(state.bosses, defaultBosses),
|
||||
equipmentAdded: injectMissingEntries(state.equipment, defaultEquipment),
|
||||
explorationAreasAdded: injectMissingExplorationAreas(state),
|
||||
questRewardsPatched: patchQuestRewards(state),
|
||||
questsAdded: injectMissingEntries(state.quests, defaultQuests),
|
||||
upgradesAdded: injectMissingEntries(state.upgrades, defaultUpgrades),
|
||||
zonesAdded: injectMissingEntries(state.zones, defaultZones),
|
||||
|
||||
Reference in New Issue
Block a user