77 lines
2.2 KiB
TypeScript
77 lines
2.2 KiB
TypeScript
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<DungeonReward['bonusItem']> & {
|
|
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<TSummary extends RewardSummaryBase>(
|
|
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,
|
|
}
|
|
}
|