diff --git a/src/analysis/retail/druid/feral/CONFIG.tsx b/src/analysis/retail/druid/feral/CONFIG.tsx index 1a85b171112..7aeadd86e47 100644 --- a/src/analysis/retail/druid/feral/CONFIG.tsx +++ b/src/analysis/retail/druid/feral/CONFIG.tsx @@ -35,7 +35,7 @@ const config: Config = { ), // A recent example report to see interesting parts of the spec. Will be shown on the homepage. - exampleReport: '/report/nKgjXCLPNABhk6GV/32-Heroic+Eranog+-+Kill+(2:44)/Azlann/standard', + exampleReport: '/report/NCgvk7mBrHa9QTAZ/6/19', guideDefault: true, // Don't change anything below this line; diff --git a/src/analysis/retail/druid/guardian/CHANGELOG.tsx b/src/analysis/retail/druid/guardian/CHANGELOG.tsx index 0d8ae858597..c337d8571fe 100644 --- a/src/analysis/retail/druid/guardian/CHANGELOG.tsx +++ b/src/analysis/retail/druid/guardian/CHANGELOG.tsx @@ -2,8 +2,10 @@ import { change, date } from 'common/changelog'; import { Sref, ToppleTheNun } from 'CONTRIBUTORS'; import { TALENTS_DRUID } from 'common/TALENTS'; import { SpellLink } from 'interface'; +import SPELLS from 'common/SPELLS'; export default [ + change(date(2023, 11, 9), <>Added simple spell usage stats for , , and . Marked as updated for 10.2., Sref), change(date(2023, 6, 20), 'Update SpellLink usage.', ToppleTheNun), change(date(2023, 4, 24), <>Fixed a bug where uses weren't being correctly detected., Sref), change(date(2023, 4, 22), <>Reactivated Guardian analyzer! Only basic guide and modules so far, more to come., Sref), diff --git a/src/analysis/retail/druid/guardian/CONFIG.tsx b/src/analysis/retail/druid/guardian/CONFIG.tsx index 410ba9c7702..4ce6818f1fd 100644 --- a/src/analysis/retail/druid/guardian/CONFIG.tsx +++ b/src/analysis/retail/druid/guardian/CONFIG.tsx @@ -10,7 +10,7 @@ const config: Config = { contributors: [Sref], expansion: Expansion.Dragonflight, // The WoW client patch this spec was last updated. - patchCompatibility: '10.1.0', + patchCompatibility: '10.2.0', isPartial: true, // 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. @@ -39,7 +39,7 @@ const config: Config = { ), // A recent example report to see interesting parts of the spec. Will be shown on the homepage. - exampleReport: 'report/DhJG8fqB2rZgk9Kj/6-Heroic+Terros+-+Kill+(5:04)/Azlann/standard/overview', + exampleReport: 'report/VWt9ZTmxfhQyLw14/9/11', guideDefault: true, // Don't change anything below this line; diff --git a/src/analysis/retail/druid/guardian/CombatLogParser.tsx b/src/analysis/retail/druid/guardian/CombatLogParser.tsx index 2ac97d1d26e..8ca5475f049 100644 --- a/src/analysis/retail/druid/guardian/CombatLogParser.tsx +++ b/src/analysis/retail/druid/guardian/CombatLogParser.tsx @@ -13,6 +13,9 @@ import Barkskin from 'analysis/retail/druid/guardian/modules/core/defensives/Bar import SurvivalInstincts from 'analysis/retail/druid/guardian/modules/core/defensives/SurvivalInstincts'; import RageOfTheSleeper from 'analysis/retail/druid/guardian/modules/core/defensives/RageOfTheSleeper'; import Pulverize from 'analysis/retail/druid/guardian/modules/core/defensives/Pulverize'; +import Thrash from 'analysis/retail/druid/guardian/modules/spells/Thrash'; +import Mangle from 'analysis/retail/druid/guardian/modules/spells/Mangle'; +import Moonfire from 'analysis/retail/druid/guardian/modules/spells/Moonfire'; class CombatLogParser extends CoreCombatLogParser { static specModules = { @@ -42,8 +45,9 @@ class CombatLogParser extends CoreCombatLogParser { // Spells convokeSpirits: ConvokeSpiritsGuardian, ironfur: Ironfur, - // thrash: Thrash, - // moonfire: Moonfire, + thrash: Thrash, + mangle: Mangle, + moonfire: Moonfire, // pulverize: Pulverize, // frenziedRegeneration: FrenziedRegeneration, // earthwarden: Earthwarden, diff --git a/src/analysis/retail/druid/guardian/Guide.tsx b/src/analysis/retail/druid/guardian/Guide.tsx index 941b729ab93..47e9f2f9209 100644 --- a/src/analysis/retail/druid/guardian/Guide.tsx +++ b/src/analysis/retail/druid/guardian/Guide.tsx @@ -84,8 +84,8 @@ function RotationSection({ modules, events, info }: GuideProps

Guardian is absolutely a GCD-capped spec and you should be constantly using abilities. - Automated analysis of this rotation is coming soon, but for now we'll look at your GCD - utilization: + Active time shows the percentage of time you were spamming abilities - get as close to 100% + as you can.

@@ -95,6 +95,9 @@ function RotationSection({ modules, events, info }: GuideProps{' '}

+ {modules.mangle.guideSubsection} + {modules.thrash.guideSubsection} + {modules.moonfire.guideSubsection} ); } diff --git a/src/analysis/retail/druid/guardian/modules/spells/Mangle.tsx b/src/analysis/retail/druid/guardian/modules/spells/Mangle.tsx new file mode 100644 index 00000000000..e2fd8bb260a --- /dev/null +++ b/src/analysis/retail/druid/guardian/modules/spells/Mangle.tsx @@ -0,0 +1,24 @@ +import SPELLS from 'common/SPELLS'; +import Analyzer from 'parser/core/Analyzer'; +import SpellLink from 'interface/SpellLink'; +import CastEfficiencyPanel from 'interface/guide/components/CastEfficiencyPanel'; +import { explanationAndDataSubsection } from 'interface/guide/components/ExplanationRow'; + +export default class Mangle extends Analyzer { + get guideSubsection() { + const explanation = ( +

+ + + {' '} + does direct damage and generates rage. Use it on cooldown. The very short cooldown combined + with jammed GCDs means 100% usage will be practically impossible, but get as close as you + can. +

+ ); + + const data = ; + + return explanationAndDataSubsection(explanation, data); + } +} diff --git a/src/analysis/retail/druid/guardian/modules/spells/Moonfire.jsx b/src/analysis/retail/druid/guardian/modules/spells/Moonfire.jsx deleted file mode 100644 index cf7b454fd40..00000000000 --- a/src/analysis/retail/druid/guardian/modules/spells/Moonfire.jsx +++ /dev/null @@ -1,74 +0,0 @@ -import { defineMessage } from '@lingui/macro'; -import { formatPercentage } from 'common/format'; -import SPELLS from 'common/SPELLS'; -import { SpellLink } from 'interface'; -import { SpellIcon } from 'interface'; -import Analyzer from 'parser/core/Analyzer'; -import Enemies from 'parser/shared/modules/Enemies'; -import BoringValueText from 'parser/ui/BoringValueText'; -import Statistic from 'parser/ui/Statistic'; -import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; - -class Moonfire extends Analyzer { - static dependencies = { - enemies: Enemies, - }; - - suggestions(when) { - const moonfireUptimePercentage = - this.enemies.getBuffUptime(SPELLS.MOONFIRE_DEBUFF.id) / this.owner.fightDuration; - - when(moonfireUptimePercentage) - .isLessThan(0.95) - .addSuggestion((suggest, actual, recommended) => - suggest( - - {' '} - Your uptime was{' '} - {formatPercentage(moonfireUptimePercentage)}%, unless you have extended periods of - downtime it should be near 100%. - , - ) - .icon(SPELLS.MOONFIRE_DEBUFF.icon) - .actual( - defineMessage({ - id: 'druid.guardian.suggestions.moonfire.uptime', - message: `${formatPercentage(moonfireUptimePercentage)}% uptime`, - }), - ) - .recommended(`${Math.round(formatPercentage(recommended))}% is recommended`) - .regular(recommended - 0.05) - .major(recommended - 0.15), - ); - } - - statistic() { - const moonfireUptimePercentage = - this.enemies.getBuffUptime(SPELLS.MOONFIRE_DEBUFF.id) / this.owner.fightDuration; - - return ( - - Your Moonfire uptime is{' '} - {`${formatPercentage(moonfireUptimePercentage)}%`} - - } - > - - Moonfire uptime{' '} - - } - > - {`${formatPercentage(moonfireUptimePercentage)}%`} - - - ); - } -} - -export default Moonfire; diff --git a/src/analysis/retail/druid/guardian/modules/spells/Moonfire.tsx b/src/analysis/retail/druid/guardian/modules/spells/Moonfire.tsx new file mode 100644 index 00000000000..90ff56bc63e --- /dev/null +++ b/src/analysis/retail/druid/guardian/modules/spells/Moonfire.tsx @@ -0,0 +1,78 @@ +import { formatPercentage } from 'common/format'; +import SPELLS from 'common/SPELLS'; +import { SpellIcon } from 'interface'; +import Analyzer from 'parser/core/Analyzer'; +import Enemies from 'parser/shared/modules/Enemies'; +import BoringValueText from 'parser/ui/BoringValueText'; +import Statistic from 'parser/ui/Statistic'; +import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; +import SpellLink from 'interface/SpellLink'; +import { explanationAndDataSubsection } from 'interface/guide/components/ExplanationRow'; +import { RoundedPanel } from 'interface/guide/components/GuideDivs'; +import uptimeBarSubStatistic from 'parser/ui/UptimeBarSubStatistic'; + +const MF_COLOR = '#22aaff'; + +const deps = { + enemies: Enemies, +}; + +export default class Moonfire extends Analyzer.withDependencies(deps) { + get guideSubsection() { + const explanation = ( +

+ + + {' '} + is a DoT that can be applied to any number of targets. It's worth maintaining full uptime on + low target counts. +

+ ); + + const history = this.deps.enemies.getDebuffHistory(SPELLS.MOONFIRE_DEBUFF.id); + const uptimeBar = uptimeBarSubStatistic(this.owner.fight, { + spells: [SPELLS.MOONFIRE_DEBUFF], + uptimes: history, + color: MF_COLOR, + }); + const data = ( +
+ + Moonfire uptimes + {uptimeBar} + +
+ ); + + return explanationAndDataSubsection(explanation, data); + } + + get uptime() { + return this.deps.enemies.getBuffUptime(SPELLS.MOONFIRE_DEBUFF.id) / this.owner.fightDuration; + } + + statistic() { + return ( + + Your Moonfire uptime is{' '} + {`${formatPercentage(this.uptime)}%`} + + } + > + + Moonfire uptime{' '} + + } + > + {`${formatPercentage(this.uptime)}%`} + + + ); + } +} diff --git a/src/analysis/retail/druid/guardian/modules/spells/Thrash.jsx b/src/analysis/retail/druid/guardian/modules/spells/Thrash.jsx deleted file mode 100644 index 569afb95bd3..00000000000 --- a/src/analysis/retail/druid/guardian/modules/spells/Thrash.jsx +++ /dev/null @@ -1,69 +0,0 @@ -import { defineMessage } from '@lingui/macro'; -import { formatPercentage } from 'common/format'; -import SPELLS from 'common/SPELLS'; -import { SpellLink } from 'interface'; -import { SpellIcon } from 'interface'; -import Analyzer from 'parser/core/Analyzer'; -import Enemies from 'parser/shared/modules/Enemies'; -import BoringValueText from 'parser/ui/BoringValueText'; -import Statistic from 'parser/ui/Statistic'; -import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; - -class Thrash extends Analyzer { - static dependencies = { - enemies: Enemies, - }; - - suggestions(when) { - const thrashUptimePercentage = - this.enemies.getBuffUptime(SPELLS.THRASH_BEAR_DOT.id) / this.owner.fightDuration; - - when(thrashUptimePercentage) - .isLessThan(0.95) - .addSuggestion((suggest, actual, recommended) => - suggest( - - {' '} - Your uptime was{' '} - {formatPercentage(thrashUptimePercentage)}%, unless you have extended periods of - downtime it should be near 100%.
- Thrash applies a bleed which buffs the damage of{' '} - by 20%. Thrash uptime is especially important - if you are talented into , since it - buffs the rest of your damage and gives you extra damage reduction. -
, - ) - .icon(SPELLS.THRASH_BEAR.icon) - .actual( - defineMessage({ - id: 'druid.guardian.suggestions.thrash.uptime', - message: `${formatPercentage(thrashUptimePercentage)}% uptime`, - }), - ) - .recommended(`${Math.round(formatPercentage(recommended))}% is recommended`) - .regular(recommended - 0.05) - .major(recommended - 0.15), - ); - } - - statistic() { - const thrashUptimePercentage = - this.enemies.getBuffUptime(SPELLS.THRASH_BEAR_DOT.id) / this.owner.fightDuration; - - return ( - - - Thrash uptime{' '} - - } - > - {`${formatPercentage(thrashUptimePercentage)}%`} - - - ); - } -} - -export default Thrash; diff --git a/src/analysis/retail/druid/guardian/modules/spells/Thrash.tsx b/src/analysis/retail/druid/guardian/modules/spells/Thrash.tsx new file mode 100644 index 00000000000..814125a6e4b --- /dev/null +++ b/src/analysis/retail/druid/guardian/modules/spells/Thrash.tsx @@ -0,0 +1,53 @@ +import { formatPercentage } from 'common/format'; +import SPELLS from 'common/SPELLS'; +import { SpellIcon } from 'interface'; +import Analyzer from 'parser/core/Analyzer'; +import Enemies from 'parser/shared/modules/Enemies'; +import BoringValueText from 'parser/ui/BoringValueText'; +import Statistic from 'parser/ui/Statistic'; +import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; +import SpellLink from 'interface/SpellLink'; +import CastEfficiencyPanel from 'interface/guide/components/CastEfficiencyPanel'; +import { explanationAndDataSubsection } from 'interface/guide/components/ExplanationRow'; + +const deps = { + enemies: Enemies, +}; + +export default class Thrash extends Analyzer.withDependencies(deps) { + get guideSubsection() { + const explanation = ( +

+ + + {' '} + is AoE direct damage and a stacking bleed. It generates rage and should be used on cooldown. + The very short cooldown combined with jammed GCDs means 100% usage will be practically + impossible, but get as close as you can. +

+ ); + + const data = ; + + return explanationAndDataSubsection(explanation, data); + } + + statistic() { + const thrashUptimePercentage = + this.deps.enemies.getBuffUptime(SPELLS.THRASH_BEAR_DOT.id) / this.owner.fightDuration; + + return ( + + + Thrash uptime{' '} + + } + > + {`${formatPercentage(thrashUptimePercentage)}%`} + + + ); + } +} diff --git a/src/analysis/retail/druid/restoration/CONFIG.tsx b/src/analysis/retail/druid/restoration/CONFIG.tsx index de8f398538b..78edf52046f 100644 --- a/src/analysis/retail/druid/restoration/CONFIG.tsx +++ b/src/analysis/retail/druid/restoration/CONFIG.tsx @@ -28,7 +28,7 @@ const config: Config = { ), // A recent example report to see interesting parts of the spec. Will be shown on the homepage. - exampleReport: '/report/nKgjXCLPNABhk6GV/32-Heroic+Eranog+-+Kill+(2:44)/Shåped/standard', + exampleReport: '/report/xnaX1W8rCGf9Jtwv/5/3', //Only show the guide since restoration druid no longer has a supported checklist //This will also default to the guide guideOnly: true,