Skip to content

Commit

Permalink
Merge pull request WoWAnalyzer#6586 from Krealle/dragonflight
Browse files Browse the repository at this point in the history
[Evoker] Improved accuracy of EssenceTracker module
  • Loading branch information
emallson authored Jan 8, 2024
2 parents 5eb848e + d7231ad commit fc71214
Show file tree
Hide file tree
Showing 20 changed files with 416 additions and 117 deletions.
1 change: 1 addition & 0 deletions src/CHANGELOG.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ export default [
change(date(2024, 1, 7), <>Add checklist support for <ItemLink id={ITEMS.FYRALATH.id} />.</>, ToppleTheNun),
change(date(2024, 1, 4), <>Add statistics for <ItemLink id={ITEMS.ECHOING_TYRSTONE.id}/>.</>, Arbixal),
change(date(2024, 1, 2), 'Remove Shadowlands food and augment rune support.', ToppleTheNun),
change(date(2023, 12, 31), <>Add resource initialization and granularity support for ResourceTracker module.</>, Vollmer),
change(date(2023, 12, 30), 'Fix errors caused by ESLint update.', ToppleTheNun),
change(date(2023, 12, 28), 'Improve internal handling of phases', emallson),
change(date(2023, 12, 21), <>Mark <ItemLink id={ITEMS.ENCHANT_WEAPON_DREAMING_DEVOTION_R3.id} /> as a max rank enchant.</>, ToppleTheNun),
Expand Down
4 changes: 3 additions & 1 deletion src/analysis/retail/evoker/augmentation/CHANGELOG.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import { change, date } from 'common/changelog';
import { Pants, Vollmer } from 'CONTRIBUTORS';
import { SpellLink } from 'interface';
import { ResourceLink, SpellLink } from 'interface';
import TALENTS from 'common/TALENTS/evoker';
import SPELLS from 'common/SPELLS/evoker';
import RESOURCE_TYPES from 'game/RESOURCE_TYPES';

export default [
change(date(2023, 12, 31), <>Implemented <ResourceLink id={RESOURCE_TYPES.ESSENCE.id}/> Graph.</>, Vollmer),
change(date(2023, 12, 22), <>Update blacklist for Helpers to increase accuracy.</>, Vollmer),
change(date(2023, 12, 13), <>Added Boss filter button for Buff Helper, and improved loading speed.</>, Vollmer),
change(date(2023, 12, 7), <>Update blacklist for Helpers to increase accuracy.</>, Vollmer),
Expand Down
11 changes: 10 additions & 1 deletion src/analysis/retail/evoker/augmentation/CombatLogParser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,22 @@ import EbonMightNormalizer from './modules/normalizers/EbonMightNormalizer';
import T31Augmentation4P from './modules/dragonflight/T31Augmentation4P';

//Shared
import { LeapingFlamesNormalizer, LeapingFlames } from 'analysis/retail/evoker/shared';
import {
LeapingFlamesNormalizer,
LeapingFlames,
SpellEssenceCost,
EssenceTracker,
EssenceGraph,
} from 'analysis/retail/evoker/shared';

class CombatLogParser extends MainCombatLogParser {
static specModules = {
// Shared
leapingFlamesNormalizer: LeapingFlamesNormalizer,
leapingFlames: LeapingFlames,
spellEssenceCost: SpellEssenceCost,
essenceTracker: EssenceTracker,
essenceGraph: EssenceGraph,

// Normalizers
castLinkNormalizer: CastLinkNormalizer,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,16 @@ import { GuideProps, Section, SubSection } from 'interface/guide';
import { TALENTS_EVOKER } from 'common/TALENTS';
import SPELLS from 'common/SPELLS';
import CombatLogParser from '../../CombatLogParser';
import { SpellLink } from 'interface';
import { ResourceLink, SpellLink } from 'interface';
import HideExplanationsToggle from 'interface/guide/components/HideExplanationsToggle';
import HideGoodCastsToggle from 'interface/guide/components/HideGoodCastsToggle';
import { RoundedPanel } from 'interface/guide/components/GuideDivs';
import ExplanationRow from 'interface/guide/components/ExplanationRow';
import Explanation from 'interface/guide/components/Explanation';
import CooldownUsage from 'parser/core/MajorCooldowns/CooldownUsage';
import { QualitativePerformance } from 'parser/ui/QualitativePerformance';
import RESOURCE_TYPES from 'game/RESOURCE_TYPES';
import PerformancePercentage from 'analysis/retail/evoker/devastation/modules/guide/PerformancePercentage';

export function CoreRotationSection({ modules, events, info }: GuideProps<typeof CombatLogParser>) {
return (
Expand All @@ -34,6 +37,8 @@ export function CoreRotationSection({ modules, events, info }: GuideProps<typeof
<HideExplanationsToggle id="hide-explanations-rotations" />
<HideGoodCastsToggle id="hide-good-casts-rotations" />

<EssenceGraphSection modules={modules} events={events} info={info} />

<SubSection title="Buff Graph">
This graph shows how many Ebon Mights and Presciences you had active over the course of the
encounter, with rule lines showing when you used Breath of Eon. Use this to ensure that you
Expand All @@ -56,7 +61,7 @@ export function CoreRotationSection({ modules, events, info }: GuideProps<typeof
);
}

function BlisteringScalesSection({ modules, events, info }: GuideProps<typeof CombatLogParser>) {
function BlisteringScalesSection({ modules }: GuideProps<typeof CombatLogParser>) {
return (
<SubSection title="Blistering Scales">
<ExplanationRow>
Expand All @@ -83,3 +88,48 @@ function BlisteringScalesSection({ modules, events, info }: GuideProps<typeof Co
</SubSection>
);
}

function EssenceGraphSection({ modules, events, info }: GuideProps<typeof CombatLogParser>) {
const percentAtCap = modules.essenceTracker.percentAtCap;
const essenceWasted = modules.essenceTracker.wasted;

const perfectTimeAtEssenceCap = 0.1;
const goodTimeAtEssenceCap = 0.15;
const okTimeAtEssenceCap = 0.2;

const percentAtCapPerformance =
percentAtCap <= perfectTimeAtEssenceCap
? QualitativePerformance.Perfect
: percentAtCap <= goodTimeAtEssenceCap
? QualitativePerformance.Good
: percentAtCap <= okTimeAtEssenceCap
? QualitativePerformance.Ok
: QualitativePerformance.Fail;

return (
<SubSection title="Essence Graph">
<p>
Your primary resource is <ResourceLink id={RESOURCE_TYPES.ESSENCE.id} />. You should avoid
overcapping <ResourceLink id={RESOURCE_TYPES.ESSENCE.id} /> - lost{' '}
<ResourceLink id={RESOURCE_TYPES.ESSENCE.id} /> generation is lost DPS. Sometimes it will be
impossible to avoid overcapping <ResourceLink id={RESOURCE_TYPES.ESSENCE.id} /> - due to
handling mechanics, high rolling <SpellLink spell={SPELLS.ESSENCE_BURST_DEV_BUFF} /> procs
or during intermission phases.
</p>
<p>
The chart below shows your <ResourceLink id={RESOURCE_TYPES.ESSENCE.id} /> over the course
of the encounter. You wasted{' '}
<PerformancePercentage
performance={percentAtCapPerformance}
perfectPercentage={perfectTimeAtEssenceCap}
goodPercentage={goodTimeAtEssenceCap}
okPercentage={okTimeAtEssenceCap}
percentage={percentAtCap}
flatAmount={essenceWasted}
/>{' '}
of your <ResourceLink id={RESOURCE_TYPES.ESSENCE.id} />.
</p>
{modules.essenceGraph.plot}
</SubSection>
);
}
4 changes: 3 additions & 1 deletion src/analysis/retail/evoker/devastation/CHANGELOG.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import { change, date } from 'common/changelog';
import { ToppleTheNun, Tyndi, Vireve, Vollmer } from 'CONTRIBUTORS';
import { SpellLink } from 'interface';
import { ResourceLink, SpellLink } from 'interface';
import TALENTS from 'common/TALENTS/evoker';
import SPELLS from 'common/SPELLS/evoker';
import RESOURCE_TYPES from 'game/RESOURCE_TYPES';

export default [
change(date(2023, 12, 31), <>Improved tracking of <ResourceLink id={RESOURCE_TYPES.ESSENCE.id}/> for a more precise representation on the <ResourceLink id={RESOURCE_TYPES.ESSENCE.id}/> Graph.</>, Vollmer),
change(date(2023, 12, 6), <>Update APL Check.</>, Vollmer),
change(date(2023, 11, 30), <>Update <SpellLink spell={SPELLS.DISINTEGRATE}/> guide section.</>, Vollmer),
change(date(2023, 11, 12), <>Properly track dropped ticks when only 1 tick is remaining for <SpellLink spell={SPELLS.DISINTEGRATE}/> graph.</>, Vollmer),
Expand Down
15 changes: 10 additions & 5 deletions src/analysis/retail/evoker/devastation/CombatLogParser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ import ShatteringStar from './modules/abilities/ShatteringStar';
import Buffs from './modules/Buffs';
import Guide from './Guide';
import AplCheck from './modules/AplCheck';
import EssenceTracker from '../preservation/modules/features/EssenceTracker';
import EssenceGraph from './modules/guide/EssenceGraph/EssenceGraph';
import Disintegrate from './modules/abilities/Disintegrate';
import EssenceBurst from './modules/abilities/EssenceBurst';
import Burnout from './modules/abilities/Burnout';
Expand All @@ -33,13 +31,22 @@ import Iridescence from './modules/talents/Iridescence';
import T31DevaTier from './modules/dragonflight/tier/T31DevaTier';

// Shared
import { LeapingFlamesNormalizer, LeapingFlames } from 'analysis/retail/evoker/shared';
import {
LeapingFlamesNormalizer,
LeapingFlames,
SpellEssenceCost,
EssenceTracker,
EssenceGraph,
} from 'analysis/retail/evoker/shared';

class CombatLogParser extends MainCombatLogParser {
static specModules = {
// Shared
leapingFlamesNormalizer: LeapingFlamesNormalizer,
leapingFlames: LeapingFlames,
spellEssenceCost: SpellEssenceCost,
essenceTracker: EssenceTracker,
essenceGraph: EssenceGraph,

// Core
abilities: Abilities,
Expand All @@ -50,8 +57,6 @@ class CombatLogParser extends MainCombatLogParser {
essenceBurstNormalizer: EssenceBurstNormalizer,

// features
essenceTracker: EssenceTracker,
essenceGraph: EssenceGraph,
apls: AplCheck,
cooldownThroughputTracker: CooldownThroughputTracker,

Expand Down
4 changes: 2 additions & 2 deletions src/analysis/retail/evoker/devastation/Guide.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,18 @@ import PreparationSection from 'interface/guide/components/Preparation/Preparati
import { CooldownSection } from './modules/guide/Cooldown';
import { CoreRotation } from './modules/guide/CoreRotation';
import { DamageEfficiency } from './modules/guide/DamageEfficiencySection';
import { EssenceGraphSection } from './modules/guide/EssenceGraph/EssenceGraphSection';
import { EssenceGraphSection } from './modules/guide/EssenceGraphSection';
import { DragonRageSection } from './modules/guide/DragonRageSection';
import { IntroSection } from './modules/guide/IntroSection';

export default function Guide({ modules, events, info }: GuideProps<typeof CombatLogParser>) {
return (
<>
<IntroSection />
<EssenceGraphSection modules={modules} info={info} events={events} />
<CooldownSection modules={modules} info={info} events={events} />
<DragonRageSection modules={modules} info={info} events={events} />
<DamageEfficiency modules={modules} info={info} events={events} />
<EssenceGraphSection modules={modules} info={info} events={events} />
<CoreRotation modules={modules} info={info} events={events} />
<PreparationSection />
</>
Expand Down
3 changes: 3 additions & 0 deletions src/analysis/retail/evoker/devastation/constants.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,6 @@ export const CAUSALITY_DISINTEGRATE_CDR_MS = 500;
export const CAUSALITY_PYRE_CDR_MS = 400;

export const DEVA_T31_2PC_MULTIPLER = 0.05;

export const POWER_SWELL_REGEN_FACTOR = 1;
export const DENSE_ENERGY_ESSENCE_REDUCTION = 1;

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import CombatLogParser from '../../CombatLogParser';
import { GuideProps, Section } from 'interface/guide';
import { QualitativePerformance } from 'parser/ui/QualitativePerformance';
import PerformancePercentage from './PerformancePercentage';
import { ResourceLink, SpellLink, Tooltip } from 'interface';
import RESOURCE_TYPES from 'game/RESOURCE_TYPES';
import { TIERS } from 'game/TIERS';
import { InformationIcon } from 'interface/icons';
import SPELLS from 'common/SPELLS/evoker';

export function EssenceGraphSection({ modules, events, info }: GuideProps<typeof CombatLogParser>) {
const hasT31 = info.combatant.has4PieceByTier(TIERS.T31);
const percentAtCap = modules.essenceTracker.percentAtCap;
const essenceWasted = modules.essenceTracker.wasted;

const perfectTimeAtEssenceCap = 0.1 + (hasT31 ? 0.05 : 0);
const goodTimeAtEssenceCap = 0.15 + (hasT31 ? 0.05 : 0);
const okTimeAtEssenceCap = 0.2 + (hasT31 ? 0.05 : 0);

const percentAtCapPerformance =
percentAtCap <= perfectTimeAtEssenceCap
? QualitativePerformance.Perfect
: percentAtCap <= goodTimeAtEssenceCap
? QualitativePerformance.Good
: percentAtCap <= okTimeAtEssenceCap
? QualitativePerformance.Ok
: QualitativePerformance.Fail;

return (
<Section title="Essence Graph">
<p>
Your primary resource is <ResourceLink id={RESOURCE_TYPES.ESSENCE.id} />. You should avoid
overcapping <ResourceLink id={RESOURCE_TYPES.ESSENCE.id} /> - lost{' '}
<ResourceLink id={RESOURCE_TYPES.ESSENCE.id} /> generation is lost DPS. Sometimes it will be
impossible to avoid overcapping <ResourceLink id={RESOURCE_TYPES.ESSENCE.id} /> - due to
handling mechanics, high rolling <SpellLink spell={SPELLS.ESSENCE_BURST_DEV_BUFF} /> procs
or during intermission phases.
</p>
<p>
The chart below shows your <ResourceLink id={RESOURCE_TYPES.ESSENCE.id} /> over the course
of the encounter. You wasted{' '}
<PerformancePercentage
performance={percentAtCapPerformance}
perfectPercentage={perfectTimeAtEssenceCap}
goodPercentage={goodTimeAtEssenceCap}
okPercentage={okTimeAtEssenceCap}
percentage={percentAtCap}
flatAmount={essenceWasted}
/>{' '}
of your <ResourceLink id={RESOURCE_TYPES.ESSENCE.id} />.
{hasT31 && (
<>
{' '}
<Tooltip
content={
<div>
Since you have T31 4pc an extra 5% grace period is added, as it is expected that
more <ResourceLink id={RESOURCE_TYPES.ESSENCE.id} /> will go to waste, due to the
extra amount of <SpellLink spell={SPELLS.ESSENCE_BURST_DEV_BUFF} /> generated.
</div>
}
>
<div style={{ display: 'inline' }}>
<InformationIcon style={{ fontSize: '1.4em' }} />
</div>
</Tooltip>
</>
)}
</p>
{modules.essenceGraph.plot}
</Section>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { PerformanceMark } from 'interface/guide';
import { QualitativePerformance } from 'parser/ui/QualitativePerformance';
import { formatNumber, formatPercentage } from 'common/format';
import PerformanceStrongWithTooltip from 'interface/PerformanceStrongWithTooltip';

interface Props {
performance: QualitativePerformance;
perfectPercentage: number;
goodPercentage: number;
okPercentage: number;
percentage: number;
flatAmount: number;
}
const PerformancePercentage = ({
performance,
perfectPercentage,
goodPercentage,
okPercentage,
percentage,
flatAmount,
}: Props) => {
const perfectSign = perfectPercentage > 0 ? '<=' : '=';

return (
<PerformanceStrongWithTooltip
performance={performance}
tooltip={
<>
<PerformanceMark perf={QualitativePerformance.Perfect} /> Perfect usage {perfectSign}{' '}
{formatPercentage(perfectPercentage, 0)}%
<br />
<PerformanceMark perf={QualitativePerformance.Good} /> Good usage &lt;={' '}
{formatPercentage(goodPercentage, 0)}%
<br />
<PerformanceMark perf={QualitativePerformance.Ok} /> OK usage &lt;={' '}
{formatPercentage(okPercentage, 0)}%
</>
}
>
{formatNumber(flatAmount)} ({formatPercentage(percentage)}%)
</PerformanceStrongWithTooltip>
);
};

export default PerformancePercentage;
6 changes: 4 additions & 2 deletions src/analysis/retail/evoker/preservation/CHANGELOG.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import { change, date } from 'common/changelog';
import SPELLS from 'common/SPELLS';
import { TALENTS_EVOKER } from 'common/TALENTS';
import { ToppleTheNun, Trevor, Tyndi, Vohrr } from 'CONTRIBUTORS';
import { SpellLink } from 'interface';
import { ToppleTheNun, Trevor, Tyndi, Vohrr, Vollmer } from 'CONTRIBUTORS';
import RESOURCE_TYPES from 'game/RESOURCE_TYPES';
import { ResourceLink, SpellLink } from 'interface';

export default [
change(date(2023, 12, 31), <>Improved tracking of <ResourceLink id={RESOURCE_TYPES.ESSENCE.id}/> for a more precise representation of overcapped <ResourceLink id={RESOURCE_TYPES.ESSENCE.id}/>.</>, Vollmer),
change(date(2023, 11, 25), <>Fixed bug in <SpellLink spell={TALENTS_EVOKER.LEAPING_FLAMES_TALENT}/> module</>, Trevor),
change(date(2023, 11, 24), <>Add chart to T31 tier set 4PC module</>, Trevor),
change(date(2023, 11, 11), <>Add <SpellLink spell={SPELLS.EMERALD_BLOSSOM}/> graphic to guide</>, Trevor),
Expand Down
9 changes: 7 additions & 2 deletions src/analysis/retail/evoker/preservation/CombatLogParser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import HotRemovalNormalizer from './normalizers/HotRemovalNormalizer';

import Checklist from 'analysis/retail/evoker/preservation/modules/features/Checklist/Module';
import EssenceDetails from './modules/features/EssenceDetails';
import EssenceTracker from './modules/features/EssenceTracker';
import GracePeriod from './modules/talents/GracePeriod';
import Reversion from './modules/talents/Reversion';
import CallOfYsera from './modules/talents/CallOfYsera';
Expand Down Expand Up @@ -48,7 +47,12 @@ import RegenerativeMagic from '../shared/modules/talents/RegenerativeMagic';
import AncientFlame from './modules/talents/AncientFlame';
import T31PrevokerSet from './modules/dragonflight/tier/T31TierSet';
import EchoTypeBreakdown from './modules/talents/EchoTypeBreakdown';
import { LeapingFlamesNormalizer, LeapingFlames } from '../shared';
import {
LeapingFlamesNormalizer,
LeapingFlames,
SpellEssenceCost,
EssenceTracker,
} from '../shared';

class CombatLogParser extends CoreCombatLogParser {
static specModules = {
Expand All @@ -68,6 +72,7 @@ class CombatLogParser extends CoreCombatLogParser {
//resources
essenceTracker: EssenceTracker,
essenceDetails: EssenceDetails,
spellEssenceCost: SpellEssenceCost,
manaTracker: ManaTracker,

//features
Expand Down
Loading

0 comments on commit fc71214

Please sign in to comment.