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,