diff --git a/src/CHANGELOG.tsx b/src/CHANGELOG.tsx index 560288a4b92..dc9b1b9fe0c 100644 --- a/src/CHANGELOG.tsx +++ b/src/CHANGELOG.tsx @@ -35,7 +35,10 @@ import SpellLink from 'interface/SpellLink'; // prettier-ignore export default [ + change(date(2024, 9, 9), 'Fix character search showing UNKNOWN instead of THE WAR WITHIN.', ToppleTheNun), + change(date(2024, 9, 8), "Add Nerub'ar Palace bosses and season 1 M+ dungeons.", ToppleTheNun), change(date(2024, 9, 6), "Add missing supportID property to DamageEvent interface", Vollmer), + change(date(2024, 9, 5), 'Update Rogue spells for Classic Cataclysm', jazminite), change(date(2024, 9, 4), 'Updates to Active Time calculation to avoid cases where overcount could occur.', Sref), change(date(2024, 9, 3), "Fixed a bug where the Death Recap wouldn't detect some defensive buffs", Sref), change(date(2024, 9, 3), 'Remove AbilitiesMissing module.', ToppleTheNun), diff --git a/src/analysis/classic/rogue/assassination/CombatLogParser.ts b/src/analysis/classic/rogue/assassination/CombatLogParser.ts index a3e1f249e2f..6997bdc504e 100644 --- a/src/analysis/classic/rogue/assassination/CombatLogParser.ts +++ b/src/analysis/classic/rogue/assassination/CombatLogParser.ts @@ -1,8 +1,6 @@ // Base file import BaseCombatLogParser from 'parser/classic/CombatLogParser'; // Shared -import lowRankSpellsSuggestion from 'parser/classic/suggestions/lowRankSpells'; -import { lowRankSpells } from '../shared'; // Features import Abilities from './modules/features/Abilities'; import AlwaysBeCasting from './modules/features/AlwaysBeCasting'; @@ -14,7 +12,6 @@ import Checklist from './modules/checklist/Module'; class CombatLogParser extends BaseCombatLogParser { static specModules = { // Shared - lowRankSpells: lowRankSpellsSuggestion(lowRankSpells), // Features abilities: Abilities, alwaysBeCasting: AlwaysBeCasting, diff --git a/src/analysis/classic/rogue/assassination/modules/features/Abilities.ts b/src/analysis/classic/rogue/assassination/modules/features/Abilities.ts index ae746233d2b..234dcb53db5 100644 --- a/src/analysis/classic/rogue/assassination/modules/features/Abilities.ts +++ b/src/analysis/classic/rogue/assassination/modules/features/Abilities.ts @@ -7,27 +7,22 @@ class Abilities extends CoreAbilities { return [ // Rotational { - spell: [SPELLS.MUTILATE.id, ...SPELLS.MUTILATE.lowRanks], + spell: SPELLS.MUTILATE.id, category: SPELL_CATEGORY.ROTATIONAL, gcd: { base: 1000 }, }, { - spell: [SPELLS.SLICE_AND_DICE.id, ...SPELLS.SLICE_AND_DICE.lowRanks], + spell: SPELLS.SLICE_AND_DICE.id, category: SPELL_CATEGORY.ROTATIONAL, gcd: { base: 1000 }, }, { - spell: [SPELLS.HUNGER_FOR_BLOOD.id], + spell: SPELLS.ENVENOM.id, category: SPELL_CATEGORY.ROTATIONAL, gcd: { base: 1000 }, }, { - spell: [SPELLS.ENVENOM.id, ...SPELLS.ENVENOM.lowRanks], - category: SPELL_CATEGORY.ROTATIONAL, - gcd: { base: 1000 }, - }, - { - spell: [SPELLS.RUPTURE.id, ...SPELLS.RUPTURE.lowRanks], + spell: SPELLS.RUPTURE.id, category: SPELL_CATEGORY.ROTATIONAL, gcd: { base: 1000 }, }, @@ -58,17 +53,17 @@ class Abilities extends CoreAbilities { }, // Defensive { - spell: [SPELLS.FEINT.id, ...SPELLS.FEINT.lowRanks], + spell: SPELLS.FEINT.id, category: SPELL_CATEGORY.DEFENSIVE, gcd: { base: 1000 }, }, { - spell: [SPELLS.EVASION.id, ...SPELLS.EVASION.lowRanks], + spell: SPELLS.EVASION.id, category: SPELL_CATEGORY.DEFENSIVE, gcd: null, }, { - spell: [SPELLS.VANISH.id, ...SPELLS.VANISH.lowRanks], + spell: SPELLS.VANISH.id, category: SPELL_CATEGORY.DEFENSIVE, gcd: null, }, @@ -79,7 +74,7 @@ class Abilities extends CoreAbilities { }, // Other spells (not apart of the normal rotation) { - spell: [SPELLS.EVISCERATE.id, ...SPELLS.EVISCERATE.lowRanks], + spell: SPELLS.EVISCERATE.id, category: SPELL_CATEGORY.OTHERS, gcd: { base: 1000 }, }, @@ -95,12 +90,12 @@ class Abilities extends CoreAbilities { gcd: null, }, { - spell: [SPELLS.KIDNEY_SHOT.id, ...SPELLS.KIDNEY_SHOT.lowRanks], + spell: SPELLS.KIDNEY_SHOT.id, category: SPELL_CATEGORY.UTILITY, gcd: { base: 1000 }, }, { - spell: [SPELLS.SPRINT.id, ...SPELLS.SPRINT.lowRanks], + spell: SPELLS.SPRINT.id, category: SPELL_CATEGORY.UTILITY, gcd: null, }, diff --git a/src/analysis/classic/rogue/shared/index.ts b/src/analysis/classic/rogue/shared/index.ts deleted file mode 100644 index 57748bc19b8..00000000000 --- a/src/analysis/classic/rogue/shared/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as lowRankSpells } from './lowRankSpells'; diff --git a/src/analysis/classic/rogue/shared/lowRankSpells.ts b/src/analysis/classic/rogue/shared/lowRankSpells.ts deleted file mode 100644 index 46d526eff78..00000000000 --- a/src/analysis/classic/rogue/shared/lowRankSpells.ts +++ /dev/null @@ -1,10 +0,0 @@ -import SPELLS from 'common/SPELLS/classic/rogue'; - -const lowRankSpells = Object.entries(SPELLS).reduce((result, [str, obj]) => { - if ('lowRanks' in obj && obj.lowRanks) { - Object.assign(result, { [obj.id]: [...obj.lowRanks] }); - } - return result; -}, {}); - -export default lowRankSpells; diff --git a/src/analysis/retail/evoker/augmentation/CHANGELOG.tsx b/src/analysis/retail/evoker/augmentation/CHANGELOG.tsx index c8d2855d09b..7d226368a89 100644 --- a/src/analysis/retail/evoker/augmentation/CHANGELOG.tsx +++ b/src/analysis/retail/evoker/augmentation/CHANGELOG.tsx @@ -5,6 +5,8 @@ import TALENTS from 'common/TALENTS/evoker'; export default [ change(date(2024, 9, 6), <>Implement module, Vollmer), + change(date(2024, 9, 6), <>Update MajorDefensive module for and , Vollmer), + change(date(2024, 9, 6), <>Implement module, Vollmer), change(date(2024, 9, 6), <>Implement module, Vollmer), change(date(2024, 8, 14), <>Implement module, Vollmer), change(date(2024, 8, 14), <>Implement module, Vollmer), diff --git a/src/analysis/retail/evoker/augmentation/CombatLogParser.ts b/src/analysis/retail/evoker/augmentation/CombatLogParser.ts index 03b57720c8d..744328f50f0 100644 --- a/src/analysis/retail/evoker/augmentation/CombatLogParser.ts +++ b/src/analysis/retail/evoker/augmentation/CombatLogParser.ts @@ -64,6 +64,7 @@ import { DivertedPower, UnrelentingSiege, Wingleader, + Slipstream, } from 'analysis/retail/evoker/shared'; class CombatLogParser extends MainCombatLogParser { @@ -132,6 +133,7 @@ class CombatLogParser extends MainCombatLogParser { divertedPower: DivertedPower, unrelentingSiege: UnrelentingSiege, wingLeader: Wingleader, + slipstream: Slipstream, // Features buffTrackerGraph: BuffTrackerGraph, diff --git a/src/analysis/retail/evoker/devastation/CHANGELOG.tsx b/src/analysis/retail/evoker/devastation/CHANGELOG.tsx index 9f2be742545..e61718b33fa 100644 --- a/src/analysis/retail/evoker/devastation/CHANGELOG.tsx +++ b/src/analysis/retail/evoker/devastation/CHANGELOG.tsx @@ -6,6 +6,8 @@ import SPELLS from 'common/SPELLS/evoker'; export default [ change(date(2024, 9, 6), <>Implement module, Vollmer), + change(date(2024, 9, 6), <>Update MajorDefensive module for and , Vollmer), + change(date(2024, 9, 6), <>Implement module, Vollmer), change(date(2024, 9, 6), <>Implement module, Vollmer), change(date(2024, 8, 14), <>Implement module, Vollmer), change(date(2024, 8, 14), <>Implement module, Vollmer), diff --git a/src/analysis/retail/evoker/devastation/CombatLogParser.ts b/src/analysis/retail/evoker/devastation/CombatLogParser.ts index c19e7eddd6a..dc996c289c5 100644 --- a/src/analysis/retail/evoker/devastation/CombatLogParser.ts +++ b/src/analysis/retail/evoker/devastation/CombatLogParser.ts @@ -66,6 +66,7 @@ import { DivertedPower, UnrelentingSiege, Wingleader, + Slipstream, } from 'analysis/retail/evoker/shared'; import ExpandedLungs from '../shared/modules/talents/hero/flameshaper/ExpandedLungs'; import FanTheFlames from '../shared/modules/talents/hero/flameshaper/FanTheFlames'; @@ -142,6 +143,7 @@ class CombatLogParser extends MainCombatLogParser { divertedPower: DivertedPower, unrelentingSiege: UnrelentingSiege, wingLeader: Wingleader, + slipstream: Slipstream, // core abilities disintegrate: Disintegrate, diff --git a/src/analysis/retail/evoker/shared/constants.ts b/src/analysis/retail/evoker/shared/constants.ts index 0eb6bfb3b6c..83281d8f3f5 100644 --- a/src/analysis/retail/evoker/shared/constants.ts +++ b/src/analysis/retail/evoker/shared/constants.ts @@ -79,6 +79,7 @@ export const IMMINENT_DESTRUCTION_ESSENCE_REDUCTION = 1; export const MELT_ARMOR_MULTIPLIER = 0.2; export const MIGHT_OF_THE_BLACK_DRAGONFLIGHT_MULTIPLIER = 0.2; export const UNRELENTING_SIEGE_MULTIPLIER_PER_STACK = 0.01; +export const HARDENED_SCALES_MITIGATION = 0.1; export const MASS_DISINTEGRATE_MULTIPLIER_PER_MISSING_TARGET = 0.15; export const MASS_ERUPTION_MULTIPLIER_PER_MISSING_TARGET = diff --git a/src/analysis/retail/evoker/shared/index.ts b/src/analysis/retail/evoker/shared/index.ts index 1372f23690c..ce4d11aadbd 100644 --- a/src/analysis/retail/evoker/shared/index.ts +++ b/src/analysis/retail/evoker/shared/index.ts @@ -27,4 +27,5 @@ export { default as ExtendedBattle } from './modules/talents/hero/scalecommander export { default as DivertedPower } from './modules/talents/hero/scalecommander/DivertedPower'; export { default as UnrelentingSiege } from './modules/talents/hero/scalecommander/UnrelentingSiege'; export { default as Wingleader } from './modules/talents/hero/scalecommander/Wingleader'; +export { default as Slipstream } from './modules/talents/hero/scalecommander/Slipstream'; export * from './constants'; diff --git a/src/analysis/retail/evoker/shared/modules/MajorDefensives/ObsidianScales.tsx b/src/analysis/retail/evoker/shared/modules/MajorDefensives/ObsidianScales.tsx index 94516f8936b..d399f0acd98 100644 --- a/src/analysis/retail/evoker/shared/modules/MajorDefensives/ObsidianScales.tsx +++ b/src/analysis/retail/evoker/shared/modules/MajorDefensives/ObsidianScales.tsx @@ -9,13 +9,12 @@ import Events, { DamageEvent } from 'parser/core/Events'; import { SpellLink } from 'interface'; import MajorDefensiveStatistic from 'interface/MajorDefensiveStatistic'; import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; +import { HARDENED_SCALES_MITIGATION } from '../../constants'; -// TWW ScaleCommander hero talent has a +5% buff so just preparing for that. const BASE_MITIGATION = 0.3; -const HARDENED_SCALES_MITIGATION = 0.05; class ObsidianScales extends MajorDefensiveBuff { - hasHardenedScales = false; + hasHardenedScales = this.selectedCombatant.hasTalent(TALENTS.HARDENED_SCALES_TALENT); mitPct: number = BASE_MITIGATION + (this.hasHardenedScales ? HARDENED_SCALES_MITIGATION : 0); constructor(options: Options) { @@ -39,6 +38,13 @@ class ObsidianScales extends MajorDefensiveBuff { return (

reduces the damage you take by 30%. + {this.hasHardenedScales && ( + <> +
+ increases this mitigation to{' '} + {this.mitPct * 100}%. + + )}

); } diff --git a/src/analysis/retail/evoker/shared/modules/MajorDefensives/RenewingBlaze.tsx b/src/analysis/retail/evoker/shared/modules/MajorDefensives/RenewingBlaze.tsx index c8cb314be19..3fca4fe72b3 100644 --- a/src/analysis/retail/evoker/shared/modules/MajorDefensives/RenewingBlaze.tsx +++ b/src/analysis/retail/evoker/shared/modules/MajorDefensives/RenewingBlaze.tsx @@ -7,11 +7,10 @@ import MajorDefensive, { } from 'interface/guide/components/MajorDefensives/MajorDefensiveAnalyzer'; import { Options, SELECTED_PLAYER } from 'parser/core/Analyzer'; import TALENTS from 'common/TALENTS/evoker'; -import SPELLS from 'common/SPELLS/evoker'; import Events, { ApplyBuffEvent, DamageEvent, - GetRelatedEvent, + GetRelatedEvents, HealEvent, } from 'parser/core/Events'; import { SpellLink } from 'interface'; @@ -35,34 +34,43 @@ import BoringValue from 'parser/ui/BoringValueText'; import MAGIC_SCHOOLS, { color } from 'game/MAGIC_SCHOOLS'; import { QualitativePerformance } from 'parser/ui/QualitativePerformance'; import { ReactNode } from 'react'; -import { - RENEWING_BLAZE_BUFFS, - RENEWING_BLAZE_HEAL, -} from '../normalizers/DefensiveCastLinkNormalizer'; +import { RENEWING_BLAZE_HEAL } from '../normalizers/DefensiveCastLinkNormalizer'; type RenewingBlazeHealBuff = { start: ApplyBuffEvent; - events: HealEvent[]; amount: number; overheal: number; + partnerAmount: number; }; class RenewingBlaze extends MajorDefensiveBuff { renewingBlazeHealBuffs: RenewingBlazeHealBuff[] = []; normalizedMitigations: Mitigation[] = []; + hasCinders = false; constructor(options: Options) { - super(TALENTS.RENEWING_BLAZE_TALENT, buff(TALENTS.RENEWING_BLAZE_TALENT), options); + // Custom trigger since we only want to track mitigation during our + // personal buffs, not any external ones + const trigger = buff(TALENTS.RENEWING_BLAZE_TALENT); + trigger.applyTrigger = Events.applybuff + .spell(TALENTS.RENEWING_BLAZE_TALENT) + .by(SELECTED_PLAYER) + .to(SELECTED_PLAYER); + trigger.removeTrigger = Events.removebuff + .spell(TALENTS.RENEWING_BLAZE_TALENT) + .by(SELECTED_PLAYER) + .to(SELECTED_PLAYER); + + super(TALENTS.RENEWING_BLAZE_TALENT, trigger, options); this.active = this.selectedCombatant.hasTalent(TALENTS.RENEWING_BLAZE_TALENT); + this.hasCinders = this.selectedCombatant.hasTalent(TALENTS.LIFECINDERS_TALENT); + this.addEventListener(Events.damage.to(SELECTED_PLAYER), this.recordDamage); + this.addEventListener( - Events.heal.to(SELECTED_PLAYER).spell(SPELLS.RENEWING_BLAZE_HEAL), - this.recordHeal, - ); - this.addEventListener( - Events.applybuff.to(SELECTED_PLAYER).spell(SPELLS.RENEWING_BLAZE_HEAL), - this.applyHealBuff, + Events.applybuff.by(SELECTED_PLAYER).to(SELECTED_PLAYER).spell(TALENTS.RENEWING_BLAZE_TALENT), + this.applyBuff, ); this.addEventListener(Events.fightend, this.onFightEnd); } @@ -78,29 +86,33 @@ class RenewingBlaze extends MajorDefensiveBuff { }); } - private recordHeal(event: HealEvent) { - const heal = this.renewingBlazeHealBuffs.find( - (buff) => GetRelatedEvent(event, RENEWING_BLAZE_HEAL) === buff.start, - ); - if (!heal) { - console.warn('Unable to find parent buff for Major Defensive analyzer', this.spell, event); - return; + private applyBuff(event: ApplyBuffEvent) { + const heal = { + start: event, + amount: 0, + overheal: 0, + partnerAmount: -1, + }; + if (this.hasCinders) { + heal.partnerAmount = 0; } - heal.events.push(event); - heal.amount += event.amount; - heal.overheal += event.overheal ?? 0; - } + const healEvents = GetRelatedEvents(event, RENEWING_BLAZE_HEAL); + for (const healEvent of healEvents) { + if (healEvent.targetID !== this.selectedCombatant.id) { + heal.partnerAmount += healEvent.amount; + continue; + } - private applyHealBuff(event: ApplyBuffEvent) { - this.renewingBlazeHealBuffs.push({ start: event, events: [], amount: 0, overheal: 0 }); + heal.amount += healEvent.amount; + heal.overheal += healEvent.overheal ?? 0; + } + this.renewingBlazeHealBuffs.push(heal); } /** Returns the related Renewing Healing buff, for our Acc buff. */ - private healBuff(mit: Mitigation): RenewingBlazeHealBuff | undefined { - return this.renewingBlazeHealBuffs.find( - (buff) => GetRelatedEvent(buff.start, RENEWING_BLAZE_BUFFS) === mit.start, - ); + private healBuff(mit: Mitigation | undefined): RenewingBlazeHealBuff | undefined { + return this.renewingBlazeHealBuffs.find((buff) => buff.start === mit?.start); } // For some reason healing numbers and damage taken doesn't always @@ -119,9 +131,7 @@ class RenewingBlaze extends MajorDefensiveBuff { } mitigationSegments(mit: Mitigation): MitigationSegment[] { - const heal = this.renewingBlazeHealBuffs.find( - (buff) => GetRelatedEvent(buff.start, RENEWING_BLAZE_BUFFS) === mit.start, - ); + const heal = this.healBuff(mit); return [ { @@ -321,9 +331,7 @@ class RenewingBlaze extends MajorDefensiveBuff { get cooldownDetailsComponent() { return ({ analyzer, mit }: CooldownDetailsProps) => { - const heal = this.renewingBlazeHealBuffs.find( - (buff) => GetRelatedEvent(buff.start, RENEWING_BLAZE_BUFFS) === mit?.start, - ); + const heal = this.healBuff(mit); return ; }; } @@ -402,6 +410,26 @@ const CooldownDetails = ({ /> + + {heal.partnerAmount >= 0 && ( + + Partner healing + {formatNumber(heal.partnerAmount)} + + + + + + + )} ) : ( <> diff --git a/src/analysis/retail/evoker/shared/modules/normalizers/DefensiveCastLinkNormalizer.ts b/src/analysis/retail/evoker/shared/modules/normalizers/DefensiveCastLinkNormalizer.ts index 073d76a6906..d3d3f18ee46 100644 --- a/src/analysis/retail/evoker/shared/modules/normalizers/DefensiveCastLinkNormalizer.ts +++ b/src/analysis/retail/evoker/shared/modules/normalizers/DefensiveCastLinkNormalizer.ts @@ -6,14 +6,10 @@ import { Options } from 'parser/core/Module'; export const OBSIDIAN_SCALES = 'obsidianScales'; // links cast to buff apply export const RENEWING_BLAZE = 'renewingBlaze'; // links cast to buff apply -export const RENEWING_BLAZE_BUFFS = 'renewingBlazeBuffs'; // links acc & heal buffs export const RENEWING_BLAZE_HEAL = 'renewingBlazeHeal'; // links heal buff and healing const TWIN_GUARDIAN_PARTNER = 'twinGuardianPartner'; // links external and personal buffs const CAST_BUFFER = 25; -/** Heal buff gets applied once you first take damage, so there is a non-zero chance it won't apply - * till very late into the acc buff */ -const RENEWING_BLAZE_BUFF_BUFFER = 10_000; /** Heal buff can get applied immediately on use, and keeps getting refreshed on damage until * main acc buff runs out, so we set this high to make sure we catch all. */ const RENEWING_BLAZE_DURATION = 25_000; @@ -37,29 +33,19 @@ const EVENT_LINKS: EventLink[] = [ linkingEventType: EventType.ApplyBuff, referencedEventId: TALENTS.RENEWING_BLAZE_TALENT.id, referencedEventType: EventType.Cast, - anyTarget: true, // TODO: Revisit in TWW - Flame shaper can share RB + anyTarget: true, forwardBufferMs: CAST_BUFFER, backwardBufferMs: CAST_BUFFER, }, - { - linkRelation: RENEWING_BLAZE_BUFFS, - reverseLinkRelation: RENEWING_BLAZE_BUFFS, - linkingEventId: TALENTS.RENEWING_BLAZE_TALENT.id, - linkingEventType: EventType.ApplyBuff, - referencedEventId: SPELLS.RENEWING_BLAZE_HEAL.id, - referencedEventType: EventType.ApplyBuff, - anyTarget: true, // TODO: Revisit in TWW - Flameshaper can share RB - forwardBufferMs: RENEWING_BLAZE_BUFF_BUFFER, - maximumLinks: 1, - }, { linkRelation: RENEWING_BLAZE_HEAL, reverseLinkRelation: RENEWING_BLAZE_HEAL, - linkingEventId: SPELLS.RENEWING_BLAZE_HEAL.id, + linkingEventId: TALENTS.RENEWING_BLAZE_TALENT.id, linkingEventType: EventType.ApplyBuff, referencedEventId: SPELLS.RENEWING_BLAZE_HEAL.id, referencedEventType: EventType.Heal, anyTarget: true, + anySource: false, // We only want to be tracking our own Buffs, not any external ones forwardBufferMs: RENEWING_BLAZE_DURATION, }, { diff --git a/src/analysis/retail/evoker/shared/modules/normalizers/DefensiveNormalizer.ts b/src/analysis/retail/evoker/shared/modules/normalizers/DefensiveNormalizer.ts index c02b822bada..6c1d94c2de2 100644 --- a/src/analysis/retail/evoker/shared/modules/normalizers/DefensiveNormalizer.ts +++ b/src/analysis/retail/evoker/shared/modules/normalizers/DefensiveNormalizer.ts @@ -44,6 +44,7 @@ class DefensiveNormalizer extends EventsNormalizer { continue; } + const targetID = event.targetID ?? 0; // You never know if (event.type === EventType.ApplyBuff) { // fake apply don't push if (!HasRelatedEvent(event, castLink)) { @@ -51,10 +52,10 @@ class DefensiveNormalizer extends EventsNormalizer { } // on new "real" apply we push in our last removeBuffEvent - const hasStoredEnd = latestBuffRemoveEvents.get(spellId); + const hasStoredEnd = latestBuffRemoveEvents.get(spellId + targetID); if (hasStoredEnd) { fixedEvents.push(hasStoredEnd); - latestBuffRemoveEvents.delete(spellId); + latestBuffRemoveEvents.delete(spellId + targetID); } fixedEvents.push(event); continue; @@ -62,7 +63,7 @@ class DefensiveNormalizer extends EventsNormalizer { if (event.type === EventType.RemoveBuff) { // store the latests event so we only push the latests one - latestBuffRemoveEvents.set(spellId, event); + latestBuffRemoveEvents.set(spellId + targetID, event); continue; } } diff --git a/src/analysis/retail/evoker/shared/modules/talents/hero/scalecommander/Slipstream.tsx b/src/analysis/retail/evoker/shared/modules/talents/hero/scalecommander/Slipstream.tsx new file mode 100644 index 00000000000..1e19c0bd154 --- /dev/null +++ b/src/analysis/retail/evoker/shared/modules/talents/hero/scalecommander/Slipstream.tsx @@ -0,0 +1,80 @@ +import SPELLS from 'common/SPELLS/evoker'; +import TALENTS from 'common/TALENTS/evoker'; +import { SoupIcon, WarningIcon } from 'interface/icons'; +import SpellLink from 'interface/SpellLink'; +import Analyzer, { SELECTED_PLAYER } from 'parser/core/Analyzer'; +import Events, { CastEvent } from 'parser/core/Events'; +import { Options } from 'parser/core/EventSubscriber'; +import SpellUsable from 'parser/shared/modules/SpellUsable'; +import Statistic from 'parser/ui/Statistic'; +import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; +import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; +import TalentSpellText from 'parser/ui/TalentSpellText'; + +/** Deep Breath resets the cooldown of Hover. */ +class Slipstream extends Analyzer { + static dependencies = { + spellUsable: SpellUsable, + }; + protected spellUsable!: SpellUsable; + + chargesRecharged = 0; + chargesWasted = 0; + maxCharges = 0; + + constructor(options: Options) { + super(options); + this.active = this.selectedCombatant.hasTalent(TALENTS.SLIPSTREAM_TALENT); + + this.maxCharges = this.selectedCombatant.hasTalent(TALENTS.AERIAL_MASTERY_TALENT) ? 2 : 1; + + this.addEventListener( + Events.cast + .by(SELECTED_PLAYER) + .spell([SPELLS.DEEP_BREATH_SCALECOMMANDER, SPELLS.BREATH_OF_EONS_SCALECOMMANDER]), + this.onCast, + ); + } + + onCast(event: CastEvent) { + if (event.prepull) { + return; + } + + const charges = this.spellUsable.chargesAvailable(SPELLS.HOVER.id); + + this.chargesRecharged += this.maxCharges - charges; + this.chargesWasted += charges; + + this.spellUsable.endCooldown(SPELLS.HOVER.id, event.timestamp, false, true); + } + + statistic() { + return ( + + +
+ {this.chargesRecharged}{' '} + + charges gained + +
+ {this.chargesWasted > 0 && ( +
+ {this.chargesWasted}{' '} + + charges overcapped + +
+ )} +
+
+ ); + } +} + +export default Slipstream; diff --git a/src/analysis/retail/priest/discipline/CHANGELOG.tsx b/src/analysis/retail/priest/discipline/CHANGELOG.tsx index 6918b8eab50..865a0d781f2 100644 --- a/src/analysis/retail/priest/discipline/CHANGELOG.tsx +++ b/src/analysis/retail/priest/discipline/CHANGELOG.tsx @@ -1,87 +1,6 @@ import { change, date } from 'common/changelog'; -import { TALENTS_PRIEST } from 'common/TALENTS'; -import SPELLS from 'common/SPELLS' -import { Saeldur, Arlie, Hana, Sref, Tapir, ToppleTheNun } from 'CONTRIBUTORS'; -import { SpellLink } from 'interface'; - +import { Hana } from 'CONTRIBUTORS'; export default [ - change(date(2024, 6, 1), <>Fix wasted bolts from stacks. , Saeldur), - change(date(2024, 5, 3), <>Add to , , and , Saeldur), - change(date(2024, 5, 3), <>Fix cooldown and CDR. , Saeldur), - change(date(2024, 5, 3), <>Update Many Discipline Priest Ability Categorisations and Fix Cooldowns for and . , Saeldur), - change(date(2024, 4, 20), <>Fix cooldown of when using .,Arlie), - change(date(2023, 4, 20), <>Hide analyzer for now., Arlie), - change(date(2023, 3, 12), <>Update spec compatibility with 10.2.5 patch., Hana), - change(date(2023, 12, 17), <>Re enabled ., Hana), - change(date(2023, 12, 17), <>Updated . No longer shows mana, and damage is now displayed. , Hana), - change(date(2023, 12, 11), <>Fixed ., Hana), - change(date(2023, 11, 23), <> and should now properly show as casting time in the timeline., Sref), - change(date(2023, 11, 14), <>Add tracker for CDR., Arlie), - change(date(2023, 11, 14), <>Add tracker for CDR., Arlie), - change(date(2023, 11, 1), 'Added Amirdrassil 4p tracker.', Arlie), - change(date(2023, 10, 27), <>Enable spec with 10.2 changes., Arlie), - change(date(2023, 10, 8), <>Updated for revamp - the heal has been removed and has various amps depending on talents selected., Hana), - change(date(2023, 10, 7), <>Added , Hana), - change(date(2023, 9, 15), <>Added new atonement damage sources which will appear in the new patch. Can be merged now as it doesn't break any old functionality., Hana), - change(date(2023, 8, 18), <>Cleared some console logs, updated some spells for cast efficiency, updated some mana costs, Hana), - change(date(2023, 8, 12), <>'Add ', Hana), - change(date(2023, 8, 3), 'Update Rapture analysis now ignores off GCD spells and enchants', Tapir), - change(date(2023, 8, 1), <>Add , Hana), - change(date(2023, 7, 3), 'Update SpellLink usage.', ToppleTheNun), - change(date(2023, 5, 29), 'Fix Evangelism ramp crash.', ToppleTheNun), - change(date(2023, 5, 5), <>Added module., Hana), - change(date(2023, 4, 16), <>Aberrus 2p added., Hana), - change(date(2023, 4, 14), <>Added module., Hana), - change(date(2023, 3, 14), <> added., Hana), - change(date(2023, 3, 7), <> working with , Hana), - change(date(2023, 2, 6), <> re enabled., Hana), - change(date(2023, 2, 2), <> graph updated., Hana), - change(date(2023, 1, 29), <> module added., Hana), - change(date(2023, 1, 28), <> bugfix., Hana), - change(date(2023, 1, 27), <> module no longer uses Atonement event., Hana), - change(date(2023, 1, 27), <>Begun 10.0.5 changes, updated and. Bugfix for Solace vs Shield discipline module. , Hana), - change(date(2023, 1, 22), <> module no longer uses Atonement event., Hana), - change(date(2023, 1, 22), <> module no longer uses Atonement event., Hana), - change(date(2023, 1, 21), <> module., Hana), - change(date(2023, 1, 15), <> module no longer uses Atonement event., Hana), - change(date(2023, 1, 15), <> module no longer uses Atonement event., Hana), - change(date(2023, 1, 14), <> module no longer uses Atonement event., Hana), - change(date(2023, 1, 10), <> refactor begun - added normalizer to create links between events., Hana), - change(date(2023, 1, 4), <> bugfixes., Hana), - change(date(2022, 12, 26), 'Disable Twilight Equilibrium analyzer.', ToppleTheNun), - change(date(2022, 12, 11), <> added to guide., Hana), - change(date(2022, 11, 26), <>Enabled ., Hana), - change(date(2022, 11, 23), <>Support for ., Hana), - change(date(2022, 11, 23), <> updated following nerfs., Hana), - change(date(2022, 11, 23), <> updated following buffs., Hana), - change(date(2022, 11, 23), <>Updated following nerfs., Hana), - change(date(2022, 11, 8), <>Updated to use correct damage multiplier., Hana), - change(date(2022, 11, 7), <> support added., Hana), - change(date(2022, 11, 6), <>Added section to guide., Hana), - change(date(2022, 11, 6), <>Added DPS rotation to guide., Hana), - change(date(2022, 11, 5), <>Updated ., Hana), - change(date(2022, 11, 5), <>Added Resplendent Light., Hana), - change(date(2022, 10, 30), <>Showed casts and highlighted casts which are bad, Hana), - change(date(2022, 10, 30), <>First backend section of ., Hana), - change(date(2022, 10, 29), <>Hid tier bonus when not using it, Hana), - change(date(2022, 10, 29), <>Added line break in module., Hana), - change(date(2022, 10, 23), <>Updated abilities file with new spells, updated mana costs of spells., Hana), - change(date(2022, 10, 23), <>Updated list of spells which are effected by healing increases., Hana), - change(date(2022, 10, 23), <>Updated section to the Guide., Hana), - change(date(2022, 10, 22), <>Added section to the Guide., Hana), - change(date(2022, 10, 22), <>Initial guide/suggestion revamp implementation, including section for , Hana), - change(date(2022, 10, 22), <>Added ., Hana), - change(date(2022, 10, 16), <>Added and ., Hana), - change(date(2022, 10, 16), <>Added module., Hana), - change(date(2022, 10, 16), <>Fixed ., Hana), - change(date(2022, 10, 15), <>Reorganised talents display, Hana), - change(date(2022, 10, 15), <> bugfixes. , Hana), - change(date(2022, 10, 15), <>Added Stolen Psyche., Hana), - change(date(2022, 10, 11), <>Added module showing it's damage breakdown., Hana), - change(date(2022, 10, 10), <>Added generic module which handles attribution of it's amplifiers, Hana), - change(date(2022, 10, 8), <>Added ., Hana), - change(date(2022, 10, 3), <>Added ., Hana), - change(date(2022, 10, 3), <>Added ., Hana), - change(date(2022, 10, 3), <>Dragonflight Clean up., Hana), + change(date(2022, 10, 3), <>The War Within Clean up., Hana), ]; diff --git a/src/analysis/retail/priest/discipline/CONFIG.tsx b/src/analysis/retail/priest/discipline/CONFIG.tsx index 4e361594fbf..05af3978784 100644 --- a/src/analysis/retail/priest/discipline/CONFIG.tsx +++ b/src/analysis/retail/priest/discipline/CONFIG.tsx @@ -1,3 +1,4 @@ +import CHANGELOG from './CHANGELOG'; import { Hana } from 'CONTRIBUTORS'; import GameBranch from 'game/GameBranch'; import SPECS from 'game/SPECS'; @@ -10,7 +11,7 @@ const config: Config = { contributors: [Hana], branch: GameBranch.Retail, // The WoW client patch this spec was last updated. - patchCompatibility: '10.2.7', + patchCompatibility: '11.0.0', supportLevel: SupportLevel.MaintainedFull, // Explain the status of this spec's analysis here. Try to mention how complete it is, and perhaps show links to places users can learn more. // If this spec's analysis does not show a complete picture please mention this in the `` component. @@ -42,12 +43,12 @@ const config: Config = { // The current spec identifier. This is the only place (in code) that specifies which spec this parser is about. spec: SPECS.DISCIPLINE_PRIEST, // The contents of your changelog. - // changelog: CHANGELOG, + changelog: CHANGELOG, // The CombatLogParser class for your spec. - // parser: () => - // import('./CombatLogParser' /* webpackChunkName: "DisciplinePriest" */).then( - // (exports) => exports.default, - // ), + parser: () => + import('./CombatLogParser' /* webpackChunkName: "DisciplinePriest" */).then( + (exports) => exports.default, + ), // The path to the current directory (relative form project root). This is used for generating a GitHub link directly to your spec's code. path: import.meta.url, }; diff --git a/src/analysis/retail/priest/discipline/CombatLogParser.ts b/src/analysis/retail/priest/discipline/CombatLogParser.ts index 1e9a1c7c47c..29350a03376 100644 --- a/src/analysis/retail/priest/discipline/CombatLogParser.ts +++ b/src/analysis/retail/priest/discipline/CombatLogParser.ts @@ -27,7 +27,6 @@ import CooldownThroughputTracker from './modules/features/CooldownThroughputTrac import PowerWordBarrier from './modules/features/PowerWordBarrier'; import PowerWordShieldWasted from './modules/features/PowerWordShieldWasted'; import PurgeTheWicked from './modules/features/PurgeTheWicked'; -import Mindgames from 'analysis/retail/priest/discipline/modules/spells/Mindgames'; import Atonement from './modules/spells/Atonement'; import Castigation from './modules/spells/Castigation'; import Contrition from './modules/spells/Contrition'; @@ -70,6 +69,7 @@ import HeavensWrath from './modules/spells/HeavensWrath'; import Amirdrassil4p from './modules/spells/Amirdrassil4p'; import TrainOfThought from './modules/spells/TrainOfThought'; import VoidSummoner from './modules/spells/VoidSummoner'; +import ShadowCovenant from './modules/spells/ShadowCovenant/ShadowCovenant'; class CombatLogParser extends CoreCombatLogParser { static specModules = { @@ -122,7 +122,6 @@ class CombatLogParser extends CoreCombatLogParser { grace: Grace, sinsOfTheMany: SinsOfTheMany, schism: Schism, - mindgames: Mindgames, harshDiscipline: HarshDiscipline, indemnity: Indemnity, expiation: Expiation, @@ -149,6 +148,7 @@ class CombatLogParser extends CoreCombatLogParser { trainOfThought: TrainOfThought, voidSummoner: VoidSummoner, translucentImage: TranslucentImage, + shadowCovenant: ShadowCovenant, // Items: radiantProvidence: RadiantProvidence, diff --git a/src/analysis/retail/priest/discipline/constants.ts b/src/analysis/retail/priest/discipline/constants.ts index 498baba9a06..abd6119c2bd 100644 --- a/src/analysis/retail/priest/discipline/constants.ts +++ b/src/analysis/retail/priest/discipline/constants.ts @@ -35,7 +35,6 @@ export const ATONEMENT_DAMAGE_SOURCES = { [SPELLS.MIND_SEAR.id]: true, [SPELLS.MIND_BLAST.id]: true, [SPELLS.EXPIATION_DAMAGE.id]: true, - [SPELLS.MINDGAMES_HEAL_REVERSAL.id]: true, [TALENTS_PRIEST.SHADOW_WORD_DEATH_TALENT.id]: true, [SPELLS.INESCAPABLE_TORMENT_TALENT_DAMAGE.id]: true, }; @@ -57,7 +56,6 @@ export const ATONEMENT_DAMAGE_IDS = [ SPELLS.MIND_SEAR.id, SPELLS.MIND_BLAST.id, SPELLS.EXPIATION_DAMAGE.id, - SPELLS.MINDGAMES_HEAL_REVERSAL.id, TALENTS_PRIEST.SHADOW_WORD_DEATH_TALENT.id, TALENTS_PRIEST.INESCAPABLE_TORMENT_TALENT.id, SPELLS.SHADOW_HALO_DAMAGE.id, @@ -65,6 +63,10 @@ export const ATONEMENT_DAMAGE_IDS = [ SPELLS.DARK_REPRIMAND_DAMAGE.id, SPELLS.INESCAPABLE_TORMENT_TALENT_DAMAGE.id, SPELLS.ULTIMATE_PENITENCE_DAMAGE.id, + SPELLS.ENTROPIC_RIFT_DAMAGE_DISC.id, + SPELLS.COLLAPSING_VOID_DAMAGE_DISC.id, + SPELLS.VOID_BLAST_DAMAGE_DISC.id, + SPELLS.VOID_FLAY_DAMAGE_DISC.id, ]; export const EFFECTS_INCREASED_BY_BENEVOLENCE_DISCIPLINE = [ diff --git a/src/analysis/retail/priest/discipline/modules/Abilities.ts b/src/analysis/retail/priest/discipline/modules/Abilities.ts index 614b532933b..71e4eb747b6 100644 --- a/src/analysis/retail/priest/discipline/modules/Abilities.ts +++ b/src/analysis/retail/priest/discipline/modules/Abilities.ts @@ -135,15 +135,6 @@ class Abilities extends CoreAbilities { }, enabled: combatant.hasTalent(TALENTS_PRIEST.POWER_WORD_LIFE_TALENT), }, - { - spell: TALENTS_PRIEST.MINDGAMES_TALENT.id, - category: SPELL_CATEGORY.COOLDOWNS, - cooldown: 45, - gcd: { - base: 1500, - }, - enabled: combatant.hasTalent(TALENTS_PRIEST.MINDGAMES_TALENT), - }, { spell: SPELLS.SHADOWFIEND.id, category: SPELL_CATEGORY.COOLDOWNS, diff --git a/src/analysis/retail/priest/discipline/modules/spells/AbyssalReverie.tsx b/src/analysis/retail/priest/discipline/modules/spells/AbyssalReverie.tsx index 49a1ae0f316..1d452611160 100644 --- a/src/analysis/retail/priest/discipline/modules/spells/AbyssalReverie.tsx +++ b/src/analysis/retail/priest/discipline/modules/spells/AbyssalReverie.tsx @@ -12,7 +12,7 @@ import { getDamageEvent } from '../../normalizers/AtonementTracker'; import MAGIC_SCHOOLS from 'game/MAGIC_SCHOOLS'; import TalentSpellText from 'parser/ui/TalentSpellText'; -const ABYSSAL_REVERIE_INCREASE = 0.1; +const ABYSSAL_REVERIE_INCREASE = 0.05; class AbyssalReverie extends Analyzer { healing = 0; diff --git a/src/analysis/retail/priest/discipline/modules/spells/BlazeOfLight/BlazeOfLight.tsx b/src/analysis/retail/priest/discipline/modules/spells/BlazeOfLight/BlazeOfLight.tsx index a6db85fc4fc..ff819e34bd7 100644 --- a/src/analysis/retail/priest/discipline/modules/spells/BlazeOfLight/BlazeOfLight.tsx +++ b/src/analysis/retail/priest/discipline/modules/spells/BlazeOfLight/BlazeOfLight.tsx @@ -15,7 +15,7 @@ import BlazeOfLightSourceDonut from './BlazeOfLightSourceDonut'; const BLAZE_OF_LIGHT_SPELLS = [ SPELLS.SMITE, - SPELLS.SHADOW_SMITE, + SPELLS.VOID_BLAST_DAMAGE_DISC, SPELLS.PENANCE, SPELLS.DARK_REPRIMAND_DAMAGE, ]; diff --git a/src/analysis/retail/priest/discipline/modules/spells/BlazeOfLight/BlazeOfLightSourceDonut.tsx b/src/analysis/retail/priest/discipline/modules/spells/BlazeOfLight/BlazeOfLightSourceDonut.tsx index 3c308720d45..9df3aea6bb4 100644 --- a/src/analysis/retail/priest/discipline/modules/spells/BlazeOfLight/BlazeOfLightSourceDonut.tsx +++ b/src/analysis/retail/priest/discipline/modules/spells/BlazeOfLight/BlazeOfLightSourceDonut.tsx @@ -18,7 +18,7 @@ interface BlazeOfLightSourceGraphItem { const COLORS = { [SPELLS.SMITE.id]: '#fff', - [SPELLS.SHADOW_SMITE.id]: '#8d4499', + [SPELLS.VOID_BLAST_DAMAGE_DISC.id]: '#8d4499', [SPELLS.PENANCE.id]: '#0cd368', [SPELLS.DARK_REPRIMAND_DAMAGE.id]: '#3C79F5', }; diff --git a/src/analysis/retail/priest/discipline/modules/spells/Grace.tsx b/src/analysis/retail/priest/discipline/modules/spells/Grace.tsx index 661a7da9fb6..cdfb2093970 100644 --- a/src/analysis/retail/priest/discipline/modules/spells/Grace.tsx +++ b/src/analysis/retail/priest/discipline/modules/spells/Grace.tsx @@ -1,7 +1,7 @@ import { formatNumber, formatPercentage } from 'common/format'; import SPELLS from 'common/SPELLS'; import PRIEST_SPELLS from 'common/SPELLS/priest'; -import { default as PRIEST_TALENTS, TALENTS_PRIEST } from 'common/TALENTS/priest'; +import { default as PRIEST_TALENTS } from 'common/TALENTS/priest'; import { SpellIcon } from 'interface'; import Analyzer, { Options, SELECTED_PLAYER } from 'parser/core/Analyzer'; import { calculateEffectiveHealing } from 'parser/core/EventCalculateLib'; @@ -17,9 +17,7 @@ import isAtonement from '../core/isAtonement'; const PRIEST_WHITELIST: number[] = Object.values({ ...PRIEST_SPELLS, ...PRIEST_TALENTS, -}) - .concat([TALENTS_PRIEST.MINDGAMES_TALENT, SPELLS.MINDGAMES_HEAL, SPELLS.MINDGAMES_ABSORB]) - .map((ability) => ability.id); +}).map((ability) => ability.id); class Grace extends Analyzer { static dependencies = { diff --git a/src/analysis/retail/priest/discipline/modules/spells/Indemnity.tsx b/src/analysis/retail/priest/discipline/modules/spells/Indemnity.tsx index 6766b8bbac3..e65c3230b04 100644 --- a/src/analysis/retail/priest/discipline/modules/spells/Indemnity.tsx +++ b/src/analysis/retail/priest/discipline/modules/spells/Indemnity.tsx @@ -13,7 +13,7 @@ import { POWER_WORD_SHIELD_ATONEMENT_DUR } from '../../constants'; import AtonementAnalyzer, { AtonementAnalyzerEvent } from '../core/AtonementAnalyzer'; -const INDEMNITY_EXTENSION_DURATION = 2000; +const INDEMNITY_EXTENSION_DURATION = 3000; const EVANG_EXTENSION_DURATION = 6000; type ShieldInfo = { diff --git a/src/analysis/retail/priest/discipline/modules/spells/Mindgames.tsx b/src/analysis/retail/priest/discipline/modules/spells/Mindgames.tsx deleted file mode 100644 index 53a4f5fcf1e..00000000000 --- a/src/analysis/retail/priest/discipline/modules/spells/Mindgames.tsx +++ /dev/null @@ -1,109 +0,0 @@ -import { formatNumber } from 'common/format'; -import SPELLS from 'common/SPELLS'; -import { TALENTS_PRIEST } from 'common/TALENTS'; -import SPECS from 'game/SPECS'; -import Analyzer, { SELECTED_PLAYER } from 'parser/core/Analyzer'; -import Events, { AbsorbedEvent, HealEvent } from 'parser/core/Events'; -import { Options } from 'parser/core/Module'; -import BoringSpellValueText from 'parser/ui/BoringSpellValueText'; -import ItemHealingDone from 'parser/ui/ItemHealingDone'; -import Statistic from 'parser/ui/Statistic'; -import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; - -import AtonementDamageSource from '../features/AtonementDamageSource'; -import { getDamageEvent } from '../../normalizers/AtonementTracker'; - -class Mindgames extends Analyzer { - static dependencies = { - atonementDamageSource: AtonementDamageSource, - }; - atonementHealing = 0; - directHealing = 0; - preventedDamage = 0; - protected atonementDamageSource!: AtonementDamageSource; - - constructor(options: Options) { - super(options); - this.active = - this.selectedCombatant.hasTalent(TALENTS_PRIEST.MINDGAMES_TALENT) && - this.selectedCombatant.spec === SPECS.DISCIPLINE_PRIEST; - - this.addEventListener(Events.heal.by(SELECTED_PLAYER), this.onHeal); - this.addEventListener( - Events.absorbed.by(SELECTED_PLAYER).spell(SPELLS.MINDGAMES_ABSORB), - this.onMindgamesAbsorbed, - ); - this.addEventListener( - Events.heal - .by(SELECTED_PLAYER) - .spell([SPELLS.ATONEMENT_HEAL_CRIT, SPELLS.ATONEMENT_HEAL_NON_CRIT]), - this.onAtoneHeal, - ); - } - - onAtoneHeal(event: any) { - const damageEvent = getDamageEvent(event); - if (!damageEvent) { - return; - } - - if ( - damageEvent.ability.guid !== TALENTS_PRIEST.MINDGAMES_TALENT.id && - damageEvent.ability.guid !== SPELLS.MINDGAMES_HEAL_REVERSAL.id - ) { - return; - } - this.atonementHealing += event.amount + (event.absorbed || 0); - } - - onAtonement(event: any) { - const { healEvent, damageEvent } = event; - - if (damageEvent.ability.guid !== TALENTS_PRIEST.MINDGAMES_TALENT.id) { - return; - } - - this.atonementHealing += healEvent.amount + (event.absorbed || 0); - } - - onHeal(event: HealEvent) { - const spellId = event.ability.guid; - if (spellId === SPELLS.MINDGAMES_HEAL.id) { - this.directHealing += event.amount + (event.absorbed || 0); - return; - } - } - - onMindgamesAbsorbed(event: AbsorbedEvent) { - this.preventedDamage += event.amount; - } - - statistic() { - return ( - - Healing Breakdown: -
    -
  • {formatNumber(this.atonementHealing)} Atonement Healing
  • -
  • {formatNumber(this.directHealing)} Direct Healing
  • -
  • {formatNumber(this.preventedDamage)} Prevented Damage
  • -
- - } - category={STATISTIC_CATEGORY.TALENTS} - > - - <> - - - -
- ); - } -} - -export default Mindgames; diff --git a/src/analysis/retail/priest/discipline/modules/spells/ShadowCovenant/ShadowCovSourceDonut.tsx b/src/analysis/retail/priest/discipline/modules/spells/ShadowCovenant/ShadowCovSourceDonut.tsx index 7cfaa78c5da..f79e8606c43 100644 --- a/src/analysis/retail/priest/discipline/modules/spells/ShadowCovenant/ShadowCovSourceDonut.tsx +++ b/src/analysis/retail/priest/discipline/modules/spells/ShadowCovenant/ShadowCovSourceDonut.tsx @@ -19,7 +19,6 @@ interface ScovSourceGraphItem { const COLORS = { [SPELLS.MIND_BLAST.id]: '#FF8B13', - [TALENTS_PRIEST.MINDGAMES_TALENT.id]: '#6F1AB6', [SPELLS.DIVINE_STAR_DAMAGE.id]: '#3D1766', [SPELLS.HALO_DAMAGE.id]: '#3D1766', [TALENTS_PRIEST.SCHISM_TALENT.id]: '#A31ACB', diff --git a/src/analysis/retail/priest/discipline/modules/spells/ShadowCovenant/ShadowCovenant.tsx b/src/analysis/retail/priest/discipline/modules/spells/ShadowCovenant/ShadowCovenant.tsx index 247ff964dd5..4e7075f0822 100644 --- a/src/analysis/retail/priest/discipline/modules/spells/ShadowCovenant/ShadowCovenant.tsx +++ b/src/analysis/retail/priest/discipline/modules/spells/ShadowCovenant/ShadowCovenant.tsx @@ -54,12 +54,22 @@ class ShadowCovenant extends Analyzer { } calculateBonus() { - let bonus = this.selectedCombatant.hasTalent(TALENTS_PRIEST.MINDBENDER_DISCIPLINE_TALENT) - ? 0.1 - : 0.25; + let bonus; + + // Check for VOIDWRAITH_TALENT first, since it overrides the initial bonus + if (this.selectedCombatant.hasTalent(TALENTS_PRIEST.VOIDWRAITH_TALENT)) { + bonus = 0.25; + } else { + // voidwraith is not present + bonus = this.selectedCombatant.hasTalent(TALENTS_PRIEST.MINDBENDER_DISCIPLINE_TALENT) + ? 0.1 + : 0.25; + } + if (this.selectedCombatant.hasTalent(TALENTS_PRIEST.TWILIGHT_CORRUPTION_TALENT)) { bonus += 0.1; } + return bonus; } @@ -79,7 +89,8 @@ class ShadowCovenant extends Analyzer { // Shadow spells only damageEvent.ability.type !== MAGIC_SCHOOLS.ids.SHADOW || // no pets here - damageEvent.ability.guid === -MAGIC_SCHOOLS.ids.SHADOW + damageEvent.ability.guid === -MAGIC_SCHOOLS.ids.SHADOW || + damageEvent.ability.guid === SPELLS.VOID_FLAY_DAMAGE_DISC.id ) { return; } diff --git a/src/analysis/retail/priest/discipline/modules/spells/TwilightEquilibrium/TeSourceDonut.tsx b/src/analysis/retail/priest/discipline/modules/spells/TwilightEquilibrium/TeSourceDonut.tsx index bdcc31bc9dd..c2ff8c51191 100644 --- a/src/analysis/retail/priest/discipline/modules/spells/TwilightEquilibrium/TeSourceDonut.tsx +++ b/src/analysis/retail/priest/discipline/modules/spells/TwilightEquilibrium/TeSourceDonut.tsx @@ -19,7 +19,6 @@ interface TeSourceGraphItem { const COLORS = { [SPELLS.MIND_BLAST.id]: '#FF8B13', - [TALENTS_PRIEST.MINDGAMES_TALENT.id]: '#6F1AB6', [SPELLS.DIVINE_STAR_DAMAGE.id]: '#3D1766', [SPELLS.HALO_DAMAGE.id]: '#3D1766', [TALENTS_PRIEST.SCHISM_TALENT.id]: '#A31ACB', diff --git a/src/analysis/retail/priest/discipline/normalizers/DamageCastLink.ts b/src/analysis/retail/priest/discipline/normalizers/DamageCastLink.ts index ad03aa25f4f..2f9196af515 100644 --- a/src/analysis/retail/priest/discipline/normalizers/DamageCastLink.ts +++ b/src/analysis/retail/priest/discipline/normalizers/DamageCastLink.ts @@ -41,7 +41,6 @@ const EVENT_LINKS: EventLink[] = [ TALENTS_PRIEST.SCHISM_TALENT.id, TALENTS_PRIEST.HOLY_NOVA_TALENT.id, SPELLS.MIND_BLAST.id, - TALENTS_PRIEST.MINDGAMES_TALENT.id, TALENTS_PRIEST.SHADOW_WORD_DEATH_TALENT.id, ], referencedEventType: EventType.Cast, @@ -59,7 +58,6 @@ const EVENT_LINKS: EventLink[] = [ TALENTS_PRIEST.SCHISM_TALENT.id, TALENTS_PRIEST.HOLY_NOVA_TALENT.id, SPELLS.MIND_BLAST.id, - TALENTS_PRIEST.MINDGAMES_TALENT.id, TALENTS_PRIEST.SHADOW_WORD_DEATH_TALENT.id, ], linkingEventType: EventType.Damage, diff --git a/src/analysis/retail/priest/holy/CHANGELOG.tsx b/src/analysis/retail/priest/holy/CHANGELOG.tsx index 6f6a991f17c..d41036f3033 100644 --- a/src/analysis/retail/priest/holy/CHANGELOG.tsx +++ b/src/analysis/retail/priest/holy/CHANGELOG.tsx @@ -5,6 +5,9 @@ import { Arlie, Hana, Litena, Liavre, Squided, ToppleTheNun, Trevor, Saeldur } f import { SpellLink } from 'interface'; export default [ + change(date(2024, 9, 6), <>Implemented 2pc, rewrote back end for Holy Word CDR and remove old modules. , Liavre), + change(date(2024, 9, 6), <>Moved all spell constants to constants file for ease of maintenance , Liavre), + change(date(2024, 8, 31), <>Implemented an Echo of Light per heal/amp attributor , Liavre), change(date(2024, 8, 20), <>Implemented/pushed Archon , Liavre), change(date(2024, 8, 24), <>Added Cast time hps component to lightweaver and other statistic display improvements , Liavre), change(date(2024, 8, 20), <>Implemented both Oracle and Archon + minor fixes , Liavre), diff --git a/src/analysis/retail/priest/holy/CONFIG.tsx b/src/analysis/retail/priest/holy/CONFIG.tsx index 7a32eba35df..5da27b3fc29 100644 --- a/src/analysis/retail/priest/holy/CONFIG.tsx +++ b/src/analysis/retail/priest/holy/CONFIG.tsx @@ -1,4 +1,4 @@ -import { Litena, Squided } from 'CONTRIBUTORS'; +import { Liavre } from 'CONTRIBUTORS'; import GameBranch from 'game/GameBranch'; import SPECS from 'game/SPECS'; import Config, { SupportLevel } from 'parser/Config'; @@ -7,10 +7,10 @@ import CHANGELOG from './CHANGELOG'; //Description not accurate as of Dragonflight update const config: Config = { // The people that have contributed to this spec recently. People don't have to sign up to be long-time maintainers to be included in this list. If someone built a large part of the spec or contributed something recently to that spec, they can be added to the contributors list. If someone goes MIA, they may be removed after major changes or during a new expansion. - contributors: [Litena, Squided], + contributors: [Liavre], branch: GameBranch.Retail, // The WoW client patch this spec was last updated. - patchCompatibility: '10.2.7', + patchCompatibility: '11.0.2', supportLevel: SupportLevel.MaintainedPartial, // Explain the status of this spec's analysis here. Try to mention how complete it is, and perhaps show links to places users can learn more. // If this spec's analysis does not show a complete picture please mention this in the `` component. diff --git a/src/analysis/retail/priest/holy/CombatLogParser.tsx b/src/analysis/retail/priest/holy/CombatLogParser.tsx index 11cd1063661..f1d3c326656 100644 --- a/src/analysis/retail/priest/holy/CombatLogParser.tsx +++ b/src/analysis/retail/priest/holy/CombatLogParser.tsx @@ -9,8 +9,6 @@ import Abilities from './modules/Abilities'; import Checklist from './modules/checklist/Module'; import EchoOfLightMastery from './modules/core/EchoOfLightMastery'; import FortitudeRaidBuff from './modules/core/FortitudeRaidBuff'; -import HolyWordsReductionBySpell from './modules/core/HolyWordsReductionBySpell'; -import HolyWordWastedAmounts from './modules/core/HolyWordWastedAmounts'; import SpellManaCost from './modules/core/SpellManaCost'; // Spell data import AlwaysBeCasting from './modules/features/AlwaysBeCasting'; @@ -24,18 +22,11 @@ import CircleOfHealing from './modules/spells/CircleOfHealing'; import DivineHymn from './modules/spells/DivineHymn'; import GuardianSpirit from './modules/spells/GuardianSpirit'; import HolyNova from './modules/spells/HolyNova'; -import HolyWordChastise from './modules/spells/holyword/HolyWordChastise'; -import HolyWordSalvationCooldown from './modules/spells/holyword/HolyWordSalvation'; -import HolyWordSanctify from './modules/spells/holyword/HolyWordSanctify'; -import HolyWordSerenity from './modules/spells/holyword/HolyWordSerenity'; import HymnBuffBenefit from './modules/spells/HymnBuffBenefit'; import PrayerOfMending from './modules/spells/PrayerOfMending'; import Renew from './modules/spells/Renew'; import SpiritOfRedemption from './modules/spells/SpiritOfRedemption'; import Talents from './modules/talents'; -import T29TwoSet from './modules/dragonflight/tier/tier29/Tier29HolyPriest2Set'; -import T29FourSet from './modules/dragonflight/tier/tier29/Tier29HolyPriest4Set'; -import T30FourSet from './modules/dragonflight/tier/tier30/Tier30HolyPriest4Set'; import ProtectiveLight from '../shared/ProtectiveLight'; import PrayerOfHealing from './modules/spells/PrayerOfHealing'; import CastLinkNormalizer from './normalizers/CastLinkNormalizer'; @@ -43,6 +34,9 @@ import Guide from './Guide'; import Benevolence from '../shared/Benevolence'; import RenewTracker from './modules/talents/Oracle/OracleCore/RenewTracker'; import RenewAttributor from './modules/talents/Oracle/OracleCore/RenewAttributor'; +import EOLAttrib from './modules/core/EchoOfLightAttributor'; +import HolyWordCDRBySpell from './modules/core/HolyWordCDRBySpell'; +import HolyWordCDR from './modules/core/HolyWordCDR'; class CombatLogParser extends CoreCombatLogParser { static specModules = { @@ -69,20 +63,17 @@ class CombatLogParser extends CoreCombatLogParser { // Core echoOfLightMastery: EchoOfLightMastery, fortitudeRaidBuff: FortitudeRaidBuff, - holyWordsReductionBySpell: HolyWordsReductionBySpell, - holyWordWastedAmounts: HolyWordWastedAmounts, renewTracker: RenewTracker, renewAttributor: RenewAttributor, + eolAttrib: EOLAttrib, + holyWordCDRBySpell: HolyWordCDRBySpell, + holyWordCDR: HolyWordCDR, // Spells divineHymn: DivineHymn, guardianSpirit: GuardianSpirit, holyNova: HolyNova, hymnBuffBenefit: HymnBuffBenefit, - holyWordSanctify: HolyWordSanctify, - holyWordSerenity: HolyWordSerenity, - holyWordChastise: HolyWordChastise, - holyWordSalvation: HolyWordSalvationCooldown, circleOfHealing: CircleOfHealing, prayerOfHealing: PrayerOfHealing, @@ -92,9 +83,6 @@ class CombatLogParser extends CoreCombatLogParser { renew: Renew, prayerOfMending: PrayerOfMending, - T29TwoSet: T29TwoSet, - T29FourSet: T29FourSet, - T30FourSet: T30FourSet, // Talents Enlightenment: Talents.MiddleRow.Enlightenment, TrailOfLight: Talents.MiddleRow.TrailOfLight, @@ -132,8 +120,6 @@ class CombatLogParser extends CoreCombatLogParser { Lightweaver: Talents.BottomRow.Lightweaver, divineImage: Talents.BottomRow.DivineImage, - lightOfTheNaaru: Talents.BottomRow.LightOfTheNaaru, - harmoniousApparatus: Talents.BottomRow.HarmoniousApparatus, resonantWords: Talents.BottomRow.ResonantWords, TranslucentImage: TranslucentImage, miracleWorker: Talents.BottomRow.MiracleWorker, @@ -146,7 +132,6 @@ class CombatLogParser extends CoreCombatLogParser { ResonantEnergyHoly: Talents.Archon.ResonantEnergyHoly, ManifestedPowerHoly: Talents.Archon.ManifestedPowerHoly, EmpoweredSurgesHoly: Talents.Archon.EmpoweredSurgesHoly, - EnergyCycleHoly: Talents.Archon.EnergyCycleHoly, EnergyCompressionHoly: Talents.Archon.EnergyCompressionHoly, PowerSurgeAndDivineHaloHoly: Talents.Archon.PowerSurgeAndDivineHaloHoly, diff --git a/src/analysis/retail/priest/holy/constants.ts b/src/analysis/retail/priest/holy/constants.ts index f40be10212b..807245787c8 100644 --- a/src/analysis/retail/priest/holy/constants.ts +++ b/src/analysis/retail/priest/holy/constants.ts @@ -1,7 +1,165 @@ import SPELLS from 'common/SPELLS'; import TALENTS from 'common/TALENTS/priest'; +import { TALENTS_PRIEST } from 'common/TALENTS'; + +/** + * -------------------------TALENTS------------------------------ + */ + +// TOP ROW + +// afterlife - need to update in tww +export const SPIRIT_OF_REDEMPTION_DURATION = 15000; +// burning vehemence +export const BV_DAMAGE_INCREASE_PER_RANK = [0, 0.3, 0.6]; +// guardian angel +export const GS_BASE_COOLDOWN_TIME = 60 * 3 * 1000; +export const GS_MODIFIED_COOLDOWN_TIME = (60 + 10) * 1000; // one minute plus 10 seconds to account for the duration of the buff. +// renewed faith +export const RENEWED_FAITH_MULTIPLIER = 1.06; +// sanctified prayers +export const SANCTIFIED_PRAYERS_MULTIPLIER = 1.15; + +// MIDDLE ROW + +// enlightenment +export const ENLIGHT_MAX_MANA = 250000; +export const ENLIGHT_BASE_MANA_REGEN = 0.04; +// everlasting light +export const MAX_EVERLASTING_LIGHT_BUFF = 0.15; +// healing chorus +export const HEALING_CHORUS_BONUS_PER_STACK = 0.05; +export const HEALING_CHORUS_MAX_STACKS = 20; +// prayerful litany +export const PRAYERFUL_LITANY_MULTIPLIER = 1; + +// BOTTOM ROW + +// answered prayers +export const AP_HEALS_PER_TRIGGER_BY_RANK = [0, 100, 50]; +// desperate times +export const DESP_TIMES_HEALING_MULTIPLIER_PER_RANK = 0.1; +// divine word +export const DAMAGE_INCREASE_FROM_CHASTISE = 0.2; +export const CHASTISE_REFUNDED_COOLDOWN = 15; +export const HEALING_INCREASE_FROM_SERENITY = 0.3; +export const MANA_REDUCTION_FROM_SERENITY = 0.2; +export const DW_ACTIVATOR_SPELL_INCREASE = 0.3; +// lightweaver +export const LW_HEALING_BONUS = 0.25; +export const LW_OVERHEAL_THRESHOLD = 0.75; +export const LW_CAST_TIME_DECREASE = 1 - 0.3; +// pontifex +export const PONTIFEX_HEALING_INCREASE = 0.06; +// prismatic echoes +export const PRISMATIC_ECHOES_PER_RANK = 0.06; +// resonant words +export const HEALING_MULTIPLIER_BY_RANK: number[] = [0, 0.2, 0.4]; +export const HOLY_WORD_LIST = [ + TALENTS.HOLY_WORD_CHASTISE_TALENT, + TALENTS.HOLY_WORD_SALVATION_TALENT, + TALENTS.HOLY_WORD_SANCTIFY_TALENT, + TALENTS.HOLY_WORD_SERENITY_TALENT, +]; +export const RESONANT_WORD_WHITELIST = [ + SPELLS.FLASH_HEAL, + SPELLS.GREATER_HEAL, + TALENTS.PRAYER_OF_HEALING_TALENT, + TALENTS.CIRCLE_OF_HEALING_TALENT, +]; + +// ORACLE VALUES + +export const FATEBENDER_SCALER = 1.4; +export const SOLACE_DR = 0.15; +export const PIETY_OVERHEAL_MISDIRECT = 0.7; +export const PIETY_AMP = 0.15; +export const INSIGHT_CDR = 7; +export const PREVENTIVE_MEASURES_DMG_AMP = 0.25; +export const PREVENTIVE_MEASURES_HEAL_AMP = 0.4; +export const PROPHETS_WILL_AMP = 0.3; +export const PREEMPTIVE_CARE_RENEW_DUR = 6_000; + +export const INSIGHT_CDR_ABILITIES = [ + TALENTS_PRIEST.ANGELIC_FEATHER_TALENT.id, + TALENTS_PRIEST.MASS_DISPEL_TALENT.id, + SPELLS.PSYCHIC_SCREAM.id, + SPELLS.DESPERATE_PRAYER.id, + SPELLS.MIND_SOOTHE.id, + SPELLS.FADE.id, + TALENTS_PRIEST.POWER_INFUSION_TALENT.id, + TALENTS_PRIEST.HALO_SHARED_TALENT.id, + TALENTS_PRIEST.SHADOWFIEND_TALENT.id, + SPELLS.POWER_WORD_SHIELD.id, + TALENTS_PRIEST.PRAYER_OF_MENDING_TALENT.id, + TALENTS_PRIEST.APOTHEOSIS_TALENT.id, + TALENTS_PRIEST.HOLY_WORD_CHASTISE_TALENT.id, + SPELLS.HOLY_FIRE.id, + TALENTS_PRIEST.HOLY_WORD_SANCTIFY_TALENT.id, + TALENTS_PRIEST.HOLY_WORD_SERENITY_TALENT.id, + TALENTS_PRIEST.HOLY_WORD_SALVATION_TALENT.id, + TALENTS_PRIEST.SYMBOL_OF_HOPE_TALENT.id, + SPELLS.PURIFY.id, + TALENTS_PRIEST.DIVINE_HYMN_TALENT.id, + TALENTS_PRIEST.LIGHTWELL_TALENT.id, + TALENTS_PRIEST.DIVINE_WORD_TALENT.id, + TALENTS_PRIEST.SHADOW_WORD_DEATH_TALENT.id, + TALENTS_PRIEST.CIRCLE_OF_HEALING_TALENT.id, +]; + +export const PROPHETS_WILL_SPELLS_HOLY = [ + SPELLS.FLASH_HEAL, + TALENTS_PRIEST.HOLY_WORD_SERENITY_TALENT, + SPELLS.GREATER_HEAL, +]; + +export const HOLY_DMG_ABILITIES_AFFECTED_BY_PM = [ + SPELLS.HOLY_FIRE, + SPELLS.HOLY_NOVA_HEAL, + SPELLS.BURNING_VEHEMENCE_DAMAGE, + TALENTS_PRIEST.HOLY_NOVA_TALENT, + SPELLS.SMITE, +]; + +// ARCHON VALUES + +export const EMPOWERED_SURGES_AMP = 0.3; +export const ENERGY_COMPRESSION_AMP = 0.3; +export const APOTH_MULTIPIER = 4; +export const ENERGY_CYCLE_CDR = 4; +export const LIGHT_OF_THE_NAARU_REDUCTION_PER_RANK = 0.1; +export const TWW_TIER1_2PC_CDR = 0.1; +export const PERFECTED_FORM_AMP = 0.1; +export const RESONANT_ENERGY_AMP_PER_STACK = 0.02; + +/** + * MASSIVE TO DO - REWRITE THE HOLY WORD CDR MODULE TO BE EASIER TO MAINTAIN AND + * PUT CONSTANTS HERE + */ + +/** + * ------------------CORE/SPELL MODIFIERS AND LISTS------------------------ + */ + +// renew attributor +export const BASE_RENEW_DURATION = 15; +// not sure what the max is, df s3 tier could extend it to like 2min +export const MAX_RENEW_DURATION = 50; + +// circle of healing +export const COH_OVERHEAL_THRESHOLD = 0.75; +export const COH_MAX_TARGETS_HIT = 5; + +// guardian spirit +export const GUARDIAN_SPIRIT_HEALING_INCREASE = 0.6; + +// divine hymn +export const BASE_DIVINE_HYMN_HEALING_INCREASE_PER_STACK = 0.04; +export const GALES_OF_SONG_HEALING_INCREASE_PER_POINT = 0.02; + +// prayer of healing +export const POH_MAX_TARGETS_HIT = 5; -//TODO: check if .id will work instead of this block export const HOLY_ABILITIES_AFFECTED_BY_HEALING_INCREASES_ID = [ SPELLS.FLASH_HEAL.id, TALENTS.RENEW_TALENT.id, @@ -63,7 +221,6 @@ export const HOLY_ABILITIES_AFFECTED_BY_HEALING_INCREASES = [ SPELLS.ECHO_OF_LIGHT_HEAL, ]; -// better off making things that -dont- proc it perhaps? export const ABILITIES_THAT_TRIGGER_MASTERY = [ SPELLS.DIVINE_HYMN_HEAL.id, SPELLS.GREATER_HEAL.id, @@ -103,6 +260,18 @@ export const ABILITIES_AFFECTED_BY_APOTHEOSIS_TALENT = [ TALENTS.HOLY_WORD_CHASTISE_TALENT.id, ]; +export const ABILITIES_THAT_DONT_TRIGGER_MASTERY = [ + TALENTS.RENEW_TALENT.id, + SPELLS.PREMONITION_OF_PIETY.id, + SPELLS.DIVINE_IMAGE_BLESSED_LIGHT_HEAL.id, + SPELLS.DIVINE_IMAGE_DAZZLING_LIGHT_HEAL.id, + SPELLS.DIVINE_IMAGE_HEALING_LIGHT_HEAL.id, + SPELLS.DIVINE_IMAGE_TRANQUIL_LIGHT_HEAL.id, + TALENTS.ESSENCE_DEVOURER_TALENT.id, + SPELLS.LEECH.id, + SPELLS.ECHO_OF_LIGHT_HEAL, +]; + export const EFFECTS_INCREASED_BY_BENEVOLENCE_HOLY = [ SPELLS.FLASH_HEAL.id, TALENTS.RENEW_TALENT.id, @@ -132,3 +301,36 @@ export const EFFECTS_INCREASED_BY_BENEVOLENCE_HOLY = [ //REMOVE WHEN PROPER EOL ATTRIB IS WRITTEN SPELLS.ECHO_OF_LIGHT_HEAL.id, ]; + +export const serenityHWCDR = new Map([ + [SPELLS.FLASH_HEAL.id, { baseCDR: 6 }], + [SPELLS.GREATER_HEAL.id, { baseCDR: 6 }], + [TALENTS.PRAYER_OF_MENDING_TALENT.id, { baseCDR: 4, vohDependent: true }], +]); + +export const sanctifyHWCDR = new Map([ + [TALENTS.PRAYER_OF_HEALING_TALENT.id, { baseCDR: 6 }], + [TALENTS.RENEW_TALENT.id, { baseCDR: 2 }], + [TALENTS.CIRCLE_OF_HEALING_TALENT.id, { baseCDR: 4, vohDependent: true }], +]); + +export const chastiseHWCDR = new Map([ + [SPELLS.SMITE.id, { baseCDR: 6 }], + [SPELLS.HOLY_FIRE.id, { baseCDR: 4, vohDependent: true }], + [TALENTS.HOLY_NOVA_TALENT.id, { baseCDR: 4, vohDependent: true }], +]); + +export const salvationHWCDR = new Map([ + [TALENTS.HOLY_WORD_SERENITY_TALENT.id, { baseCDR: 15, apothDisable: true }], + [TALENTS.HOLY_WORD_SANCTIFY_TALENT.id, { baseCDR: 15, apothDisable: true }], +]); + +export const energyCycleCDR = new Map([ + [TALENTS.ENERGY_CYCLE_TALENT.id, { baseCDR: 4 }], +]); + +export interface baseHolyWordCDR { + baseCDR: number; + vohDependent?: boolean; + apothDisable?: boolean; +} diff --git a/src/analysis/retail/priest/holy/modules/Abilities.ts b/src/analysis/retail/priest/holy/modules/Abilities.ts index 45373ab5e56..46536351274 100644 --- a/src/analysis/retail/priest/holy/modules/Abilities.ts +++ b/src/analysis/retail/priest/holy/modules/Abilities.ts @@ -150,7 +150,7 @@ class Abilities extends CoreAbilities { { spell: SPELLS.HALO_TALENT.id, category: SPELL_CATEGORY.ROTATIONAL, - cooldown: 40, + cooldown: 60, enabled: combatant.hasTalent(TALENTS.HALO_SHARED_TALENT), gcd: { base: 1500, diff --git a/src/analysis/retail/priest/holy/modules/core/EchoOfLightAttributor.tsx b/src/analysis/retail/priest/holy/modules/core/EchoOfLightAttributor.tsx new file mode 100644 index 00000000000..96026e1d5aa --- /dev/null +++ b/src/analysis/retail/priest/holy/modules/core/EchoOfLightAttributor.tsx @@ -0,0 +1,114 @@ +import Analyzer from 'parser/core/Analyzer'; +import { GetRelatedEvents, HealEvent } from 'parser/core/Events'; +import { Options } from 'parser/core/Module'; +import Combatants from 'parser/shared/modules/Combatants'; +import { TALENTS_PRIEST } from 'common/TALENTS'; +import { ECHO_OF_LIGHT_ATTRIB_EVENT } from '../../normalizers/CastLinkNormalizer'; +import { ABILITIES_THAT_DONT_TRIGGER_MASTERY, PRISMATIC_ECHOES_PER_RANK } from '../../constants'; +import StatTracker from 'parser/shared/modules/StatTracker'; +class EOLAttrib extends Analyzer { + static dependencies = { + combatants: Combatants, + statTracker: StatTracker, + }; + + protected combatants!: Combatants; + protected statTracker!: StatTracker; + private masteryScaler = 1; + + constructor(options: Options) { + super(options); + this.active = true; + if (this.selectedCombatant.hasTalent(TALENTS_PRIEST.PRISMATIC_ECHOES_TALENT)) { + const talentRank = this.selectedCombatant.getTalentRank( + TALENTS_PRIEST.PRISMATIC_ECHOES_TALENT, + ); + this.masteryScaler *= talentRank * PRISMATIC_ECHOES_PER_RANK + 1; + } + } + + /** Attributor for a spell's EOL amount, + * it is calculated by looking at up to the next 6s of EOL ticks after a heal event + * to get average overhealing, then it is raw healing event * mastery % * scaled overhealing + * + * ASSUMPTION: whether or not the hot gets infinitely extended or pool empties within 2 ticks + * won't have a noticeable impact on the value since any extensions would be a smaller and smaller value + * of the inital heal and overhealing in theory shouldnt massively swing anyways + */ + public getEchoOfLightHealingAttrib(eolEvent: HealEvent) { + const currentMastery = this.statTracker.currentMasteryPercentage * this.masteryScaler; + const initialHeal = + currentMastery * (eolEvent.amount + (eolEvent.absorbed || 0) + (eolEvent.overheal || 0)); + let eolTicksHeal = 0; + let eolTicksOverHeal = 0; + + // blacklist non EOL heals + if (ABILITIES_THAT_DONT_TRIGGER_MASTERY.includes(eolEvent.ability.guid)) { + return 0; + } + + // get average healing/overhealing over the next 6s of EOL + const eolHealEvents = GetRelatedEvents(eolEvent, ECHO_OF_LIGHT_ATTRIB_EVENT); + if (eolHealEvents.length > 0) { + Object.values(eolHealEvents).forEach((eolHealEvent) => { + eolHealEvent = eolHealEvent as HealEvent; + eolTicksHeal += eolHealEvent.amount + (eolHealEvent.absorbed || 0); + eolTicksOverHeal += eolHealEvent.overheal || 0; + }); + } + + //scale calculated EOL by how much overhealing the average ticks did + if (eolTicksHeal + eolTicksOverHeal !== 0) { + return (initialHeal * eolTicksHeal) / (eolTicksHeal + eolTicksOverHeal); + } + return 0; + } + + /** + * copy and paste of the previous except it applies getEffectiveHealing math to + * the theoretical results per tick of EoL + */ + public getEchoOfLightAmpAttrib(eolEvent: HealEvent, relativeHealIncrease: number) { + const currentMastery = this.statTracker.currentMasteryPercentage * this.masteryScaler; + const initialHeal = + currentMastery * (eolEvent.amount + (eolEvent.absorbed || 0) + (eolEvent.overheal || 0)); + let eolTicksHeal = 0; + let eolTicksOverHeal = 0; + let totalEOLAmpHealing = 0; + + // blacklist non EOL heals + if (ABILITIES_THAT_DONT_TRIGGER_MASTERY.includes(eolEvent.ability.guid)) { + return 0; + } + + const eolHealEvents = GetRelatedEvents(eolEvent, ECHO_OF_LIGHT_ATTRIB_EVENT); + + /** + * if ticks exist, get the amount each tick overhealed and apply that against the + * initial heal (raw * mastery %) divided per tick number, and apply getEffectiveHealing math per tick + */ + if (eolHealEvents.length > 0) { + const initialHealPerTick = initialHeal / eolHealEvents.length; + + Object.values(eolHealEvents).forEach((eolHealEvent) => { + eolHealEvent = eolHealEvent as HealEvent; + eolTicksHeal += eolHealEvent.amount + (eolHealEvent.absorbed || 0); + eolTicksOverHeal += eolHealEvent.overheal || 0; + + // this is a copy paste of getEffectiveHealing + if (eolTicksHeal + eolTicksOverHeal !== 0) { + const overheal = + (initialHealPerTick * eolTicksOverHeal) / (eolTicksHeal + eolTicksOverHeal); + const relativeHealingIncreaseFactor = 1 + relativeHealIncrease; + const healingIncrease = + initialHealPerTick - initialHealPerTick / relativeHealingIncreaseFactor; + const effectiveHealing = healingIncrease - overheal; + totalEOLAmpHealing += Math.max(0, effectiveHealing); + } + }); + } + return totalEOLAmpHealing || 0; + } +} + +export default EOLAttrib; diff --git a/src/analysis/retail/priest/holy/modules/core/HolyWordCDR.tsx b/src/analysis/retail/priest/holy/modules/core/HolyWordCDR.tsx new file mode 100644 index 00000000000..b4f7b6ead36 --- /dev/null +++ b/src/analysis/retail/priest/holy/modules/core/HolyWordCDR.tsx @@ -0,0 +1,189 @@ +import Analyzer from 'parser/core/Analyzer'; +import { Options } from 'parser/core/Module'; +import Combatants from 'parser/shared/modules/Combatants'; + +import { TALENTS_PRIEST } from 'common/TALENTS'; +import SpellUsable from 'parser/shared/modules/SpellUsable'; +import { TIERS } from 'game/TIERS'; +import { CastEvent } from 'parser/core/Events'; +import TALENTS from 'common/TALENTS/priest'; +import { + APOTH_MULTIPIER, + baseHolyWordCDR, + chastiseHWCDR, + energyCycleCDR, + LIGHT_OF_THE_NAARU_REDUCTION_PER_RANK, + salvationHWCDR, + sanctifyHWCDR, + serenityHWCDR, + TWW_TIER1_2PC_CDR, +} from '../../constants'; + +/** + * This module drives all holy word CDR evaluations, use as a dependency and call one of the public handlers + * or make a new one + */ + +class HolyWordCDR extends Analyzer { + static dependencies = { + combatants: Combatants, + spellUsable: SpellUsable, + }; + + protected combatants!: Combatants; + protected spellUsable!: SpellUsable; + + private baseHolyWordCDR = 1; + private baseVohMult = 0; + private lotnMult = 1; + private twwS1TierMult = 1; + + constructor(options: Options) { + super(options); + + // The below 3 if statements scale the CDR base on talents/gear + if (this.selectedCombatant.hasTalent(TALENTS_PRIEST.LIGHT_OF_THE_NAARU_TALENT)) { + this.lotnMult = + this.selectedCombatant.getTalentRank(TALENTS_PRIEST.LIGHT_OF_THE_NAARU_TALENT) * + LIGHT_OF_THE_NAARU_REDUCTION_PER_RANK + + 1; + } + + if (this.selectedCombatant.has2PieceByTier(TIERS.TWW1)) { + this.twwS1TierMult = TWW_TIER1_2PC_CDR + 1; + } + + if (this.selectedCombatant.hasTalent(TALENTS_PRIEST.VOICE_OF_HARMONY_TALENT)) { + this.baseVohMult = + 0.5 * this.selectedCombatant.getTalentRank(TALENTS_PRIEST.VOICE_OF_HARMONY_TALENT); + } + + this.baseHolyWordCDR = this.lotnMult * this.twwS1TierMult; + } + + public handleAny(event: CastEvent, specialEvent?: string): hwCDRBreakdown | undefined { + if (specialEvent === 'ENERGY_CYCLE') { + return this.handleCDR( + event, + energyCycleCDR.get(TALENTS.ENERGY_CYCLE_TALENT.id), + TALENTS.HOLY_WORD_SANCTIFY_TALENT.id, + ); + } + if (chastiseHWCDR.has(event.ability.guid)) { + return this.handleCDR( + event, + chastiseHWCDR.get(event.ability.guid), + TALENTS.HOLY_WORD_CHASTISE_TALENT.id, + ); + } + if (sanctifyHWCDR.has(event.ability.guid)) { + return this.handleCDR( + event, + sanctifyHWCDR.get(event.ability.guid), + TALENTS.HOLY_WORD_SANCTIFY_TALENT.id, + ); + } + if (serenityHWCDR.has(event.ability.guid)) { + return this.handleCDR( + event, + serenityHWCDR.get(event.ability.guid), + TALENTS.HOLY_WORD_SERENITY_TALENT.id, + ); + } + if (salvationHWCDR.has(event.ability.guid)) { + return this.handleCDR( + event, + salvationHWCDR.get(event.ability.guid), + TALENTS.HOLY_WORD_SALVATION_TALENT.id, + ); + } + } + /** + * this function is called by one of the above handlers and returns a breakdown of what effects contributed to + * holy word CDR effects. + * + * if vohAffectsBase is ever true, attribute the entire base to voice of harmony + * + * this takes a baseHolyWordCDR type, you can manually write one to fit in special cases + */ + + private handleCDR( + event: CastEvent, //future proof for tww s1 tier check + hwMap: baseHolyWordCDR | undefined, + hwToReduceId: number, + ): hwCDRBreakdown | undefined { + let baseMult = 1; + let modHolyWordCDR = this.baseHolyWordCDR; + let apothMult = 1; + + if (this.selectedCombatant.hasBuff(TALENTS.APOTHEOSIS_TALENT) && !hwMap?.apothDisable) { + modHolyWordCDR *= 1 + APOTH_MULTIPIER; + apothMult = 1 + APOTH_MULTIPIER; + } + + if (hwMap?.vohDependent) { + baseMult = this.baseVohMult; + } + + // At this point all modifiers should be settled, if blizzard ever adds a new modifier + // add it into the calcs somewhere here + + // TODO: twws1 tier set supposedly scales the CDR down to 35% effectiveness + // if this is true, if(getRelatedEvents(tier proc)) -> multipliers cut down to 0.35 + + const baseCDR = (hwMap?.baseCDR || 0) * baseMult; + const idealCDR = baseCDR * modHolyWordCDR; + const actualCDR = this.spellUsable.reduceCooldown(hwToReduceId, idealCDR); + + // if there is no base CDR, then a VoH spell was passed and VoH was not specced, return 0 + if (baseCDR === 0) { + return; + } + // if base CDR is larger than actual CDR none of the modifiers mattered + else if (baseCDR >= actualCDR) { + return { + idealTotalCDR: idealCDR, + actualTotalCDR: actualCDR, + cdrFromBase: actualCDR, + cdrFromLOTN: 0, + cdrFromApoth: 0, + cdrFromTwwTier: 0, + vohAffectsBase: hwMap?.vohDependent, + affectedSpell: hwToReduceId, + }; + } + + const cdrScaler = (actualCDR - baseCDR) / (idealCDR - baseCDR); + + return { + idealTotalCDR: idealCDR, + actualTotalCDR: actualCDR, + cdrFromBase: baseCDR, + cdrFromLOTN: this.getCDRComponent(idealCDR, cdrScaler, this.lotnMult), + cdrFromApoth: this.getCDRComponent(idealCDR, cdrScaler, apothMult), + cdrFromTwwTier: this.getCDRComponent(idealCDR, cdrScaler, this.twwS1TierMult), + vohAffectsBase: hwMap?.vohDependent, + affectedSpell: hwToReduceId, + }; + } + + // figure out what the other multipliers combine to without and minus from total + private getCDRComponent(idealCDR: number, cdrScaler: number, amp: number): number { + return cdrScaler * (idealCDR - idealCDR / amp); + } +} + +// If vohAffectsBase is true, the attribute base CDR to Voice of Harmony +// can directly add new effects as needed +interface hwCDRBreakdown { + idealTotalCDR: number; + actualTotalCDR: number; + cdrFromBase: number; + cdrFromLOTN: number; + cdrFromApoth: number; + cdrFromTwwTier: number; + vohAffectsBase: boolean | undefined; + affectedSpell: number; +} + +export default HolyWordCDR; diff --git a/src/analysis/retail/priest/holy/modules/core/HolyWordCDRBySpell.tsx b/src/analysis/retail/priest/holy/modules/core/HolyWordCDRBySpell.tsx new file mode 100644 index 00000000000..ff401d941a1 --- /dev/null +++ b/src/analysis/retail/priest/holy/modules/core/HolyWordCDRBySpell.tsx @@ -0,0 +1,228 @@ +import SPELLS from 'common/SPELLS'; +import TALENTS from 'common/TALENTS/priest'; +import { SpellIcon } from 'interface'; +import Analyzer, { Options, SELECTED_PLAYER } from 'parser/core/Analyzer'; +import BoringSpellValueText from 'parser/ui/BoringSpellValueText'; +import Statistic from 'parser/ui/Statistic'; +import { STATISTIC_ORDER } from 'parser/ui/StatisticBox'; +import HolyWordCDR from './HolyWordCDR'; +import Events, { CastEvent, RemoveBuffEvent, RemoveBuffStackEvent } from 'parser/core/Events'; +import { TIERS } from 'game/TIERS'; +import { buffedBySurgeOfLight, getSOLFlashCast } from '../../normalizers/CastLinkNormalizer'; + +/** + * this is just the display function for talents powered by the core of HolyWordCDR + */ + +class HolyWordCDRBySpell extends Analyzer { + static dependencies = { + holyWordCDR: HolyWordCDR, + }; + protected holyWordCDR!: HolyWordCDR; + + private lightOfTheNaaruActive = false; + private apotheosisActive = false; + private voiceOfHarmonyActive = false; + private tierActive = false; + + private hwContainer: hwCDRBreakdown[] = []; + + constructor(options: Options) { + super(options); + + this.lightOfTheNaaruActive = this.selectedCombatant.hasTalent( + TALENTS.LIGHT_OF_THE_NAARU_TALENT, + ); + + this.apotheosisActive = + this.selectedCombatant.hasTalent(TALENTS.APOTHEOSIS_TALENT) || + this.selectedCombatant.hasTalent(TALENTS.ANSWERED_PRAYERS_TALENT); + + this.voiceOfHarmonyActive = this.selectedCombatant.hasTalent(TALENTS.VOICE_OF_HARMONY_TALENT); + + this.tierActive = this.selectedCombatant.has2PieceByTier(TIERS.TWW1); + + this.addEventListener(Events.cast.by(SELECTED_PLAYER), this.handleOnCast); + + if (this.selectedCombatant.hasTalent(TALENTS.ENERGY_CYCLE_TALENT)) { + this.addEventListener(Events.removebuff.by(SELECTED_PLAYER), this.handleEnergyCycle); + this.addEventListener(Events.removebuffstack.by(SELECTED_PLAYER), this.handleEnergyCycle); + } + } + + handleOnCast(event: CastEvent, specialEvent?: string) { + const hwBreakdown = this.holyWordCDR.handleAny(event, specialEvent); + let spellId = event.ability.guid; + + if (specialEvent === 'ENERGY_CYCLE') { + spellId = TALENTS.ENERGY_CYCLE_TALENT.id; + } + + let baseCd = hwBreakdown?.cdrFromBase || 0; + const idealCd = hwBreakdown?.idealTotalCDR || 0; + // filters out non HW reducing abilities + if (idealCd === 0) { + return; + } + let vohCD = 0; + + // if Voice of Harmony enables this ability, switch the base CDR to VoH + if (hwBreakdown?.vohAffectsBase) { + baseCd = 0; + vohCD = hwBreakdown.cdrFromBase; + } + + if (hwBreakdown) { + const wastedCDR = hwBreakdown.idealTotalCDR - hwBreakdown.actualTotalCDR; + const cdrFromLotn = hwBreakdown.cdrFromLOTN; + const cdrFromApoth = hwBreakdown.cdrFromApoth; + const cdrFromTwwTier = hwBreakdown.cdrFromTwwTier; + const totalEffectiveCDR = baseCd + vohCD + cdrFromApoth + cdrFromLotn + cdrFromTwwTier; + const affectedSpell = hwBreakdown.affectedSpell; + + if (this.hwContainer[spellId]) { + this.hwContainer[spellId].wastedCdr += + hwBreakdown.idealTotalCDR - hwBreakdown.actualTotalCDR; + this.hwContainer[spellId].cdrFromBase += baseCd; + this.hwContainer[spellId].cdrFromLOTN += cdrFromLotn; + this.hwContainer[spellId].cdrFromApoth += cdrFromApoth; + this.hwContainer[spellId].cdrFromTwwTier += cdrFromTwwTier; + this.hwContainer[spellId].cdrFromVoh += vohCD; + this.hwContainer[spellId].totalCDR += totalEffectiveCDR; + } + // first time + else { + this.hwContainer[spellId] = { + wastedCdr: wastedCDR, + cdrFromBase: baseCd, + cdrFromLOTN: cdrFromLotn, + cdrFromApoth: cdrFromApoth, + cdrFromTwwTier: cdrFromTwwTier, + cdrFromVoh: vohCD, + spellNum: spellId, + totalCDR: totalEffectiveCDR, + affectedSpell: affectedSpell, + }; + } + } + } + + /** + * + * SPECIAL CASES + * + */ + + handleEnergyCycle(event: RemoveBuffEvent | RemoveBuffStackEvent) { + // this uses heal event because tww S1 tier set is stupid and doesn't "cast" it just procs a second heal + // but still consumes SoL potentially + const castEvent = getSOLFlashCast(event); + + if (castEvent) { + if (buffedBySurgeOfLight(event)) { + this.handleOnCast(castEvent, 'ENERGY_CYCLE'); + } + } + } + + roundVal(num: number) { + return Math.round(num * 10) / 10; + } + + statistic() { + this.hwContainer = this.hwContainer.filter(Boolean); + this.hwContainer.sort((a, b) => { + if (a.affectedSpell < b.affectedSpell) { + return -1; + } + if (a.affectedSpell > b.affectedSpell) { + return 1; + } + return 0; + }); + return ( + + + + + + + + {this.apotheosisActive && ( + + )} + {this.lightOfTheNaaruActive && ( + + )} + {this.voiceOfHarmonyActive && ( + + )} + {this.tierActive && } + + + + + + {Array.from(this.hwContainer.keys()).map((e, i) => ( + + + + + {this.apotheosisActive && ( + + )} + {this.lightOfTheNaaruActive && ( + + )} + {this.voiceOfHarmonyActive && ( + + )} + {this.tierActive && ( + + )} + + + + ))} + +
Cast SpellReduced SpellBase + + + + + + Tier Total Used Wasted
+ + + + {this.roundVal(this.hwContainer[e].cdrFromBase)}s{this.roundVal(this.hwContainer[e].cdrFromApoth)}s{this.roundVal(this.hwContainer[e].cdrFromLOTN)}s{this.roundVal(this.hwContainer[e].cdrFromVoh)}s{this.roundVal(this.hwContainer[e].cdrFromTwwTier)}s{this.roundVal(this.hwContainer[Number(e)].totalCDR)}s{this.roundVal(this.hwContainer[Number(e)].wastedCdr)}s
+ + } + > + + Total holy word CDR from all sources. + +
+ ); + } +} + +// Add more values here as needed +interface hwCDRBreakdown { + wastedCdr: number; + cdrFromBase: number; + cdrFromLOTN: number; + cdrFromApoth: number; + cdrFromTwwTier: number; + cdrFromVoh: number; + spellNum: number; + totalCDR: number; + affectedSpell: number; +} + +export default HolyWordCDRBySpell; diff --git a/src/analysis/retail/priest/holy/modules/core/HolyWordWastedAmounts.tsx b/src/analysis/retail/priest/holy/modules/core/HolyWordWastedAmounts.tsx deleted file mode 100644 index 2aee6d946ac..00000000000 --- a/src/analysis/retail/priest/holy/modules/core/HolyWordWastedAmounts.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import HolyWordChastise from 'analysis/retail/priest/holy/modules/spells/holyword/HolyWordChastise'; -import HolyWordSanctify from 'analysis/retail/priest/holy/modules/spells/holyword/HolyWordSanctify'; -import HolyWordSerenity from 'analysis/retail/priest/holy/modules/spells/holyword/HolyWordSerenity'; -import { formatNumber, formatPercentage } from 'common/format'; -import SPELLS from 'common/SPELLS'; -import { SpellIcon } from 'interface'; -import Analyzer from 'parser/core/Analyzer'; -import StatisticBox, { STATISTIC_ORDER } from 'parser/ui/StatisticBox'; - -// dependencies - -class HolyWordWastedAmounts extends Analyzer { - static dependencies = { - sanctify: HolyWordSanctify, - serenity: HolyWordSerenity, - chastise: HolyWordChastise, - }; - - protected sanctify!: HolyWordSanctify; - protected serenity!: HolyWordSerenity; - protected chastise!: HolyWordChastise; - - statistic() { - const percWastedVersusTotal = - (this.serenity.holyWordWastedCooldown + this.sanctify.holyWordWastedCooldown) / - (this.serenity.totalCooldownReduction + this.sanctify.totalCooldownReduction); - - return ( - } - value={`${formatPercentage(percWastedVersusTotal)}%`} - label="Wasted Holy Words reduction" - tooltip={ - <> - {formatNumber(this.serenity.holyWordWastedCooldown / 1000)}s wasted Serenity reduction - (of {formatNumber(this.serenity.totalCooldownReduction / 1000)}s total) -
- {formatNumber(this.sanctify.holyWordWastedCooldown / 1000)}s wasted Sanctify reduction - (of {formatNumber(this.sanctify.totalCooldownReduction / 1000)}s total) -
- - } - position={STATISTIC_ORDER.CORE(4)} - /> - ); - } -} - -export default HolyWordWastedAmounts; diff --git a/src/analysis/retail/priest/holy/modules/core/HolyWordsReductionBySpell.tsx b/src/analysis/retail/priest/holy/modules/core/HolyWordsReductionBySpell.tsx deleted file mode 100644 index f7280513a28..00000000000 --- a/src/analysis/retail/priest/holy/modules/core/HolyWordsReductionBySpell.tsx +++ /dev/null @@ -1,190 +0,0 @@ -import HolyWordChastise from 'analysis/retail/priest/holy/modules/spells/holyword/HolyWordChastise'; -import HolyWordSalvation from 'analysis/retail/priest/holy/modules/spells/holyword/HolyWordSalvation'; -import HolyWordSanctify from 'analysis/retail/priest/holy/modules/spells/holyword/HolyWordSanctify'; -import HolyWordSerenity from 'analysis/retail/priest/holy/modules/spells/holyword/HolyWordSerenity'; -import { formatPercentage } from 'common/format'; -import SPELLS from 'common/SPELLS'; -import TALENTS from 'common/TALENTS/priest'; -import { SpellIcon } from 'interface'; -import Analyzer, { Options } from 'parser/core/Analyzer'; -import BoringSpellValueText from 'parser/ui/BoringSpellValueText'; -import Statistic from 'parser/ui/Statistic'; -import { STATISTIC_ORDER } from 'parser/ui/StatisticBox'; - -class HolyWordsReductionBySpell extends Analyzer { - static dependencies = { - sanctify: HolyWordSanctify, - serenity: HolyWordSerenity, - chastise: HolyWordChastise, - salvation: HolyWordSalvation, - }; - lightOfTheNaaruActive = false; - apotheosisActive = false; - voiceOfHarmonyActive = false; - - protected sanctify!: HolyWordSanctify; - protected serenity!: HolyWordSerenity; - protected chastise!: HolyWordChastise; - protected salvation!: HolyWordSalvation; - - constructor(options: Options) { - super(options); - this.lightOfTheNaaruActive = this.selectedCombatant.hasTalent( - TALENTS.LIGHT_OF_THE_NAARU_TALENT, - ); - this.apotheosisActive = this.selectedCombatant.hasTalent(TALENTS.APOTHEOSIS_TALENT); - this.voiceOfHarmonyActive = this.selectedCombatant.hasTalent(TALENTS.VOICE_OF_HARMONY_TALENT); - } - - get totalReduction() { - return ( - this.sanctify.totalCooldownReduction + - this.serenity.totalCooldownReduction + - this.chastise.totalCooldownReduction - ); - } - - get reductionBySpellNonApparatus() { - let totalReductionBySpell: { [spellID: string]: { [otherSpellID: string]: number } } = {}; - - totalReductionBySpell = this.sumCooldown( - totalReductionBySpell, - this.sanctify.totalHolyWordReductionPerSpellPerTalent, - ); - totalReductionBySpell = this.sumCooldown( - totalReductionBySpell, - this.serenity.totalHolyWordReductionPerSpellPerTalent, - ); - totalReductionBySpell = this.sumCooldown( - totalReductionBySpell, - this.chastise.totalHolyWordReductionPerSpellPerTalent, - ); - totalReductionBySpell = this.sumCooldown( - totalReductionBySpell, - this.salvation.totalHolyWordReductionPerSpellPerTalent, - ); - - return totalReductionBySpell; - } - - get reductionBySpellApparatus() { - let totalReductionBySpell: { [spellID: string]: { [otherSpellID: string]: number } } = {}; - - totalReductionBySpell = this.sumCooldown( - totalReductionBySpell, - this.sanctify.totalHolyWordReductionPerSpellPerTalent, - ); - totalReductionBySpell = this.sumCooldown( - totalReductionBySpell, - this.serenity.totalHolyWordReductionPerSpellPerTalent, - ); - totalReductionBySpell = this.sumCooldown( - totalReductionBySpell, - this.chastise.totalHolyWordReductionPerSpellPerTalent, - ); - totalReductionBySpell = this.sumCooldown( - totalReductionBySpell, - this.salvation.totalHolyWordReductionPerSpellPerTalent, - ); - - return totalReductionBySpell; - } - - sumCooldown( - currentList: { [spellID: string]: { [otherSpellID: string]: number } }, - newList: { [spellID: string]: { [otherSpellID: string]: number } }, - ) { - for (const [key, value] of Object.entries(newList)) { - if (currentList[key] == null) { - if ( - key === String(TALENTS.CIRCLE_OF_HEALING_TALENT.id) || - key === String(SPELLS.HOLY_FIRE.id) || - key === String(TALENTS.PRAYER_OF_MENDING_TALENT.id) - ) { - newList[key].apparatus = newList[key].base; - newList[key].base = 0; - } else { - newList[key].apparatus = 0; - } - currentList[key] = value; - } else { - for (const [innerKey, innerValue] of Object.entries(value)) { - currentList[key][innerKey] = currentList[key][innerKey] || 0; - currentList[key][innerKey] += innerValue; - } - } - } - return currentList; - } - - statistic() { - const reductionRatio = this.totalReduction / (this.owner.fightDuration + this.totalReduction); - const reductionBySpell = this.reductionBySpellNonApparatus; - - return ( - - This % shows the percentage of total CD reduction for your Holy Words throughout the - fight -
- that your Holy Words passive has contributed (The other contributor being time). -
-
- Talents like Light of the Naaru, Harmonious Apparatus, - and Apotheosis which provide further CD reduction are taken into - account when calculating these numbers. -
-
- If you have talented Holy Word Salvation both{' '} - Holy Word Sanctify - and Serenity will show since they provide CD reduction for{' '} - Holy World Salvation. - - } - dropdown={ - <> - - - - - - {this.apotheosisActive && } - {this.lightOfTheNaaruActive && } - {this.voiceOfHarmonyActive && } - - - - {Object.keys(reductionBySpell).map((e, i) => ( - - - - {this.apotheosisActive && ( - - )} - {this.lightOfTheNaaruActive && ( - - )} - {this.voiceOfHarmonyActive && ( - - )} - - ))} - -
SpellBaseApotheosisLight of the NaaruHarmonious apparatus
- {SPELLS[Number(e)].name} - {Math.ceil(reductionBySpell[e].base / 1000)}s{Math.ceil(reductionBySpell[e].apotheosis / 1000)}s{Math.ceil(reductionBySpell[e].lightOfTheNaaru / 1000)}s{Math.ceil(reductionBySpell[e].apparatus / 1000)}s
- - } - > - - {formatPercentage(reductionRatio)}% Total Holy Word reduction - -
- ); - } -} - -export default HolyWordsReductionBySpell; diff --git a/src/analysis/retail/priest/holy/modules/dragonflight/tier/tier29/Tier29HolyPriest2Set.tsx b/src/analysis/retail/priest/holy/modules/dragonflight/tier/tier29/Tier29HolyPriest2Set.tsx deleted file mode 100644 index df9a6f50bea..00000000000 --- a/src/analysis/retail/priest/holy/modules/dragonflight/tier/tier29/Tier29HolyPriest2Set.tsx +++ /dev/null @@ -1,113 +0,0 @@ -import TALENTS from 'common/TALENTS/priest'; -import SPELLS from 'common/SPELLS'; -import Analyzer, { Options, SELECTED_PLAYER } from 'parser/core/Analyzer'; -import BoringSpellValueText from 'parser/ui/BoringSpellValueText'; -import Statistic from 'parser/ui/Statistic'; -import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; -import Events, { HealEvent } from 'parser/core/Events'; -import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; -import { TIERS } from 'game/TIERS'; - -const TIER_CAST_TIME_REDUCTION = 1; -const TIER_HOLY_WORD_REDUCTION = 2; - -const LIGHT_OF_THE_NAARU_MULTIPLIER_PER_RANK = 0.1; -const APOTHEOSIS_MULTIPLIER = 4; - -//Example log: /reports/w9BXrzFApPbj6LnG#fight=10&type=healing&source=19 -class HolyPriestTier2Set extends Analyzer { - lightOfTheNaaruMultiplier = 1; - apotheosisActive = false; - - holyWordReduction = 0; - naaruReduction = 0; - apotheosisReduction = 0; - timeSaved = 0; - has2SetBuff = false; - - constructor(options: Options) { - super(options); - if (!this.selectedCombatant.has2PieceByTier(TIERS.DF1)) { - this.active = false; - return; - } - - this.lightOfTheNaaruMultiplier += - this.selectedCombatant.getTalentRank(TALENTS.LIGHT_OF_THE_NAARU_TALENT) * - LIGHT_OF_THE_NAARU_MULTIPLIER_PER_RANK; - - this.addEventListener( - Events.applybuff.by(SELECTED_PLAYER).spell(TALENTS.APOTHEOSIS_TALENT), - this.onApotheosis, - ); - this.addEventListener( - Events.removebuff.by(SELECTED_PLAYER).spell(TALENTS.APOTHEOSIS_TALENT), - this.onNoApotheosis, - ); - - this.addEventListener( - Events.applybuff.by(SELECTED_PLAYER).spell(SPELLS.HOLY_PRIEST_TIER_29_2_SET_BUFF), - this.on2SetBuff, - ); - this.addEventListener( - Events.removebuff.by(SELECTED_PLAYER).spell(SPELLS.HOLY_PRIEST_TIER_29_2_SET_BUFF), - this.on2SetNoBuff, - ); - - this.addEventListener(Events.heal.by(SELECTED_PLAYER), this.onHeal); - } - - onApotheosis() { - this.apotheosisActive = true; - } - - onNoApotheosis() { - this.apotheosisActive = false; - } - - onHeal(Event: HealEvent) { - if ( - this.has2SetBuff && - (Event.ability.guid === SPELLS.GREATER_HEAL.id || - Event.ability.guid === TALENTS.PRAYER_OF_HEALING_TALENT.id) - ) { - this.timeSaved += TIER_CAST_TIME_REDUCTION; - this.has2SetBuff = false; - - //All Holy Word reduction is tracked as one because showing them individually would - //Take a lot of space and provide little value - this.holyWordReduction += this.apotheosisActive - ? TIER_HOLY_WORD_REDUCTION * APOTHEOSIS_MULTIPLIER * this.lightOfTheNaaruMultiplier - : TIER_HOLY_WORD_REDUCTION * this.lightOfTheNaaruMultiplier; - } - } - on2SetBuff() { - this.has2SetBuff = true; - } - - on2SetNoBuff() { - this.has2SetBuff = false; - } - - statistic() { - return ( - - The reduction from tier is including the bonus from Light of the Naaru and Apotheosis. - - } - size="flexible" - category={STATISTIC_CATEGORY.ITEMS} - position={STATISTIC_ORDER.OPTIONAL(1)} - > - - {this.timeSaved} seconds of casting saved -
- {Math.floor(this.holyWordReduction)} seconds reduction of Holy Words -
-
- ); - } -} -export default HolyPriestTier2Set; diff --git a/src/analysis/retail/priest/holy/modules/dragonflight/tier/tier29/Tier29HolyPriest4Set.tsx b/src/analysis/retail/priest/holy/modules/dragonflight/tier/tier29/Tier29HolyPriest4Set.tsx deleted file mode 100644 index b7cbc98dbb8..00000000000 --- a/src/analysis/retail/priest/holy/modules/dragonflight/tier/tier29/Tier29HolyPriest4Set.tsx +++ /dev/null @@ -1,92 +0,0 @@ -import SPELLS from 'common/SPELLS'; -import Analyzer, { Options, SELECTED_PLAYER } from 'parser/core/Analyzer'; -import BoringSpellValueText from 'parser/ui/BoringSpellValueText'; -import Statistic from 'parser/ui/Statistic'; -import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; -import Events, { - ApplyBuffEvent, - FightEndEvent, - HealEvent, - RemoveBuffEvent, -} from 'parser/core/Events'; -import { formatPercentage } from 'common/format'; -import Crit from 'parser/shared/modules/helpers/CritEffectBonus'; -import ItemHealingDone from 'parser/ui/ItemHealingDone'; -import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; -import { TIERS } from 'game/TIERS'; - -const TIER_CRIT_BONUS = 0.1; - -//Example log: /reports/w9BXrzFApPbj6LnG#fight=10&type=healing&source=19 -class HolyPriestTier4Set extends Analyzer { - static dependencies = { - crit: Crit, - }; - protected crit!: Crit; - - uptime4Set = 0; //Buff uptime in milliseconds - is4SetActive = false; - timestampOfLast4SetActivation = 0; //Used to calculate uptime in case the fight ends with the buff active - healingContributionOf4Set = 0; - overallHealing = 0; - - constructor(options: Options) { - super(options); - if (!this.selectedCombatant.has4PieceByTier(TIERS.DF1)) { - this.active = false; - return; - } - - this.addEventListener(Events.heal.by(SELECTED_PLAYER), this.onHeal); - this.addEventListener( - Events.applybuff.by(SELECTED_PLAYER).spell(SPELLS.HOLY_PRIEST_TIER_29_4_SET_BUFF), - this.on4SetBuff, - ); - this.addEventListener( - Events.removebuff.by(SELECTED_PLAYER).spell(SPELLS.HOLY_PRIEST_TIER_29_4_SET_BUFF), - this.on4SetNoBuff, - ); - this.addEventListener(Events.fightend, this.onFightEnd); - } - - onHeal(Event: HealEvent) { - if (this.is4SetActive) { - this.healingContributionOf4Set += this.crit.getHealingContribution( - Event, - TIER_CRIT_BONUS, - ).effectiveHealing; - } - } - - on4SetBuff(Event: ApplyBuffEvent) { - this.is4SetActive = true; - this.timestampOfLast4SetActivation = Event.timestamp; - } - on4SetNoBuff(Event: RemoveBuffEvent) { - this.uptime4Set += Event.timestamp - this.timestampOfLast4SetActivation; - this.is4SetActive = false; - } - - onFightEnd(Event: FightEndEvent) { - if (this.is4SetActive) { - this.uptime4Set += Event.timestamp - this.timestampOfLast4SetActivation; - } - } - - statistic() { - const uptimePercent = formatPercentage(this.uptime4Set / this.owner.fightDuration); - return ( - You had {uptimePercent}% uptime on the buff.} - size="flexible" - category={STATISTIC_CATEGORY.ITEMS} - position={STATISTIC_ORDER.OPTIONAL(1)} - > - - - - - ); - } -} -export default HolyPriestTier4Set; diff --git a/src/analysis/retail/priest/holy/modules/dragonflight/tier/tier30/Tier30HolyPriest4Set.tsx b/src/analysis/retail/priest/holy/modules/dragonflight/tier/tier30/Tier30HolyPriest4Set.tsx deleted file mode 100644 index f7e40f82de8..00000000000 --- a/src/analysis/retail/priest/holy/modules/dragonflight/tier/tier30/Tier30HolyPriest4Set.tsx +++ /dev/null @@ -1,145 +0,0 @@ -import SPELLS from 'common/SPELLS'; -import TALENTS from 'common/TALENTS/priest'; -import Analyzer, { Options, SELECTED_PLAYER } from 'parser/core/Analyzer'; -import Statistic from 'parser/ui/Statistic'; -import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; -import Events, { CastEvent, HealEvent } from 'parser/core/Events'; -import { - calculateEffectiveHealing, - calculateOverhealing, - calculateEffectiveDamage, -} from 'parser/core/EventCalculateLib'; -import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; -import ItemHealingDone from 'parser/ui/ItemHealingDone'; -import { - getSerenityHealEvent, - getChastiseDamageEvent, - getSalvationHealEvents, - getSanctifyHealEvents, -} from 'analysis/retail/priest/holy/normalizers/CastLinkNormalizer'; -import BoringSpellValueText from 'parser/ui/BoringSpellValueText'; -import { formatNumber, formatPercentage } from 'common/format'; -import ItemDamageDone from 'parser/ui/ItemDamageDone'; - -const TIER_BONUS = 0.04; -const FALL_BUFFER = 100; - -class HolyPriestAbberus4Set extends Analyzer { - healing = 0; - overhealing = 0; - damage = 0; - stacksOnCast: number[] = []; - - constructor(options: Options) { - super(options); - - // bonus set id for tier 30 logs not loading properly - // if (!this.selectedCombatant.has4PieceByTier(TIERS.T30)) { - // this.active = false; - // return; - // } - - this.addEventListener( - Events.cast.by(SELECTED_PLAYER).spell([TALENTS.HOLY_WORD_SERENITY_TALENT]), - this.onSerenityCast, - ); - - this.addEventListener( - Events.cast.by(SELECTED_PLAYER).spell([TALENTS.HOLY_WORD_SANCTIFY_TALENT]), - this.onSanctifyCast, - ); - - this.addEventListener( - Events.cast.by(SELECTED_PLAYER).spell([TALENTS.HOLY_WORD_SALVATION_TALENT]), - this.onSalvationCast, - ); - - this.addEventListener( - Events.cast.by(SELECTED_PLAYER).spell([TALENTS.HOLY_WORD_CHASTISE_TALENT]), - this.onChastiseCast, - ); - } - - get tierStacks() { - return this.selectedCombatant.getBuffStacks( - SPELLS.HOLY_PRIEST_TIER_30_4_SET_BUFF.id, - null, - FALL_BUFFER, - ); - } - - onSerenityCast(event: CastEvent) { - const stacks = this.tierStacks; - if (stacks > 0) { - this.stacksOnCast.push(stacks); - const healEvent = getSerenityHealEvent(event); - this.healing += calculateEffectiveHealing(healEvent, stacks * TIER_BONUS); - this.overhealing += calculateOverhealing(healEvent, stacks * TIER_BONUS); - } - } - - onSanctifyCast(event: CastEvent) { - const stacks = this.tierStacks; - if (stacks > 0) { - this.stacksOnCast.push(stacks); - const healEvents = getSanctifyHealEvents(event); - healEvents.forEach((healEvent: HealEvent) => { - this.healing += calculateEffectiveHealing(healEvent, stacks * TIER_BONUS); - this.overhealing += calculateOverhealing(healEvent, stacks * TIER_BONUS); - }); - } - } - - onSalvationCast(event: CastEvent) { - const stacks = this.tierStacks; - if (stacks > 0) { - this.stacksOnCast.push(stacks); - const healEvents = getSalvationHealEvents(event); - healEvents.forEach((healEvent: HealEvent) => { - this.healing += calculateEffectiveHealing(healEvent, stacks * TIER_BONUS); - this.overhealing += calculateOverhealing(healEvent, stacks * TIER_BONUS); - }); - } - } - - onChastiseCast(event: CastEvent) { - const stacks = this.tierStacks; - if (stacks > 0) { - this.stacksOnCast.push(stacks); - const damageEvent = getChastiseDamageEvent(event); - this.damage += calculateEffectiveDamage(damageEvent, stacks * TIER_BONUS); - } - } - - get averageTierStacks() { - return this.stacksOnCast.reduce((a, b) => a + b) / this.stacksOnCast.length; - } - - statistic() { - // adding this check here as checking if tier is equipped is buggy atm - if (this.healing > 0 || this.overhealing > 0 || this.damage > 0) { - return ( - - Average stacks on Holy Word cast: {formatNumber(this.averageTierStacks)} -
- Bonus Healing Done: {formatNumber(this.healing)} ( - {formatPercentage(this.overhealing / (this.healing + this.overhealing))}% OH) - - } - > - - - {this.damage > 0 && } - -
- ); - } - } -} - -export default HolyPriestAbberus4Set; diff --git a/src/analysis/retail/priest/holy/modules/spells/CircleOfHealing.tsx b/src/analysis/retail/priest/holy/modules/spells/CircleOfHealing.tsx index 1e7b516487f..cd0bf53d967 100644 --- a/src/analysis/retail/priest/holy/modules/spells/CircleOfHealing.tsx +++ b/src/analysis/retail/priest/holy/modules/spells/CircleOfHealing.tsx @@ -8,9 +8,7 @@ import { getCircleOfHealingEvents } from '../../normalizers/CastLinkNormalizer'; import GradiatedPerformanceBar from 'interface/guide/components/GradiatedPerformanceBar'; import { BadColor, OkColor, GoodColor } from 'interface/guide'; import CastEfficiencyPanel from 'interface/guide/components/CastEfficiencyPanel'; - -const OVERHEAL_THRESHOLD = 0.75; -const COH_MAX_TARGETS_HIT = 5; +import { COH_MAX_TARGETS_HIT, COH_OVERHEAL_THRESHOLD } from '../../constants'; class CircleOfHealing extends Analyzer { circleOfHealingCasts = 0; @@ -76,7 +74,7 @@ class CircleOfHealing extends Analyzer { const maxTargets = this.orisonActive ? COH_MAX_TARGETS_HIT + 1 : COH_MAX_TARGETS_HIT; if (targetsHit < maxTargets) { this.badCasts += 1; - } else if (overhealing / (healing + overhealing) >= OVERHEAL_THRESHOLD) { + } else if (overhealing / (healing + overhealing) >= COH_OVERHEAL_THRESHOLD) { this.okCasts += 1; } else { this.goodCasts += 1; diff --git a/src/analysis/retail/priest/holy/modules/spells/GuardianSpirit.tsx b/src/analysis/retail/priest/holy/modules/spells/GuardianSpirit.tsx index 5b4783912eb..374a6620f2d 100644 --- a/src/analysis/retail/priest/holy/modules/spells/GuardianSpirit.tsx +++ b/src/analysis/retail/priest/holy/modules/spells/GuardianSpirit.tsx @@ -8,8 +8,7 @@ import { EventType } from 'parser/core/Events'; import AbilityTracker from 'parser/shared/modules/AbilityTracker'; import ItemHealingDone from 'parser/ui/ItemHealingDone'; import LazyLoadStatisticBox from 'parser/ui/LazyLoadStatisticBox'; - -const GUARDIAN_SPIRIT_HEALING_INCREASE = 0.6; +import { GUARDIAN_SPIRIT_HEALING_INCREASE } from '../../constants'; class GuardianSpirit extends Analyzer { static dependencies = { diff --git a/src/analysis/retail/priest/holy/modules/spells/HymnBuffBenefit.tsx b/src/analysis/retail/priest/holy/modules/spells/HymnBuffBenefit.tsx index 063c2e25405..d36514e7953 100644 --- a/src/analysis/retail/priest/holy/modules/spells/HymnBuffBenefit.tsx +++ b/src/analysis/retail/priest/holy/modules/spells/HymnBuffBenefit.tsx @@ -7,9 +7,10 @@ import { SpellIcon } from 'interface'; import Analyzer, { Options, SELECTED_PLAYER } from 'parser/core/Analyzer'; import Events, { ApplyBuffEvent, ApplyBuffStackEvent, EventType } from 'parser/core/Events'; import LazyLoadStatisticBox from 'parser/ui/LazyLoadStatisticBox'; - -const BASE_DIVINE_HYMN_HEALING_INCREASE_PER_STACK = 0.04; -const GALES_OF_SONG_HEALING_INCREASE_PER_POINT = 0.02; +import { + BASE_DIVINE_HYMN_HEALING_INCREASE_PER_STACK, + GALES_OF_SONG_HEALING_INCREASE_PER_POINT, +} from '../../constants'; class HymnBuffBenefit extends Analyzer { // This is an approximation. See the reasoning below. diff --git a/src/analysis/retail/priest/holy/modules/spells/PrayerOfHealing.tsx b/src/analysis/retail/priest/holy/modules/spells/PrayerOfHealing.tsx index 94b442d150a..6d88b2d8cbf 100644 --- a/src/analysis/retail/priest/holy/modules/spells/PrayerOfHealing.tsx +++ b/src/analysis/retail/priest/holy/modules/spells/PrayerOfHealing.tsx @@ -10,8 +10,7 @@ import { GUIDE_CORE_EXPLANATION_PERCENT } from '../../Guide'; import { BadColor, OkColor, GoodColor, PerfectColor } from 'interface/guide'; import { BoxRowEntry, PerformanceBoxRow } from 'interface/guide/components/PerformanceBoxRow'; import { QualitativePerformance } from 'parser/ui/QualitativePerformance'; - -const POH_MAX_TARGETS_HIT = 5; +import { POH_MAX_TARGETS_HIT } from '../../constants'; class PrayerOfHealing extends Analyzer { static dependencies = { diff --git a/src/analysis/retail/priest/holy/modules/spells/holyword/HolyWordBase.tsx b/src/analysis/retail/priest/holy/modules/spells/holyword/HolyWordBase.tsx deleted file mode 100644 index a52dc2bf4a7..00000000000 --- a/src/analysis/retail/priest/holy/modules/spells/holyword/HolyWordBase.tsx +++ /dev/null @@ -1,258 +0,0 @@ -import SpellUsable from 'analysis/retail/priest/holy/modules/features/SpellUsable'; -import TALENTS from 'common/TALENTS/priest'; -import Analyzer, { Options, SELECTED_PLAYER } from 'parser/core/Analyzer'; -import Events, { ApplyBuffEvent, CastEvent, HealEvent, RemoveBuffEvent } from 'parser/core/Events'; - -const LIGHT_OF_THE_NAARU_REDUCTION_PER_RANK = 0.1; -const HARMONIOUS_APPARATUS_REDUCTION_PER_RANK = 2000; -class HolyWordBase extends Analyzer { - static dependencies = { - spellUsable: SpellUsable, - }; - spellId = 0; - manaCost = 0; - baseCooldown = 60000; - apparatusReduction = - HARMONIOUS_APPARATUS_REDUCTION_PER_RANK * - this.selectedCombatant.getTalentRank(TALENTS.VOICE_OF_HARMONY_TALENT); - remainingCooldown = 0; - serendipityProccers: { - [spellID: string]: { - baseReduction: () => number; - lightOfTheNaaruReduction: () => number; - apotheosisReduction: () => number; - lightOfTheNaaruAndApotheosisReduction: () => number; - }; - } = {}; - holyWordHealing = 0; - holyWordOverhealing = 0; - holyWordCasts = 0; - holyWordWastedCooldown = 0; - baseHolyWordReductionBySpell: { [spellID: string]: number } = {}; - - lightOfTheNaruActive = false; - lightOfTheNaruMultiplier = 1; - lightOfTheNaruReductionBySpell: { [spellID: string]: number } = {}; - - apotheosisCasts = 0; - apotheosisActive = false; - apotheosisMultiplier = 3; - //Not constant because it is used in other holy word files - apotheosisReductionBySpell: { [spellID: string]: number } = {}; - apotheosisManaReduction = 0; - holyWordApotheosisCasts = 0; - holyWordHealingDuringApotheosis = 0; - holyWordOverhealingDuringApotheosis = 0; - - harmoniousApparatusActive = false; - - protected spellUsable!: SpellUsable; - - constructor(options: Options) { - super(options); - - // Set up proper serendipity reduction values - if (this.selectedCombatant.hasTalent(TALENTS.LIGHT_OF_THE_NAARU_TALENT)) { - this.lightOfTheNaruActive = true; - this.lightOfTheNaruMultiplier = - this.selectedCombatant.getTalentRank(TALENTS.LIGHT_OF_THE_NAARU_TALENT) * - LIGHT_OF_THE_NAARU_REDUCTION_PER_RANK + - 1; - } - - if (this.selectedCombatant.hasTalent(TALENTS.VOICE_OF_HARMONY_TALENT)) { - this.harmoniousApparatusActive = true; - } - - this.addEventListener(Events.cast.by(SELECTED_PLAYER), this.onCast); - this.addEventListener(Events.heal.by(SELECTED_PLAYER), this.onHeal); - this.addEventListener( - Events.applybuff.by(SELECTED_PLAYER).spell(TALENTS.APOTHEOSIS_TALENT), - this.onApplyBuff, - ); - this.addEventListener( - Events.removebuff.by(SELECTED_PLAYER).spell(TALENTS.APOTHEOSIS_TALENT), - this.onRemoveBuff, - ); - } - - get baseCooldownReduction() { - let totalCDR = 0; - - for (const key of Object.entries(this.baseHolyWordReductionBySpell)) { - totalCDR += key[1]; - } - return totalCDR; - } - - get lightOfTheNaaruCooldownReduction() { - let lotnCDR = 0; - - for (const key of Object.entries(this.lightOfTheNaruReductionBySpell)) { - lotnCDR += key[1]; - } - return lotnCDR; - } - - get apotheosisCooldownReduction() { - let apothCDR = 0; - - for (const key of Object.entries(this.apotheosisReductionBySpell)) { - apothCDR += key[1]; - } - return apothCDR; - } - - get totalHolyWordReductionPerSpell() { - const totalReduction: any = {}; - for (const [key, value] of Object.entries(this.baseHolyWordReductionBySpell)) { - totalReduction[key] = totalReduction[key] || 0; - totalReduction[key] += value; - } - - for (const [key, value] of Object.entries(this.apotheosisReductionBySpell)) { - totalReduction[key] = totalReduction[key] || 0; - totalReduction[key] += value; - } - - for (const [key, value] of Object.entries(this.lightOfTheNaruReductionBySpell)) { - totalReduction[key] = totalReduction[key] || 0; - totalReduction[key] += value; - } - - return totalReduction; - } - - get totalHolyWordReductionPerSpellPerTalent() { - const totalReduction: { - [spellID: string]: { - [otherSpellID: string]: number; - }; - } = {}; - for (const [key, value] of Object.entries(this.baseHolyWordReductionBySpell)) { - totalReduction[key] = totalReduction[key] || {}; - totalReduction[key].base = totalReduction[key].base || 0; - totalReduction[key].base += value; - } - - for (const [key, value] of Object.entries(this.apotheosisReductionBySpell)) { - totalReduction[key] = totalReduction[key] || {}; - totalReduction[key].apotheosis = totalReduction[key].apotheosis || 0; - totalReduction[key].apotheosis += value; - } - - for (const [key, value] of Object.entries(this.lightOfTheNaruReductionBySpell)) { - totalReduction[key] = totalReduction[key] || {}; - totalReduction[key].lightOfTheNaaru = totalReduction[key].lightOfTheNaaru || 0; - totalReduction[key].lightOfTheNaaru += value; - } - - return totalReduction; - } - - get totalCooldownReduction() { - return ( - this.baseCooldownReduction + - this.lightOfTheNaaruCooldownReduction + - this.apotheosisCooldownReduction - ); - } - - onCast(event: CastEvent) { - const spellId = event.ability.guid; - if (spellId === this.spellId) { - this.holyWordCasts += 1; - this.remainingCooldown = this.baseCooldown; - - if (this.apotheosisActive) { - this.apotheosisManaReduction += this.manaCost; - this.holyWordApotheosisCasts += 1; - } - } else if (this.serendipityProccers[spellId] != null) { - const reductionAmount = this.parseSerendipityCast(spellId); - this.remainingCooldown -= reductionAmount; - - if (this.spellUsable.isOnCooldown(this.spellId)) { - this.spellUsable.reduceCooldown(this.spellId, reductionAmount, event.timestamp); - } - - if (this.remainingCooldown < 0) { - this.holyWordWastedCooldown += this.remainingCooldown * -1; - this.remainingCooldown = 0; - } - } - } - - parseSerendipityCast(spellId: number) { - // We are casting a spell that will reduce a Holy Word Cooldown. - // Get the base amount of the reduction - const baseReductionAmount = this.serendipityProccers[spellId].baseReduction(); - this.baseHolyWordReductionBySpell[spellId] = this.baseHolyWordReductionBySpell[spellId] || 0; - this.baseHolyWordReductionBySpell[spellId] += baseReductionAmount; - - // Get the modified reduction by spell - if (this.lightOfTheNaruActive && this.apotheosisActive) { - //When both LightOfTheNaaru and Apotheosis is active the total reduction is higher than each reduction individually - //Here each gets reduction equal to their individual contribution and the additional total reduction is split 50% - //Cooldown gained from harmonious apparatus is treated as being base reduction and thus does not gain any from other bonusses - const totalReduction = - this.serendipityProccers[spellId].lightOfTheNaaruAndApotheosisReduction() - - baseReductionAmount; - const lightOfTheNaaruReduction = - this.serendipityProccers[spellId].lightOfTheNaaruReduction() - baseReductionAmount; - const apotheosisReduction = - this.serendipityProccers[spellId].apotheosisReduction() - baseReductionAmount; - const additionalReduction = totalReduction - (lightOfTheNaaruReduction + apotheosisReduction); - - this.lightOfTheNaruReductionBySpell[spellId] = - this.lightOfTheNaruReductionBySpell[spellId] || 0; //Setting the value to zero if its the first time the spell is cast - this.apotheosisReductionBySpell[spellId] = this.apotheosisReductionBySpell[spellId] || 0; //Setting the value to zero if its the first time the spell is cast - - this.lightOfTheNaruReductionBySpell[spellId] += - lightOfTheNaaruReduction + additionalReduction; - this.apotheosisReductionBySpell[spellId] += apotheosisReduction + additionalReduction; - - return totalReduction + baseReductionAmount; - } - - if (this.lightOfTheNaruActive) { - const lightOfTheNaaruReduction = this.serendipityProccers[spellId].lightOfTheNaaruReduction(); - this.lightOfTheNaruReductionBySpell[spellId] = - this.lightOfTheNaruReductionBySpell[spellId] || 0; //Setting the value to zero if its the first time the spell is cast - this.lightOfTheNaruReductionBySpell[spellId] += - lightOfTheNaaruReduction - baseReductionAmount; - return lightOfTheNaaruReduction; - } else if (this.apotheosisActive) { - const apotheosisReduction = this.serendipityProccers[spellId].apotheosisReduction(); - this.apotheosisReductionBySpell[spellId] = this.apotheosisReductionBySpell[spellId] || 0; //Setting the value to zero if its the first time the spell is cast - this.apotheosisReductionBySpell[spellId] += apotheosisReduction - baseReductionAmount; - return apotheosisReduction; - } else { - return baseReductionAmount; - } - } - - onHeal(event: HealEvent) { - const spellId = event.ability.guid; - if (spellId === this.spellId) { - this.holyWordHealing += event.amount || 0; - this.holyWordOverhealing += event.overheal || 0; - - if (this.apotheosisActive) { - this.holyWordHealingDuringApotheosis += event.amount || 0; - this.holyWordOverhealingDuringApotheosis += event.overheal || 0; - } - } - } - - onApplyBuff(event: ApplyBuffEvent) { - this.apotheosisCasts += 1; - this.apotheosisActive = true; - } - - onRemoveBuff(event: RemoveBuffEvent) { - this.apotheosisActive = false; - } -} - -export default HolyWordBase; diff --git a/src/analysis/retail/priest/holy/modules/spells/holyword/HolyWordChastise.tsx b/src/analysis/retail/priest/holy/modules/spells/holyword/HolyWordChastise.tsx deleted file mode 100644 index 49eb43f35b2..00000000000 --- a/src/analysis/retail/priest/holy/modules/spells/holyword/HolyWordChastise.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import SPELLS from 'common/SPELLS'; -import TALENTS from 'common/TALENTS/priest'; -import { Options } from 'parser/core/Analyzer'; - -import HolyWordBase from './HolyWordBase'; - -const SMITE_SERENDIPITY_REDUCTION = 4000; - -class HolyWordSanctify extends HolyWordBase { - constructor(options: Options) { - super(options); - - this.spellId = TALENTS.HOLY_WORD_CHASTISE_TALENT.id; - this.manaCost = 1500; - this.serendipityProccers = { - [SPELLS.SMITE.id]: { - baseReduction: () => SMITE_SERENDIPITY_REDUCTION, - lightOfTheNaaruReduction: () => SMITE_SERENDIPITY_REDUCTION * this.lightOfTheNaruMultiplier, - apotheosisReduction: () => SMITE_SERENDIPITY_REDUCTION * this.apotheosisMultiplier, - lightOfTheNaaruAndApotheosisReduction: () => - SMITE_SERENDIPITY_REDUCTION * this.apotheosisMultiplier * this.lightOfTheNaruMultiplier, - }, - }; - - if (this.harmoniousApparatusActive) { - this.serendipityProccers[SPELLS.HOLY_FIRE.id] = { - baseReduction: () => this.apparatusReduction, - lightOfTheNaaruReduction: () => this.apparatusReduction * this.lightOfTheNaruMultiplier, - apotheosisReduction: () => this.apparatusReduction * this.apotheosisMultiplier, - lightOfTheNaaruAndApotheosisReduction: () => - this.apparatusReduction * this.lightOfTheNaruMultiplier * this.apotheosisMultiplier, - }; - } - } -} - -export default HolyWordSanctify; diff --git a/src/analysis/retail/priest/holy/modules/spells/holyword/HolyWordSalvation.tsx b/src/analysis/retail/priest/holy/modules/spells/holyword/HolyWordSalvation.tsx deleted file mode 100644 index 9831c770b77..00000000000 --- a/src/analysis/retail/priest/holy/modules/spells/holyword/HolyWordSalvation.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import TALENTS from 'common/TALENTS/priest'; -import { Options } from 'parser/core/Analyzer'; - -import HolyWordBase from './HolyWordBase'; - -const HOLY_WORD_SERENDIPITY_REDUCTION = 15000; - -class HolyWordSalvation extends HolyWordBase { - constructor(options: Options) { - super(options); - - this.spellId = TALENTS.HOLY_WORD_SALVATION_TALENT.id; - this.manaCost = 15000; - this.serendipityProccers = { - [TALENTS.HOLY_WORD_SERENITY_TALENT.id]: { - baseReduction: () => HOLY_WORD_SERENDIPITY_REDUCTION, - lightOfTheNaaruReduction: () => - HOLY_WORD_SERENDIPITY_REDUCTION * this.lightOfTheNaruMultiplier, - apotheosisReduction: () => HOLY_WORD_SERENDIPITY_REDUCTION, - lightOfTheNaaruAndApotheosisReduction: () => - HOLY_WORD_SERENDIPITY_REDUCTION * this.lightOfTheNaruMultiplier, - }, - [TALENTS.HOLY_WORD_SANCTIFY_TALENT.id]: { - baseReduction: () => HOLY_WORD_SERENDIPITY_REDUCTION, - lightOfTheNaaruReduction: () => - HOLY_WORD_SERENDIPITY_REDUCTION * this.lightOfTheNaruMultiplier, - apotheosisReduction: () => HOLY_WORD_SERENDIPITY_REDUCTION, - lightOfTheNaaruAndApotheosisReduction: () => - HOLY_WORD_SERENDIPITY_REDUCTION * this.lightOfTheNaruMultiplier, - }, - }; - } -} - -export default HolyWordSalvation; diff --git a/src/analysis/retail/priest/holy/modules/spells/holyword/HolyWordSanctify.tsx b/src/analysis/retail/priest/holy/modules/spells/holyword/HolyWordSanctify.tsx deleted file mode 100644 index 9411b6e6f8e..00000000000 --- a/src/analysis/retail/priest/holy/modules/spells/holyword/HolyWordSanctify.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import TALENTS from 'common/TALENTS/priest'; -import { Options } from 'parser/core/Analyzer'; - -import HolyWordBase from './HolyWordBase'; - -const PRAYER_OF_HEALING_SERENDIPITY_REDUCTION = 6000; -const RENEW_SERENDIPITY_REDUCTION = 2000; - -class HolyWordSanctify extends HolyWordBase { - constructor(options: Options) { - super(options); - - this.spellId = TALENTS.HOLY_WORD_SANCTIFY_TALENT.id; - this.manaCost = 8750; - this.serendipityProccers = { - [TALENTS.PRAYER_OF_HEALING_TALENT.id]: { - baseReduction: () => PRAYER_OF_HEALING_SERENDIPITY_REDUCTION, - lightOfTheNaaruReduction: () => - PRAYER_OF_HEALING_SERENDIPITY_REDUCTION * this.lightOfTheNaruMultiplier, - apotheosisReduction: () => - PRAYER_OF_HEALING_SERENDIPITY_REDUCTION * this.apotheosisMultiplier, - lightOfTheNaaruAndApotheosisReduction: () => - PRAYER_OF_HEALING_SERENDIPITY_REDUCTION * - this.lightOfTheNaruMultiplier * - this.apotheosisMultiplier, - }, - [TALENTS.RENEW_TALENT.id]: { - baseReduction: () => RENEW_SERENDIPITY_REDUCTION, - lightOfTheNaaruReduction: () => RENEW_SERENDIPITY_REDUCTION * this.lightOfTheNaruMultiplier, - apotheosisReduction: () => RENEW_SERENDIPITY_REDUCTION * this.apotheosisMultiplier, - lightOfTheNaaruAndApotheosisReduction: () => - RENEW_SERENDIPITY_REDUCTION * this.lightOfTheNaruMultiplier * this.apotheosisMultiplier, - }, - }; - if (this.harmoniousApparatusActive) { - this.serendipityProccers[TALENTS.CIRCLE_OF_HEALING_TALENT.id] = { - baseReduction: () => this.apparatusReduction, - lightOfTheNaaruReduction: () => this.apparatusReduction * this.lightOfTheNaruMultiplier, - apotheosisReduction: () => this.apparatusReduction * this.apotheosisMultiplier, - lightOfTheNaaruAndApotheosisReduction: () => - this.apparatusReduction * this.lightOfTheNaruMultiplier * this.apotheosisMultiplier, - }; - } - } -} - -export default HolyWordSanctify; diff --git a/src/analysis/retail/priest/holy/modules/spells/holyword/HolyWordSerenity.tsx b/src/analysis/retail/priest/holy/modules/spells/holyword/HolyWordSerenity.tsx deleted file mode 100644 index ad4b87613f0..00000000000 --- a/src/analysis/retail/priest/holy/modules/spells/holyword/HolyWordSerenity.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import TALENTS from 'common/TALENTS/priest'; -import SPELLS from 'common/SPELLS'; -import { Options } from 'parser/core/Analyzer'; - -import HolyWordBase from './HolyWordBase'; - -const GREATER_HEAL_SERENDIPITY_REDUCTION = 6000; -const FLASH_HEAL_SERENDIPITY_REDUCTION = 6000; - -class HolyWordSerenity extends HolyWordBase { - constructor(options: Options) { - super(options); - - this.spellId = TALENTS.HOLY_WORD_SERENITY_TALENT.id; - this.manaCost = 6250; - this.serendipityProccers = { - [SPELLS.GREATER_HEAL.id]: { - baseReduction: () => GREATER_HEAL_SERENDIPITY_REDUCTION, - lightOfTheNaaruReduction: () => - GREATER_HEAL_SERENDIPITY_REDUCTION * this.lightOfTheNaruMultiplier, - apotheosisReduction: () => GREATER_HEAL_SERENDIPITY_REDUCTION * this.apotheosisMultiplier, - lightOfTheNaaruAndApotheosisReduction: () => - GREATER_HEAL_SERENDIPITY_REDUCTION * - this.lightOfTheNaruMultiplier * - this.apotheosisMultiplier, - }, - [SPELLS.FLASH_HEAL.id]: { - baseReduction: () => FLASH_HEAL_SERENDIPITY_REDUCTION, - lightOfTheNaaruReduction: () => - FLASH_HEAL_SERENDIPITY_REDUCTION * this.lightOfTheNaruMultiplier, - apotheosisReduction: () => FLASH_HEAL_SERENDIPITY_REDUCTION * this.apotheosisMultiplier, - lightOfTheNaaruAndApotheosisReduction: () => - GREATER_HEAL_SERENDIPITY_REDUCTION * - this.lightOfTheNaruMultiplier * - this.apotheosisMultiplier, - }, - }; - - if (this.harmoniousApparatusActive) { - this.serendipityProccers[TALENTS.PRAYER_OF_MENDING_TALENT.id] = { - baseReduction: () => this.apparatusReduction, - lightOfTheNaaruReduction: () => this.apparatusReduction * this.lightOfTheNaruMultiplier, - apotheosisReduction: () => this.apparatusReduction * this.apotheosisMultiplier, - lightOfTheNaaruAndApotheosisReduction: () => - this.apparatusReduction * this.lightOfTheNaruMultiplier * this.apotheosisMultiplier, - }; - } - } -} - -export default HolyWordSerenity; diff --git a/src/analysis/retail/priest/holy/modules/talents/Archon/ArchonValues.tsx b/src/analysis/retail/priest/holy/modules/talents/Archon/ArchonValues.tsx deleted file mode 100644 index 583dfe8aded..00000000000 --- a/src/analysis/retail/priest/holy/modules/talents/Archon/ArchonValues.tsx +++ /dev/null @@ -1,10 +0,0 @@ -// Values used for Archon - -export const EMPOWERED_SURGES_AMP = 0.3; -export const ENERGY_COMPRESSION_AMP = 0.3; -export const APOTH_MULTIPIER = 4; -export const ENERGY_CYCLE_CDR = 4; -export const LIGHT_OF_THE_NAARU_REDUCTION_PER_RANK = 0.1; -export const TWW_TIER1_2PC_CDR = 0.1; -export const PERFECTED_FORM_AMP = 0.1; -export const RESONANT_ENERGY_AMP_PER_STACK = 0.02; diff --git a/src/analysis/retail/priest/holy/modules/talents/Archon/EmpoweredSurgesHoly.tsx b/src/analysis/retail/priest/holy/modules/talents/Archon/EmpoweredSurgesHoly.tsx index e92c1ee92ac..ce956fe0f7b 100644 --- a/src/analysis/retail/priest/holy/modules/talents/Archon/EmpoweredSurgesHoly.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/Archon/EmpoweredSurgesHoly.tsx @@ -12,7 +12,7 @@ import { TALENTS_PRIEST } from 'common/TALENTS'; import Events, { RemoveBuffEvent, RemoveBuffStackEvent } from 'parser/core/Events'; import SPELLS from 'common/SPELLS'; import { calculateEffectiveHealing } from 'parser/core/EventCalculateLib'; -import { EMPOWERED_SURGES_AMP } from './ArchonValues'; +import { EMPOWERED_SURGES_AMP } from '../../../constants'; class EmpoweredSurgesHoly extends Analyzer { static dependencies = { diff --git a/src/analysis/retail/priest/holy/modules/talents/Archon/EnergyCompressionHoly.tsx b/src/analysis/retail/priest/holy/modules/talents/Archon/EnergyCompressionHoly.tsx index ec52000af31..a618ba612fc 100644 --- a/src/analysis/retail/priest/holy/modules/talents/Archon/EnergyCompressionHoly.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/Archon/EnergyCompressionHoly.tsx @@ -13,7 +13,7 @@ import { calculateEffectiveDamage, calculateEffectiveHealing } from 'parser/core import SPELLS from 'common/SPELLS'; import SpellLink from 'interface/SpellLink'; import PRIEST_TALENTS from 'common/TALENTS/priest'; -import { ENERGY_COMPRESSION_AMP } from './ArchonValues'; +import { ENERGY_COMPRESSION_AMP } from '../../../constants'; class EnergyCompressionHoly extends Analyzer { static dependencies = { diff --git a/src/analysis/retail/priest/holy/modules/talents/Archon/EnergyCycleHoly.tsx b/src/analysis/retail/priest/holy/modules/talents/Archon/EnergyCycleHoly.tsx deleted file mode 100644 index 02549a0bec6..00000000000 --- a/src/analysis/retail/priest/holy/modules/talents/Archon/EnergyCycleHoly.tsx +++ /dev/null @@ -1,133 +0,0 @@ -import Analyzer, { SELECTED_PLAYER } from 'parser/core/Analyzer'; -import { Options } from 'parser/core/Module'; -import Combatants from 'parser/shared/modules/Combatants'; -import Statistic from 'parser/ui/Statistic'; -import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; -import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; -import { formatNumber } from 'common/format'; -import BoringSpellValueText from 'parser/ui/BoringSpellValueText'; - -import { TALENTS_PRIEST } from 'common/TALENTS'; -import SpellUsable from 'parser/shared/modules/SpellUsable'; -import { TIERS } from 'game/TIERS'; -import Events, { RemoveBuffEvent, RemoveBuffStackEvent } from 'parser/core/Events'; -import { buffedBySurgeOfLight, getHealFromSurge } from '../../../normalizers/CastLinkNormalizer'; -import SPELLS from 'common/SPELLS'; -import SpellLink from 'interface/SpellLink'; -import { - APOTH_MULTIPIER, - ENERGY_CYCLE_CDR, - LIGHT_OF_THE_NAARU_REDUCTION_PER_RANK, - TWW_TIER1_2PC_CDR, -} from './ArchonValues'; - -class EnergyCycleHoly extends Analyzer { - static dependencies = { - combatants: Combatants, - spellUsable: SpellUsable, - }; - - protected combatants!: Combatants; - protected spellUsable!: SpellUsable; - - //Energy Cycle Ideal is no lost CDR from overcapping CD - energyCycleCDRIdeal = 0; - energyCycleCDRActual = 0; - - private baseHolyWordCDR = 1; - private modHolyWordCDR = 1; - private apothBuffActive = false; - - constructor(options: Options) { - super(options); - - this.active = this.selectedCombatant.hasTalent(TALENTS_PRIEST.ENERGY_CYCLE_TALENT); - - if (this.selectedCombatant.hasTalent(TALENTS_PRIEST.LIGHT_OF_THE_NAARU_TALENT)) { - this.baseHolyWordCDR = - this.selectedCombatant.getTalentRank(TALENTS_PRIEST.LIGHT_OF_THE_NAARU_TALENT) * - LIGHT_OF_THE_NAARU_REDUCTION_PER_RANK + - 1; - } - if (this.selectedCombatant.has2PieceByTier(TIERS.TWW1)) { - this.baseHolyWordCDR *= TWW_TIER1_2PC_CDR + 1; - } - - //these are used to check if CDR needs to be scaled for Energy Cycle - this.addEventListener( - Events.applybuff.by(SELECTED_PLAYER).spell(TALENTS_PRIEST.APOTHEOSIS_TALENT), - this.applyApoth, - ); - - this.addEventListener( - Events.removebuff.by(SELECTED_PLAYER).spell(TALENTS_PRIEST.APOTHEOSIS_TALENT), - this.removeApoth, - ); - - //tracks spending of Surge of Light - this.addEventListener( - Events.removebuff.by(SELECTED_PLAYER).spell(SPELLS.SURGE_OF_LIGHT_BUFF), - this.onSurgeOfLightHeal, - ); - - this.addEventListener( - Events.removebuffstack.by(SELECTED_PLAYER).spell(SPELLS.SURGE_OF_LIGHT_BUFF), - this.onSurgeOfLightHeal, - ); - } - - onSurgeOfLightHeal(event: RemoveBuffEvent | RemoveBuffStackEvent) { - const healEvent = getHealFromSurge(event); - - if (healEvent) { - if (buffedBySurgeOfLight(event)) { - this.modHolyWordCDR = this.baseHolyWordCDR; - if (this.apothBuffActive) { - this.modHolyWordCDR *= APOTH_MULTIPIER; - } - - this.energyCycleCDRIdeal += ENERGY_CYCLE_CDR * this.modHolyWordCDR; - - this.energyCycleCDRActual += this.spellUsable.reduceCooldown( - SPELLS.HOLY_WORD_SANCTIFY.id, - ENERGY_CYCLE_CDR * this.modHolyWordCDR, - ); - } - } - } - - applyApoth() { - this.apothBuffActive = true; - } - removeApoth() { - this.apothBuffActive = false; - } - - get passWastedEnergyCycleCDR(): number { - return this.energyCycleCDRIdeal - this.energyCycleCDRActual; - } - - statistic() { - return ( - - -
- {formatNumber(this.energyCycleCDRActual)}s - - {' '} - reduced from - {' '} -
- {this.passWastedEnergyCycleCDR}s wasted
-
-
-
- ); - } -} - -export default EnergyCycleHoly; diff --git a/src/analysis/retail/priest/holy/modules/talents/Archon/PerfectedFormHoly.tsx b/src/analysis/retail/priest/holy/modules/talents/Archon/PerfectedFormHoly.tsx index 3bbbf93036b..c94e467e469 100644 --- a/src/analysis/retail/priest/holy/modules/talents/Archon/PerfectedFormHoly.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/Archon/PerfectedFormHoly.tsx @@ -15,7 +15,7 @@ import Events, { HealEvent } from 'parser/core/Events'; import { HOLY_ABILITIES_AFFECTED_BY_HEALING_INCREASES } from '../../../constants'; import { calculateEffectiveHealing } from 'parser/core/EventCalculateLib'; import SPELLS from 'common/SPELLS'; -import { PERFECTED_FORM_AMP } from './ArchonValues'; +import { PERFECTED_FORM_AMP } from '../../../constants'; class PerfectedFormHoly extends Analyzer { static dependencies = { diff --git a/src/analysis/retail/priest/holy/modules/talents/Archon/ResonantEnergyHoly.tsx b/src/analysis/retail/priest/holy/modules/talents/Archon/ResonantEnergyHoly.tsx index 79b9b5f0a10..0fbbb30615e 100644 --- a/src/analysis/retail/priest/holy/modules/talents/Archon/ResonantEnergyHoly.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/Archon/ResonantEnergyHoly.tsx @@ -12,7 +12,7 @@ import SPELLS from 'common/SPELLS'; import Events, { HealEvent } from 'parser/core/Events'; import { calculateEffectiveHealing } from 'parser/core/EventCalculateLib'; import { HOLY_ABILITIES_AFFECTED_BY_HEALING_INCREASES } from '../../../constants'; -import { RESONANT_ENERGY_AMP_PER_STACK } from './ArchonValues'; +import { RESONANT_ENERGY_AMP_PER_STACK } from '../../../constants'; class ResonantEnergyHoly extends Analyzer { static dependencies = { diff --git a/src/analysis/retail/priest/holy/modules/talents/Archon/index.tsx b/src/analysis/retail/priest/holy/modules/talents/Archon/index.tsx index 6deec90fbe0..1704efac98c 100644 --- a/src/analysis/retail/priest/holy/modules/talents/Archon/index.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/Archon/index.tsx @@ -2,7 +2,6 @@ import PerfectedFormHoly from './PerfectedFormHoly'; import ResonantEnergyHoly from './ResonantEnergyHoly'; import ManifestedPowerHoly from './ManifestedPowerHoly'; import EmpoweredSurgesHoly from './EmpoweredSurgesHoly'; -import EnergyCycleHoly from './EnergyCycleHoly'; import EnergyCompressionHoly from './EnergyCompressionHoly'; import PowerSurgeAndDivineHaloHoly from './PowerSurgeAndDivineHaloHoly'; @@ -11,7 +10,6 @@ export { ResonantEnergyHoly, ManifestedPowerHoly, EmpoweredSurgesHoly, - EnergyCycleHoly, EnergyCompressionHoly, PowerSurgeAndDivineHaloHoly, }; diff --git a/src/analysis/retail/priest/holy/modules/talents/BottomRow/AnsweredPrayers.tsx b/src/analysis/retail/priest/holy/modules/talents/BottomRow/AnsweredPrayers.tsx index a5fa21cca51..c86f4c42800 100644 --- a/src/analysis/retail/priest/holy/modules/talents/BottomRow/AnsweredPrayers.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/BottomRow/AnsweredPrayers.tsx @@ -6,8 +6,7 @@ import Statistic from 'parser/ui/Statistic'; import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; import BoringSpellValueText from 'parser/ui/BoringSpellValueText'; import { SpellLink } from 'interface'; - -const HEALS_PER_TRIGGER_BY_RANK = [0, 100, 50]; +import { AP_HEALS_PER_TRIGGER_BY_RANK } from '../../../constants'; //Example log: /report/cCKp6qfAM8FZgxHL/2-Heroic+Broodkeeper+Diurna+-+Wipe+2+(1:34)/Mayceia/standard/statistics class AnsweredPrayers extends Analyzer { @@ -18,7 +17,7 @@ class AnsweredPrayers extends Analyzer { super(options); this.active = this.selectedCombatant.hasTalent(TALENTS.ANSWERED_PRAYERS_TALENT); this.healsPerApotheosis = - HEALS_PER_TRIGGER_BY_RANK[ + AP_HEALS_PER_TRIGGER_BY_RANK[ this.selectedCombatant.getTalentRank(TALENTS.ANSWERED_PRAYERS_TALENT) ]; this.addEventListener( diff --git a/src/analysis/retail/priest/holy/modules/talents/BottomRow/Apotheosis.tsx b/src/analysis/retail/priest/holy/modules/talents/BottomRow/Apotheosis.tsx index db0b39c58bb..3c7ddf47f19 100644 --- a/src/analysis/retail/priest/holy/modules/talents/BottomRow/Apotheosis.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/BottomRow/Apotheosis.tsx @@ -1,49 +1,50 @@ -import HolyWordChastise from 'analysis/retail/priest/holy/modules/spells/holyword/HolyWordChastise'; -import HolyWordSanctify from 'analysis/retail/priest/holy/modules/spells/holyword/HolyWordSanctify'; -import HolyWordSerenity from 'analysis/retail/priest/holy/modules/spells/holyword/HolyWordSerenity'; -import { formatNumber } from 'common/format'; import TALENTS from 'common/TALENTS/priest'; import Analyzer, { Options, SELECTED_PLAYER } from 'parser/core/Analyzer'; -import Events, { ApplyBuffEvent, RemoveBuffEvent } from 'parser/core/Events'; +import Events, { CastEvent } from 'parser/core/Events'; import BoringSpellValueText from 'parser/ui/BoringSpellValueText'; import ItemManaGained from 'parser/ui/ItemManaGained'; import Statistic from 'parser/ui/Statistic'; import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; +import { HOLY_WORD_LIST } from '../../../constants'; +import SpellManaCost from 'parser/shared/modules/SpellManaCost'; +import PRIEST_TALENTS from 'common/TALENTS/priest'; +import SpellLink from 'interface/SpellLink'; // Example Log: /report/NfFqTvxrQ8GLWDpY/12-Normal+Fetid+Devourer+-+Kill+(1:25)/6-Yrret class Apotheosis extends Analyzer { static dependencies = { - sanctify: HolyWordSanctify, - serenity: HolyWordSerenity, - chastise: HolyWordChastise, + spellManaCost: SpellManaCost, }; + protected spellManaCost!: SpellManaCost; apotheosisCasts = 0; apotheosisActive = false; - protected sanctify!: HolyWordSanctify; - protected serenity!: HolyWordSerenity; - protected chastise!: HolyWordChastise; + manaSavedFromSerenity = 0; + manaSavedFromSanctify = 0; + manaSavedFromChastise = 0; constructor(options: Options) { super(options); - this.active = this.selectedCombatant.hasTalent(TALENTS.APOTHEOSIS_TALENT); - this.addEventListener( - Events.applybuff.by(SELECTED_PLAYER).spell(TALENTS.APOTHEOSIS_TALENT), - this.onApplyBuff, - ); - this.addEventListener( - Events.removebuff.by(SELECTED_PLAYER).spell(TALENTS.APOTHEOSIS_TALENT), - this.onRemoveBuff, - ); + this.active = + this.selectedCombatant.hasTalent(TALENTS.APOTHEOSIS_TALENT) || + this.selectedCombatant.hasTalent(TALENTS.ANSWERED_PRAYERS_TALENT); + this.addEventListener(Events.cast.by(SELECTED_PLAYER).spell(HOLY_WORD_LIST), this.handleCast); } - onApplyBuff(event: ApplyBuffEvent) { - this.apotheosisCasts += 1; - this.apotheosisActive = true; + handleCast(event: CastEvent) { + if (this.selectedCombatant.hasBuff(TALENTS.APOTHEOSIS_TALENT)) { + if (event.ability.guid === TALENTS.HOLY_WORD_SERENITY_TALENT.id) { + this.manaSavedFromSerenity += this.spellManaCost.getRawResourceCost(event); + } else if (event.ability.guid === TALENTS.HOLY_WORD_SANCTIFY_TALENT.id) { + this.manaSavedFromSanctify += this.spellManaCost.getRawResourceCost(event); + } else if (event.ability.guid === TALENTS.HOLY_WORD_CHASTISE_TALENT.id) { + this.manaSavedFromChastise += this.spellManaCost.getRawResourceCost(event); + } + } } - onRemoveBuff(event: RemoveBuffEvent) { - this.apotheosisActive = false; + get totalManaSaved() { + return this.manaSavedFromChastise + this.manaSavedFromSanctify + this.manaSavedFromSerenity; } statistic() { @@ -51,12 +52,16 @@ class Apotheosis extends Analyzer { - Serenity: {this.sanctify.apotheosisCooldownReduction / 1000}s CDR |{' '} - {this.sanctify.apotheosisManaReduction} Mana saved
- Sanctify: {this.serenity.apotheosisCooldownReduction / 1000}s CDR |{' '} - {this.serenity.apotheosisManaReduction} Mana saved
- Chastise: {this.chastise.apotheosisCooldownReduction / 1000}s CDR |{' '} - {this.chastise.apotheosisManaReduction} Mana saved + For Holy Word CDR see the Holy Word module at the top. +
+
+ This includes .
+ :{' '} + {this.manaSavedFromSerenity} Mana saved
+ :{' '} + {this.manaSavedFromSanctify} Mana saved
+ :{' '} + {this.manaSavedFromChastise} Mana saved } size="flexible" @@ -65,21 +70,7 @@ class Apotheosis extends Analyzer { > <> - -
- {formatNumber( - (this.sanctify.apotheosisCooldownReduction + - this.serenity.apotheosisCooldownReduction + - this.chastise.apotheosisCooldownReduction) / - 1000, - )} - s Cooldown Reduction +
diff --git a/src/analysis/retail/priest/holy/modules/talents/BottomRow/DesperateTimes.tsx b/src/analysis/retail/priest/holy/modules/talents/BottomRow/DesperateTimes.tsx index 4cb6d3c7999..89289f9c491 100644 --- a/src/analysis/retail/priest/holy/modules/talents/BottomRow/DesperateTimes.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/BottomRow/DesperateTimes.tsx @@ -8,8 +8,8 @@ import { formatNumber, formatPercentage } from 'common/format'; import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; import ItemHealingDone from 'parser/ui/ItemHealingDone'; import { calculateEffectiveHealing, calculateOverhealing } from 'parser/core/EventCalculateLib'; +import { DESP_TIMES_HEALING_MULTIPLIER_PER_RANK } from '../../../constants'; -const HEALING_MULTIPLIER_PER_RANK = 0.1; //Example log: /report/kVQd4LrBb9RW2h6K/9-Heroic+The+Primal+Council+-+Wipe+5+(5:04)/Delipriest/standard/statistics class DesperateTimes extends Analyzer { healingDoneFromTalent = 0; @@ -22,7 +22,7 @@ class DesperateTimes extends Analyzer { this.active = false; } this.healingMultiplier = - HEALING_MULTIPLIER_PER_RANK * + DESP_TIMES_HEALING_MULTIPLIER_PER_RANK * this.selectedCombatant.getTalentRank(TALENTS.DESPERATE_TIMES_TALENT); this.addEventListener(Events.heal.by(SELECTED_PLAYER), this.onHeal); } diff --git a/src/analysis/retail/priest/holy/modules/talents/BottomRow/DivineWord.tsx b/src/analysis/retail/priest/holy/modules/talents/BottomRow/DivineWord.tsx index 105eac4da24..de88920b5c5 100644 --- a/src/analysis/retail/priest/holy/modules/talents/BottomRow/DivineWord.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/BottomRow/DivineWord.tsx @@ -15,17 +15,18 @@ import StatTracker from 'parser/shared/modules/StatTracker'; import ItemHealingDone from 'parser/ui/ItemHealingDone'; import ItemDamageDone from 'parser/ui/ItemDamageDone'; import { formatPercentage } from 'common/format'; -import { ABILITIES_THAT_WORK_WITH_DIVINE_FAVOR_CHASTISE } from 'analysis/retail/priest/holy/constants'; +import { + ABILITIES_THAT_WORK_WITH_DIVINE_FAVOR_CHASTISE, + DW_ACTIVATOR_SPELL_INCREASE, + CHASTISE_REFUNDED_COOLDOWN, + DAMAGE_INCREASE_FROM_CHASTISE, + HEALING_INCREASE_FROM_SERENITY, + MANA_REDUCTION_FROM_SERENITY, +} from 'analysis/retail/priest/holy/constants'; import { SpellIcon } from 'interface'; import RESOURCE_TYPES from 'game/RESOURCE_TYPES'; import ItemManaGained from 'parser/ui/ItemManaGained'; -const DAMAGE_INCREASE_FROM_CHASTISE = 0.2; -const CHASTISE_REFUNDED_COOLDOWN = 15; -const HEALING_INCREASE_FROM_SERENITY = 0.3; -const MANA_REDUCTION_FROM_SERENITY = 0.2; -const ACTIVATOR_SPELL_INCREASE = 0.3; - // Example Logs: /report/VXr2kgALF3Rj6Q4M/11-Mythic+Anduin+Wrynn+-+Kill+(5:12)/Litena/standard/statistics // /report/xq2FvfVCJh6YLjzZ/2-Mythic+Vigilant+Guardian+-+Kill+(4:40)/Ashelya/standard/statistics class DivineWord extends Analyzer { @@ -134,14 +135,14 @@ class DivineWord extends Analyzer { spellId === TALENTS.HOLY_WORD_SERENITY_TALENT.id && this.selectedCombatant.hasBuff(TALENTS.DIVINE_WORD_TALENT.id) ) { - this.serenityHealing += calculateEffectiveHealing(event, ACTIVATOR_SPELL_INCREASE); - this.serenityOverhealing += calculateOverhealing(event, ACTIVATOR_SPELL_INCREASE); + this.serenityHealing += calculateEffectiveHealing(event, DW_ACTIVATOR_SPELL_INCREASE); + this.serenityOverhealing += calculateOverhealing(event, DW_ACTIVATOR_SPELL_INCREASE); } else if ( spellId === TALENTS.HOLY_WORD_SANCTIFY_TALENT.id && this.selectedCombatant.hasBuff(TALENTS.DIVINE_WORD_TALENT.id) ) { - this.sanctifyHealing += calculateEffectiveHealing(event, ACTIVATOR_SPELL_INCREASE); - this.sanctifyOverhealing += calculateOverhealing(event, ACTIVATOR_SPELL_INCREASE); + this.sanctifyHealing += calculateEffectiveHealing(event, DW_ACTIVATOR_SPELL_INCREASE); + this.sanctifyOverhealing += calculateOverhealing(event, DW_ACTIVATOR_SPELL_INCREASE); } } @@ -168,7 +169,7 @@ class DivineWord extends Analyzer { spellId === TALENTS.HOLY_WORD_CHASTISE_TALENT.id && this.selectedCombatant.hasBuff(TALENTS.DIVINE_WORD_TALENT.id) ) { - this.chastiseDamage += calculateEffectiveDamage(event, ACTIVATOR_SPELL_INCREASE); + this.chastiseDamage += calculateEffectiveDamage(event, DW_ACTIVATOR_SPELL_INCREASE); } else if ( ABILITIES_THAT_WORK_WITH_DIVINE_FAVOR_CHASTISE.includes(event.ability.guid) && this.selectedCombatant.hasBuff(SPELLS.DIVINE_WORD_CHASTISE_TALENT_BUFF.id) diff --git a/src/analysis/retail/priest/holy/modules/talents/BottomRow/HarmoniousApparatus.tsx b/src/analysis/retail/priest/holy/modules/talents/BottomRow/HarmoniousApparatus.tsx deleted file mode 100644 index cf6c18ace4d..00000000000 --- a/src/analysis/retail/priest/holy/modules/talents/BottomRow/HarmoniousApparatus.tsx +++ /dev/null @@ -1,104 +0,0 @@ -import HolyWordChastise from 'analysis/retail/priest/holy/modules/spells/holyword/HolyWordChastise'; -import HolyWordSanctify from 'analysis/retail/priest/holy/modules/spells/holyword/HolyWordSanctify'; -import HolyWordSerenity from 'analysis/retail/priest/holy/modules/spells/holyword/HolyWordSerenity'; -import SPELLS from 'common/SPELLS'; -import Analyzer, { Options } from 'parser/core/Analyzer'; -import BoringSpellValueText from 'parser/ui/BoringSpellValueText'; -import Statistic from 'parser/ui/Statistic'; -import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; -import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; -import TALENTS from 'common/TALENTS/priest'; - -class HarmoniousApparatus extends Analyzer { - static dependencies = { - sanctify: HolyWordSanctify, - serenity: HolyWordSerenity, - chastise: HolyWordChastise, - }; - protected sanctify!: HolyWordSanctify; - protected serenity!: HolyWordSerenity; - protected chastise!: HolyWordChastise; - - constructor(options: Options) { - super(options); - this.active = this.selectedCombatant.hasTalent(TALENTS.VOICE_OF_HARMONY_TALENT); - } - - get reductionForAllSpells() { - let totalReductionBySpell: { [spellID: string]: { [otherSpellID: string]: number } } = {}; - - totalReductionBySpell = this.sumCooldown( - totalReductionBySpell, - this.sanctify.totalHolyWordReductionPerSpellPerTalent, - ); - totalReductionBySpell = this.sumCooldown( - totalReductionBySpell, - this.serenity.totalHolyWordReductionPerSpellPerTalent, - ); - totalReductionBySpell = this.sumCooldown( - totalReductionBySpell, - this.chastise.totalHolyWordReductionPerSpellPerTalent, - ); - - return totalReductionBySpell; - } - - sumCooldown( - currentList: { [spellID: string]: { [otherSpellID: string]: number } }, - newList: { [spellID: string]: { [otherSpellID: string]: number } }, - ) { - for (const [key, value] of Object.entries(newList)) { - if (currentList[key] == null) { - currentList[key] = value; - } else { - for (const [innerKey, innerValue] of Object.entries(value)) { - currentList[key][innerKey] = currentList[key][innerKey] || 0; - currentList[key][innerKey] += innerValue; - } - } - } - return currentList; - } - - reductionForSpell(spellId: number) { - const reduction = this.reductionForAllSpells[spellId]; - if (reduction && reduction.base) { - return reduction.base; - } - return 0; - } - - statistic() { - const totalHealingSpellReduction = - this.reductionForSpell(TALENTS.CIRCLE_OF_HEALING_TALENT.id) + - this.reductionForSpell(TALENTS.PRAYER_OF_MENDING_TALENT.id); - - return ( - - Serenity:{' '} - {Math.ceil(this.reductionForSpell(TALENTS.CIRCLE_OF_HEALING_TALENT.id) / 1000)} - s CDR -
- Sanctify:{' '} - {Math.ceil(this.reductionForSpell(TALENTS.PRAYER_OF_MENDING_TALENT.id) / 1000)}s CDR -
- Chastise : {Math.ceil(this.reductionForSpell(SPELLS.HOLY_FIRE.id) / 1000)}s CDR -
- - } - > - - {Math.ceil(totalHealingSpellReduction / 1000)}s{' '} - Healing Spell Cooldown Reduction - -
- ); - } -} - -export default HarmoniousApparatus; diff --git a/src/analysis/retail/priest/holy/modules/talents/BottomRow/LightOfTheNaaru.tsx b/src/analysis/retail/priest/holy/modules/talents/BottomRow/LightOfTheNaaru.tsx deleted file mode 100644 index d393bd8ed87..00000000000 --- a/src/analysis/retail/priest/holy/modules/talents/BottomRow/LightOfTheNaaru.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import HolyWordChastise from 'analysis/retail/priest/holy/modules/spells/holyword/HolyWordChastise'; -import HolyWordSanctify from 'analysis/retail/priest/holy/modules/spells/holyword/HolyWordSanctify'; -import HolyWordSerenity from 'analysis/retail/priest/holy/modules/spells/holyword/HolyWordSerenity'; -import TALENTS from 'common/TALENTS/priest'; -import Analyzer, { Options } from 'parser/core/Analyzer'; -import BoringSpellValueText from 'parser/ui/BoringSpellValueText'; -import Statistic from 'parser/ui/Statistic'; -import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; -import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; - -// Example Log: /report/Gvxt7CgLya2W1TYj/5-Normal+Zek'voz+-+Kill+(3:57)/13-弥砂丶 -class LightOfTheNaaru extends Analyzer { - static dependencies = { - sanctify: HolyWordSanctify, - serenity: HolyWordSerenity, - chastise: HolyWordChastise, - }; - protected sanctify!: HolyWordSanctify; - protected serenity!: HolyWordSerenity; - protected chastise!: HolyWordChastise; - - constructor(options: Options) { - super(options); - this.active = this.selectedCombatant.hasTalent(TALENTS.LIGHT_OF_THE_NAARU_TALENT); - } - - statistic() { - return ( - - Serenity: {Math.ceil(this.serenity.lightOfTheNaaruCooldownReduction / 1000)}s CDR -
- Sanctify: {Math.ceil(this.sanctify.lightOfTheNaaruCooldownReduction / 1000)}s CDR -
- Chastise: {Math.ceil(this.chastise.lightOfTheNaaruCooldownReduction / 1000)}s CDR - - } - size="flexible" - category={STATISTIC_CATEGORY.TALENTS} - position={STATISTIC_ORDER.OPTIONAL(7)} - > - - {Math.ceil( - (this.sanctify.lightOfTheNaaruCooldownReduction + - this.serenity.lightOfTheNaaruCooldownReduction) / - 1000, - )} - s Healing Spell Cooldown Reduction - -
- ); - } -} - -export default LightOfTheNaaru; diff --git a/src/analysis/retail/priest/holy/modules/talents/BottomRow/Lightweaver.tsx b/src/analysis/retail/priest/holy/modules/talents/BottomRow/Lightweaver.tsx index d9164703f4d..a967f7fc4f8 100644 --- a/src/analysis/retail/priest/holy/modules/talents/BottomRow/Lightweaver.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/BottomRow/Lightweaver.tsx @@ -13,10 +13,7 @@ import { isCastBuffedByLightweaver, getHeal } from '../../../normalizers/CastLin import { explanationAndDataSubsection } from 'interface/guide/components/ExplanationRow'; import { GUIDE_CORE_EXPLANATION_PERCENT } from '../../../Guide'; import GradiatedPerformanceBar from 'interface/guide/components/GradiatedPerformanceBar'; - -const HEALING_BONUS = 0.25; -const OVERHEAL_THRESHOLD = 0.75; -const CAST_TIME_DECREASE = 1 - 0.3; +import { LW_CAST_TIME_DECREASE, LW_HEALING_BONUS, LW_OVERHEAL_THRESHOLD } from '../../../constants'; /** * Flash Heal reduces the cast time of your next Heal @@ -60,7 +57,7 @@ class Lightweaver extends Analyzer { if (rawHealing === 0) { return false; } - return (event.overheal || 0) / rawHealing >= OVERHEAL_THRESHOLD; + return (event.overheal || 0) / rawHealing >= LW_OVERHEAL_THRESHOLD; } onHealCast(event: CastEvent) { @@ -71,8 +68,8 @@ class Lightweaver extends Analyzer { if (isCastBuffedByLightweaver(event)) { // calculate effective healing from bonus - this.healingDoneFromTalent += calculateEffectiveHealing(healEvent, HEALING_BONUS); - this.overhealingDoneFromTalent = calculateOverhealing(healEvent, HEALING_BONUS); + this.healingDoneFromTalent += calculateEffectiveHealing(healEvent, LW_HEALING_BONUS); + this.overhealingDoneFromTalent = calculateOverhealing(healEvent, LW_HEALING_BONUS); } else { this.unbuffedHealCasts += 1; // return early so we are not counting unbuffed heals for high overheal count @@ -211,7 +208,7 @@ class Lightweaver extends Analyzer { from just the heal amp
- {' '} + {' '} from both the heal amp and doing that healing in less time
diff --git a/src/analysis/retail/priest/holy/modules/talents/BottomRow/Pontifex.tsx b/src/analysis/retail/priest/holy/modules/talents/BottomRow/Pontifex.tsx index 83b5e488a68..8585d25e18e 100644 --- a/src/analysis/retail/priest/holy/modules/talents/BottomRow/Pontifex.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/BottomRow/Pontifex.tsx @@ -8,8 +8,8 @@ import { calculateEffectiveHealing, calculateOverhealing } from 'parser/core/Eve import ItemHealingDone from 'parser/ui/ItemHealingDone'; import { formatNumber, formatPercentage } from 'common/format'; import TalentSpellText from 'parser/ui/TalentSpellText'; +import { PONTIFEX_HEALING_INCREASE } from '../../../constants'; -const PONTIFEX_HEALING_INCREASE = 0.06; //const PONTIFEX_MAX_STACKS = 5; const HOLY_WORD_LIST = [ diff --git a/src/analysis/retail/priest/holy/modules/talents/BottomRow/ResonantWords.tsx b/src/analysis/retail/priest/holy/modules/talents/BottomRow/ResonantWords.tsx index 8ae79c9544b..d4034150300 100644 --- a/src/analysis/retail/priest/holy/modules/talents/BottomRow/ResonantWords.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/BottomRow/ResonantWords.tsx @@ -10,20 +10,11 @@ import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; import { formatPercentage } from 'common/format'; import { calculateEffectiveHealing, calculateOverhealing } from 'parser/core/EventCalculateLib'; - -const HEALING_MULTIPLIER_BY_RANK: number[] = [0, 0.2, 0.4]; -const HOLY_WORD_LIST = [ - TALENTS.HOLY_WORD_CHASTISE_TALENT, - TALENTS.HOLY_WORD_SALVATION_TALENT, - TALENTS.HOLY_WORD_SANCTIFY_TALENT, - TALENTS.HOLY_WORD_SERENITY_TALENT, -]; -const RESONANT_WORD_WHITELIST = [ - SPELLS.FLASH_HEAL, - SPELLS.GREATER_HEAL, - TALENTS.PRAYER_OF_HEALING_TALENT, - TALENTS.CIRCLE_OF_HEALING_TALENT, -]; +import { + HEALING_MULTIPLIER_BY_RANK, + HOLY_WORD_LIST, + RESONANT_WORD_WHITELIST, +} from '../../../constants'; // Example Log: /report/kVQd4LrBb9RW2h6K/9-Heroic+The+Primal+Council+-+Wipe+5+(5:04)/Delipriest/standard/statistics class ResonantWords extends Analyzer { diff --git a/src/analysis/retail/priest/holy/modules/talents/BottomRow/index.tsx b/src/analysis/retail/priest/holy/modules/talents/BottomRow/index.tsx index 02913d41ea9..55d7467f8e4 100644 --- a/src/analysis/retail/priest/holy/modules/talents/BottomRow/index.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/BottomRow/index.tsx @@ -3,9 +3,7 @@ import Apotheosis from './Apotheosis'; import DesperateTimes from './DesperateTimes'; import DivineImage from './DivineImage'; import DivineWord from './DivineWord'; -import HarmoniousApparatus from './HarmoniousApparatus'; import HolyWordSalvation from './HolyWordSalvation'; -import LightOfTheNaaru from './LightOfTheNaaru'; import Lightweaver from './Lightweaver'; import ResonantWords from './ResonantWords'; import Pontifex from './Pontifex'; @@ -18,9 +16,7 @@ export { DesperateTimes, DivineImage, DivineWord, - HarmoniousApparatus, HolyWordSalvation, - LightOfTheNaaru, Lightweaver, ResonantWords, Pontifex, diff --git a/src/analysis/retail/priest/holy/modules/talents/MiddleRow/Enlightenment.tsx b/src/analysis/retail/priest/holy/modules/talents/MiddleRow/Enlightenment.tsx index 705287e6607..2837e49bf4d 100644 --- a/src/analysis/retail/priest/holy/modules/talents/MiddleRow/Enlightenment.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/MiddleRow/Enlightenment.tsx @@ -6,9 +6,7 @@ import ItemManaGained from 'parser/ui/ItemManaGained'; import Statistic from 'parser/ui/Statistic'; import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; - -const MAX_MANA = 250000; -const BASE_MANA_REGEN = 0.04; +import { ENLIGHT_BASE_MANA_REGEN, ENLIGHT_MAX_MANA } from '../../../constants'; // Example Log: /report/PNYB4zgrnR86h7Lc/6-Normal+Zek'voz,+Herald+of+N'zoth/Khadaj class Enlightenment extends Analyzer { @@ -23,7 +21,7 @@ class Enlightenment extends Analyzer { } get enlightenmentMana() { - const normalManaRegen = MAX_MANA * BASE_MANA_REGEN; + const normalManaRegen = ENLIGHT_MAX_MANA * ENLIGHT_BASE_MANA_REGEN; const enlightenmentRegen = normalManaRegen * 0.1; // Convert from MS to S and from 1 second to 5. const totalEnlightenmentManaBack = diff --git a/src/analysis/retail/priest/holy/modules/talents/MiddleRow/EverlastingLight.tsx b/src/analysis/retail/priest/holy/modules/talents/MiddleRow/EverlastingLight.tsx index 25a90f4344a..db200ea570c 100644 --- a/src/analysis/retail/priest/holy/modules/talents/MiddleRow/EverlastingLight.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/MiddleRow/EverlastingLight.tsx @@ -10,8 +10,7 @@ import Statistic from 'parser/ui/Statistic'; import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; import { calculateEffectiveHealing, calculateOverhealing } from 'parser/core/EventCalculateLib'; - -const MAX_EVERLASTING_LIGHT_BUFF = 0.15; +import { MAX_EVERLASTING_LIGHT_BUFF } from '../../../constants'; /** * Heal restores up to 15% additional health, based on your missing mana. diff --git a/src/analysis/retail/priest/holy/modules/talents/MiddleRow/HealingChorus.tsx b/src/analysis/retail/priest/holy/modules/talents/MiddleRow/HealingChorus.tsx index 96642103500..e0da9946fd1 100644 --- a/src/analysis/retail/priest/holy/modules/talents/MiddleRow/HealingChorus.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/MiddleRow/HealingChorus.tsx @@ -9,9 +9,7 @@ import { calculateEffectiveHealing, calculateOverhealing } from 'parser/core/Eve import ItemHealingDone from 'parser/ui/ItemHealingDone'; import { formatPercentage } from 'common/format'; import { SpellLink } from 'interface'; - -const HEALING_BONUS_PER_STACK = 0.05; -const MAX_STACKS = 20; +import { HEALING_CHORUS_BONUS_PER_STACK, HEALING_CHORUS_MAX_STACKS } from '../../../constants'; //Example log: /reports/w9BXrzFApPbj6LnG#fight=14&type=healing&source=19 class HealingChorus extends Analyzer { @@ -51,7 +49,7 @@ class HealingChorus extends Analyzer { this.overhealingDoneFromTalent += calculateOverhealing(Event, this.lastHealedMultiplier); } if (this.currentStacks > 0) { - const multiplier = this.currentStacks * HEALING_BONUS_PER_STACK; + const multiplier = this.currentStacks * HEALING_CHORUS_BONUS_PER_STACK; this.healingDoneFromTalent += calculateEffectiveHealing(Event, multiplier); this.overhealingDoneFromTalent += calculateOverhealing(Event, multiplier); @@ -67,7 +65,7 @@ class HealingChorus extends Analyzer { onBuff() { this.totalStacks += 1; - if (this.currentStacks < MAX_STACKS) { + if (this.currentStacks < HEALING_CHORUS_MAX_STACKS) { this.currentStacks += 1; } } diff --git a/src/analysis/retail/priest/holy/modules/talents/MiddleRow/PrayerfulLitany.tsx b/src/analysis/retail/priest/holy/modules/talents/MiddleRow/PrayerfulLitany.tsx index 912c7366a88..70b1c6b78e5 100644 --- a/src/analysis/retail/priest/holy/modules/talents/MiddleRow/PrayerfulLitany.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/MiddleRow/PrayerfulLitany.tsx @@ -9,8 +9,7 @@ import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; import { calculateEffectiveHealing, calculateOverhealing } from 'parser/core/EventCalculateLib'; import ItemHealingDone from 'parser/ui/ItemHealingDone'; import { formatNumber, formatPercentage } from 'common/format'; - -const PRAYERFUL_LITANY_MULTIPLIER = 1; +import { PRAYERFUL_LITANY_MULTIPLIER } from '../../../constants'; /* Prayer of Healing heals for 30% more to the most injured ally it affects. diff --git a/src/analysis/retail/priest/holy/modules/talents/Oracle/OracleCore/RenewTracker.tsx b/src/analysis/retail/priest/holy/modules/talents/Oracle/OracleCore/RenewTracker.tsx index 60abb190456..6e04a53745c 100644 --- a/src/analysis/retail/priest/holy/modules/talents/Oracle/OracleCore/RenewTracker.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/Oracle/OracleCore/RenewTracker.tsx @@ -8,10 +8,7 @@ import { SALVATION_RENEW, REVIT_PRAYER_RENEW, } from '../../../../normalizers/CastLinkNormalizer'; - -const BASE_RENEW_DURATION = 15; -//not sure what the max is, df s3 tier could extend it to like 2min -const MAX_RENEW_DURATION = 50; +import { BASE_RENEW_DURATION, MAX_RENEW_DURATION } from 'analysis/retail/priest/holy/constants'; class RenewTracker extends HotTracker { static dependencies = { diff --git a/src/analysis/retail/priest/holy/modules/talents/Oracle/OracleValues.tsx b/src/analysis/retail/priest/holy/modules/talents/Oracle/OracleValues.tsx deleted file mode 100644 index 01de6d0e482..00000000000 --- a/src/analysis/retail/priest/holy/modules/talents/Oracle/OracleValues.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import SPELLS from 'common/SPELLS'; -import { TALENTS_PRIEST } from 'common/TALENTS'; - -export const FATEBENDER_SCALER = 1.4; -export const SOLACE_DR = 0.15; -export const PIETY_OVERHEAL_MISDIRECT = 0.7; -export const PIETY_AMP = 0.15; -export const INSIGHT_CDR = 7; -export const PREVENTIVE_MEASURES_DMG_AMP = 0.25; -export const PREVENTIVE_MEASURES_HEAL_AMP = 0.25; -export const PROPHETS_WILL_AMP = 0.3; -export const PREEMPTIVE_CARE_RENEW_DUR = 6_000; - -export const INSIGHT_CDR_ABILITIES = [ - TALENTS_PRIEST.ANGELIC_FEATHER_TALENT.id, - TALENTS_PRIEST.MASS_DISPEL_TALENT.id, - SPELLS.PSYCHIC_SCREAM.id, - SPELLS.DESPERATE_PRAYER.id, - SPELLS.MIND_SOOTHE.id, - SPELLS.FADE.id, - TALENTS_PRIEST.POWER_INFUSION_TALENT.id, - TALENTS_PRIEST.HALO_SHARED_TALENT.id, - TALENTS_PRIEST.SHADOWFIEND_TALENT.id, - SPELLS.POWER_WORD_SHIELD.id, - TALENTS_PRIEST.PRAYER_OF_MENDING_TALENT.id, - TALENTS_PRIEST.APOTHEOSIS_TALENT.id, - TALENTS_PRIEST.HOLY_WORD_CHASTISE_TALENT.id, - SPELLS.HOLY_FIRE.id, - TALENTS_PRIEST.HOLY_WORD_SANCTIFY_TALENT.id, - TALENTS_PRIEST.HOLY_WORD_SERENITY_TALENT.id, - TALENTS_PRIEST.HOLY_WORD_SALVATION_TALENT.id, - TALENTS_PRIEST.SYMBOL_OF_HOPE_TALENT.id, - SPELLS.PURIFY.id, - TALENTS_PRIEST.DIVINE_HYMN_TALENT.id, - TALENTS_PRIEST.LIGHTWELL_TALENT.id, - TALENTS_PRIEST.DIVINE_WORD_TALENT.id, - TALENTS_PRIEST.SHADOW_WORD_DEATH_TALENT.id, - TALENTS_PRIEST.CIRCLE_OF_HEALING_TALENT.id, -]; - -export const PROPHETS_WILL_SPELLS_HOLY = [ - SPELLS.FLASH_HEAL, - TALENTS_PRIEST.HOLY_WORD_SERENITY_TALENT, - SPELLS.GREATER_HEAL, -]; - -export const HOLY_DMG_ABILITIES_AFFECTED_BY_PM = [ - SPELLS.HOLY_FIRE, - SPELLS.HOLY_NOVA_HEAL, - SPELLS.BURNING_VEHEMENCE_DAMAGE, - TALENTS_PRIEST.HOLY_NOVA_TALENT, - SPELLS.SMITE, -]; diff --git a/src/analysis/retail/priest/holy/modules/talents/Oracle/PreemptiveCareHoly.tsx b/src/analysis/retail/priest/holy/modules/talents/Oracle/PreemptiveCareHoly.tsx index c96694109d7..add4f8e592f 100644 --- a/src/analysis/retail/priest/holy/modules/talents/Oracle/PreemptiveCareHoly.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/Oracle/PreemptiveCareHoly.tsx @@ -11,7 +11,7 @@ import { TALENTS_PRIEST } from 'common/TALENTS'; import { isRenewFromSalv } from '../../../normalizers/CastLinkNormalizer'; import HotTracker, { Attribution } from 'parser/shared/modules/HotTracker'; import ItemPercentHealingDone from 'parser/ui/ItemPercentHealingDone'; -import { PREEMPTIVE_CARE_RENEW_DUR } from './OracleValues'; +import { PREEMPTIVE_CARE_RENEW_DUR } from '../../../constants'; class PreemptiveCareHoly extends Analyzer { static dependencies = { diff --git a/src/analysis/retail/priest/holy/modules/talents/Oracle/PremonitionOfInsight.tsx b/src/analysis/retail/priest/holy/modules/talents/Oracle/PremonitionOfInsight.tsx index 24c4bb8fab2..8591a2c8a4f 100644 --- a/src/analysis/retail/priest/holy/modules/talents/Oracle/PremonitionOfInsight.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/Oracle/PremonitionOfInsight.tsx @@ -9,8 +9,8 @@ import Statistic from 'parser/ui/Statistic'; import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; -import { INSIGHT_CDR } from './OracleValues'; -import { FATEBENDER_SCALER } from './OracleValues'; +import { INSIGHT_CDR } from '../../../constants'; +import { FATEBENDER_SCALER } from '../../../constants'; import { removesInsightCharge } from '../../../normalizers/CastLinkNormalizer'; import SpellIcon from 'interface/SpellIcon'; diff --git a/src/analysis/retail/priest/holy/modules/talents/Oracle/PremonitionOfPiety.tsx b/src/analysis/retail/priest/holy/modules/talents/Oracle/PremonitionOfPiety.tsx index d51722494f4..ab4ebcd97d7 100644 --- a/src/analysis/retail/priest/holy/modules/talents/Oracle/PremonitionOfPiety.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/Oracle/PremonitionOfPiety.tsx @@ -11,9 +11,9 @@ import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; import BoringSpellValueText from 'parser/ui/BoringSpellValueText'; -import { PIETY_AMP } from './OracleValues'; -import { PIETY_OVERHEAL_MISDIRECT } from './OracleValues'; -import { FATEBENDER_SCALER } from './OracleValues'; +import { PIETY_AMP } from '../../../constants'; +import { PIETY_OVERHEAL_MISDIRECT } from '../../../constants'; +import { FATEBENDER_SCALER } from '../../../constants'; class PremonitionOfPiety extends Analyzer { static dependencies = { diff --git a/src/analysis/retail/priest/holy/modules/talents/Oracle/PremonitionOfSolace.tsx b/src/analysis/retail/priest/holy/modules/talents/Oracle/PremonitionOfSolace.tsx index ac2167242f4..59e79234071 100644 --- a/src/analysis/retail/priest/holy/modules/talents/Oracle/PremonitionOfSolace.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/Oracle/PremonitionOfSolace.tsx @@ -12,8 +12,8 @@ import { formatNumber } from 'common/format'; import BoringSpellValueText from 'parser/ui/BoringSpellValueText'; import ItemPercentHealingDone from 'parser/ui/ItemPercentHealingDone'; -import { SOLACE_DR } from './OracleValues'; -import { FATEBENDER_SCALER } from './OracleValues'; +import { SOLACE_DR } from '../../../constants'; +import { FATEBENDER_SCALER } from '../../../constants'; class PremonitionOfSolace extends Analyzer { static dependencies = { diff --git a/src/analysis/retail/priest/holy/modules/talents/Oracle/PreventiveMeasuresHoly.tsx b/src/analysis/retail/priest/holy/modules/talents/Oracle/PreventiveMeasuresHoly.tsx index efbb0fb706a..3578e0835ef 100644 --- a/src/analysis/retail/priest/holy/modules/talents/Oracle/PreventiveMeasuresHoly.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/Oracle/PreventiveMeasuresHoly.tsx @@ -10,9 +10,9 @@ import Statistic from 'parser/ui/Statistic'; import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; -import { HOLY_DMG_ABILITIES_AFFECTED_BY_PM } from './OracleValues'; -import { PREVENTIVE_MEASURES_DMG_AMP } from './OracleValues'; -import { PREVENTIVE_MEASURES_HEAL_AMP } from './OracleValues'; +import { HOLY_DMG_ABILITIES_AFFECTED_BY_PM } from '../../../constants'; +import { PREVENTIVE_MEASURES_DMG_AMP } from '../../../constants'; +import { PREVENTIVE_MEASURES_HEAL_AMP } from '../../../constants'; import ItemPercentDamageDone from 'parser/ui/ItemPercentDamageDone'; import TalentSpellText from 'parser/ui/TalentSpellText'; diff --git a/src/analysis/retail/priest/holy/modules/talents/Oracle/ProphetsWillHoly.tsx b/src/analysis/retail/priest/holy/modules/talents/Oracle/ProphetsWillHoly.tsx index 0d1f0e0b9b0..a419f5c65f5 100644 --- a/src/analysis/retail/priest/holy/modules/talents/Oracle/ProphetsWillHoly.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/Oracle/ProphetsWillHoly.tsx @@ -9,7 +9,7 @@ import Statistic from 'parser/ui/Statistic'; import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; import BoringSpellValueText from 'parser/ui/BoringSpellValueText'; -import { PROPHETS_WILL_AMP, PROPHETS_WILL_SPELLS_HOLY } from './OracleValues'; +import { PROPHETS_WILL_AMP, PROPHETS_WILL_SPELLS_HOLY } from '../../../constants'; class ProphetsWillHoly extends Analyzer { static dependencies = { diff --git a/src/analysis/retail/priest/holy/modules/talents/TopRow/Afterlife.tsx b/src/analysis/retail/priest/holy/modules/talents/TopRow/Afterlife.tsx index 0a686bf3a13..93e37969202 100644 --- a/src/analysis/retail/priest/holy/modules/talents/TopRow/Afterlife.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/TopRow/Afterlife.tsx @@ -7,8 +7,7 @@ import ItemHealingDone from 'parser/ui/ItemHealingDone'; import Statistic from 'parser/ui/Statistic'; import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; - -const SPIRIT_OF_REDEMPTION_DURATION = 15000; +import { SPIRIT_OF_REDEMPTION_DURATION } from '../../../constants'; // Example Log: /report/zCMpvAPYW16k3bQr/33-Normal+G'huun+-+Wipe+12+(8:24)/60-Кеонна class Afterlife extends Analyzer { diff --git a/src/analysis/retail/priest/holy/modules/talents/TopRow/BurningVehemence.tsx b/src/analysis/retail/priest/holy/modules/talents/TopRow/BurningVehemence.tsx index c6007416e03..963b46a6ee4 100644 --- a/src/analysis/retail/priest/holy/modules/talents/TopRow/BurningVehemence.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/TopRow/BurningVehemence.tsx @@ -8,8 +8,7 @@ import Statistic from 'parser/ui/Statistic'; import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; import { calculateEffectiveDamage } from 'parser/core/EventCalculateLib'; - -const DAMAGE_INCREASE_PER_RANK = [0, 0.3, 0.6]; +import { BV_DAMAGE_INCREASE_PER_RANK } from '../../../constants'; class BurningVehemence extends Analyzer { damageBonus = 0; @@ -19,7 +18,7 @@ class BurningVehemence extends Analyzer { super(options); this.active = this.selectedCombatant.hasTalent(TALENTS.BURNING_VEHEMENCE_TALENT); this.damageBonus = - DAMAGE_INCREASE_PER_RANK[ + BV_DAMAGE_INCREASE_PER_RANK[ this.selectedCombatant.getTalentRank(TALENTS.BURNING_VEHEMENCE_TALENT) ]; this.addEventListener(Events.damage.by(SELECTED_PLAYER).spell(SPELLS.HOLY_FIRE), this.onDamage); diff --git a/src/analysis/retail/priest/holy/modules/talents/TopRow/GuardianAngel.tsx b/src/analysis/retail/priest/holy/modules/talents/TopRow/GuardianAngel.tsx index fa77d2b6c7d..d051d8bcf91 100644 --- a/src/analysis/retail/priest/holy/modules/talents/TopRow/GuardianAngel.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/TopRow/GuardianAngel.tsx @@ -6,9 +6,7 @@ import BoringSpellValueText from 'parser/ui/BoringSpellValueText'; import Statistic from 'parser/ui/Statistic'; import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; - -const GS_BASE_COOLDOWN_TIME = 60 * 3 * 1000; -const GS_MODIFIED_COOLDOWN_TIME = (60 + 10) * 1000; // one minute plus 10 seconds to account for the duration of the buff. +import { GS_BASE_COOLDOWN_TIME, GS_MODIFIED_COOLDOWN_TIME } from '../../../constants'; // Example Log: /report/mFarpncVW9ALwTq4/7-Mythic+Zek'voz+-+Kill+(8:52)/14-Praydien class GuardianAngel extends Analyzer { diff --git a/src/analysis/retail/priest/holy/modules/talents/TopRow/RenewedFaith.tsx b/src/analysis/retail/priest/holy/modules/talents/TopRow/RenewedFaith.tsx index c8902ad6e06..5233a6f8073 100644 --- a/src/analysis/retail/priest/holy/modules/talents/TopRow/RenewedFaith.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/TopRow/RenewedFaith.tsx @@ -7,8 +7,7 @@ import ItemHealingDone from 'parser/ui/ItemHealingDone'; import Statistic from 'parser/ui/Statistic'; import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; - -const RENEWED_FAITH_MULTIPLIER = 1.06; +import { RENEWED_FAITH_MULTIPLIER } from '../../../constants'; class RenewedFaith extends Analyzer { renewTracker: { [combatantId: number]: boolean } = {}; diff --git a/src/analysis/retail/priest/holy/modules/talents/TopRow/SanctifiedPrayers.tsx b/src/analysis/retail/priest/holy/modules/talents/TopRow/SanctifiedPrayers.tsx index 7c4e2113e5e..e0134516786 100644 --- a/src/analysis/retail/priest/holy/modules/talents/TopRow/SanctifiedPrayers.tsx +++ b/src/analysis/retail/priest/holy/modules/talents/TopRow/SanctifiedPrayers.tsx @@ -10,11 +10,11 @@ import Statistic from 'parser/ui/Statistic'; import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; import ItemHealingDone from 'parser/ui/ItemHealingDone'; +import { SANCTIFIED_PRAYERS_MULTIPLIER } from '../../../constants'; /* Using Holy Word: Sanctify increases the healing done by Prayer of Healing by 15% for 15 sec. */ -const SANCTIFIED_PRAYERS_MULTIPLIER = 1.15; class SanctifiedPrayers extends Analyzer { static dependencies = { diff --git a/src/analysis/retail/priest/holy/normalizers/CastLinkNormalizer.ts b/src/analysis/retail/priest/holy/normalizers/CastLinkNormalizer.ts index 57ab8ff6a49..322dc98d263 100644 --- a/src/analysis/retail/priest/holy/normalizers/CastLinkNormalizer.ts +++ b/src/analysis/retail/priest/holy/normalizers/CastLinkNormalizer.ts @@ -17,7 +17,7 @@ import { import { Options } from 'parser/core/Module'; import { TALENTS_PRIEST } from 'common/TALENTS'; import SPELLS from 'common/SPELLS/priest'; -import { INSIGHT_CDR_ABILITIES } from '../modules/talents/Oracle/OracleValues'; +import { INSIGHT_CDR_ABILITIES } from '../constants'; const CAST_BUFFER_MS = 200; @@ -30,10 +30,13 @@ const SANCTIFY_CAST = 'HolyWordSanctifyCast'; const SALVATION_CAST = 'HolyWordSalvationCast'; const CHASTISE_CAST = 'HolyWordChastiseCast'; export const BUFFED_BY_SURGE_OF_LIGHT = 'BuffedBySurgeOfLight'; +export const BUFFED_BY_SURGE_OF_LIGHT_CAST = 'BuffedBySurgeOfLightCast'; const SURGE_OF_LIGHT_APPLIED_BY_HALO = 'SurgeOfLightAppliedByHalo'; const HALO_LINKED_TO_SURGE_OF_LIGHT = 'HaloLinkedtoSurgeOfLight'; const SPELL_SPENDS_INSIGHT_CHARGE = 'SpellSpendsInsightCharge'; const GET_SPELL_CAST_FROM_INSIGHT_CHARGE = 'GetSpellCastFromInsightCharge'; +export const ECHO_OF_LIGHT_BUFF_REFRESH = 'EchOfLightRefresh'; +export const ECHO_OF_LIGHT_ATTRIB_EVENT = 'GetEchoOfLight'; export const HARDCAST_POWER_WORD_SHIELD = 'HardCastPowerWordShield'; export const POWER_WORD_SHIELD_ABSORB = 'PowerWordShieldAbsorb'; export const LIGHTWELL_RENEW_HEALS = 'LightwellRenewHeal'; @@ -241,7 +244,15 @@ const EVENT_LINKS: EventLink[] = [ return !HasRelatedEvent(linkingEvent, HARDCAST_POWER_WORD_SHIELD); }, }, - + { + linkRelation: ECHO_OF_LIGHT_ATTRIB_EVENT, + linkingEventId: null, + linkingEventType: [EventType.Heal], + referencedEventId: SPELLS.ECHO_OF_LIGHT_HEAL.id, + referencedEventType: EventType.Heal, + forwardBufferMs: 6000, + anyTarget: false, + }, { linkRelation: BENEDICTION_RENEW_HEALS, reverseLinkRelation: BENEDICTION_RENEW_HEALS, @@ -269,6 +280,17 @@ const EVENT_LINKS: EventLink[] = [ forwardBufferMs: CAST_BUFFER_MS, backwardBufferMs: CAST_BUFFER_MS, }, + { + linkRelation: BUFFED_BY_SURGE_OF_LIGHT_CAST, + reverseLinkRelation: BUFFED_BY_SURGE_OF_LIGHT_CAST, + linkingEventId: SPELLS.FLASH_HEAL.id, + linkingEventType: EventType.Cast, + referencedEventId: [SPELLS.SURGE_OF_LIGHT_BUFF.id], + referencedEventType: [EventType.RemoveBuff, EventType.RemoveBuffStack, EventType.RefreshBuff], + anyTarget: true, + forwardBufferMs: CAST_BUFFER_MS, + backwardBufferMs: CAST_BUFFER_MS, + }, { linkRelation: SURGE_OF_LIGHT_APPLIED_BY_HALO, reverseLinkRelation: HALO_LINKED_TO_SURGE_OF_LIGHT, @@ -377,4 +399,14 @@ export function isPWSHardCast(event: AbsorbedEvent): boolean { return HasRelatedEvent(event, HARDCAST_POWER_WORD_SHIELD); } +export function getSOLFlashCast( + event: RemoveBuffEvent | RemoveBuffStackEvent, +): CastEvent | undefined { + return GetRelatedEvents( + event, + BUFFED_BY_SURGE_OF_LIGHT_CAST, + (e): e is CastEvent => e.type === EventType.Cast, + ).pop(); +} + export default CastLinkNormalizer; diff --git a/src/common/SPELLS/classic/rogue.ts b/src/common/SPELLS/classic/rogue.ts index c3834817671..547564f12e1 100644 --- a/src/common/SPELLS/classic/rogue.ts +++ b/src/common/SPELLS/classic/rogue.ts @@ -1,5 +1,5 @@ /** - * All WotLK Rogue spells (including talent spells) go here. + * All Classic Rogue spells (including talent spells) go here. * You need to do this manually by opening a WCL report and clicking the icons of spells to open the relevant Wowhead page. Here, you can get the icon name by clicking the icon, copy the name of the spell, and the ID is in the URL. * You can access these entries like other entries in the spells files by importing `common/SPELLS/classic` and using the assigned property on the SPELLS object. Please try to avoid abbreviating properties. */ @@ -11,138 +11,144 @@ const spells = { // SHARED // -------- AMBUSH: { - id: 48691, + id: 8676, name: 'Ambush', - icon: 'ability_rogue_ambush', - lowRanks: [48690, 48689, 27441, 11269, 11268, 11267, 8725, 8724, 8676], + icon: 'ability_rogue_ambush.jpg', }, BACKSTAB: { - id: 48657, + id: 53, name: 'Backstab', - icon: 'ability_backstab', - lowRanks: [48656, 26863, 25300, 11281, 11280, 11279, 8721, 2591, 2590, 2589, 53], + icon: 'ability_backstab.jpg', }, BLIND: { id: 2094, name: 'Blind', - icon: 'spell_shadow_mindsteal', + icon: 'spell_shadow_mindsteal.jpg', }, CHEAP_SHOT: { id: 1833, name: 'Cheap Shot', - icon: 'ability_cheapshot', + icon: 'ability_cheapshot.jpg', }, CLOAK_OF_SHADOWS: { id: 31224, name: 'Cloak of Shadows', - icon: 'spell_shadow_nethercloak', + icon: 'spell_shadow_nethercloak.jpg', + }, + COMBAT_READINESS: { + id: 74001, + name: 'Combat Readiness', + icon: 'ability_rogue_combatreadiness.jpg', }, DEADLY_THROW: { - id: 48674, + id: 26679, name: 'Deadly Throw', - icon: 'inv_throwingknife_06', - lowRanks: [48673, 26679], + icon: 'inv_throwingknife_06.jpg', }, DISMANTLE: { id: 51722, name: 'Dismantle', - icon: 'ability_rogue_dismantle', + icon: 'ability_rogue_dismantle.jpg', }, ENVENOM: { - id: 57993, + id: 32645, name: 'Envenom', - icon: 'ability_rogue_disembowel', - lowRanks: [57992, 32684, 32645], + icon: 'ability_rogue_disembowel.jpg', }, EVASION: { - id: 26669, + id: 5277, name: 'Evasion', - icon: 'spell_shadow_shadowward', - lowRanks: [8], + icon: 'spell_shadow_shadowward.jpg', }, EVISCERATE: { - id: 48668, + id: 2098, name: 'Eviscerate', - icon: 'ability_rogue_eviscerate', - lowRanks: [48667, 26865, 31016, 11300, 11299, 8624, 8623, 6762, 6761, 6760, 2098], + icon: 'ability_rogue_eviscerate.jpg', }, EXPOSE_ARMOR: { id: 8647, name: 'Expose Armor', - icon: 'ability_warrior_riposte', + icon: 'ability_warrior_riposte.jpg', }, FAN_OF_KNIVES: { id: 51723, name: 'Fan of Knives', - icon: 'ability_rogue_fanofknives', + icon: 'ability_rogue_fanofknives.jpg', }, FEINT: { - id: 48659, + id: 1966, name: 'Feint', - icon: 'ability_rogue_feint', - lowRanks: [48658, 27448, 25302, 11303, 8637, 6768, 1966], + icon: 'ability_rogue_feint.jpg', }, GARROTE: { - id: 48676, + id: 703, name: 'Garrote', - icon: 'ability_rogue_garrote', - lowRanks: [48675, 26884, 26839, 11290, 11289, 8633, 8632, 8631, 703], + icon: 'ability_rogue_garrote.jpg', }, GOUGE: { id: 1776, name: 'Gouge', - icon: 'ability_gouge', + icon: 'ability_gouge.jpg', }, KICK: { id: 1766, name: 'Kick', - icon: 'ability_kick', + icon: 'ability_kick.jpg', }, KIDNEY_SHOT: { - id: 8643, + id: 408, name: 'Kidney Shot', - icon: 'ability_rogue_kidneyshot', - lowRanks: [408], + icon: 'ability_rogue_kidneyshot.jpg', + }, + RECUPERATE: { + id: 73651, + name: 'Recuperate', + icon: 'ability_rogue_recuperate.jpg', + }, + REDIRECT: { + id: 73981, + name: 'Redirect', + icon: 'ability_rogue_redirect.jpg', }, RUPTURE: { - id: 48672, + id: 1943, name: 'Rupture', - icon: 'ability_rogue_rupture', - lowRanks: [48671, 26867, 11275, 11274, 11273, 8640, 8639, 1943], + icon: 'ability_rogue_rupture.jpg', }, SHIV: { id: 5938, name: 'Shiv', - icon: 'inv_throwingknife_04', + icon: 'inv_throwingknife_04.jpg', }, SINISTER_STRIKE: { - id: 48638, + id: 1752, name: 'Sinister Strike', - icon: 'spell_shadow_ritualofsacrifice', - lowRanks: [48637, 26862, 26861, 11294, 11293, 8621, 1760, 1759, 1758, 1757, 1752], + icon: 'spell_shadow_ritualofsacrifice.jpg', }, SLICE_AND_DICE: { - id: 6774, + id: 5171, name: 'Slice and Dice', - icon: 'ability_rogue_slicedice', - lowRanks: [5171], + icon: 'ability_rogue_slicedice.jpg', + }, + SMOKE_BOMB: { + id: 76577, + name: 'Smoke Bomb', + icon: 'ability_rogue_smoke.jpg', }, SPRINT: { - id: 11305, + id: 2983, name: 'Sprint', - icon: 'ability_rogue_sprint', - lowRanks: [8696, 2983], + icon: 'ability_rogue_sprint.jpg', }, TRICKS_OF_THE_TRADE: { id: 57934, name: 'Tricks of the Trade', - icon: 'ability_rogue_tricksofthetrade', + icon: 'ability_rogue_tricksofthetrade.jpg', }, VANISH: { - id: 26889, + id: 1856, name: 'Vanish', - icon: 'ability_vanish', - lowRanks: [1857, 1856], + icon: 'ability_vanish.jpg', }, // --------- // TALENTS @@ -151,81 +157,79 @@ const spells = { COLD_BLOOD: { id: 14177, name: 'Cold Blood', - icon: 'spell_ice_lament', - }, - HUNGER_FOR_BLOOD: { - id: 51662, - name: 'Hunger For Blood', - icon: 'ability_rogue_hungerforblood', + icon: 'spell_ice_lament.jpg', }, MUTILATE: { - id: 48666, + id: 1329, name: 'Mutilate', - icon: 'ability_rogue_shadowstrikes', - lowRanks: [48663, 34413, 34412, 34411, 1329], + icon: 'ability_rogue_shadowstrikes.jpg', + }, + VENDETTA: { + id: 79140, + name: 'Vendetta', + icon: 'ability_rogue_deadliness.jpg', }, // Combat ADRENALINE_RUSH: { id: 13750, name: 'Adrenaline Rush', - icon: 'spell_shadow_shadowworddominate', + icon: 'spell_shadow_shadowworddominate.jpg', }, BLADE_FLURRY: { id: 13877, name: 'Blade Flurry', - icon: 'ability_warrior_punishingblow', + icon: 'ability_warrior_punishingblow.jpg', }, KILLING_SPREE: { id: 51690, name: 'Killing Spree', - icon: 'ability_rogue_murderspree', + icon: 'ability_rogue_murderspree.jpg', }, OVERKILL_BUFF: { id: 58427, name: 'Overkill', - icon: 'ability_hunter_rapidkilling', + icon: 'ability_hunter_rapidkilling.jpg', + }, + REVEALING_STRIKE: { + id: 84617, + name: 'Revealing Strike', + icon: 'inv_sword_97.jpg', }, RIPOSTE: { id: 14251, name: 'Riposte', - icon: 'ability_warrior_challange', + icon: 'ability_warrior_challange.jpg', }, SAVAGE_COMBAT: { id: 58683, name: 'Savage Combat', - icon: 'ability_creature_disease_03', + icon: 'ability_creature_disease_03.jpg', }, // Subtlety - GHOSTLY_STRIKE: { - id: 14278, - name: 'Ghostly Strike', - icon: 'spell_shadow_curse', - }, HEMORRHAGE: { - id: 48660, + id: 16511, name: 'Hemorrhage', - icon: 'spell_shadow_lifedrain', - lowRanks: [26864, 17348, 17347, 16511], + icon: 'spell_shadow_lifedrain.jpg', }, PREMEDITATION: { id: 14183, name: 'Premeditation', - icon: 'spell_shadow_possession', + icon: 'spell_shadow_possession.jpg', }, PREPARATION: { id: 14185, name: 'Preparation', - icon: 'spell_shadow_antishadow', + icon: 'ability_rogue_preparation.jpg', }, SHADOW_DANCE: { id: 51713, name: 'Shadow Dance', - icon: 'ability_rogue_shadowdance', + icon: 'ability_rogue_shadowdance.jpg', }, SHADOWSTEP: { id: 36554, name: 'Shadowstep', - icon: 'ability_rogue_shadowstep', + icon: 'ability_rogue_shadowstep.jpg', }, // --------- // OTHER @@ -234,7 +238,7 @@ const spells = { // Thistle Tea id: 9512, name: 'Restore Energy', - icon: 'inv_drink_milk_05', + icon: 'inv_drink_milk_05.jpg', }, } satisfies Record; diff --git a/src/common/SPELLS/priest.ts b/src/common/SPELLS/priest.ts index 963c55205ae..cb96caf1a9f 100644 --- a/src/common/SPELLS/priest.ts +++ b/src/common/SPELLS/priest.ts @@ -30,21 +30,6 @@ const spells = { icon: 'spell_holy_mindsooth', manaCost: 500, }, - MINDGAMES_HEAL: { - id: 375904, - name: 'Mindgames', - icon: 'ability_revendreth_priest', - }, - MINDGAMES_ABSORB: { - id: 375902, - name: 'Mindgames', - icon: 'ability_revendreth_priest', - }, - MINDGAMES_HEAL_REVERSAL: { - id: 375903, - name: 'Mindgames', - icon: 'ability_revendreth_priest', - }, CRYSTALLINE_REFLECTION_TALENT_HEAL: { id: 373462, name: 'Crystalline Reflection', @@ -430,6 +415,26 @@ const spells = { name: 'Words of the Pious', icon: 'ability_priest_clarityofwill', }, + ENTROPIC_RIFT_DAMAGE_DISC: { + id: 447448, + name: 'Entropic Rift', + icon: 'inv_ability_voidweaverpriest_entropicrift', + }, + COLLAPSING_VOID_DAMAGE_DISC: { + id: 448405, + name: 'Collapsing Void', + icon: 'inv_cosmicvoid_groundsate', + }, + VOID_BLAST_DAMAGE_DISC: { + id: 450215, + name: 'Void Blast', + icon: 'inv_cosmicvoid_missile', + }, + VOID_FLAY_DAMAGE_DISC: { + id: 451435, + name: 'Void Flay', + icon: 'spell_priest_voidsear', + }, // Holy Priest Spells GREATER_HEAL: { diff --git a/src/game/Expansion.ts b/src/game/Expansion.ts index 480528688a2..2b9da2cf8a7 100644 --- a/src/game/Expansion.ts +++ b/src/game/Expansion.ts @@ -17,7 +17,7 @@ enum ExpansionName { WrathOfTheLichKing = 'wotlk', Cataclysm = 'cataclysm', Dragonflight = 'dragonflight', - TheWarWithin = 'UNKNOWN', + TheWarWithin = 'the war within', } export const CLASSIC_EXPANSION = Expansion.Cataclysm; diff --git a/src/game/ZONES.ts b/src/game/ZONES.ts index 3e90addcf19..19107426b5d 100644 --- a/src/game/ZONES.ts +++ b/src/game/ZONES.ts @@ -1,158 +1,30 @@ // a butchered version of https://www.warcraftlogs.com:443/v1/zones // only includes the raids from Dragonflight (showing older logs wouldn't make sense) import mythicPlusSeasonOne from 'game/raids/mythicplusseasonone'; -import mythicPlusSeasonTwo from 'game/raids/mythicplusseasontwo'; -import mythicplusseasonthree from './raids/mythicplusseasonthree'; -import mythicplusseasonfour from 'game/raids/mythicplusseasonfour'; -import vaultOfTheIncarnates from 'game/raids/vaultoftheincarnates'; -import aberrus from 'game/raids/aberrus'; -import amirdrassil from 'game/raids/amirdrassil'; - -// TODO: Refactor this (it's kind of strange and feels misplaced) - -interface Encounter { - id: number; - name: string; -} +import nerubarPalace from 'game/raids/nerubarpalace'; +import type { Boss } from 'game/raids'; export interface Zone { id: number; name: string; frozen?: boolean; - encounters: Encounter[]; + encounters: Boss[]; usePtrTooltips?: boolean; partition?: number; } const ZONES: Zone[] = [ - { - id: 31, - name: 'Vault of the Incarnates', - frozen: false, - partition: 4, - encounters: [ - vaultOfTheIncarnates.bosses.Eranog, - vaultOfTheIncarnates.bosses.Terros, - vaultOfTheIncarnates.bosses.PrimalCouncil, - vaultOfTheIncarnates.bosses.Sennarth, - vaultOfTheIncarnates.bosses.Dathea, - vaultOfTheIncarnates.bosses.KurogGrimtotem, - vaultOfTheIncarnates.bosses.BroodkeeperDiurna, - vaultOfTheIncarnates.bosses.Raszageth, - ], - }, - { - id: 32, - name: 'Mythic+ Season 1', - frozen: true, - encounters: [ - mythicPlusSeasonOne.bosses.AlgetharAcademy, - mythicPlusSeasonOne.bosses.AzureVault, - mythicPlusSeasonOne.bosses.CourtOfStars, - mythicPlusSeasonOne.bosses.HallsOfValor, - mythicPlusSeasonOne.bosses.NokhudOffensive, - mythicPlusSeasonOne.bosses.RubyLifePools, - mythicPlusSeasonOne.bosses.ShadowmoonBurialGrounds, - mythicPlusSeasonOne.bosses.TempleOfTheJadeSerpent, - ], - }, - { - id: 33, - name: 'Aberrus, the Shadowed Crucible', - frozen: false, - partition: 6, - encounters: [ - aberrus.bosses.Kazzara, - aberrus.bosses.AmalgamationChamber, - aberrus.bosses.ForgottenExperiments, - aberrus.bosses.AssaultOfTheZaqali, - aberrus.bosses.Rashok, - aberrus.bosses.Zskarn, - aberrus.bosses.Magmorax, - aberrus.bosses.EchoOfNeltharion, - aberrus.bosses.Sarkareth, - ], - usePtrTooltips: false, - }, - { - id: 34, - name: 'Mythic+ Season 2', - frozen: true, - encounters: [ - mythicPlusSeasonTwo.bosses.BrackenhideHollow, - mythicPlusSeasonTwo.bosses.Freehold, - mythicPlusSeasonTwo.bosses.HallsOfInfusion, - mythicPlusSeasonTwo.bosses.NeltharionsLair, - mythicPlusSeasonTwo.bosses.Neltharus, - mythicPlusSeasonTwo.bosses.Uldaman, - mythicPlusSeasonTwo.bosses.Underrot, - mythicPlusSeasonTwo.bosses.VortexPinnacle, - ], - usePtrTooltips: false, - }, - { - id: 35, - name: "Amirdrassil, the Dream's Hope", - frozen: false, - partition: 3, - encounters: [ - amirdrassil.bosses.Gnarlroot, - amirdrassil.bosses.Igira, - amirdrassil.bosses.Volcoross, - amirdrassil.bosses.CouncilOfDreams, - amirdrassil.bosses.Larodar, - amirdrassil.bosses.Nymue, - amirdrassil.bosses.Smolderon, - amirdrassil.bosses.Tindral, - amirdrassil.bosses.Fyrakk, - ], - usePtrTooltips: false, - }, - { - id: 36, - name: 'Mythic+ Season 3', - frozen: true, - encounters: [ - mythicplusseasonthree.bosses.AtalDazar, - mythicplusseasonthree.bosses.BlackRookHold, - mythicplusseasonthree.bosses.DarkheartThicket, - mythicplusseasonthree.bosses.Everbloom, - mythicplusseasonthree.bosses.GalakrondsFall, - mythicplusseasonthree.bosses.MurozondsRise, - mythicplusseasonthree.bosses.ThroneOfTheTides, - mythicplusseasonthree.bosses.WaycrestManor, - ], - usePtrTooltips: false, - }, - { - id: 37, - name: 'Mythic+ Season 4', - frozen: true, - encounters: [ - mythicplusseasonfour.bosses.AlgetharAcademy, - mythicplusseasonfour.bosses.AzureVault, - mythicplusseasonfour.bosses.BrackenhideHollow, - mythicplusseasonfour.bosses.HallsOfInfusion, - mythicplusseasonfour.bosses.Neltharus, - mythicplusseasonfour.bosses.NokhudOffensive, - mythicplusseasonfour.bosses.RubyLifePools, - mythicplusseasonfour.bosses.Uldaman, - ], - usePtrTooltips: false, - }, { id: 38, name: "Nerub'ar Palace", frozen: false, - encounters: [], - usePtrTooltips: true, + encounters: [...Object.values(nerubarPalace.bosses)], }, { id: 39, name: 'Mythic+ Season 1', frozen: false, - encounters: [], - usePtrTooltips: true, + encounters: [...Object.values(mythicPlusSeasonOne.bosses)], }, ]; diff --git a/src/game/raids/aberrus/AmalgamationChamber.ts b/src/game/raids/aberrus/AmalgamationChamber.ts deleted file mode 100644 index 44a2066c7a3..00000000000 --- a/src/game/raids/aberrus/AmalgamationChamber.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/AmalgamationChamber.jpg'; -import Headshot from './headshots/AmalgamationChamber.jpg'; - -const AmalgamationChamber: Boss = { - id: 2687, - name: 'The Amalgamation Chamber', - background: Background, - headshot: Headshot, - icon: 'inv_achievement_raiddragon_amalgamationchamber', - fight: {}, -}; - -export default AmalgamationChamber; diff --git a/src/game/raids/aberrus/AssaultOfTheZaqali.ts b/src/game/raids/aberrus/AssaultOfTheZaqali.ts deleted file mode 100644 index c3fbb45e767..00000000000 --- a/src/game/raids/aberrus/AssaultOfTheZaqali.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/AssaultOfTheZaqali.jpg'; -import Headshot from './headshots/AssaultOfTheZaqali.jpg'; - -const AssaultOfTheZaqali: Boss = { - id: 2682, - name: 'Assault of the Zaqali', - background: Background, - headshot: Headshot, - icon: 'inv_achievement_raiddragon_zaqaliassault', - fight: {}, -}; - -export default AssaultOfTheZaqali; diff --git a/src/game/raids/aberrus/EchoOfNeltharion.ts b/src/game/raids/aberrus/EchoOfNeltharion.ts deleted file mode 100644 index 848ecd5f293..00000000000 --- a/src/game/raids/aberrus/EchoOfNeltharion.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/EchoOfNeltharion.jpg'; -import Headshot from './headshots/EchoOfNeltharion.jpg'; - -const EchoOfNeltharion: Boss = { - id: 2684, - name: 'Echo of Neltharion', - background: Background, - headshot: Headshot, - icon: 'inv_achievement_raiddragon_neltharion', - fight: {}, -}; - -export default EchoOfNeltharion; diff --git a/src/game/raids/aberrus/ForgottenExperiments.ts b/src/game/raids/aberrus/ForgottenExperiments.ts deleted file mode 100644 index d695bb3e58f..00000000000 --- a/src/game/raids/aberrus/ForgottenExperiments.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/ForgottenExperiments.jpg'; -import Headshot from './headshots/ForgottenExperiments.jpg'; - -const ForgottenExperiments: Boss = { - id: 2693, - name: 'The Forgotten Experiments', - background: Background, - headshot: Headshot, - icon: 'inv_achievement_raiddragon_forgottenexperiments', - fight: {}, -}; - -export default ForgottenExperiments; diff --git a/src/game/raids/aberrus/Kazzara.ts b/src/game/raids/aberrus/Kazzara.ts deleted file mode 100644 index cd34b730495..00000000000 --- a/src/game/raids/aberrus/Kazzara.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/Kazzara.jpg'; -import Headshot from './headshots/Kazzara.jpg'; - -const Kazzara: Boss = { - id: 2688, - name: 'Kazzara, the Hellforged', - background: Background, - headshot: Headshot, - icon: 'inv_achievement_raiddragon_kazzara', - fight: {}, -}; - -export default Kazzara; diff --git a/src/game/raids/aberrus/Magmorax.ts b/src/game/raids/aberrus/Magmorax.ts deleted file mode 100644 index e00222c8920..00000000000 --- a/src/game/raids/aberrus/Magmorax.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/Magmorax.jpg'; -import Headshot from './headshots/Magmorax.jpg'; - -const Magmorax: Boss = { - id: 2683, - name: 'Magmorax', - background: Background, - headshot: Headshot, - icon: 'inv_achievement_raiddragon_magmorax', - fight: {}, -}; - -export default Magmorax; diff --git a/src/game/raids/aberrus/README.md b/src/game/raids/aberrus/README.md deleted file mode 100644 index 1bff089da45..00000000000 --- a/src/game/raids/aberrus/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# How to get pictures - -Never use screenshots from Google/Wowhead as their copyright is unknown and likely incompatible. Make your own, or from Blizzard. It's ok if other people provide screenshots, but make sure they're actually theirs and they allow you to relicense them as AGPL. - -## Backgrounds - -An easy way if the raid preview is released is to get them from the raid preview post: -https://worldofwarcraft.blizzard.com/en-us/news/23935246/aberrus-the-shadowed-crucible-raid-preview-and-schedule - -But I assume they won't be available for PTR dungeons and they're not the prettiest. Alternatively try to find a WoW news article as they generally tend to have good screenshots. These usually don't have good ones for all dungeons, so then you'll just have to enter the dungeons and make your own screenshots. Rogues can often make the best screenshots as they can get close to (final) bosses. Zoom in and disable nameplates, turn settings to max and make your screenshots. - -## Headshots - -For headshots in raids just use the boss achievement icon. - -# Boss IDs - -Use https://wago.tools/db2/JournalEncounter and search for the boss name. You want the `DungeonEncounterID`. diff --git a/src/game/raids/aberrus/Rashok.ts b/src/game/raids/aberrus/Rashok.ts deleted file mode 100644 index 0e3f5519251..00000000000 --- a/src/game/raids/aberrus/Rashok.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/Rashok.jpg'; -import Headshot from './headshots/Rashok.jpg'; - -const Rashok: Boss = { - id: 2680, - name: 'Rashok, the Elder', - background: Background, - headshot: Headshot, - icon: 'inv_achievement_raiddragon_rashok', - fight: {}, -}; - -export default Rashok; diff --git a/src/game/raids/aberrus/Sarkareth.ts b/src/game/raids/aberrus/Sarkareth.ts deleted file mode 100644 index b4ce51a0e41..00000000000 --- a/src/game/raids/aberrus/Sarkareth.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/Sarkareth.jpg'; -import Headshot from './headshots/Sarkareth.jpg'; - -const Sarkareth: Boss = { - id: 2685, - name: 'Scalecommander Sarkareth', - background: Background, - headshot: Headshot, - icon: 'inv_achievement_raiddragon_sarkareth', - fight: {}, -}; - -export default Sarkareth; diff --git a/src/game/raids/aberrus/Zskarn.ts b/src/game/raids/aberrus/Zskarn.ts deleted file mode 100644 index 652d1c9e693..00000000000 --- a/src/game/raids/aberrus/Zskarn.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/Zskarn.jpg'; -import Headshot from './headshots/Zskarn.jpg'; - -const Zskarn: Boss = { - id: 2689, - name: 'The Vigilant Steward, Zskarn', - background: Background, - headshot: Headshot, - icon: 'inv_achievement_raiddragon_zskarn', - fight: {}, -}; - -export default Zskarn; diff --git a/src/game/raids/aberrus/backgrounds/AmalgamationChamber.jpg b/src/game/raids/aberrus/backgrounds/AmalgamationChamber.jpg deleted file mode 100644 index 9beae426e31..00000000000 Binary files a/src/game/raids/aberrus/backgrounds/AmalgamationChamber.jpg and /dev/null differ diff --git a/src/game/raids/aberrus/backgrounds/AssaultOfTheZaqali.jpg b/src/game/raids/aberrus/backgrounds/AssaultOfTheZaqali.jpg deleted file mode 100644 index 983c40b0652..00000000000 Binary files a/src/game/raids/aberrus/backgrounds/AssaultOfTheZaqali.jpg and /dev/null differ diff --git a/src/game/raids/aberrus/backgrounds/EchoOfNeltharion.jpg b/src/game/raids/aberrus/backgrounds/EchoOfNeltharion.jpg deleted file mode 100644 index ee5d94eed22..00000000000 Binary files a/src/game/raids/aberrus/backgrounds/EchoOfNeltharion.jpg and /dev/null differ diff --git a/src/game/raids/aberrus/backgrounds/ForgottenExperiments.jpg b/src/game/raids/aberrus/backgrounds/ForgottenExperiments.jpg deleted file mode 100644 index 3f26b721d21..00000000000 Binary files a/src/game/raids/aberrus/backgrounds/ForgottenExperiments.jpg and /dev/null differ diff --git a/src/game/raids/aberrus/backgrounds/Kazzara.jpg b/src/game/raids/aberrus/backgrounds/Kazzara.jpg deleted file mode 100644 index ffe439e8e96..00000000000 Binary files a/src/game/raids/aberrus/backgrounds/Kazzara.jpg and /dev/null differ diff --git a/src/game/raids/aberrus/backgrounds/Magmorax.jpg b/src/game/raids/aberrus/backgrounds/Magmorax.jpg deleted file mode 100644 index 5b43b5d8d4c..00000000000 Binary files a/src/game/raids/aberrus/backgrounds/Magmorax.jpg and /dev/null differ diff --git a/src/game/raids/aberrus/backgrounds/Rashok.jpg b/src/game/raids/aberrus/backgrounds/Rashok.jpg deleted file mode 100644 index effc462f4e9..00000000000 Binary files a/src/game/raids/aberrus/backgrounds/Rashok.jpg and /dev/null differ diff --git a/src/game/raids/aberrus/backgrounds/Sarkareth.jpg b/src/game/raids/aberrus/backgrounds/Sarkareth.jpg deleted file mode 100644 index a25c5b37bc6..00000000000 Binary files a/src/game/raids/aberrus/backgrounds/Sarkareth.jpg and /dev/null differ diff --git a/src/game/raids/aberrus/backgrounds/Zskarn.jpg b/src/game/raids/aberrus/backgrounds/Zskarn.jpg deleted file mode 100644 index ba261c512df..00000000000 Binary files a/src/game/raids/aberrus/backgrounds/Zskarn.jpg and /dev/null differ diff --git a/src/game/raids/aberrus/backgrounds/overview.jpg b/src/game/raids/aberrus/backgrounds/overview.jpg deleted file mode 100644 index b18e88fa848..00000000000 Binary files a/src/game/raids/aberrus/backgrounds/overview.jpg and /dev/null differ diff --git a/src/game/raids/aberrus/headshots/AmalgamationChamber.jpg b/src/game/raids/aberrus/headshots/AmalgamationChamber.jpg deleted file mode 100644 index 0b956a91fb6..00000000000 Binary files a/src/game/raids/aberrus/headshots/AmalgamationChamber.jpg and /dev/null differ diff --git a/src/game/raids/aberrus/headshots/AssaultOfTheZaqali.jpg b/src/game/raids/aberrus/headshots/AssaultOfTheZaqali.jpg deleted file mode 100644 index a90ac44d525..00000000000 Binary files a/src/game/raids/aberrus/headshots/AssaultOfTheZaqali.jpg and /dev/null differ diff --git a/src/game/raids/aberrus/headshots/EchoOfNeltharion.jpg b/src/game/raids/aberrus/headshots/EchoOfNeltharion.jpg deleted file mode 100644 index 85404e12b05..00000000000 Binary files a/src/game/raids/aberrus/headshots/EchoOfNeltharion.jpg and /dev/null differ diff --git a/src/game/raids/aberrus/headshots/ForgottenExperiments.jpg b/src/game/raids/aberrus/headshots/ForgottenExperiments.jpg deleted file mode 100644 index 0ce483daf8a..00000000000 Binary files a/src/game/raids/aberrus/headshots/ForgottenExperiments.jpg and /dev/null differ diff --git a/src/game/raids/aberrus/headshots/Kazzara.jpg b/src/game/raids/aberrus/headshots/Kazzara.jpg deleted file mode 100644 index b06b99093d3..00000000000 Binary files a/src/game/raids/aberrus/headshots/Kazzara.jpg and /dev/null differ diff --git a/src/game/raids/aberrus/headshots/Magmorax.jpg b/src/game/raids/aberrus/headshots/Magmorax.jpg deleted file mode 100644 index f1db2127732..00000000000 Binary files a/src/game/raids/aberrus/headshots/Magmorax.jpg and /dev/null differ diff --git a/src/game/raids/aberrus/headshots/Rashok.jpg b/src/game/raids/aberrus/headshots/Rashok.jpg deleted file mode 100644 index a79771639b1..00000000000 Binary files a/src/game/raids/aberrus/headshots/Rashok.jpg and /dev/null differ diff --git a/src/game/raids/aberrus/headshots/Sarkareth.jpg b/src/game/raids/aberrus/headshots/Sarkareth.jpg deleted file mode 100644 index 7c95e7a4670..00000000000 Binary files a/src/game/raids/aberrus/headshots/Sarkareth.jpg and /dev/null differ diff --git a/src/game/raids/aberrus/headshots/Zskarn.jpg b/src/game/raids/aberrus/headshots/Zskarn.jpg deleted file mode 100644 index 3f967a4198c..00000000000 Binary files a/src/game/raids/aberrus/headshots/Zskarn.jpg and /dev/null differ diff --git a/src/game/raids/aberrus/index.ts b/src/game/raids/aberrus/index.ts deleted file mode 100644 index 601769bd0d7..00000000000 --- a/src/game/raids/aberrus/index.ts +++ /dev/null @@ -1,28 +0,0 @@ -import type { Raid } from 'game/raids'; -import Kazzara from 'game/raids/aberrus/Kazzara'; -import AmalgamationChamber from 'game/raids/aberrus/AmalgamationChamber'; -import ForgottenExperiments from 'game/raids/aberrus/ForgottenExperiments'; -import AssaultOfTheZaqali from 'game/raids/aberrus/AssaultOfTheZaqali'; -import Rashok from 'game/raids/aberrus/Rashok'; -import Zskarn from 'game/raids/aberrus/Zskarn'; -import Magmorax from 'game/raids/aberrus/Magmorax'; -import EchoOfNeltharion from 'game/raids/aberrus/EchoOfNeltharion'; -import Sarkareth from 'game/raids/aberrus/Sarkareth'; - -import Background from './backgrounds/overview.jpg'; - -export default { - name: 'Aberrus, the Shadowed Crucible', - background: Background, - bosses: { - Kazzara, - AmalgamationChamber, - ForgottenExperiments, - AssaultOfTheZaqali, - Rashok, - Zskarn, - Magmorax, - EchoOfNeltharion, - Sarkareth, - }, -} satisfies Raid; diff --git a/src/game/raids/amirdrassil/CouncilOfDreams.ts b/src/game/raids/amirdrassil/CouncilOfDreams.ts deleted file mode 100644 index 914f8e90688..00000000000 --- a/src/game/raids/amirdrassil/CouncilOfDreams.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/CouncilOfDreams.png'; -import Headshot from './headshots/CouncilOfDreams.jpg'; - -const CouncilOfDreams: Boss = { - id: 2728, - name: 'Council Of Dreams', - background: Background, - headshot: Headshot, - icon: 'inv_achievement_raidemeralddream_dreamcouncil', - fight: {}, -}; - -export default CouncilOfDreams; diff --git a/src/game/raids/amirdrassil/Fyrakk.ts b/src/game/raids/amirdrassil/Fyrakk.ts deleted file mode 100644 index 007852c0841..00000000000 --- a/src/game/raids/amirdrassil/Fyrakk.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/Fyrakk.png'; -import Headshot from './headshots/Fyrakk.jpg'; - -const Fyrakk: Boss = { - id: 2677, - name: 'Fyrakk, the Blazing', - background: Background, - headshot: Headshot, - icon: 'inv_achievement_raidemeralddream_fyrakk', - fight: {}, -}; - -export default Fyrakk; diff --git a/src/game/raids/amirdrassil/Gnarlroot.ts b/src/game/raids/amirdrassil/Gnarlroot.ts deleted file mode 100644 index 5a6cbb0447d..00000000000 --- a/src/game/raids/amirdrassil/Gnarlroot.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/Gnarlroot.png'; -import Headshot from './headshots/Gnarlroot.jpg'; - -const Gnarlroot: Boss = { - id: 2820, - name: 'Gnarlroot', - background: Background, - headshot: Headshot, - icon: 'inv_achievement_raidemeralddream_fieryancient', - fight: {}, -}; - -export default Gnarlroot; diff --git a/src/game/raids/amirdrassil/Igira.ts b/src/game/raids/amirdrassil/Igira.ts deleted file mode 100644 index 31a109b9f60..00000000000 --- a/src/game/raids/amirdrassil/Igira.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/Igira.png'; -import Headshot from './headshots/Igira.jpg'; - -const Igira: Boss = { - id: 2709, - name: 'Igira the Cruel', - background: Background, - headshot: Headshot, - icon: 'inv_achievement_raidemeralddream_igira-the-cruel', - fight: {}, -}; - -export default Igira; diff --git a/src/game/raids/amirdrassil/Larodar.ts b/src/game/raids/amirdrassil/Larodar.ts deleted file mode 100644 index 60d35b05de3..00000000000 --- a/src/game/raids/amirdrassil/Larodar.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/Larodar.png'; -import Headshot from './headshots/Larodar.jpg'; - -const Larodar: Boss = { - id: 2731, - name: 'Larodar, Keeper of the Flame', - background: Background, - headshot: Headshot, - icon: 'inv_achievement_raidemeralddream_keeperoftheflames', - fight: {}, -}; - -export default Larodar; diff --git a/src/game/raids/amirdrassil/Nymue.ts b/src/game/raids/amirdrassil/Nymue.ts deleted file mode 100644 index 0de4e644b14..00000000000 --- a/src/game/raids/amirdrassil/Nymue.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/Nymue.png'; -import Headshot from './headshots/Nymue.jpg'; - -const Nymue: Boss = { - id: 2708, - name: 'Nymue, Weaver of the Cycle', - background: Background, - headshot: Headshot, - icon: 'inv_achievement_raidemeralddream_dreamweaver', - fight: {}, -}; - -export default Nymue; diff --git a/src/game/raids/amirdrassil/README.md b/src/game/raids/amirdrassil/README.md deleted file mode 100644 index 1bff089da45..00000000000 --- a/src/game/raids/amirdrassil/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# How to get pictures - -Never use screenshots from Google/Wowhead as their copyright is unknown and likely incompatible. Make your own, or from Blizzard. It's ok if other people provide screenshots, but make sure they're actually theirs and they allow you to relicense them as AGPL. - -## Backgrounds - -An easy way if the raid preview is released is to get them from the raid preview post: -https://worldofwarcraft.blizzard.com/en-us/news/23935246/aberrus-the-shadowed-crucible-raid-preview-and-schedule - -But I assume they won't be available for PTR dungeons and they're not the prettiest. Alternatively try to find a WoW news article as they generally tend to have good screenshots. These usually don't have good ones for all dungeons, so then you'll just have to enter the dungeons and make your own screenshots. Rogues can often make the best screenshots as they can get close to (final) bosses. Zoom in and disable nameplates, turn settings to max and make your screenshots. - -## Headshots - -For headshots in raids just use the boss achievement icon. - -# Boss IDs - -Use https://wago.tools/db2/JournalEncounter and search for the boss name. You want the `DungeonEncounterID`. diff --git a/src/game/raids/amirdrassil/Smolderon.ts b/src/game/raids/amirdrassil/Smolderon.ts deleted file mode 100644 index d0d907f5431..00000000000 --- a/src/game/raids/amirdrassil/Smolderon.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/Smolderon.png'; -import Headshot from './headshots/Smolderon.jpg'; - -const Smolderon: Boss = { - id: 2824, - name: 'Smolderon', - background: Background, - headshot: Headshot, - icon: 'inv_achievement_raidemeralddream_smolderon', - fight: {}, -}; - -export default Smolderon; diff --git a/src/game/raids/amirdrassil/Tindral.ts b/src/game/raids/amirdrassil/Tindral.ts deleted file mode 100644 index ce545eabfa9..00000000000 --- a/src/game/raids/amirdrassil/Tindral.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/Tindral.png'; -import Headshot from './headshots/Tindral.jpg'; - -const Tindral: Boss = { - id: 2786, - name: 'Tindral Sageswift, Seer of Flame', - background: Background, - headshot: Headshot, - icon: 'inv_achievement_raidemeralddream_druidoftheflame', - fight: {}, -}; - -export default Tindral; diff --git a/src/game/raids/amirdrassil/Volcoross.ts b/src/game/raids/amirdrassil/Volcoross.ts deleted file mode 100644 index b4e6fc4a076..00000000000 --- a/src/game/raids/amirdrassil/Volcoross.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/Volcoross.png'; -import Headshot from './headshots/Volcoross.jpg'; - -const Volcoross: Boss = { - id: 2737, - name: 'Volcoross', - background: Background, - headshot: Headshot, - icon: 'inv_achievement_raidemeralddream_lavaserpent', - fight: {}, -}; - -export default Volcoross; diff --git a/src/game/raids/amirdrassil/backgrounds/Amirdrassil.png b/src/game/raids/amirdrassil/backgrounds/Amirdrassil.png deleted file mode 100644 index e965c9a975e..00000000000 Binary files a/src/game/raids/amirdrassil/backgrounds/Amirdrassil.png and /dev/null differ diff --git a/src/game/raids/amirdrassil/backgrounds/CouncilOfDreams.png b/src/game/raids/amirdrassil/backgrounds/CouncilOfDreams.png deleted file mode 100644 index b62635cbc65..00000000000 Binary files a/src/game/raids/amirdrassil/backgrounds/CouncilOfDreams.png and /dev/null differ diff --git a/src/game/raids/amirdrassil/backgrounds/Fyrakk.png b/src/game/raids/amirdrassil/backgrounds/Fyrakk.png deleted file mode 100644 index f74fe84d2f3..00000000000 Binary files a/src/game/raids/amirdrassil/backgrounds/Fyrakk.png and /dev/null differ diff --git a/src/game/raids/amirdrassil/backgrounds/Gnarlroot.png b/src/game/raids/amirdrassil/backgrounds/Gnarlroot.png deleted file mode 100644 index 09ca0fc8544..00000000000 Binary files a/src/game/raids/amirdrassil/backgrounds/Gnarlroot.png and /dev/null differ diff --git a/src/game/raids/amirdrassil/backgrounds/Igira.png b/src/game/raids/amirdrassil/backgrounds/Igira.png deleted file mode 100644 index 84964581d6d..00000000000 Binary files a/src/game/raids/amirdrassil/backgrounds/Igira.png and /dev/null differ diff --git a/src/game/raids/amirdrassil/backgrounds/Larodar.png b/src/game/raids/amirdrassil/backgrounds/Larodar.png deleted file mode 100644 index b951cfff4a1..00000000000 Binary files a/src/game/raids/amirdrassil/backgrounds/Larodar.png and /dev/null differ diff --git a/src/game/raids/amirdrassil/backgrounds/Nymue.png b/src/game/raids/amirdrassil/backgrounds/Nymue.png deleted file mode 100644 index 2b9d87436f2..00000000000 Binary files a/src/game/raids/amirdrassil/backgrounds/Nymue.png and /dev/null differ diff --git a/src/game/raids/amirdrassil/backgrounds/Smolderon.png b/src/game/raids/amirdrassil/backgrounds/Smolderon.png deleted file mode 100644 index fbd937dd351..00000000000 Binary files a/src/game/raids/amirdrassil/backgrounds/Smolderon.png and /dev/null differ diff --git a/src/game/raids/amirdrassil/backgrounds/Tindral.png b/src/game/raids/amirdrassil/backgrounds/Tindral.png deleted file mode 100644 index 916375b334c..00000000000 Binary files a/src/game/raids/amirdrassil/backgrounds/Tindral.png and /dev/null differ diff --git a/src/game/raids/amirdrassil/backgrounds/Volcoross.png b/src/game/raids/amirdrassil/backgrounds/Volcoross.png deleted file mode 100644 index 0c7096b5e55..00000000000 Binary files a/src/game/raids/amirdrassil/backgrounds/Volcoross.png and /dev/null differ diff --git a/src/game/raids/amirdrassil/headshots/CouncilOfDreams.jpg b/src/game/raids/amirdrassil/headshots/CouncilOfDreams.jpg deleted file mode 100644 index 840de9d838c..00000000000 Binary files a/src/game/raids/amirdrassil/headshots/CouncilOfDreams.jpg and /dev/null differ diff --git a/src/game/raids/amirdrassil/headshots/Fyrakk.jpg b/src/game/raids/amirdrassil/headshots/Fyrakk.jpg deleted file mode 100644 index 3c7cea08b13..00000000000 Binary files a/src/game/raids/amirdrassil/headshots/Fyrakk.jpg and /dev/null differ diff --git a/src/game/raids/amirdrassil/headshots/Gnarlroot.jpg b/src/game/raids/amirdrassil/headshots/Gnarlroot.jpg deleted file mode 100644 index 2de618ed9b6..00000000000 Binary files a/src/game/raids/amirdrassil/headshots/Gnarlroot.jpg and /dev/null differ diff --git a/src/game/raids/amirdrassil/headshots/Igira.jpg b/src/game/raids/amirdrassil/headshots/Igira.jpg deleted file mode 100644 index 15b8eaaf0b6..00000000000 Binary files a/src/game/raids/amirdrassil/headshots/Igira.jpg and /dev/null differ diff --git a/src/game/raids/amirdrassil/headshots/Larodar.jpg b/src/game/raids/amirdrassil/headshots/Larodar.jpg deleted file mode 100644 index 342cc2cf118..00000000000 Binary files a/src/game/raids/amirdrassil/headshots/Larodar.jpg and /dev/null differ diff --git a/src/game/raids/amirdrassil/headshots/Nymue.jpg b/src/game/raids/amirdrassil/headshots/Nymue.jpg deleted file mode 100644 index 596440df13f..00000000000 Binary files a/src/game/raids/amirdrassil/headshots/Nymue.jpg and /dev/null differ diff --git a/src/game/raids/amirdrassil/headshots/Smolderon.jpg b/src/game/raids/amirdrassil/headshots/Smolderon.jpg deleted file mode 100644 index c445f34ee23..00000000000 Binary files a/src/game/raids/amirdrassil/headshots/Smolderon.jpg and /dev/null differ diff --git a/src/game/raids/amirdrassil/headshots/Tindral.jpg b/src/game/raids/amirdrassil/headshots/Tindral.jpg deleted file mode 100644 index d74068f343a..00000000000 Binary files a/src/game/raids/amirdrassil/headshots/Tindral.jpg and /dev/null differ diff --git a/src/game/raids/amirdrassil/headshots/Volcoross.jpg b/src/game/raids/amirdrassil/headshots/Volcoross.jpg deleted file mode 100644 index 7a23e3d6f6e..00000000000 Binary files a/src/game/raids/amirdrassil/headshots/Volcoross.jpg and /dev/null differ diff --git a/src/game/raids/amirdrassil/index.ts b/src/game/raids/amirdrassil/index.ts deleted file mode 100644 index a2d59d23393..00000000000 --- a/src/game/raids/amirdrassil/index.ts +++ /dev/null @@ -1,27 +0,0 @@ -import Background from './backgrounds/Amirdrassil.png'; -import Gnarlroot from 'game/raids/amirdrassil/Gnarlroot'; -import Igira from 'game/raids/amirdrassil/Igira'; -import Volcoross from 'game/raids/amirdrassil/Volcoross'; -import CouncilOfDreams from 'game/raids/amirdrassil/CouncilOfDreams'; -import Larodar from 'game/raids/amirdrassil/Larodar'; -import Nymue from 'game/raids/amirdrassil/Nymue'; -import Smolderon from 'game/raids/amirdrassil/Smolderon'; -import Tindral from 'game/raids/amirdrassil/Tindral'; -import Fyrakk from 'game/raids/amirdrassil/Fyrakk'; -import type { Raid } from 'game/raids'; - -export default { - name: "Amirdrassil, the Dream's Hope", - background: Background, - bosses: { - Gnarlroot, - Igira, - Volcoross, - CouncilOfDreams, - Larodar, - Nymue, - Smolderon, - Tindral, - Fyrakk, - }, -} satisfies Raid; diff --git a/src/game/raids/builders.ts b/src/game/raids/builders.ts new file mode 100644 index 00000000000..5177c90c316 --- /dev/null +++ b/src/game/raids/builders.ts @@ -0,0 +1,10 @@ +import type { Boss } from 'game/raids'; + +export function buildBoss(params: { id: number; name: string; background?: string }): Boss { + return { + ...params, + headshot: `https://assets.rpglogs.com/img/warcraft/bosses/${params.id}-icon.jpg`, + icon: `https://assets.rpglogs.com/img/warcraft/bosses/${params.id}-icon.jpg`, + fight: {}, + }; +} diff --git a/src/game/raids/index.ts b/src/game/raids/index.ts index eafc0d495c7..257a5b3aa31 100644 --- a/src/game/raids/index.ts +++ b/src/game/raids/index.ts @@ -2,12 +2,6 @@ import { Spec } from 'game/SPECS'; import { Race } from 'parser/core/Combatant'; import PhaseConfig from 'parser/core/PhaseConfig'; import MythicPlusSeasonOne from 'game/raids/mythicplusseasonone'; -import MythicPlusSeasonTwo from 'game/raids/mythicplusseasontwo'; -import MythicPlusSeasonThree from 'game/raids/mythicplusseasonthree'; -import MythicPlusSeasonFour from 'game/raids/mythicplusseasonfour'; -import VaultOfTheIncarnates from 'game/raids/vaultoftheincarnates'; -import Aberrus from 'game/raids/aberrus'; -import Amirdrassil from 'game/raids/amirdrassil'; import NerubarPalace from 'game/raids/nerubarpalace'; import { bot as BastionOfTwilight, @@ -53,17 +47,11 @@ export interface Phase extends PhaseConfig { } const dungeons = { - // Dragonflight + // The War Within MythicPlusSeasonOne, - MythicPlusSeasonTwo, - MythicPlusSeasonThree, - MythicPlusSeasonFour, }; const raids = { - VaultOfTheIncarnates, // tier 29 - Aberrus, // tier 30 - Amirdrassil, // tier 31 NerubarPalace, // TWW S1 // Cataclysm (Classic) BlackwingDescent, diff --git a/src/game/raids/mythicplusseasonfour/AlgetharAcademy.ts b/src/game/raids/mythicplusseasonfour/AlgetharAcademy.ts deleted file mode 100644 index 3f43ec58ee8..00000000000 --- a/src/game/raids/mythicplusseasonfour/AlgetharAcademy.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from '../mythicplusseasonone/backgrounds/AlgetharAcademy.jpg'; -import Headshot from '../mythicplusseasonone/headshots/AlgetharAcademy.jpg'; - -const AlgetharAcademy: Boss = { - id: 62526, - name: "Algeth'ar Academy", - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_dragonacademy', - fight: {}, -}; - -export default AlgetharAcademy; diff --git a/src/game/raids/mythicplusseasonfour/AzureVault.ts b/src/game/raids/mythicplusseasonfour/AzureVault.ts deleted file mode 100644 index ebe0dd4e097..00000000000 --- a/src/game/raids/mythicplusseasonfour/AzureVault.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from '../mythicplusseasonone/backgrounds/AzureVault.jpg'; -import Headshot from '../mythicplusseasonone/headshots/AzureVault.jpg'; - -const AzureVault: Boss = { - id: 62515, - name: 'The Azure Vault', - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_arcanevaults', - fight: {}, -}; - -export default AzureVault; diff --git a/src/game/raids/mythicplusseasonfour/BrackenhideHollow.ts b/src/game/raids/mythicplusseasonfour/BrackenhideHollow.ts deleted file mode 100644 index b4444fcf95d..00000000000 --- a/src/game/raids/mythicplusseasonfour/BrackenhideHollow.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from '../mythicplusseasontwo/backgrounds/BrackenhideHollow.jpg'; -import Headshot from '../mythicplusseasontwo/headshots/BrackenhideHollow.jpg'; - -const BrackenhideHollow: Boss = { - id: 62520, - name: 'Brackenhide Hollow', - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_brackenhidehollow', - fight: {}, -}; - -export default BrackenhideHollow; diff --git a/src/game/raids/mythicplusseasonfour/HallsOfInfusion.ts b/src/game/raids/mythicplusseasonfour/HallsOfInfusion.ts deleted file mode 100644 index 6fd51ecc6b2..00000000000 --- a/src/game/raids/mythicplusseasonfour/HallsOfInfusion.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from '../mythicplusseasontwo/backgrounds/HallsOfInfusion.jpg'; -import Headshot from '../mythicplusseasontwo/headshots/HallsOfInfusion.jpg'; - -const HallsOfInfusion: Boss = { - id: 62527, - name: 'Halls of Infusion', - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_hallsofinfusion', - fight: {}, -}; - -export default HallsOfInfusion; diff --git a/src/game/raids/mythicplusseasonfour/Neltharus.ts b/src/game/raids/mythicplusseasonfour/Neltharus.ts deleted file mode 100644 index 75549e41b66..00000000000 --- a/src/game/raids/mythicplusseasonfour/Neltharus.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from '../mythicplusseasontwo/backgrounds/Neltharus.jpg'; -import Headshot from '../mythicplusseasontwo/headshots/Neltharus.jpg'; - -const Neltharus: Boss = { - id: 62519, - name: 'Neltharus', - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_neltharus', - fight: {}, -}; - -export default Neltharus; diff --git a/src/game/raids/mythicplusseasonfour/NokhudOffensive.ts b/src/game/raids/mythicplusseasonfour/NokhudOffensive.ts deleted file mode 100644 index 59786152205..00000000000 --- a/src/game/raids/mythicplusseasonfour/NokhudOffensive.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from '../mythicplusseasonone/backgrounds/NokhudOffensive.jpg'; -import Headshot from '../mythicplusseasonone/headshots/NokhudOffensive.jpg'; - -const NokhudOffensive: Boss = { - id: 62516, - name: 'The Nokhud Offensive', - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_centaurplains', - fight: {}, -}; - -export default NokhudOffensive; diff --git a/src/game/raids/mythicplusseasonfour/README.md b/src/game/raids/mythicplusseasonfour/README.md deleted file mode 100644 index 2afa29d43c5..00000000000 --- a/src/game/raids/mythicplusseasonfour/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# How to get pictures - -Never use screenshots from Google/Wowhead as their copyright is unknown and likely incompatible. Make your own, or from Blizzard. It's ok if other people provide screenshots, but make sure they're actually theirs and they allow you to relicense them as AGPL. - -## Backgrounds - -An easy way if the dungeons are released is to get them from the dungeon leaderboards: -https://worldofwarcraft.com/en-gb/game/pve/leaderboards/aegwynn/ataldazar - -But I assume they won't be available for PTR dungeons and they're not the prettiest. Alternatively try to find a WoW news article as they generally tend to have good screenshots. These usually don't have good ones for all dungeons, so then you'll just have to enter the dungeons and make your own screenshots. Rogues can often make the best screenshots as they can get close to (final) bosses. Zoom in and disable nameplates, turn settings to max and make your screenshots. - -## Headshots - -For headshots in dungeons just use the dungeon achievement icon. The easiest way is via this list: -https://www.wowhead.com/battle-dungeon-guild-achievements diff --git a/src/game/raids/mythicplusseasonfour/RubyLifePools.ts b/src/game/raids/mythicplusseasonfour/RubyLifePools.ts deleted file mode 100644 index 706494fedcf..00000000000 --- a/src/game/raids/mythicplusseasonfour/RubyLifePools.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from '../mythicplusseasonone/backgrounds/RubyLifePools.jpg'; -import Headshot from '../mythicplusseasonone/headshots/RubyLifePools.jpg'; - -const RubyLifePools: Boss = { - id: 62521, - name: 'Ruby Life Pools', - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_lifepools', - fight: {}, -}; - -export default RubyLifePools; diff --git a/src/game/raids/mythicplusseasonfour/Uldaman.ts b/src/game/raids/mythicplusseasonfour/Uldaman.ts deleted file mode 100644 index a00864c726b..00000000000 --- a/src/game/raids/mythicplusseasonfour/Uldaman.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from '../mythicplusseasontwo/backgrounds/Uldaman.jpg'; -import Headshot from '../mythicplusseasontwo/headshots/Uldaman.jpg'; - -const Uldaman: Boss = { - id: 62451, - name: 'Uldaman: Legacy of Tyr', - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_uldaman', - fight: {}, -}; - -export default Uldaman; diff --git a/src/game/raids/mythicplusseasonfour/index.ts b/src/game/raids/mythicplusseasonfour/index.ts deleted file mode 100644 index 501db5f4d62..00000000000 --- a/src/game/raids/mythicplusseasonfour/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -import type { Raid } from 'game/raids/index'; -import AlgetharAcademy from 'game/raids/mythicplusseasonfour/AlgetharAcademy'; -import AzureVault from 'game/raids/mythicplusseasonfour/AzureVault'; -import BrackenhideHollow from 'game/raids/mythicplusseasonfour/BrackenhideHollow'; -import HallsOfInfusion from 'game/raids/mythicplusseasonfour/HallsOfInfusion'; -import Neltharus from 'game/raids/mythicplusseasonfour/Neltharus'; -import NokhudOffensive from 'game/raids/mythicplusseasonfour/NokhudOffensive'; -import RubyLifePools from 'game/raids/mythicplusseasonfour/RubyLifePools'; -import Uldaman from 'game/raids/mythicplusseasonfour/Uldaman'; - -export default { - name: 'Mythic+ Season 4', - background: undefined, // TODO: Set up - bosses: { - AlgetharAcademy, - AzureVault, - BrackenhideHollow, - HallsOfInfusion, - Neltharus, - NokhudOffensive, - RubyLifePools, - Uldaman, - }, -} satisfies Raid; diff --git a/src/game/raids/mythicplusseasonone/AlgetharAcademy.ts b/src/game/raids/mythicplusseasonone/AlgetharAcademy.ts deleted file mode 100644 index 183bfefb618..00000000000 --- a/src/game/raids/mythicplusseasonone/AlgetharAcademy.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/AlgetharAcademy.jpg'; -import Headshot from './headshots/AlgetharAcademy.jpg'; - -const AlgetharAcademy: Boss = { - id: 12526, - name: "Algeth'ar Academy", - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_dragonacademy', - fight: {}, -}; - -export default AlgetharAcademy; diff --git a/src/game/raids/mythicplusseasonone/AraKara.ts b/src/game/raids/mythicplusseasonone/AraKara.ts new file mode 100644 index 00000000000..cac242f259b --- /dev/null +++ b/src/game/raids/mythicplusseasonone/AraKara.ts @@ -0,0 +1,6 @@ +import { buildBoss } from 'game/raids/builders'; + +export const AraKara = buildBoss({ + id: 12660, + name: 'Ara-Kara, City of Echoes', +}); diff --git a/src/game/raids/mythicplusseasonone/AzureVault.ts b/src/game/raids/mythicplusseasonone/AzureVault.ts deleted file mode 100644 index 1116965cb6b..00000000000 --- a/src/game/raids/mythicplusseasonone/AzureVault.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/AzureVault.jpg'; -import Headshot from './headshots/AzureVault.jpg'; - -const AzureVault: Boss = { - id: 12515, - name: 'The Azure Vault', - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_arcanevaults', - fight: {}, -}; - -export default AzureVault; diff --git a/src/game/raids/mythicplusseasonone/CityOfThreads.ts b/src/game/raids/mythicplusseasonone/CityOfThreads.ts new file mode 100644 index 00000000000..83258a42c37 --- /dev/null +++ b/src/game/raids/mythicplusseasonone/CityOfThreads.ts @@ -0,0 +1,6 @@ +import { buildBoss } from 'game/raids/builders'; + +export const CityOfThreads = buildBoss({ + id: 12669, + name: 'City of Threads', +}); diff --git a/src/game/raids/mythicplusseasonone/CourtOfStars.ts b/src/game/raids/mythicplusseasonone/CourtOfStars.ts deleted file mode 100644 index 4c162947954..00000000000 --- a/src/game/raids/mythicplusseasonone/CourtOfStars.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/CourtOfStars.jpg'; -import Headshot from './headshots/CourtOfStars.jpg'; - -const CourtOfStars: Boss = { - id: 61571, - name: 'Court of Stars', - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_courtofstars', - fight: {}, -}; - -export default CourtOfStars; diff --git a/src/game/raids/mythicplusseasonone/Dawnbreaker.ts b/src/game/raids/mythicplusseasonone/Dawnbreaker.ts new file mode 100644 index 00000000000..8e2f3dadd3e --- /dev/null +++ b/src/game/raids/mythicplusseasonone/Dawnbreaker.ts @@ -0,0 +1,6 @@ +import { buildBoss } from 'game/raids/builders'; + +export const Dawnbreaker = buildBoss({ + id: 12662, + name: 'The Dawnbreaker', +}); diff --git a/src/game/raids/mythicplusseasonone/GrimBatol.ts b/src/game/raids/mythicplusseasonone/GrimBatol.ts new file mode 100644 index 00000000000..f1170852f4b --- /dev/null +++ b/src/game/raids/mythicplusseasonone/GrimBatol.ts @@ -0,0 +1,6 @@ +import { buildBoss } from 'game/raids/builders'; + +export const GrimBatol = buildBoss({ + id: 60670, + name: 'Grim Batol', +}); diff --git a/src/game/raids/mythicplusseasonone/HallsOfValor.ts b/src/game/raids/mythicplusseasonone/HallsOfValor.ts deleted file mode 100644 index 8aabdb72f3f..00000000000 --- a/src/game/raids/mythicplusseasonone/HallsOfValor.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/HallsOfValor.jpg'; -import Headshot from './headshots/HallsOfValor.jpg'; - -const HallsOfValor: Boss = { - id: 61477, - name: 'Halls of Valor', - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_hallsofvalor', - fight: {}, -}; - -export default HallsOfValor; diff --git a/src/game/raids/mythicplusseasonone/Mists.ts b/src/game/raids/mythicplusseasonone/Mists.ts new file mode 100644 index 00000000000..e75032afcdd --- /dev/null +++ b/src/game/raids/mythicplusseasonone/Mists.ts @@ -0,0 +1,6 @@ +import { buildBoss } from 'game/raids/builders'; + +export const Mists = buildBoss({ + id: 62290, + name: 'Mists of Tirna Scithe', +}); diff --git a/src/game/raids/mythicplusseasonone/NecroticWake.ts b/src/game/raids/mythicplusseasonone/NecroticWake.ts new file mode 100644 index 00000000000..8c1b306cb56 --- /dev/null +++ b/src/game/raids/mythicplusseasonone/NecroticWake.ts @@ -0,0 +1,6 @@ +import { buildBoss } from 'game/raids/builders'; + +export const NecroticWake = buildBoss({ + id: 62286, + name: 'The Necrotic Wake', +}); diff --git a/src/game/raids/mythicplusseasonone/NokhudOffensive.ts b/src/game/raids/mythicplusseasonone/NokhudOffensive.ts deleted file mode 100644 index 13bb8c9525e..00000000000 --- a/src/game/raids/mythicplusseasonone/NokhudOffensive.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/NokhudOffensive.jpg'; -import Headshot from './headshots/NokhudOffensive.jpg'; - -const NokhudOffensive: Boss = { - id: 12516, - name: 'The Nokhud Offensive', - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_centaurplains', - fight: {}, -}; - -export default NokhudOffensive; diff --git a/src/game/raids/mythicplusseasonone/RubyLifePools.ts b/src/game/raids/mythicplusseasonone/RubyLifePools.ts deleted file mode 100644 index 1ecdc41b08d..00000000000 --- a/src/game/raids/mythicplusseasonone/RubyLifePools.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/RubyLifePools.jpg'; -import Headshot from './headshots/RubyLifePools.jpg'; - -const RubyLifePools: Boss = { - id: 12521, - name: 'Ruby Life Pools', - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_lifepools', - fight: {}, -}; - -export default RubyLifePools; diff --git a/src/game/raids/mythicplusseasonone/ShadowmoonBurialGrounds.ts b/src/game/raids/mythicplusseasonone/ShadowmoonBurialGrounds.ts deleted file mode 100644 index 83fa4f35cf3..00000000000 --- a/src/game/raids/mythicplusseasonone/ShadowmoonBurialGrounds.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/ShadowmoonBurialGrounds.jpg'; -import Headshot from './headshots/ShadowmoonBurialGrounds.jpg'; - -const ShadowmoonBurialGrounds: Boss = { - id: 61176, - name: 'Shadowmoon Burial Grounds', - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_shadowmoonhideout', - fight: {}, -}; - -export default ShadowmoonBurialGrounds; diff --git a/src/game/raids/mythicplusseasonone/Siege.ts b/src/game/raids/mythicplusseasonone/Siege.ts new file mode 100644 index 00000000000..cfa6079f6c8 --- /dev/null +++ b/src/game/raids/mythicplusseasonone/Siege.ts @@ -0,0 +1,6 @@ +import { buildBoss } from 'game/raids/builders'; + +export const Siege = buildBoss({ + id: 61822, + name: 'Siege of Boralus', +}); diff --git a/src/game/raids/mythicplusseasonone/StoneVault.ts b/src/game/raids/mythicplusseasonone/StoneVault.ts new file mode 100644 index 00000000000..1aaeb5b7725 --- /dev/null +++ b/src/game/raids/mythicplusseasonone/StoneVault.ts @@ -0,0 +1,6 @@ +import { buildBoss } from 'game/raids/builders'; + +export const StoneVault = buildBoss({ + id: 12652, + name: 'The Stone Vault', +}); diff --git a/src/game/raids/mythicplusseasonone/TempleOfTheJadeSerpent.ts b/src/game/raids/mythicplusseasonone/TempleOfTheJadeSerpent.ts deleted file mode 100644 index 6450f76fe50..00000000000 --- a/src/game/raids/mythicplusseasonone/TempleOfTheJadeSerpent.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/TempleOfTheJadeSerpent.jpg'; -import Headshot from './headshots/TempleOfTheJadeSerpent.jpg'; - -const TempleOfTheJadeSerpent: Boss = { - id: 10960, - name: 'Temple of the Jade Serpent', - background: Background, - headshot: Headshot, - icon: 'achievement_jadeserpent', - fight: {}, -}; - -export default TempleOfTheJadeSerpent; diff --git a/src/game/raids/mythicplusseasonone/backgrounds/AlgetharAcademy.jpg b/src/game/raids/mythicplusseasonone/backgrounds/AlgetharAcademy.jpg deleted file mode 100644 index 161f5927dae..00000000000 Binary files a/src/game/raids/mythicplusseasonone/backgrounds/AlgetharAcademy.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasonone/backgrounds/AzureVault.jpg b/src/game/raids/mythicplusseasonone/backgrounds/AzureVault.jpg deleted file mode 100644 index 2b79a052422..00000000000 Binary files a/src/game/raids/mythicplusseasonone/backgrounds/AzureVault.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasonone/backgrounds/CourtOfStars.jpg b/src/game/raids/mythicplusseasonone/backgrounds/CourtOfStars.jpg deleted file mode 100644 index ce1e593e18c..00000000000 Binary files a/src/game/raids/mythicplusseasonone/backgrounds/CourtOfStars.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasonone/backgrounds/HallsOfValor.jpg b/src/game/raids/mythicplusseasonone/backgrounds/HallsOfValor.jpg deleted file mode 100644 index d713592338c..00000000000 Binary files a/src/game/raids/mythicplusseasonone/backgrounds/HallsOfValor.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasonone/backgrounds/NokhudOffensive.jpg b/src/game/raids/mythicplusseasonone/backgrounds/NokhudOffensive.jpg deleted file mode 100644 index 5b0e58894b8..00000000000 Binary files a/src/game/raids/mythicplusseasonone/backgrounds/NokhudOffensive.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasonone/backgrounds/RubyLifePools.jpg b/src/game/raids/mythicplusseasonone/backgrounds/RubyLifePools.jpg deleted file mode 100644 index 8211f85bcdf..00000000000 Binary files a/src/game/raids/mythicplusseasonone/backgrounds/RubyLifePools.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasonone/backgrounds/Season1.jpg b/src/game/raids/mythicplusseasonone/backgrounds/Season1.jpg new file mode 100644 index 00000000000..0991f99e994 Binary files /dev/null and b/src/game/raids/mythicplusseasonone/backgrounds/Season1.jpg differ diff --git a/src/game/raids/mythicplusseasonone/backgrounds/ShadowmoonBurialGrounds.jpg b/src/game/raids/mythicplusseasonone/backgrounds/ShadowmoonBurialGrounds.jpg deleted file mode 100644 index fec28889dd1..00000000000 Binary files a/src/game/raids/mythicplusseasonone/backgrounds/ShadowmoonBurialGrounds.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasonone/backgrounds/TempleOfTheJadeSerpent.jpg b/src/game/raids/mythicplusseasonone/backgrounds/TempleOfTheJadeSerpent.jpg deleted file mode 100644 index ca05fc9542e..00000000000 Binary files a/src/game/raids/mythicplusseasonone/backgrounds/TempleOfTheJadeSerpent.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasonone/headshots/AlgetharAcademy.jpg b/src/game/raids/mythicplusseasonone/headshots/AlgetharAcademy.jpg deleted file mode 100644 index effa8babef8..00000000000 Binary files a/src/game/raids/mythicplusseasonone/headshots/AlgetharAcademy.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasonone/headshots/AzureVault.jpg b/src/game/raids/mythicplusseasonone/headshots/AzureVault.jpg deleted file mode 100644 index 50c233d8c04..00000000000 Binary files a/src/game/raids/mythicplusseasonone/headshots/AzureVault.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasonone/headshots/CourtOfStars.jpg b/src/game/raids/mythicplusseasonone/headshots/CourtOfStars.jpg deleted file mode 100644 index 8e0cb926571..00000000000 Binary files a/src/game/raids/mythicplusseasonone/headshots/CourtOfStars.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasonone/headshots/HallsOfValor.jpg b/src/game/raids/mythicplusseasonone/headshots/HallsOfValor.jpg deleted file mode 100644 index 440b9928295..00000000000 Binary files a/src/game/raids/mythicplusseasonone/headshots/HallsOfValor.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasonone/headshots/NokhudOffensive.jpg b/src/game/raids/mythicplusseasonone/headshots/NokhudOffensive.jpg deleted file mode 100644 index 1e4c9c2b37e..00000000000 Binary files a/src/game/raids/mythicplusseasonone/headshots/NokhudOffensive.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasonone/headshots/RubyLifePools.jpg b/src/game/raids/mythicplusseasonone/headshots/RubyLifePools.jpg deleted file mode 100644 index 4626fd8ab4e..00000000000 Binary files a/src/game/raids/mythicplusseasonone/headshots/RubyLifePools.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasonone/headshots/ShadowmoonBurialGrounds.jpg b/src/game/raids/mythicplusseasonone/headshots/ShadowmoonBurialGrounds.jpg deleted file mode 100644 index b8619f0e117..00000000000 Binary files a/src/game/raids/mythicplusseasonone/headshots/ShadowmoonBurialGrounds.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasonone/headshots/TempleOfTheJadeSerpent.jpg b/src/game/raids/mythicplusseasonone/headshots/TempleOfTheJadeSerpent.jpg deleted file mode 100644 index 0c06f382332..00000000000 Binary files a/src/game/raids/mythicplusseasonone/headshots/TempleOfTheJadeSerpent.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasonone/index.ts b/src/game/raids/mythicplusseasonone/index.ts index 4bf19013aeb..56ad07354d5 100644 --- a/src/game/raids/mythicplusseasonone/index.ts +++ b/src/game/raids/mythicplusseasonone/index.ts @@ -1,24 +1,25 @@ -import AlgetharAcademy from 'game/raids/mythicplusseasonone/AlgetharAcademy'; -import AzureVault from 'game/raids/mythicplusseasonone/AzureVault'; -import CourtOfStars from 'game/raids/mythicplusseasonone/CourtOfStars'; -import HallsOfValor from 'game/raids/mythicplusseasonone/HallsOfValor'; -import NokhudOffensive from 'game/raids/mythicplusseasonone/NokhudOffensive'; -import RubyLifePools from 'game/raids/mythicplusseasonone/RubyLifePools'; -import ShadowmoonBurialGrounds from 'game/raids/mythicplusseasonone/ShadowmoonBurialGrounds'; -import TempleOfTheJadeSerpent from 'game/raids/mythicplusseasonone/TempleOfTheJadeSerpent'; import type { Raid } from 'game/raids'; +import { StoneVault } from './StoneVault'; +import { Siege } from './Siege'; +import { NecroticWake } from './NecroticWake'; +import { Mists } from './Mists'; +import { GrimBatol } from './GrimBatol'; +import { Dawnbreaker } from './Dawnbreaker'; +import { CityOfThreads } from './CityOfThreads'; +import { AraKara } from './AraKara'; +import background from './backgrounds/Season1.jpg'; export default { name: 'Mythic+ Season 1', - background: undefined, + background, bosses: { - AlgetharAcademy, - AzureVault, - CourtOfStars, - HallsOfValor, - NokhudOffensive, - RubyLifePools, - ShadowmoonBurialGrounds, - TempleOfTheJadeSerpent, + AraKara, + CityOfThreads, + Dawnbreaker, + GrimBatol, + Mists, + NecroticWake, + Siege, + StoneVault, }, } satisfies Raid; diff --git a/src/game/raids/mythicplusseasonthree/AtalDazar.ts b/src/game/raids/mythicplusseasonthree/AtalDazar.ts deleted file mode 100644 index 7c917f6ed83..00000000000 --- a/src/game/raids/mythicplusseasonthree/AtalDazar.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/AtalDazar.jpg'; -import Headshot from './headshots/AtalDazar.jpg'; - -const AtalDazar: Boss = { - id: 61763, - name: "Atal'Dazar", - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_ataldazar', - fight: {}, -}; - -export default AtalDazar; diff --git a/src/game/raids/mythicplusseasonthree/BlackRookHold.ts b/src/game/raids/mythicplusseasonthree/BlackRookHold.ts deleted file mode 100644 index 40b2fe93b1a..00000000000 --- a/src/game/raids/mythicplusseasonthree/BlackRookHold.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/BlackRookHold.jpg'; -import Headshot from './headshots/BlackRookHold.jpg'; - -const BlackRookHold: Boss = { - id: 61501, - name: 'Black Rook Hold', - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_blackrookhold', - fight: {}, -}; - -export default BlackRookHold; diff --git a/src/game/raids/mythicplusseasonthree/DarkheartThicket.ts b/src/game/raids/mythicplusseasonthree/DarkheartThicket.ts deleted file mode 100644 index 4e9741dccfd..00000000000 --- a/src/game/raids/mythicplusseasonthree/DarkheartThicket.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/DarkheartThicket.jpg'; -import Headshot from './headshots/DarkheartThicket.jpg'; - -const DarkheartThicket: Boss = { - id: 61466, - name: 'Darkheart Thicket', - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_darkheartthicket', - fight: {}, -}; - -export default DarkheartThicket; diff --git a/src/game/raids/mythicplusseasonthree/Everbloom.ts b/src/game/raids/mythicplusseasonthree/Everbloom.ts deleted file mode 100644 index 6dc4420b97d..00000000000 --- a/src/game/raids/mythicplusseasonthree/Everbloom.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/Everbloom.png'; -import Headshot from './headshots/Everbloom.jpg'; - -const Everbloom: Boss = { - id: 61279, - name: 'The Everbloom', - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_everbloom', - fight: {}, -}; - -export default Everbloom; diff --git a/src/game/raids/mythicplusseasonthree/GalakrondsFall.ts b/src/game/raids/mythicplusseasonthree/GalakrondsFall.ts deleted file mode 100644 index 5f4d3f1a6f5..00000000000 --- a/src/game/raids/mythicplusseasonthree/GalakrondsFall.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/DawnOfTheInfinite.png'; -import Headshot from './headshots/GalakrondsFall.jpg'; - -const GalakrondsFall: Boss = { - id: 12579, - name: "DOTI: Galakrond's Fall", - background: Background, - headshot: Headshot, - icon: 'ability_evoker_timespiral', - fight: {}, -}; - -export default GalakrondsFall; diff --git a/src/game/raids/mythicplusseasonthree/MurozondsRise.ts b/src/game/raids/mythicplusseasonthree/MurozondsRise.ts deleted file mode 100644 index 7b107e22db9..00000000000 --- a/src/game/raids/mythicplusseasonthree/MurozondsRise.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/DawnOfTheInfinite.png'; -import Headshot from './headshots/MurozondsRise.jpg'; - -const MurozondsRise: Boss = { - id: 12580, - name: "DOTI: Murozond's Rise", - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_dawnoftheinfinite', - fight: {}, -}; - -export default MurozondsRise; diff --git a/src/game/raids/mythicplusseasonthree/README.md b/src/game/raids/mythicplusseasonthree/README.md deleted file mode 100644 index 53983e428b1..00000000000 --- a/src/game/raids/mythicplusseasonthree/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# How to get pictures - -Never use screenshots from Google/Wowhead as their copyright is unknown and likely incompatible. Make your own, or from Blizzard. It's ok if other people provide screenshots, but make sure they're actually theirs and they allow you to relicense them as AGPL. - -## Backgrounds - -An easy way if the dungeons are released is to get them from the dungeon leaderboards: -https://worldofwarcraft.com/en-gb/game/pve/leaderboards/aegwynn/ataldazar - -But I assume they won't be available for PTR dungeons and they're not the prettiest. Alternatively try to find a WoW news article as they generally tend to have good screenshots. These usually don't have good ones for all dungeons, so then you'll just have to enter the dungeons and make your own screenshots. Rogues can often make the best screenshots as they can get close to (final) bosses. Zoom in and disable nameplates, turn settings to max and make your screenshots. - -## Headshots - -For headshots in dungeons just use the dungeon achievement icon. The easiest way is via this list: -https://www.wowhead.com/battle-dungeon-guild-achievements - -# Dungeon IDs - -Look for the MapID of the dungeon here: https://wago.tools/db2/JournalInstance?page=1 - -Add 10,000 to it for dungeons that are becoming an M+ dungeon for the first time. -Add 50,000 more for dungeons that are in the M+ rotation for a second time. diff --git a/src/game/raids/mythicplusseasonthree/ThroneOfTheTides.ts b/src/game/raids/mythicplusseasonthree/ThroneOfTheTides.ts deleted file mode 100644 index c048f1cf348..00000000000 --- a/src/game/raids/mythicplusseasonthree/ThroneOfTheTides.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/ThroneOfTheTides.png'; -import Headshot from './headshots/ThroneOfTheTides.jpg'; - -const ThroneOfTheTides: Boss = { - id: 10643, - name: 'Throne of the Tides', - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_throne-of-the-tides', - fight: {}, -}; - -export default ThroneOfTheTides; diff --git a/src/game/raids/mythicplusseasonthree/WaycrestManor.ts b/src/game/raids/mythicplusseasonthree/WaycrestManor.ts deleted file mode 100644 index d4bfceef352..00000000000 --- a/src/game/raids/mythicplusseasonthree/WaycrestManor.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/WaycrestManor.jpg'; -import Headshot from './headshots/WaycrestManor.jpg'; - -const WaycrestManor: Boss = { - id: 61862, - name: 'Waycrest Manor', - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_waycrestmannor', // Blizz whyyyy - fight: {}, -}; - -export default WaycrestManor; diff --git a/src/game/raids/mythicplusseasonthree/backgrounds/AtalDazar.jpg b/src/game/raids/mythicplusseasonthree/backgrounds/AtalDazar.jpg deleted file mode 100644 index 8fbf9801a37..00000000000 Binary files a/src/game/raids/mythicplusseasonthree/backgrounds/AtalDazar.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasonthree/backgrounds/BlackRookHold.jpg b/src/game/raids/mythicplusseasonthree/backgrounds/BlackRookHold.jpg deleted file mode 100644 index 9c5d7ca58fc..00000000000 Binary files a/src/game/raids/mythicplusseasonthree/backgrounds/BlackRookHold.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasonthree/backgrounds/DarkheartThicket.jpg b/src/game/raids/mythicplusseasonthree/backgrounds/DarkheartThicket.jpg deleted file mode 100644 index 82f436c81ec..00000000000 Binary files a/src/game/raids/mythicplusseasonthree/backgrounds/DarkheartThicket.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasonthree/backgrounds/DawnOfTheInfinite.png b/src/game/raids/mythicplusseasonthree/backgrounds/DawnOfTheInfinite.png deleted file mode 100644 index a51ad7fdd44..00000000000 Binary files a/src/game/raids/mythicplusseasonthree/backgrounds/DawnOfTheInfinite.png and /dev/null differ diff --git a/src/game/raids/mythicplusseasonthree/backgrounds/Everbloom.png b/src/game/raids/mythicplusseasonthree/backgrounds/Everbloom.png deleted file mode 100644 index 9c06e50c058..00000000000 Binary files a/src/game/raids/mythicplusseasonthree/backgrounds/Everbloom.png and /dev/null differ diff --git a/src/game/raids/mythicplusseasonthree/backgrounds/ThroneOfTheTides.png b/src/game/raids/mythicplusseasonthree/backgrounds/ThroneOfTheTides.png deleted file mode 100644 index 76669dc6989..00000000000 Binary files a/src/game/raids/mythicplusseasonthree/backgrounds/ThroneOfTheTides.png and /dev/null differ diff --git a/src/game/raids/mythicplusseasonthree/backgrounds/WaycrestManor.jpg b/src/game/raids/mythicplusseasonthree/backgrounds/WaycrestManor.jpg deleted file mode 100644 index dcb019eb27d..00000000000 Binary files a/src/game/raids/mythicplusseasonthree/backgrounds/WaycrestManor.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasonthree/headshots/AtalDazar.jpg b/src/game/raids/mythicplusseasonthree/headshots/AtalDazar.jpg deleted file mode 100644 index 3497b60e282..00000000000 Binary files a/src/game/raids/mythicplusseasonthree/headshots/AtalDazar.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasonthree/headshots/BlackRookHold.jpg b/src/game/raids/mythicplusseasonthree/headshots/BlackRookHold.jpg deleted file mode 100644 index 9efb97eb829..00000000000 Binary files a/src/game/raids/mythicplusseasonthree/headshots/BlackRookHold.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasonthree/headshots/DarkheartThicket.jpg b/src/game/raids/mythicplusseasonthree/headshots/DarkheartThicket.jpg deleted file mode 100644 index e00ff8a0765..00000000000 Binary files a/src/game/raids/mythicplusseasonthree/headshots/DarkheartThicket.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasonthree/headshots/Everbloom.jpg b/src/game/raids/mythicplusseasonthree/headshots/Everbloom.jpg deleted file mode 100644 index 41001fd4c7e..00000000000 Binary files a/src/game/raids/mythicplusseasonthree/headshots/Everbloom.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasonthree/headshots/GalakrondsFall.jpg b/src/game/raids/mythicplusseasonthree/headshots/GalakrondsFall.jpg deleted file mode 100644 index 8db4886f854..00000000000 Binary files a/src/game/raids/mythicplusseasonthree/headshots/GalakrondsFall.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasonthree/headshots/MurozondsRise.jpg b/src/game/raids/mythicplusseasonthree/headshots/MurozondsRise.jpg deleted file mode 100644 index c42a432f38d..00000000000 Binary files a/src/game/raids/mythicplusseasonthree/headshots/MurozondsRise.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasonthree/headshots/ThroneOfTheTides.jpg b/src/game/raids/mythicplusseasonthree/headshots/ThroneOfTheTides.jpg deleted file mode 100644 index 7833a5c3273..00000000000 Binary files a/src/game/raids/mythicplusseasonthree/headshots/ThroneOfTheTides.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasonthree/headshots/WaycrestManor.jpg b/src/game/raids/mythicplusseasonthree/headshots/WaycrestManor.jpg deleted file mode 100644 index 96e78e8e53a..00000000000 Binary files a/src/game/raids/mythicplusseasonthree/headshots/WaycrestManor.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasonthree/index.ts b/src/game/raids/mythicplusseasonthree/index.ts deleted file mode 100644 index 24a54bd0784..00000000000 --- a/src/game/raids/mythicplusseasonthree/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -import AtalDazar from 'game/raids/mythicplusseasonthree/AtalDazar'; -import BlackRookHold from 'game/raids/mythicplusseasonthree/BlackRookHold'; -import DarkheartThicket from 'game/raids/mythicplusseasonthree/DarkheartThicket'; -import Everbloom from 'game/raids/mythicplusseasonthree/Everbloom'; -import GalakrondsFall from 'game/raids/mythicplusseasonthree/GalakrondsFall'; -import MurozondsRise from 'game/raids/mythicplusseasonthree/MurozondsRise'; -import ThroneOfTheTides from 'game/raids/mythicplusseasonthree/ThroneOfTheTides'; -import WaycrestManor from 'game/raids/mythicplusseasonthree/WaycrestManor'; -import type { Raid } from 'game/raids'; - -export default { - name: 'Mythic+ Season 3', - background: undefined, // TODO: Set up - bosses: { - AtalDazar, - BlackRookHold, - DarkheartThicket, - Everbloom, - GalakrondsFall, - MurozondsRise, - ThroneOfTheTides, - WaycrestManor, - }, -} satisfies Raid; diff --git a/src/game/raids/mythicplusseasontwo/BrackenhideHollow.ts b/src/game/raids/mythicplusseasontwo/BrackenhideHollow.ts deleted file mode 100644 index f47f0407f2f..00000000000 --- a/src/game/raids/mythicplusseasontwo/BrackenhideHollow.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/BrackenhideHollow.jpg'; -import Headshot from './headshots/BrackenhideHollow.jpg'; - -const BrackenhideHollow: Boss = { - id: 12520, - name: 'Brackenhide Hollow', - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_brackenhidehollow', - fight: {}, -}; - -export default BrackenhideHollow; diff --git a/src/game/raids/mythicplusseasontwo/Freehold.ts b/src/game/raids/mythicplusseasontwo/Freehold.ts deleted file mode 100644 index cfffad77a98..00000000000 --- a/src/game/raids/mythicplusseasontwo/Freehold.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/Freehold.jpg'; -import Headshot from './headshots/Freehold.jpg'; - -const Freehold: Boss = { - id: 61754, - name: 'Freehold', - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_freehold', - fight: {}, -}; - -export default Freehold; diff --git a/src/game/raids/mythicplusseasontwo/HallsOfInfusion.ts b/src/game/raids/mythicplusseasontwo/HallsOfInfusion.ts deleted file mode 100644 index a1d65f5878f..00000000000 --- a/src/game/raids/mythicplusseasontwo/HallsOfInfusion.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/HallsOfInfusion.jpg'; -import Headshot from './headshots/HallsOfInfusion.jpg'; - -const HallsOfInfusion: Boss = { - id: 12527, - name: 'Halls of Infusion', - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_hallsofinfusion', - fight: {}, -}; - -export default HallsOfInfusion; diff --git a/src/game/raids/mythicplusseasontwo/NeltharionsLair.ts b/src/game/raids/mythicplusseasontwo/NeltharionsLair.ts deleted file mode 100644 index bb1136ba2db..00000000000 --- a/src/game/raids/mythicplusseasontwo/NeltharionsLair.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/NeltharionsLair.jpg'; -import Headshot from './headshots/NeltharionsLair.jpg'; - -const NeltharionsLair: Boss = { - id: 61458, - name: "Neltharion's Lair", - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_neltharionslair', - fight: {}, -}; - -export default NeltharionsLair; diff --git a/src/game/raids/mythicplusseasontwo/Neltharus.ts b/src/game/raids/mythicplusseasontwo/Neltharus.ts deleted file mode 100644 index e87963d029f..00000000000 --- a/src/game/raids/mythicplusseasontwo/Neltharus.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/Neltharus.jpg'; -import Headshot from './headshots/Neltharus.jpg'; - -const Neltharus: Boss = { - id: 12519, - name: 'Neltharus', - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_neltharus', - fight: {}, -}; - -export default Neltharus; diff --git a/src/game/raids/mythicplusseasontwo/README.md b/src/game/raids/mythicplusseasontwo/README.md deleted file mode 100644 index 53983e428b1..00000000000 --- a/src/game/raids/mythicplusseasontwo/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# How to get pictures - -Never use screenshots from Google/Wowhead as their copyright is unknown and likely incompatible. Make your own, or from Blizzard. It's ok if other people provide screenshots, but make sure they're actually theirs and they allow you to relicense them as AGPL. - -## Backgrounds - -An easy way if the dungeons are released is to get them from the dungeon leaderboards: -https://worldofwarcraft.com/en-gb/game/pve/leaderboards/aegwynn/ataldazar - -But I assume they won't be available for PTR dungeons and they're not the prettiest. Alternatively try to find a WoW news article as they generally tend to have good screenshots. These usually don't have good ones for all dungeons, so then you'll just have to enter the dungeons and make your own screenshots. Rogues can often make the best screenshots as they can get close to (final) bosses. Zoom in and disable nameplates, turn settings to max and make your screenshots. - -## Headshots - -For headshots in dungeons just use the dungeon achievement icon. The easiest way is via this list: -https://www.wowhead.com/battle-dungeon-guild-achievements - -# Dungeon IDs - -Look for the MapID of the dungeon here: https://wago.tools/db2/JournalInstance?page=1 - -Add 10,000 to it for dungeons that are becoming an M+ dungeon for the first time. -Add 50,000 more for dungeons that are in the M+ rotation for a second time. diff --git a/src/game/raids/mythicplusseasontwo/Uldaman.ts b/src/game/raids/mythicplusseasontwo/Uldaman.ts deleted file mode 100644 index c3d4ee59516..00000000000 --- a/src/game/raids/mythicplusseasontwo/Uldaman.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/Uldaman.jpg'; -import Headshot from './headshots/Uldaman.jpg'; - -const Uldaman: Boss = { - id: 12451, - name: 'Uldaman: Legacy of Tyr', - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_uldaman', - fight: {}, -}; - -export default Uldaman; diff --git a/src/game/raids/mythicplusseasontwo/Underrot.ts b/src/game/raids/mythicplusseasontwo/Underrot.ts deleted file mode 100644 index 678a458774b..00000000000 --- a/src/game/raids/mythicplusseasontwo/Underrot.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/Underrot.jpg'; -import Headshot from './headshots/Underrot.jpg'; - -const Underrot: Boss = { - id: 61841, - name: 'The Underrot', - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_underrot', - fight: {}, -}; - -export default Underrot; diff --git a/src/game/raids/mythicplusseasontwo/VortexPinnacle.ts b/src/game/raids/mythicplusseasontwo/VortexPinnacle.ts deleted file mode 100644 index 08a2977d061..00000000000 --- a/src/game/raids/mythicplusseasontwo/VortexPinnacle.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/VortexPinnacle.jpg'; -import Headshot from './headshots/VortexPinnacle.jpg'; - -const VortexPinnacle: Boss = { - id: 10657, - name: 'The Vortex Pinnacle', - background: Background, - headshot: Headshot, - icon: 'achievement_dungeon_skywall', - fight: {}, -}; - -export default VortexPinnacle; diff --git a/src/game/raids/mythicplusseasontwo/backgrounds/BrackenhideHollow.jpg b/src/game/raids/mythicplusseasontwo/backgrounds/BrackenhideHollow.jpg deleted file mode 100644 index 517b1c8a26b..00000000000 Binary files a/src/game/raids/mythicplusseasontwo/backgrounds/BrackenhideHollow.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasontwo/backgrounds/Freehold.jpg b/src/game/raids/mythicplusseasontwo/backgrounds/Freehold.jpg deleted file mode 100644 index 899223f9c94..00000000000 Binary files a/src/game/raids/mythicplusseasontwo/backgrounds/Freehold.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasontwo/backgrounds/HallsOfInfusion.jpg b/src/game/raids/mythicplusseasontwo/backgrounds/HallsOfInfusion.jpg deleted file mode 100644 index b65088d0f33..00000000000 Binary files a/src/game/raids/mythicplusseasontwo/backgrounds/HallsOfInfusion.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasontwo/backgrounds/NeltharionsLair.jpg b/src/game/raids/mythicplusseasontwo/backgrounds/NeltharionsLair.jpg deleted file mode 100644 index 7887796be43..00000000000 Binary files a/src/game/raids/mythicplusseasontwo/backgrounds/NeltharionsLair.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasontwo/backgrounds/Neltharus.jpg b/src/game/raids/mythicplusseasontwo/backgrounds/Neltharus.jpg deleted file mode 100644 index fa32ee9b596..00000000000 Binary files a/src/game/raids/mythicplusseasontwo/backgrounds/Neltharus.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasontwo/backgrounds/Uldaman.jpg b/src/game/raids/mythicplusseasontwo/backgrounds/Uldaman.jpg deleted file mode 100644 index e2c4dbe7c18..00000000000 Binary files a/src/game/raids/mythicplusseasontwo/backgrounds/Uldaman.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasontwo/backgrounds/Underrot.jpg b/src/game/raids/mythicplusseasontwo/backgrounds/Underrot.jpg deleted file mode 100644 index 083a8502675..00000000000 Binary files a/src/game/raids/mythicplusseasontwo/backgrounds/Underrot.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasontwo/backgrounds/VortexPinnacle.jpg b/src/game/raids/mythicplusseasontwo/backgrounds/VortexPinnacle.jpg deleted file mode 100644 index 54136c7c9f6..00000000000 Binary files a/src/game/raids/mythicplusseasontwo/backgrounds/VortexPinnacle.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasontwo/headshots/BrackenhideHollow.jpg b/src/game/raids/mythicplusseasontwo/headshots/BrackenhideHollow.jpg deleted file mode 100644 index d743804385e..00000000000 Binary files a/src/game/raids/mythicplusseasontwo/headshots/BrackenhideHollow.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasontwo/headshots/Freehold.jpg b/src/game/raids/mythicplusseasontwo/headshots/Freehold.jpg deleted file mode 100644 index 747effbe4b4..00000000000 Binary files a/src/game/raids/mythicplusseasontwo/headshots/Freehold.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasontwo/headshots/HallsOfInfusion.jpg b/src/game/raids/mythicplusseasontwo/headshots/HallsOfInfusion.jpg deleted file mode 100644 index d94a257674f..00000000000 Binary files a/src/game/raids/mythicplusseasontwo/headshots/HallsOfInfusion.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasontwo/headshots/NeltharionsLair.jpg b/src/game/raids/mythicplusseasontwo/headshots/NeltharionsLair.jpg deleted file mode 100644 index ccfcf55c329..00000000000 Binary files a/src/game/raids/mythicplusseasontwo/headshots/NeltharionsLair.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasontwo/headshots/Neltharus.jpg b/src/game/raids/mythicplusseasontwo/headshots/Neltharus.jpg deleted file mode 100644 index 6bf83792b33..00000000000 Binary files a/src/game/raids/mythicplusseasontwo/headshots/Neltharus.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasontwo/headshots/Uldaman.jpg b/src/game/raids/mythicplusseasontwo/headshots/Uldaman.jpg deleted file mode 100644 index 3dc3c380f40..00000000000 Binary files a/src/game/raids/mythicplusseasontwo/headshots/Uldaman.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasontwo/headshots/Underrot.jpg b/src/game/raids/mythicplusseasontwo/headshots/Underrot.jpg deleted file mode 100644 index d7067d6188b..00000000000 Binary files a/src/game/raids/mythicplusseasontwo/headshots/Underrot.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasontwo/headshots/VortexPinnacle.jpg b/src/game/raids/mythicplusseasontwo/headshots/VortexPinnacle.jpg deleted file mode 100644 index e608bf6a0bf..00000000000 Binary files a/src/game/raids/mythicplusseasontwo/headshots/VortexPinnacle.jpg and /dev/null differ diff --git a/src/game/raids/mythicplusseasontwo/index.ts b/src/game/raids/mythicplusseasontwo/index.ts deleted file mode 100644 index 2f7d0a44c68..00000000000 --- a/src/game/raids/mythicplusseasontwo/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -import BrackenhideHollow from 'game/raids/mythicplusseasontwo/BrackenhideHollow'; -import Freehold from 'game/raids/mythicplusseasontwo/Freehold'; -import HallsOfInfusion from 'game/raids/mythicplusseasontwo/HallsOfInfusion'; -import Neltharus from 'game/raids/mythicplusseasontwo/Neltharus'; -import Uldaman from 'game/raids/mythicplusseasontwo/Uldaman'; -import Underrot from 'game/raids/mythicplusseasontwo/Underrot'; -import NeltharionsLair from 'game/raids/mythicplusseasontwo/NeltharionsLair'; -import VortexPinnacle from 'game/raids/mythicplusseasontwo/VortexPinnacle'; -import type { Raid } from 'game/raids'; - -export default { - name: 'Mythic+ Season 2', - background: undefined, // TODO: Set up - bosses: { - BrackenhideHollow, - Freehold, - HallsOfInfusion, - NeltharionsLair, - Neltharus, - Uldaman, - Underrot, - VortexPinnacle, - }, -} satisfies Raid; diff --git a/src/game/raids/nerubarpalace/Ansurek.ts b/src/game/raids/nerubarpalace/Ansurek.ts new file mode 100644 index 00000000000..4ace791cd49 --- /dev/null +++ b/src/game/raids/nerubarpalace/Ansurek.ts @@ -0,0 +1,8 @@ +import { buildBoss } from 'game/raids/builders'; +import background from './backgrounds/Ansurek.jpg'; + +export const Ansurek = buildBoss({ + id: 2922, + name: 'Queen Ansurek', + background, +}); diff --git a/src/game/raids/nerubarpalace/BloodboundHorror.ts b/src/game/raids/nerubarpalace/BloodboundHorror.ts new file mode 100644 index 00000000000..754a43b0563 --- /dev/null +++ b/src/game/raids/nerubarpalace/BloodboundHorror.ts @@ -0,0 +1,8 @@ +import { buildBoss } from 'game/raids/builders'; +import background from './backgrounds/BloodboundHorror.jpg'; + +export const BloodboundHorror = buildBoss({ + id: 2917, + name: 'The Bloodbound Horror', + background, +}); diff --git a/src/game/raids/nerubarpalace/Kyveza.ts b/src/game/raids/nerubarpalace/Kyveza.ts new file mode 100644 index 00000000000..a499071d188 --- /dev/null +++ b/src/game/raids/nerubarpalace/Kyveza.ts @@ -0,0 +1,8 @@ +import { buildBoss } from 'game/raids/builders'; +import background from './backgrounds/Kyveza.jpg'; + +export const Kyveza = buildBoss({ + id: 2920, + name: "Nexus-Princess Ky'veza", + background, +}); diff --git a/src/game/raids/nerubarpalace/Ovinax.ts b/src/game/raids/nerubarpalace/Ovinax.ts new file mode 100644 index 00000000000..381dc95bea4 --- /dev/null +++ b/src/game/raids/nerubarpalace/Ovinax.ts @@ -0,0 +1,8 @@ +import { buildBoss } from 'game/raids/builders'; +import background from './backgrounds/Ovinax.jpg'; + +export const Ovinax = buildBoss({ + id: 2919, + name: "Broodtwister Ovi'nax", + background, +}); diff --git a/src/game/raids/nerubarpalace/Rashanan.ts b/src/game/raids/nerubarpalace/Rashanan.ts new file mode 100644 index 00000000000..c442ee24d21 --- /dev/null +++ b/src/game/raids/nerubarpalace/Rashanan.ts @@ -0,0 +1,8 @@ +import { buildBoss } from 'game/raids/builders'; +import background from './backgrounds/Rashanan.jpg'; + +export const Rashanan = buildBoss({ + id: 2918, + name: "Rasha'nan", + background, +}); diff --git a/src/game/raids/nerubarpalace/Sikran.ts b/src/game/raids/nerubarpalace/Sikran.ts new file mode 100644 index 00000000000..c91765db482 --- /dev/null +++ b/src/game/raids/nerubarpalace/Sikran.ts @@ -0,0 +1,6 @@ +import { buildBoss } from 'game/raids/builders'; + +export const Sikran = buildBoss({ + id: 2898, + name: 'Sikran, Captain of the Sureki', +}); diff --git a/src/game/raids/nerubarpalace/SilkenCourt.ts b/src/game/raids/nerubarpalace/SilkenCourt.ts new file mode 100644 index 00000000000..55a455b384a --- /dev/null +++ b/src/game/raids/nerubarpalace/SilkenCourt.ts @@ -0,0 +1,8 @@ +import { buildBoss } from 'game/raids/builders'; +import background from './backgrounds/SilkenCourt.jpg'; + +export const SilkenCourt = buildBoss({ + id: 2921, + name: 'The Silken Court', + background, +}); diff --git a/src/game/raids/nerubarpalace/Ulgrax.ts b/src/game/raids/nerubarpalace/Ulgrax.ts new file mode 100644 index 00000000000..1c73ba91e1b --- /dev/null +++ b/src/game/raids/nerubarpalace/Ulgrax.ts @@ -0,0 +1,6 @@ +import { buildBoss } from 'game/raids/builders'; + +export const Ulgrax = buildBoss({ + id: 2902, + name: 'Ulgrax the Devourer', +}); diff --git a/src/game/raids/nerubarpalace/backgrounds/Ansurek.jpg b/src/game/raids/nerubarpalace/backgrounds/Ansurek.jpg new file mode 100644 index 00000000000..ced6bbd8bd7 Binary files /dev/null and b/src/game/raids/nerubarpalace/backgrounds/Ansurek.jpg differ diff --git a/src/game/raids/nerubarpalace/backgrounds/BloodboundHorror.jpg b/src/game/raids/nerubarpalace/backgrounds/BloodboundHorror.jpg new file mode 100644 index 00000000000..987576eaaeb Binary files /dev/null and b/src/game/raids/nerubarpalace/backgrounds/BloodboundHorror.jpg differ diff --git a/src/game/raids/nerubarpalace/backgrounds/Kyveza.jpg b/src/game/raids/nerubarpalace/backgrounds/Kyveza.jpg new file mode 100644 index 00000000000..8dc346dfce0 Binary files /dev/null and b/src/game/raids/nerubarpalace/backgrounds/Kyveza.jpg differ diff --git a/src/game/raids/nerubarpalace/backgrounds/NerubarPalace.jpg b/src/game/raids/nerubarpalace/backgrounds/NerubarPalace.jpg new file mode 100644 index 00000000000..e1b627f68c1 Binary files /dev/null and b/src/game/raids/nerubarpalace/backgrounds/NerubarPalace.jpg differ diff --git a/src/game/raids/nerubarpalace/backgrounds/Ovinax.jpg b/src/game/raids/nerubarpalace/backgrounds/Ovinax.jpg new file mode 100644 index 00000000000..f18bf2e92e0 Binary files /dev/null and b/src/game/raids/nerubarpalace/backgrounds/Ovinax.jpg differ diff --git a/src/game/raids/nerubarpalace/backgrounds/Rashanan.jpg b/src/game/raids/nerubarpalace/backgrounds/Rashanan.jpg new file mode 100644 index 00000000000..cab82d849b1 Binary files /dev/null and b/src/game/raids/nerubarpalace/backgrounds/Rashanan.jpg differ diff --git a/src/game/raids/nerubarpalace/backgrounds/SilkenCourt.jpg b/src/game/raids/nerubarpalace/backgrounds/SilkenCourt.jpg new file mode 100644 index 00000000000..b961835716f Binary files /dev/null and b/src/game/raids/nerubarpalace/backgrounds/SilkenCourt.jpg differ diff --git a/src/game/raids/nerubarpalace/index.ts b/src/game/raids/nerubarpalace/index.ts index 70ff9f5b1e6..48a367de268 100644 --- a/src/game/raids/nerubarpalace/index.ts +++ b/src/game/raids/nerubarpalace/index.ts @@ -1,7 +1,26 @@ import type { Raid } from 'game/raids'; +import { Ansurek } from './Ansurek'; +import { BloodboundHorror } from './BloodboundHorror'; +import { Kyveza } from './Kyveza'; +import { Ovinax } from './Ovinax'; +import { Rashanan } from './Rashanan'; +import { Sikran } from './Sikran'; +import { SilkenCourt } from './SilkenCourt'; +import { Ulgrax } from './Ulgrax'; +import background from './backgrounds/NerubarPalace.jpg'; + export default { name: "Nerub'ar Palace", - background: undefined, - bosses: {}, + background, + bosses: { + Ansurek, + BloodboundHorror, + Kyveza, + Ovinax, + Rashanan, + Sikran, + SilkenCourt, + Ulgrax, + }, } satisfies Raid; diff --git a/src/game/raids/vaultoftheincarnates/BroodkeeperDiurna.ts b/src/game/raids/vaultoftheincarnates/BroodkeeperDiurna.ts deleted file mode 100644 index 3ef5caa328a..00000000000 --- a/src/game/raids/vaultoftheincarnates/BroodkeeperDiurna.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/broodkeeper.jpg'; -import Headshot from './headshots/BroodkeeperDiurna.jpg'; - -const BroodkeeperDiurna: Boss = { - id: 2614, - name: 'Broodkeeper Diurna', - background: Background, - headshot: Headshot, - icon: 'achievement_raidprimalist_diurna', - fight: {}, -}; - -export default BroodkeeperDiurna; diff --git a/src/game/raids/vaultoftheincarnates/Dathea.ts b/src/game/raids/vaultoftheincarnates/Dathea.ts deleted file mode 100644 index 8411042ab60..00000000000 --- a/src/game/raids/vaultoftheincarnates/Dathea.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/dathea.jpg'; -import Headshot from './headshots/Dathea.jpg'; - -const Dathea: Boss = { - id: 2635, - name: 'Dathea, Ascended', - background: Background, - headshot: Headshot, - icon: 'achievement_raidprimalist_windelemental', - fight: {}, -}; - -export default Dathea; diff --git a/src/game/raids/vaultoftheincarnates/Eranog.ts b/src/game/raids/vaultoftheincarnates/Eranog.ts deleted file mode 100644 index 98fa0b0d811..00000000000 --- a/src/game/raids/vaultoftheincarnates/Eranog.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/eranog.jpg'; -import Headshot from './headshots/Eranog.jpg'; - -const Eranog: Boss = { - id: 2587, - name: 'Eranog', - background: Background, - headshot: Headshot, - icon: 'achievement_raidprimalist_eranog', - fight: {}, -}; - -export default Eranog; diff --git a/src/game/raids/vaultoftheincarnates/KurogGrimtotem.ts b/src/game/raids/vaultoftheincarnates/KurogGrimtotem.ts deleted file mode 100644 index bc8a1a208bb..00000000000 --- a/src/game/raids/vaultoftheincarnates/KurogGrimtotem.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/kurog.jpg'; -import Headshot from './headshots/KurogGrimtotem.jpg'; - -const KurogGrimtotem: Boss = { - id: 2605, - name: 'Kurog Grimtotem', - background: Background, - headshot: Headshot, - icon: 'achievement_raidprimalist_kurog', - fight: {}, -}; - -export default KurogGrimtotem; diff --git a/src/game/raids/vaultoftheincarnates/PrimalCouncil.ts b/src/game/raids/vaultoftheincarnates/PrimalCouncil.ts deleted file mode 100644 index 4328d0bb989..00000000000 --- a/src/game/raids/vaultoftheincarnates/PrimalCouncil.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/primalcouncil.jpg'; -import Headshot from './headshots/PrimalCouncil.jpg'; - -const PrimalCouncil: Boss = { - id: 2590, - name: 'The Primal Council', - background: Background, - headshot: Headshot, - icon: 'achievement_raidprimalist_council', - fight: {}, -}; - -export default PrimalCouncil; diff --git a/src/game/raids/vaultoftheincarnates/Raszageth.ts b/src/game/raids/vaultoftheincarnates/Raszageth.ts deleted file mode 100644 index 4c0d25b024e..00000000000 --- a/src/game/raids/vaultoftheincarnates/Raszageth.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/raszageth.jpg'; -import Headshot from './headshots/Raszageth.jpg'; - -const Raszageth: Boss = { - id: 2607, - name: 'Raszageth the Storm-Eater', - background: Background, - headshot: Headshot, - icon: 'achievement_raidprimalist_raszageth', - fight: { - resultsWarning: - "During the first intermission, the two teams are briefly out of logging range of each other. This can cause errors in analysis. You can work around this by using a log uploaded by a person that is on the same side platform as the player you're analyzing.", - }, -}; - -export default Raszageth; diff --git a/src/game/raids/vaultoftheincarnates/Sennarth.ts b/src/game/raids/vaultoftheincarnates/Sennarth.ts deleted file mode 100644 index 03d3530035a..00000000000 --- a/src/game/raids/vaultoftheincarnates/Sennarth.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/sennarth.jpg'; -import Headshot from './headshots/Sennarth.jpg'; - -const Sennarth: Boss = { - id: 2592, - name: 'Sennarth, the Cold Breath', - background: Background, - headshot: Headshot, - icon: 'achievement_raidprimalist_sennarth', - fight: {}, -}; - -export default Sennarth; diff --git a/src/game/raids/vaultoftheincarnates/Terros.ts b/src/game/raids/vaultoftheincarnates/Terros.ts deleted file mode 100644 index 1657d134af9..00000000000 --- a/src/game/raids/vaultoftheincarnates/Terros.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Boss } from 'game/raids'; - -import Background from './backgrounds/terros.jpg'; -import Headshot from './headshots/Terros.jpg'; - -const Terros: Boss = { - id: 2639, - name: 'Terros', - background: Background, - headshot: Headshot, - icon: 'achievement_raidprimalist_terros', - fight: {}, -}; - -export default Terros; diff --git a/src/game/raids/vaultoftheincarnates/backgrounds/broodkeeper.jpg b/src/game/raids/vaultoftheincarnates/backgrounds/broodkeeper.jpg deleted file mode 100644 index 7bef2eea3fd..00000000000 Binary files a/src/game/raids/vaultoftheincarnates/backgrounds/broodkeeper.jpg and /dev/null differ diff --git a/src/game/raids/vaultoftheincarnates/backgrounds/dathea.jpg b/src/game/raids/vaultoftheincarnates/backgrounds/dathea.jpg deleted file mode 100644 index befc3883953..00000000000 Binary files a/src/game/raids/vaultoftheincarnates/backgrounds/dathea.jpg and /dev/null differ diff --git a/src/game/raids/vaultoftheincarnates/backgrounds/eranog.jpg b/src/game/raids/vaultoftheincarnates/backgrounds/eranog.jpg deleted file mode 100644 index 1e657245c40..00000000000 Binary files a/src/game/raids/vaultoftheincarnates/backgrounds/eranog.jpg and /dev/null differ diff --git a/src/game/raids/vaultoftheincarnates/backgrounds/kurog.jpg b/src/game/raids/vaultoftheincarnates/backgrounds/kurog.jpg deleted file mode 100644 index ec025677a03..00000000000 Binary files a/src/game/raids/vaultoftheincarnates/backgrounds/kurog.jpg and /dev/null differ diff --git a/src/game/raids/vaultoftheincarnates/backgrounds/overview.jpg b/src/game/raids/vaultoftheincarnates/backgrounds/overview.jpg deleted file mode 100644 index cb93857b849..00000000000 Binary files a/src/game/raids/vaultoftheincarnates/backgrounds/overview.jpg and /dev/null differ diff --git a/src/game/raids/vaultoftheincarnates/backgrounds/primalcouncil.jpg b/src/game/raids/vaultoftheincarnates/backgrounds/primalcouncil.jpg deleted file mode 100644 index 89a659fa7ad..00000000000 Binary files a/src/game/raids/vaultoftheincarnates/backgrounds/primalcouncil.jpg and /dev/null differ diff --git a/src/game/raids/vaultoftheincarnates/backgrounds/raszageth.jpg b/src/game/raids/vaultoftheincarnates/backgrounds/raszageth.jpg deleted file mode 100644 index 57601515fd1..00000000000 Binary files a/src/game/raids/vaultoftheincarnates/backgrounds/raszageth.jpg and /dev/null differ diff --git a/src/game/raids/vaultoftheincarnates/backgrounds/sennarth.jpg b/src/game/raids/vaultoftheincarnates/backgrounds/sennarth.jpg deleted file mode 100644 index d047e86966b..00000000000 Binary files a/src/game/raids/vaultoftheincarnates/backgrounds/sennarth.jpg and /dev/null differ diff --git a/src/game/raids/vaultoftheincarnates/backgrounds/terros.jpg b/src/game/raids/vaultoftheincarnates/backgrounds/terros.jpg deleted file mode 100644 index d8744ae8d3a..00000000000 Binary files a/src/game/raids/vaultoftheincarnates/backgrounds/terros.jpg and /dev/null differ diff --git a/src/game/raids/vaultoftheincarnates/headshots/BroodkeeperDiurna.jpg b/src/game/raids/vaultoftheincarnates/headshots/BroodkeeperDiurna.jpg deleted file mode 100644 index add92366e63..00000000000 Binary files a/src/game/raids/vaultoftheincarnates/headshots/BroodkeeperDiurna.jpg and /dev/null differ diff --git a/src/game/raids/vaultoftheincarnates/headshots/Dathea.jpg b/src/game/raids/vaultoftheincarnates/headshots/Dathea.jpg deleted file mode 100644 index 41890f73768..00000000000 Binary files a/src/game/raids/vaultoftheincarnates/headshots/Dathea.jpg and /dev/null differ diff --git a/src/game/raids/vaultoftheincarnates/headshots/Eranog.jpg b/src/game/raids/vaultoftheincarnates/headshots/Eranog.jpg deleted file mode 100644 index 17ef6036b8f..00000000000 Binary files a/src/game/raids/vaultoftheincarnates/headshots/Eranog.jpg and /dev/null differ diff --git a/src/game/raids/vaultoftheincarnates/headshots/KurogGrimtotem.jpg b/src/game/raids/vaultoftheincarnates/headshots/KurogGrimtotem.jpg deleted file mode 100644 index 3ce785c52d8..00000000000 Binary files a/src/game/raids/vaultoftheincarnates/headshots/KurogGrimtotem.jpg and /dev/null differ diff --git a/src/game/raids/vaultoftheincarnates/headshots/PrimalCouncil.jpg b/src/game/raids/vaultoftheincarnates/headshots/PrimalCouncil.jpg deleted file mode 100644 index e8a19a7dfc7..00000000000 Binary files a/src/game/raids/vaultoftheincarnates/headshots/PrimalCouncil.jpg and /dev/null differ diff --git a/src/game/raids/vaultoftheincarnates/headshots/Raszageth.jpg b/src/game/raids/vaultoftheincarnates/headshots/Raszageth.jpg deleted file mode 100644 index 9f4505241b9..00000000000 Binary files a/src/game/raids/vaultoftheincarnates/headshots/Raszageth.jpg and /dev/null differ diff --git a/src/game/raids/vaultoftheincarnates/headshots/Sennarth.jpg b/src/game/raids/vaultoftheincarnates/headshots/Sennarth.jpg deleted file mode 100644 index 1d80f0d7c78..00000000000 Binary files a/src/game/raids/vaultoftheincarnates/headshots/Sennarth.jpg and /dev/null differ diff --git a/src/game/raids/vaultoftheincarnates/headshots/Terros.jpg b/src/game/raids/vaultoftheincarnates/headshots/Terros.jpg deleted file mode 100644 index 67144695b51..00000000000 Binary files a/src/game/raids/vaultoftheincarnates/headshots/Terros.jpg and /dev/null differ diff --git a/src/game/raids/vaultoftheincarnates/index.ts b/src/game/raids/vaultoftheincarnates/index.ts deleted file mode 100644 index b634c154197..00000000000 --- a/src/game/raids/vaultoftheincarnates/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -import Background from './backgrounds/overview.jpg'; -import Eranog from 'game/raids/vaultoftheincarnates/Eranog'; -import PrimalCouncil from 'game/raids/vaultoftheincarnates/PrimalCouncil'; -import Terros from 'game/raids/vaultoftheincarnates/Terros'; -import Sennarth from 'game/raids/vaultoftheincarnates/Sennarth'; -import Dathea from 'game/raids/vaultoftheincarnates/Dathea'; -import KurogGrimtotem from 'game/raids/vaultoftheincarnates/KurogGrimtotem'; -import BroodkeeperDiurna from 'game/raids/vaultoftheincarnates/BroodkeeperDiurna'; -import Raszageth from 'game/raids/vaultoftheincarnates/Raszageth'; -import type { Raid } from 'game/raids'; - -export default { - name: 'Vault of the Incarnates', - background: Background, - bosses: { - Eranog, - Terros, - PrimalCouncil, - Sennarth, - Dathea, - KurogGrimtotem, - BroodkeeperDiurna, - Raszageth, - }, -} satisfies Raid; diff --git a/src/interface/CharacterParses.tsx b/src/interface/CharacterParses.tsx index 401b7980a86..beadc474fcc 100644 --- a/src/interface/CharacterParses.tsx +++ b/src/interface/CharacterParses.tsx @@ -41,7 +41,7 @@ const ORDER_BY = { DPS: 1, PERCENTILE: 2, }; -const DEFAULT_RETAIL_ZONE = 35; // Amirdrassil +const DEFAULT_RETAIL_ZONE = 38; // Nerub'ar Palace const DEFAULT_CLASSIC_ZONE = 1023; // BWD / BoT / TotFW const BOSS_DEFAULT_ALL_BOSSES = 0; const FALLBACK_PICTURE = '/img/fallback-character.jpg'; diff --git a/src/interface/guide/components/Preparation/PreparationSection.tsx b/src/interface/guide/components/Preparation/PreparationSection.tsx index b8674a42601..314692d24fb 100644 --- a/src/interface/guide/components/Preparation/PreparationSection.tsx +++ b/src/interface/guide/components/Preparation/PreparationSection.tsx @@ -4,7 +4,7 @@ import Spell, { Enchant } from 'common/SPELLS/Spell'; import EnchantmentSubSection from './EnchantmentSubSection'; import ConsumablesSubSection from './ConsumablesSubSection'; import EnhancementSubSection from 'interface/guide/components/Preparation/EnhancementSubSection'; -import Expansion, { isRetailExpansion } from 'game/Expansion'; +import Expansion, { isRetailExpansion, RETAIL_EXPANSION } from 'game/Expansion'; interface Props { recommendedEnchantments?: Record; @@ -18,7 +18,7 @@ const PreparationSection = ({ recommendedFlasks, recommendedFoods, recommendedWeaponEnhancements, - expansion = Expansion.Dragonflight, + expansion = RETAIL_EXPANSION, }: Props) => (