import type { DungeonReward } from '../profile' export type RewardSummaryBase = { experienceGained: number previousLevel: number | null newLevel: number | null levelsGained: number talentPointsGained: number unlockedAbilities: DungeonReward['unlockedAbilities'] } export type RunBossCoinAward = NonNullable & { sourceLabel: string } export type PvpRunRewardSummary = RewardSummaryBase & { bossesKilled: number loot: RunBossCoinAward[] } export function createEmptyRewardSummary(): RewardSummaryBase { return { experienceGained: 0, previousLevel: null, newLevel: null, levelsGained: 0, talentPointsGained: 0, unlockedAbilities: [], } } export function createEmptyPvpRunSummary(): PvpRunRewardSummary { return { bossesKilled: 0, ...createEmptyRewardSummary(), loot: [], } } export function mergeUnlockedAbilities( current: DungeonReward['unlockedAbilities'], next: DungeonReward['unlockedAbilities'], ) { const unlockedById = new Map(current.map((ability) => [ability.id, ability])) next.forEach((ability) => unlockedById.set(ability.id, ability)) return Array.from(unlockedById.values()) } export function mergeDungeonRewardSummary( current: TSummary, reward: DungeonReward, ) { return { ...current, experienceGained: current.experienceGained + reward.experienceGained, previousLevel: current.previousLevel ?? reward.previousLevel, newLevel: reward.newLevel, levelsGained: current.levelsGained + reward.levelsGained, talentPointsGained: current.talentPointsGained + reward.talentPointsGained, unlockedAbilities: mergeUnlockedAbilities(current.unlockedAbilities, reward.unlockedAbilities), } } export function mergePvpRunRewardSummary( current: PvpRunRewardSummary, reward: DungeonReward, { bossKilled, sourceLabel }: { bossKilled: boolean; sourceLabel?: string }, ) { return { ...mergeDungeonRewardSummary(current, reward), bossesKilled: current.bossesKilled + (bossKilled ? 1 : 0), loot: reward.bonusItem ? [...current.loot, { ...reward.bonusItem, sourceLabel: sourceLabel ?? `Boss ${current.bossesKilled + 1}` }] : current.loot, } }