Skip to content

Commit

Permalink
Merge branch 'dragonflight' of https://github.com/WoWAnalyzer/WoWAnal…
Browse files Browse the repository at this point in the history
…yzer into dragonflight
  • Loading branch information
Krealle committed Apr 4, 2024
2 parents aaccaad + 9feb1a9 commit 934276a
Show file tree
Hide file tree
Showing 28 changed files with 1,247 additions and 12 deletions.
1 change: 1 addition & 0 deletions src/CHANGELOG.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import SpellLink from 'interface/SpellLink';

// prettier-ignore
export default [
change(date(2024, 3, 30), 'Update Nymue spellids and make Channeling normalizer normalize fabricated Prepull events.', Vollmer),
change(date(2024, 3, 27), 'Rewrite events tab in TypeScript.', ToppleTheNun),
change(date(2024, 3, 26), 'Add patch 10.2.6.', ToppleTheNun),
change(date(2024, 3, 26), 'Add Dragonflight season 4 M+ dungeons and zone.', ToppleTheNun),
Expand Down
2 changes: 2 additions & 0 deletions src/analysis/retail/evoker/augmentation/CHANGELOG.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import SPELLS from 'common/SPELLS/evoker';
import RESOURCE_TYPES from 'game/RESOURCE_TYPES';

export default [
change(date(2024, 4, 1), <>Added analysis for <SpellLink spell={TALENTS.RENEWING_BLAZE_TALENT} />, <SpellLink spell={TALENTS.OBSIDIAN_SCALES_TALENT} /> and <SpellLink spell={TALENTS.TWIN_GUARDIAN_TALENT} />.</>, Vollmer),
change(date(2024, 3, 30), <>Fix prepull <SpellLink spell={SPELLS.LIVING_FLAME_CAST} /> casts to properly display channel time.</>, Vollmer),
change(date(2024, 3, 7), <>Fix an issue with <SpellLink spell={TALENTS.POTENT_MANA_TALENT} /> module when no <SpellLink spell={TALENTS.SOURCE_OF_MAGIC_TALENT} /> was active during the fight.</>, Vollmer),
change(date(2024, 2, 10), <>Fix crash in <SpellLink spell={TALENTS.SOURCE_OF_MAGIC_TALENT} /> module.</>, Trevor),
change(date(2024, 2, 3), <>Implement <SpellLink spell={TALENTS.SOURCE_OF_MAGIC_TALENT} /> and <SpellLink spell={TALENTS.POTENT_MANA_TALENT} /> modules.</>, Vollmer),
Expand Down
15 changes: 15 additions & 0 deletions src/analysis/retail/evoker/augmentation/CombatLogParser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,18 +36,27 @@ import T31Augmentation4P from './modules/dragonflight/T31Augmentation4P';

//Shared
import {
LivingFlameNormalizer,
LivingFlamePrePullNormalizer,
LeapingFlamesNormalizer,
LeapingFlames,
SpellEssenceCost,
EssenceTracker,
EssenceGraph,
SourceOfMagic,
PotentMana,
ObsidianScales,
DefensiveNormalizer,
DefensiveCastLinkNormalizer,
TwinGuardian,
RenewingBlaze,
} from 'analysis/retail/evoker/shared';

class CombatLogParser extends MainCombatLogParser {
static specModules = {
// Shared
livingFlameNormalizer: LivingFlameNormalizer,
livingFlamePrePullNormalizer: LivingFlamePrePullNormalizer,
leapingFlamesNormalizer: LeapingFlamesNormalizer,
leapingFlames: LeapingFlames,
spellEssenceCost: SpellEssenceCost,
Expand All @@ -56,6 +65,12 @@ class CombatLogParser extends MainCombatLogParser {
sourceOfMagic: SourceOfMagic,
potentMana: PotentMana,

obsidianScales: ObsidianScales,
defensiveCastLinkNormalizer: DefensiveCastLinkNormalizer,
defensiveNormalizer: DefensiveNormalizer,
twinGuardian: TwinGuardian,
renewingBlaze: RenewingBlaze,

// Normalizers
castLinkNormalizer: CastLinkNormalizer,
prescienceNormalizer: PrescienceNormalizer,
Expand Down
2 changes: 2 additions & 0 deletions src/analysis/retail/evoker/augmentation/Guide.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { CooldownSection } from './modules/guide/Cooldown';
import { IntroSection } from './modules/guide/IntroSection';
import { CoreRotationSection } from './modules/guide/CoreRotation';
import { Helpers } from './modules/guide/Helpers';
import MajorDefensives from '../shared/modules/MajorDefensives/DefensivesGuide';

export default function Guide({ modules, events, info }: GuideProps<typeof CombatLogParser>) {
return (
Expand All @@ -13,6 +14,7 @@ export default function Guide({ modules, events, info }: GuideProps<typeof Comba
<Helpers modules={modules} events={events} info={info} />
<CoreRotationSection modules={modules} events={events} info={info} />
<CooldownSection modules={modules} info={info} events={events} />
<MajorDefensives />
<PreparationSection />
</>
);
Expand Down
2 changes: 2 additions & 0 deletions src/analysis/retail/evoker/devastation/CHANGELOG.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import SPELLS from 'common/SPELLS/evoker';
import RESOURCE_TYPES from 'game/RESOURCE_TYPES';

export default [
change(date(2024, 4, 1), <>Added analysis for <SpellLink spell={TALENTS.RENEWING_BLAZE_TALENT} />, <SpellLink spell={TALENTS.OBSIDIAN_SCALES_TALENT} /> and <SpellLink spell={TALENTS.TWIN_GUARDIAN_TALENT} />.</>, Vollmer),
change(date(2024, 3, 30), <>Fix prepull <SpellLink spell={SPELLS.LIVING_FLAME_CAST} /> casts to properly display channel time.</>, Vollmer),
change(date(2024, 3, 17), 'Update APL Check and timeline cleanup.', Vollmer),
change(date(2024, 3, 7), <>Fix an issue with <SpellLink spell={TALENTS.POTENT_MANA_TALENT} /> module when no <SpellLink spell={TALENTS.SOURCE_OF_MAGIC_TALENT} /> was active during the fight.</>, Vollmer),
change(date(2024, 3, 6), <>Make it more apparent that you can mouseover points in the <SpellLink spell={SPELLS.DISINTEGRATE} /> graph.</>, Vollmer),
Expand Down
15 changes: 15 additions & 0 deletions src/analysis/retail/evoker/devastation/CombatLogParser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,18 +32,27 @@ import T31DevaTier from './modules/dragonflight/tier/T31DevaTier';

// Shared
import {
LivingFlameNormalizer,
LivingFlamePrePullNormalizer,
LeapingFlamesNormalizer,
LeapingFlames,
SpellEssenceCost,
EssenceTracker,
EssenceGraph,
SourceOfMagic,
PotentMana,
ObsidianScales,
DefensiveNormalizer,
DefensiveCastLinkNormalizer,
TwinGuardian,
RenewingBlaze,
} from 'analysis/retail/evoker/shared';

class CombatLogParser extends MainCombatLogParser {
static specModules = {
// Shared
livingFlameNormalizer: LivingFlameNormalizer,
livingFlamePrePullNormalizer: LivingFlamePrePullNormalizer,
leapingFlamesNormalizer: LeapingFlamesNormalizer,
leapingFlames: LeapingFlames,
spellEssenceCost: SpellEssenceCost,
Expand All @@ -52,6 +61,12 @@ class CombatLogParser extends MainCombatLogParser {
sourceOfMagic: SourceOfMagic,
potentMana: PotentMana,

obsidianScales: ObsidianScales,
defensiveCastLinkNormalizer: DefensiveCastLinkNormalizer,
defensiveNormalizer: DefensiveNormalizer,
twinGuardian: TwinGuardian,
renewingBlaze: RenewingBlaze,

// Core
abilities: Abilities,
buffs: Buffs,
Expand Down
2 changes: 2 additions & 0 deletions src/analysis/retail/evoker/devastation/Guide.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { DamageEfficiency } from './modules/guide/DamageEfficiencySection';
import { EssenceGraphSection } from './modules/guide/EssenceGraphSection';
import { DragonRageSection } from './modules/guide/DragonRageSection';
import { IntroSection } from './modules/guide/IntroSection';
import MajorDefensives from '../shared/modules/MajorDefensives/DefensivesGuide';

export default function Guide({ modules, events, info }: GuideProps<typeof CombatLogParser>) {
return (
Expand All @@ -17,6 +18,7 @@ export default function Guide({ modules, events, info }: GuideProps<typeof Comba
<DragonRageSection modules={modules} info={info} events={events} />
<DamageEfficiency modules={modules} info={info} events={events} />
<CoreRotation modules={modules} info={info} events={events} />
<MajorDefensives />
<PreparationSection />
</>
);
Expand Down
1 change: 1 addition & 0 deletions src/analysis/retail/evoker/preservation/CHANGELOG.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import RESOURCE_TYPES from 'game/RESOURCE_TYPES';
import { ResourceLink, SpellLink } from 'interface';

export default [
change(date(2024, 3, 30), <>Fix prepull <SpellLink spell={SPELLS.LIVING_FLAME_CAST} /> casts to properly display channel time.</>, Vollmer),
change(date(2024, 3, 12), <>Implement <SpellLink spell={TALENTS_EVOKER.TIME_OF_NEED_TALENT} /> module.</>, Harrek),
change(date(2024, 3, 7), <>Fix an issue with <SpellLink spell={TALENTS_EVOKER.POTENT_MANA_TALENT} /> module when no <SpellLink spell={TALENTS_EVOKER.SOURCE_OF_MAGIC_TALENT} /> was active during the fight.</>, Vollmer),
change(date(2024, 2, 18), <>Add spell cast time to <SpellLink spell={TALENTS_EVOKER.STASIS_TALENT}/> module</>, Trevor),
Expand Down
4 changes: 3 additions & 1 deletion src/analysis/retail/evoker/preservation/CombatLogParser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,9 @@ import AncientFlame from './modules/talents/AncientFlame';
import T31PrevokerSet from './modules/dragonflight/tier/T31TierSet';
import EchoTypeBreakdown from './modules/talents/EchoTypeBreakdown';
import {
LeapingFlamesNormalizer,
LivingFlameNormalizer,
LivingFlamePrePullNormalizer,
LeapingFlamesNormalizer,
LeapingFlames,
SpellEssenceCost,
EssenceTracker,
Expand Down Expand Up @@ -91,6 +92,7 @@ class CombatLogParser extends CoreCombatLogParser {
hotAttributor: HotAttributor,

// Shared talents
livingFlamePrePullNormalizer: LivingFlamePrePullNormalizer,
leapingFlamesNormalizer: LeapingFlamesNormalizer,
leapingFlames: LeapingFlames,
sourceOfMagic: SourceOfMagic,
Expand Down
8 changes: 7 additions & 1 deletion src/analysis/retail/evoker/shared/index.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,23 @@
export {
default as LeapingFlamesNormalizer,
default as LivingFlameNormalizer,
getLeapingDamageEvents,
getLeapingHealEvents,
generatedEssenceBurst,
getCastedGeneratedEssenceBurst,
isFromLeapingFlames,
getWastedEssenceBurst,
} from './modules/normalizers/LeapingFlamesNormalizer';
export { default as LivingFlameNormalizer } from './modules/normalizers/LivingFlameNormalizer';
export { default as LeapingFlames } from './modules/talents/LeapingFlames';
export { default as LivingFlamePrePullNormalizer } from './modules/normalizers/LivingFlamePrePullNormalizer';
export { default as SpellEssenceCost } from './modules/core/essence/SpellEssenceCost';
export { default as EssenceTracker } from './modules/core/essence/EssenceTracker';
export { default as EssenceGraph } from './modules/core/essence/EssenceGraph';
export { default as SourceOfMagic } from './modules/talents/SourceOfMagic';
export { default as PotentMana } from './modules/talents/PotentMana';
export { default as ObsidianScales } from './modules/MajorDefensives/ObsidianScales';
export { default as DefensiveNormalizer } from './modules/normalizers/DefensiveNormalizer';
export { default as DefensiveCastLinkNormalizer } from './modules/normalizers/DefensiveCastLinkNormalizer';
export { default as TwinGuardian } from './modules/MajorDefensives/TwinGuardian';
export { default as RenewingBlaze } from './modules/MajorDefensives/RenewingBlaze';
export * from './constants';
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import { GoodColor, Section, SubSection, useAnalyzers } from 'interface/guide';
import ObsidianScales from './ObsidianScales';
import HideExplanationsToggle from 'interface/guide/components/HideExplanationsToggle';
import Explanation from 'interface/guide/components/Explanation';
import Timeline from 'interface/guide/components/MajorDefensives/Timeline';
import AllCooldownUsageList from 'interface/guide/components/MajorDefensives/AllCooldownUsagesList';
import { SpellLink, TooltipElement } from 'interface';
import { Highlight } from 'interface/Highlight';
import TALENTS from 'common/TALENTS/evoker';
import TwinGuardian from './TwinGuardian';
import RenewingBlaze from './RenewingBlaze';

const MajorDefensives = () => {
const defensiveAnalyzers = [ObsidianScales, TwinGuardian, RenewingBlaze];

return (
<Section title="Defensives">
<HideExplanationsToggle id="hide-explanations-major-defensives" />
<Explanation>
<p>
Effectively using your major defensive cooldowns is an important aspect of your
performance, as it will not only increase your own survivability, but also your entire
raid by allowing healers to focus on keeping others alive.
<br />
As an <span className="Evoker">Evoker</span> you have access to many short CD defensives
such as <SpellLink spell={TALENTS.OBSIDIAN_SCALES_TALENT} />,{' '}
<SpellLink spell={TALENTS.RENEWING_BLAZE_TALENT} />,{' '}
<SpellLink spell={TALENTS.ZEPHYR_TALENT} /> and{' '}
<SpellLink spell={TALENTS.TWIN_GUARDIAN_TALENT} />.
</p>
<p>There are two things you should look for in your cooldown usage:</p>
<ol>
<li>
You should cover as many{' '}
<TooltipElement
content={
<>
A <strong>damage spike</strong> is when you take much more damage than normal in a
small amount of time. These are visible on the Timeline below as tall spikes.
</>
}
>
damage spikes
</TooltipElement>{' '}
as possible, and use any left over to cover periods of heavy, consistent damage.
<br />
<small>
In the damage chart below, a spike highlighted in{' '}
<Highlight color={GoodColor} textColor="black">
green
</Highlight>{' '}
was covered by a defensive.
</small>
</li>
<li>
You should <em>use</em> your cooldowns. This may seem silly&mdash;but not using
defensives is a common problem! For <span className="Evoker">Evokers</span>, it is also
likely to be fatal, since most of your mitigation lies in your active cooldowns.
<br />
<small>
Below the damage chart, your cooldowns are shown. Large gaps may indicate that you
could get more uses&mdash;but remember that covering spikes is more important than
maximizing total casts!
</small>
</li>
</ol>
</Explanation>
<SubSection title="Damage Taken">
<Timeline analyzers={useAnalyzers(defensiveAnalyzers)} />
</SubSection>
<AllCooldownUsageList analyzers={useAnalyzers(defensiveAnalyzers)} />
</Section>
);
};

export default MajorDefensives;
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import {
MajorDefensiveBuff,
absoluteMitigation,
buff,
} from 'interface/guide/components/MajorDefensives/MajorDefensiveAnalyzer';
import { Options, SELECTED_PLAYER } from 'parser/core/Analyzer';
import TALENTS from 'common/TALENTS/evoker';
import Events, { DamageEvent } from 'parser/core/Events';
import { SpellLink } from 'interface';
import MajorDefensiveStatistic from 'interface/MajorDefensiveStatistic';
import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY';

// 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;
mitPct: number = BASE_MITIGATION + (this.hasHardenedScales ? HARDENED_SCALES_MITIGATION : 0);

constructor(options: Options) {
super(TALENTS.OBSIDIAN_SCALES_TALENT, buff(TALENTS.OBSIDIAN_SCALES_TALENT), options);
this.active = this.selectedCombatant.hasTalent(TALENTS.OBSIDIAN_SCALES_TALENT);

this.addEventListener(Events.damage.to(SELECTED_PLAYER), this.recordDamage);
}

private recordDamage(event: DamageEvent) {
if (!this.defensiveActive) {
return;
}
this.recordMitigation({
event,
mitigatedAmount: absoluteMitigation(event, this.mitPct),
});
}

description() {
return (
<p>
<SpellLink spell={TALENTS.OBSIDIAN_SCALES_TALENT} /> reduces the damage you take by 30%.
</p>
);
}

statistic() {
return <MajorDefensiveStatistic analyzer={this} category={STATISTIC_CATEGORY.GENERAL} />;
}
}

export default ObsidianScales;
Loading

0 comments on commit 934276a

Please sign in to comment.