diff --git a/e2e/report-selection.spec.ts b/e2e/report-selection.spec.ts index 1d23cb23431..a3b3f0cdfa0 100644 --- a/e2e/report-selection.spec.ts +++ b/e2e/report-selection.spec.ts @@ -3,48 +3,48 @@ import { expect, test } from './fixtures'; test('report selection', async ({ page, homePage, fightSelectionPage }) => { await homePage.goto(); - await homePage.fillInReportInputWithCode('dFzCLcjyqMbX43KP'); + await homePage.fillInReportInputWithCode('bjqrZRnNdvKPXt13'); await fightSelectionPage.expectFightSelectionHeaderToBeVisible(); - await fightSelectionPage.expectUrlToHaveReportCode('dFzCLcjyqMbX43KP'); - await expect(page).toHaveTitle('raid day'); + await fightSelectionPage.expectUrlToHaveReportCode('bjqrZRnNdvKPXt13'); + await expect(page).toHaveTitle('owl time'); }); test('fight selection', async ({ page, fightSelectionPage, playerSelectionPage }) => { - await fightSelectionPage.goto('dFzCLcjyqMbX43KP'); + await fightSelectionPage.goto('bjqrZRnNdvKPXt13'); - await page.getByRole('link', { name: 'Kill 3:11' }).click(); + await page.getByRole('link', { name: 'Kill 8:47' }).click(); await playerSelectionPage.expectPlayerSelectionHeaderToBeVisible(); await playerSelectionPage.expectUrlToHaveReportCodeAndFight( - 'dFzCLcjyqMbX43KP', - '20-Mythic+Volcoross+-+Kill+(3:11)', + 'bjqrZRnNdvKPXt13', + '34-Mythic+Fyrakk+the+Blazing+-+Kill+(8:47)', ); - await expect(page).toHaveTitle('Mythic Volcoross - Kill (3:11) in raid day'); + await expect(page).toHaveTitle('Mythic Fyrakk the Blazing - Kill (8:47) in owl time'); }); test('player selection', async ({ page, playerSelectionPage, reportPage }) => { - await playerSelectionPage.goto('dFzCLcjyqMbX43KP', '20-Mythic+Volcoross+-+Kill+(3:11)'); + await playerSelectionPage.goto('bjqrZRnNdvKPXt13', '34-Mythic+Fyrakk+the+Blazing+-+Kill+(8:47)'); await page - .getByRole('link', { name: 'Toppledh Vengeance Demon Hunter Vengeance Demon Hunter 485' }) + .getByRole('link', { name: 'Toppledh Vengeance Demon Hunter Vengeance Demon Hunter 488' }) .click(); await reportPage.expectBossDifficultyAndNameHeaderToBeVisible(); - await reportPage.expectBossDifficultyAndNameHeaderToHaveText('MythicVolcoross'); + await reportPage.expectBossDifficultyAndNameHeaderToHaveText('MythicFyrakk, the Blazing'); await reportPage.expectUrlToHave( - 'dFzCLcjyqMbX43KP', - '20-Mythic+Volcoross+-+Kill+(3:11)', + 'bjqrZRnNdvKPXt13', + '34-Mythic+Fyrakk+the+Blazing+-+Kill+(8:47)', 'Toppledh', ); - await expect(page).toHaveTitle('Mythic Volcoross - Kill (3:11) by Toppledh in raid day'); + await expect(page).toHaveTitle('Mythic Fyrakk the Blazing - Kill (8:47) by Toppledh in owl time'); }); test.describe('tab selection', () => { test.beforeEach(async ({ reportPage }) => { await reportPage.goto({ - reportCode: 'dFzCLcjyqMbX43KP', - fightCode: '20-Mythic+Volcoross+-+Kill+(3:11)', + reportCode: 'bjqrZRnNdvKPXt13', + fightCode: '34-Mythic+Fyrakk+the+Blazing+-+Kill+(8:47)', playerName: 'Toppledh', }); }); @@ -53,7 +53,7 @@ test.describe('tab selection', () => { await reportPage.clickOnStatisticsTab(); await expect(page).toHaveURL( - '/report/dFzCLcjyqMbX43KP/20-Mythic+Volcoross+-+Kill+(3:11)/Toppledh/standard/statistics', + '/report/bjqrZRnNdvKPXt13/34-Mythic+Fyrakk+the+Blazing+-+Kill+(8:47)/Toppledh/standard/statistics', ); }); @@ -61,7 +61,7 @@ test.describe('tab selection', () => { await reportPage.clickOnTimelineTab(); await expect(page).toHaveURL( - '/report/dFzCLcjyqMbX43KP/20-Mythic+Volcoross+-+Kill+(3:11)/Toppledh/standard/timeline', + '/report/bjqrZRnNdvKPXt13/34-Mythic+Fyrakk+the+Blazing+-+Kill+(8:47)/Toppledh/standard/timeline', ); }); @@ -69,7 +69,7 @@ test.describe('tab selection', () => { await reportPage.clickOnCooldownsTab(); await expect(page).toHaveURL( - '/report/dFzCLcjyqMbX43KP/20-Mythic+Volcoross+-+Kill+(3:11)/Toppledh/standard/cooldowns', + '/report/bjqrZRnNdvKPXt13/34-Mythic+Fyrakk+the+Blazing+-+Kill+(8:47)/Toppledh/standard/cooldowns', ); }); @@ -77,7 +77,7 @@ test.describe('tab selection', () => { await reportPage.clickOnCharacterTab(); await expect(page).toHaveURL( - '/report/dFzCLcjyqMbX43KP/20-Mythic+Volcoross+-+Kill+(3:11)/Toppledh/standard/character', + '/report/bjqrZRnNdvKPXt13/34-Mythic+Fyrakk+the+Blazing+-+Kill+(8:47)/Toppledh/standard/character', ); }); @@ -85,7 +85,7 @@ test.describe('tab selection', () => { await reportPage.clickOnAboutTab('Vengeance Demon Hunter'); await expect(page).toHaveURL( - '/report/dFzCLcjyqMbX43KP/20-Mythic+Volcoross+-+Kill+(3:11)/Toppledh/standard/about', + '/report/bjqrZRnNdvKPXt13/34-Mythic+Fyrakk+the+Blazing+-+Kill+(8:47)/Toppledh/standard/about', ); }); }); @@ -96,16 +96,16 @@ test('perform analysis', async ({ page }) => { await page.getByPlaceholder('https://www.warcraftlogs.com/reports/').click(); await page .getByPlaceholder('https://www.warcraftlogs.com/reports/') - .fill('https://www.warcraftlogs.com/reports/dFzCLcjyqMbX43KP'); + .fill('https://www.warcraftlogs.com/reports/bjqrZRnNdvKPXt13'); await page.getByRole('heading', { name: 'Fight selection' }).waitFor(); - await page.getByRole('link', { name: 'Kill 3:11' }).click(); + await page.getByRole('link', { name: 'Kill 8:47' }).click(); await page.getByRole('heading', { name: 'Player selection' }).waitFor(); await page - .getByRole('link', { name: 'Toppledh Vengeance Demon Hunter Vengeance Demon Hunter 485' }) + .getByRole('link', { name: 'Toppledh Vengeance Demon Hunter Vengeance Demon Hunter 488' }) .click(); - await page.getByText('MythicVolcoross').waitFor(); + await page.getByText('MythicFyrakk, the Blazing').waitFor(); await expect(page).toHaveURL( - '/report/dFzCLcjyqMbX43KP/20-Mythic+Volcoross+-+Kill+(3:11)/Toppledh/standard', + '/report/bjqrZRnNdvKPXt13/34-Mythic+Fyrakk+the+Blazing+-+Kill+(8:47)/Toppledh/standard', ); }); diff --git a/scripts/talents/generate-talents.ts b/scripts/talents/generate-talents.ts index fd4f74dac7f..4bb80ffa30d 100644 --- a/scripts/talents/generate-talents.ts +++ b/scripts/talents/generate-talents.ts @@ -22,10 +22,10 @@ import { TalentNode, } from './talent-tree-types'; -const LIVE_WOW_BUILD_NUMBER = '10.2.5.52902'; +const LIVE_WOW_BUILD_NUMBER = '10.2.6.53913'; const LIVE_TALENT_DATA_URL = 'https://www.raidbots.com/static/data/live/talents.json'; const LIVE_SPELLPOWER_DATA_URL = `https://wago.tools/db2/SpellPower/csv?build=${LIVE_WOW_BUILD_NUMBER}`; -const PTR_WOW_BUILD_NUMBER = '10.2.5.52902'; +const PTR_WOW_BUILD_NUMBER = '10.2.6.53877'; const PTR_TALENT_DATA_URL = 'https://www.raidbots.com/static/data/xptr/talents.json'; const PTR_SPELLPOWER_DATA_URL = `https://wago.tools/db2/SpellPower/csv?build=${PTR_WOW_BUILD_NUMBER}`; diff --git a/src/CHANGELOG.tsx b/src/CHANGELOG.tsx index ac6c4c7c25b..7f6fd7d912a 100644 --- a/src/CHANGELOG.tsx +++ b/src/CHANGELOG.tsx @@ -34,6 +34,11 @@ import SpellLink from 'interface/SpellLink'; // prettier-ignore export default [ + 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), + change(date(2024, 3, 26), 'Remove support for Shadowlands tier sets.', ToppleTheNun), + change(date(2024, 3, 26), 'Add tier set IDs for Dragonflight season 4.', ToppleTheNun), + change(date(2024, 3, 22), 'Update Channeling normalizer to attach fabricated channel events to their associated cast events.', Vollmer), change(date(2024, 3, 17), <>Implement buffSoonPresent APL condition and fix chain cast issues with APL check., Vollmer), change(date(2024, 3, 14), 'Correct getBuffStacks method to return the stacks at the given timestamp', Earosselot), change(date(2024, 3, 14), 'Fix overflow on cooldown bars while using the phase selector.', ToppleTheNun), diff --git a/src/analysis/retail/deathknight/blood/CHANGELOG.tsx b/src/analysis/retail/deathknight/blood/CHANGELOG.tsx index bde82c9f6e9..c2932f29cf5 100644 --- a/src/analysis/retail/deathknight/blood/CHANGELOG.tsx +++ b/src/analysis/retail/deathknight/blood/CHANGELOG.tsx @@ -5,6 +5,8 @@ import { SpellLink } from 'interface'; export default [ + change(date(2024, 3, 26), 'Remove support for Shadowlands tier set.', ToppleTheNun), + change(date(2024, 3, 18), <>Updated spec to 10.2.5 and added new guide items,Arlie), change(date(2023, 12, 15), <>Fix spell link suggestions for,Arlie), change(date(2023, 8, 12), 'Large update to the abilities file to include many missing spells and talents.',Yajinni), change(date(2023, 8, 11), <> Updated it to show cast efficiency only if the talent was taken.,Yajinni), diff --git a/src/analysis/retail/deathknight/blood/CONFIG.tsx b/src/analysis/retail/deathknight/blood/CONFIG.tsx index fcf5473aa1c..c09ca22408d 100644 --- a/src/analysis/retail/deathknight/blood/CONFIG.tsx +++ b/src/analysis/retail/deathknight/blood/CONFIG.tsx @@ -12,7 +12,7 @@ const config: Config = { contributors: [Yajinni, joshinator], expansion: Expansion.Dragonflight, // The WoW client patch this spec was last updated. - patchCompatibility: '10.0.7', + patchCompatibility: '10.2.6', 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. @@ -42,14 +42,16 @@ const config: Config = { Discord or DM us on Discord.

- Make sure to check out the Death Knight Class Discord if - you need more specific advice or a more detailed guide than the ones available on{' '} + Make sure to check out the + Death Knight Class Discord + {' '} + if you need more specific advice or a more detailed guide than the ones available on{' '} Icy-Veins and{' '} wowhead. ), // A recent example report to see interesting parts of the spec. Will be shown on the homepage. - exampleReport: "/report/mx1BaMV7PyL4FnKz/10-Mythic+Artificer+Xy'mox+-+Kill+(5:53)/Tombo/standard", + exampleReport: '/report/y3D2KWrZtCd1AkVY/29-Heroic+Volcoross+-+Kill+(2:47)/Arlie/standard', // Don't change anything below this line; // The current spec identifier. This is the only place (in code) that specifies which spec this parser is about. diff --git a/src/analysis/retail/deathknight/blood/modules/Abilities.ts b/src/analysis/retail/deathknight/blood/modules/Abilities.ts index e803aad7fc8..8d69f6134b4 100644 --- a/src/analysis/retail/deathknight/blood/modules/Abilities.ts +++ b/src/analysis/retail/deathknight/blood/modules/Abilities.ts @@ -258,22 +258,6 @@ class Abilities extends CoreAbilities { }, timelineSortIndex: 7, }, - { - //should this be used without procs? - spell: SPELLS.DEATH_AND_DECAY.id, - category: SPELL_CATEGORY.ROTATIONAL, - gcd: { - base: 1500, - }, - enabled: combatant.hasTalent(TALENTS.RAPID_DECOMPOSITION_TALENT), - cooldown: 15, - castEfficiency: { - suggestion: true, - recommendedEfficiency: 0.8, //reduced because of proc resets - }, - timelineSortIndex: 5, - }, - //do not use cast efficiency for DnD without Rapid Decomposition. { spell: SPELLS.DEATH_AND_DECAY.id, category: SPELL_CATEGORY.ROTATIONAL, @@ -281,6 +265,12 @@ class Abilities extends CoreAbilities { base: 1500, }, cooldown: 15, + castEfficiency: combatant.hasTalent(TALENTS.RAPID_DECOMPOSITION_TALENT) + ? { + suggestion: true, + recommendedEfficiency: 0.8, //reduced because of proc resets + } + : undefined, charges: combatant.hasTalent(TALENTS.DEATHS_ECHO_TALENT) ? 2 : 1, timelineSortIndex: 5, }, diff --git a/src/analysis/retail/deathknight/blood/modules/core/RuneForgeChecker.tsx b/src/analysis/retail/deathknight/blood/modules/core/RuneForgeChecker.tsx index aa3585e7a45..d31bd17645b 100644 --- a/src/analysis/retail/deathknight/blood/modules/core/RuneForgeChecker.tsx +++ b/src/analysis/retail/deathknight/blood/modules/core/RuneForgeChecker.tsx @@ -1,6 +1,7 @@ import { Trans } from '@lingui/macro'; import { RuneForgeChecker } from 'analysis/retail/deathknight/shared'; import SPELLS from 'common/SPELLS'; +import { isMythicPlus } from 'common/isMythicPlus'; import SpellLink from 'interface/SpellLink'; import { Options } from 'parser/core/Analyzer'; import SUGGESTION_IMPORTANCE from 'parser/core/ISSUE_IMPORTANCE'; @@ -36,12 +37,12 @@ class BloodRuneForgeChecker extends RuneForgeChecker { { forge: SPELLS.RUNE_OF_SANGUINATION, importance: SUGGESTION_IMPORTANCE.MAJOR, - suggestion: ( + suggestion: isMythicPlus(options.owner.fight) ? ( - Don't use as Blood Death Knight, use{' '} - instead. + Only use as Blood Death Knight in + raids, use instead. - ), + ) : undefined, }, { forge: SPELLS.RUNE_OF_APOCALYPSE, diff --git a/src/analysis/retail/deathknight/blood/modules/features/DeathStrikeTiming.tsx b/src/analysis/retail/deathknight/blood/modules/features/DeathStrikeTiming.tsx index 55519f47fdb..fb298ec2304 100644 --- a/src/analysis/retail/deathknight/blood/modules/features/DeathStrikeTiming.tsx +++ b/src/analysis/retail/deathknight/blood/modules/features/DeathStrikeTiming.tsx @@ -8,6 +8,7 @@ class DeathStrikeTiming extends SelfHealTimingGraph { this.selfHealSpell = SPELLS.DEATH_STRIKE_HEAL; this.tabTitle = 'Death Strike Timing'; this.tabURL = 'death-strike-timings'; + this.tabEnabled = false; } } diff --git a/src/analysis/retail/deathknight/blood/modules/guide/index.tsx b/src/analysis/retail/deathknight/blood/modules/guide/index.tsx index f08b674cc34..3226d5ec72b 100644 --- a/src/analysis/retail/deathknight/blood/modules/guide/index.tsx +++ b/src/analysis/retail/deathknight/blood/modules/guide/index.tsx @@ -1,11 +1,59 @@ -import { GuideProps } from 'interface/guide'; +import { GuideProps, Section } from 'interface/guide'; import CombatLogParser from '../../CombatLogParser'; import { DeathStrikeSection } from '../spells/DeathStrike/DeathStrikeSection'; +import PreparationSection from 'interface/guide/components/Preparation/PreparationSection'; +import { TALENTS_DEATH_KNIGHT } from 'common/TALENTS'; +import SPELLS from 'common/SPELLS'; +import CooldownGraphSubsection, { + Cooldown, +} from 'interface/guide/components/CooldownGraphSubSection'; +import DRAGONFLIGHT_OTHERS_ITEMS from 'common/ITEMS/dragonflight/others'; +import DRAGONFLIGHT_OTHERS_SPELLS from 'common/SPELLS/dragonflight/others'; export default function BloodGuide(props: GuideProps): JSX.Element { + const cooldowns: Cooldown[] = [ + { + spell: TALENTS_DEATH_KNIGHT.DANCING_RUNE_WEAPON_TALENT, + isActive: (c) => c.hasTalent(TALENTS_DEATH_KNIGHT.DANCING_RUNE_WEAPON_TALENT), + }, + { + spell: SPELLS.EMPOWER_RUNE_WEAPON, + isActive: (c) => c.hasTalent(TALENTS_DEATH_KNIGHT.EMPOWER_RUNE_WEAPON_SHARED_TALENT), + }, + { + spell: DRAGONFLIGHT_OTHERS_SPELLS.RAGE_OF_FYRALATH_1, + isActive: (c) => c.hasMainHand(DRAGONFLIGHT_OTHERS_ITEMS.FYRALATH.id), + }, + { + spell: TALENTS_DEATH_KNIGHT.ABOMINATION_LIMB_TALENT, + isActive: (c) => c.hasTalent(TALENTS_DEATH_KNIGHT.ABOMINATION_LIMB_TALENT), + }, + { + spell: TALENTS_DEATH_KNIGHT.ICEBOUND_FORTITUDE_TALENT, + isActive: (c) => c.hasTalent(TALENTS_DEATH_KNIGHT.ICEBOUND_FORTITUDE_TALENT), + }, + { + spell: TALENTS_DEATH_KNIGHT.VAMPIRIC_BLOOD_TALENT, + isActive: (c) => c.hasTalent(TALENTS_DEATH_KNIGHT.VAMPIRIC_BLOOD_TALENT), + }, + { + spell: TALENTS_DEATH_KNIGHT.ANTI_MAGIC_SHELL_TALENT, + isActive: (c) => c.hasTalent(TALENTS_DEATH_KNIGHT.ANTI_MAGIC_SHELL_TALENT), + }, + ]; return ( <> - +
+ + {props.modules.deathStrikeTiming.guideSubsection} +
+
+ {props.modules.runicPowerDetails.guideSubsection} +
+
+ +
+ ); } diff --git a/src/analysis/retail/deathknight/blood/modules/runicpower/RunicPowerDetails.tsx b/src/analysis/retail/deathknight/blood/modules/runicpower/RunicPowerDetails.tsx index 1cbda3d7cea..8bc73c5b834 100644 --- a/src/analysis/retail/deathknight/blood/modules/runicpower/RunicPowerDetails.tsx +++ b/src/analysis/retail/deathknight/blood/modules/runicpower/RunicPowerDetails.tsx @@ -1,7 +1,7 @@ import { defineMessage, t, Trans } from '@lingui/macro'; import { formatPercentage } from 'common/format'; import RESOURCE_TYPES from 'game/RESOURCE_TYPES'; -import { Panel } from 'interface'; +// import { Panel } from 'interface'; import Analyzer from 'parser/core/Analyzer'; import { NumberThreshold, ThresholdStyle, When } from 'parser/core/ParseResults'; import ResourceBreakdown from 'parser/shared/modules/resources/resourcetracker/ResourceBreakdown'; @@ -10,6 +10,7 @@ import Statistic from 'parser/ui/Statistic'; import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; import RunicPowerTracker from './RunicPowerTracker'; +import { SubSection } from 'interface/guide'; class RunicPowerDetails extends Analyzer { static dependencies = { @@ -96,16 +97,12 @@ class RunicPowerDetails extends Analyzer { ); } - tab() { - return { - title: 'Runic Power usage', - url: 'runic-power-usage', - render: () => ( - - - - ), - }; + get guideSubsection() { + return ( + + + + ); } } diff --git a/src/analysis/retail/deathknight/blood/modules/spells/DeathStrike/DeathStrikeSection.tsx b/src/analysis/retail/deathknight/blood/modules/spells/DeathStrike/DeathStrikeSection.tsx index 0b6cf4ccf23..71c43bdba74 100644 --- a/src/analysis/retail/deathknight/blood/modules/spells/DeathStrike/DeathStrikeSection.tsx +++ b/src/analysis/retail/deathknight/blood/modules/spells/DeathStrike/DeathStrikeSection.tsx @@ -14,7 +14,7 @@ import talents from 'common/TALENTS/deathknight'; import MAGIC_SCHOOLS, { color } from 'game/MAGIC_SCHOOLS'; import RESOURCE_TYPES, { getResource } from 'game/RESOURCE_TYPES'; import { ResourceLink, SpellLink, TooltipElement } from 'interface'; -import { BadColor, GoodColor, Section, useAnalyzers, useEvents, useInfo } from 'interface/guide'; +import { BadColor, GoodColor, SubSection, useAnalyzers, useEvents, useInfo } from 'interface/guide'; import { ActualCastDescription } from 'interface/guide/components/Apl/violations/claims'; import CastReasonBreakdownTableContents from 'interface/guide/components/CastReasonBreakdownTableContents'; import Explanation from 'interface/guide/components/Explanation'; @@ -368,7 +368,7 @@ export function DeathStrikeSection(): JSX.Element | null { const healingTarget = totalDamage / 2; return ( -
+

As a Blood Death Knight, is both your @@ -543,6 +543,6 @@ export function DeathStrikeSection(): JSX.Element | null { renderer={DeathStrikeProblemRenderer} /> -

+ ); } diff --git a/src/analysis/retail/deathknight/blood/modules/talents/Bonestorm.tsx b/src/analysis/retail/deathknight/blood/modules/talents/Bonestorm.tsx index bd86622519b..3b6de710972 100644 --- a/src/analysis/retail/deathknight/blood/modules/talents/Bonestorm.tsx +++ b/src/analysis/retail/deathknight/blood/modules/talents/Bonestorm.tsx @@ -12,10 +12,8 @@ import ItemPercentDamageDone from 'parser/ui/ItemPercentDamageDone'; import Statistic from 'parser/ui/Statistic'; import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; -import { TIERS } from 'game/TIERS'; const SUGGESTED_MIN_TARGETS_FOR_BONESTORM = 1.5; -const SUGGESTED_RUNIC_POWER_SPENT = 100; class Bonestorm extends Analyzer { bsCasts: Array<{ cost: number; hits: number[] }> = []; @@ -68,13 +66,9 @@ class Bonestorm extends Analyzer { } get goodBonestormCasts() { - if (this.selectedCombatant.has2PieceByTier(TIERS.T28)) { - return this.bsCasts.filter((cast) => cast.cost / 10 === SUGGESTED_RUNIC_POWER_SPENT).length; - } else { - return this.bsCasts.filter( - (cast) => cast.hits.length / (cast.cost / 100) >= SUGGESTED_MIN_TARGETS_FOR_BONESTORM, - ).length; - } + return this.bsCasts.filter( + (cast) => cast.hits.length / (cast.cost / 100) >= SUGGESTED_MIN_TARGETS_FOR_BONESTORM, + ).length; } get totalBonestormCasts() { @@ -94,60 +88,32 @@ class Bonestorm extends Analyzer { } suggestions(when: When) { - if (this.selectedCombatant.has2PieceByTier(TIERS.T28)) { - when(this.suggestionThresholds).addSuggestion((suggest, actual, recommended) => - suggest( - - Try to cast only when you have 100 or - more Runic Power. The main purpose of {' '} - once you have 2-piece is to quickly spend Runic Power on a high Damage Per Execution - Time (DPET) ability. - , - ) - .icon(TALENTS.BONESTORM_TALENT.icon) - .actual( - defineMessage({ - id: 'deathknight.blood.bonestorm.suggestion.2p.actual', - message: `${formatPercentage( - actual, - )}% casts spent ${SUGGESTED_RUNIC_POWER_SPENT} Runic Power`, - }), - ) - .recommended( - defineMessage({ - id: 'deathknight.blood.bonestorm.suggestion.2p.recommended', - message: `${formatPercentage(recommended)}% is recommended`, - }), - ), - ); - } else { - when(this.suggestionThresholds).addSuggestion((suggest, actual, recommended) => - suggest( - - Try to cast only if you can reliable hit - 2 or more targets to maximize the damage and healing. Casting{' '} - with only one target in range is only a - minor DPS gain (~10 DPS) at the cost of pooling Runic Power, use{' '} - instead. - , + when(this.suggestionThresholds).addSuggestion((suggest, actual, recommended) => + suggest( + + Try to cast only if you can reliable hit 2 + or more targets to maximize the damage and healing. Casting{' '} + with only one target in range is only a + minor DPS gain (~10 DPS) at the cost of pooling Runic Power, use{' '} + instead. + , + ) + .icon(TALENTS.BONESTORM_TALENT.icon) + .actual( + defineMessage({ + id: 'deathknight.blood.bonestorm.suggestion.actual', + message: `${formatPercentage( + actual, + )}% casts hit ${SUGGESTED_MIN_TARGETS_FOR_BONESTORM} or more targets`, + }), ) - .icon(TALENTS.BONESTORM_TALENT.icon) - .actual( - defineMessage({ - id: 'deathknight.blood.bonestorm.suggestion.actual', - message: `${formatPercentage( - actual, - )}% casts hit ${SUGGESTED_MIN_TARGETS_FOR_BONESTORM} or more targets`, - }), - ) - .recommended( - defineMessage({ - id: 'deathknight.blood.bonestorm.suggestion.recommended', - message: `${formatPercentage(recommended)}% is recommended`, - }), - ), - ); - } + .recommended( + defineMessage({ + id: 'deathknight.blood.bonestorm.suggestion.recommended', + message: `${formatPercentage(recommended)}% is recommended`, + }), + ), + ); } get bonestormTooltip() { diff --git a/src/analysis/retail/deathknight/unholy/modules/spells/VileInfusion.tsx b/src/analysis/retail/deathknight/unholy/modules/spells/VileInfusion.tsx index 4f1f7ea2da0..c0927e74fc6 100644 --- a/src/analysis/retail/deathknight/unholy/modules/spells/VileInfusion.tsx +++ b/src/analysis/retail/deathknight/unholy/modules/spells/VileInfusion.tsx @@ -18,7 +18,7 @@ class VileInfusion extends Analyzer { constructor(options: Options) { super(options); - this.active = this.selectedCombatant.has2PieceByTier(TIERS.T29); + this.active = this.selectedCombatant.has2PieceByTier(TIERS.DF1); if (!this.active) { return; } diff --git a/src/analysis/retail/demonhunter/havoc/CONFIG.tsx b/src/analysis/retail/demonhunter/havoc/CONFIG.tsx index b63cd55f3e7..0c6f2e94995 100644 --- a/src/analysis/retail/demonhunter/havoc/CONFIG.tsx +++ b/src/analysis/retail/demonhunter/havoc/CONFIG.tsx @@ -10,7 +10,7 @@ const CONFIG: Config = { contributors: [ToppleTheNun], expansion: Expansion.Dragonflight, // The WoW client patch this spec was last updated. - patchCompatibility: '10.2.5', + patchCompatibility: '10.2.6', isPartial: false, // 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/demonhunter/vengeance/CHANGELOG.tsx b/src/analysis/retail/demonhunter/vengeance/CHANGELOG.tsx index 816e0855047..d00211f550a 100644 --- a/src/analysis/retail/demonhunter/vengeance/CHANGELOG.tsx +++ b/src/analysis/retail/demonhunter/vengeance/CHANGELOG.tsx @@ -5,12 +5,12 @@ import SpellLink from 'interface/SpellLink'; import SPELLS from 'common/SPELLS/demonhunter'; import TALENTS from 'common/TALENTS/demonhunter'; import SHARED_CHANGELOG from 'analysis/retail/demonhunter/shared/CHANGELOG'; -import { DEMON_HUNTER_T31_ID } from 'common/ITEMS/dragonflight'; +import { DEMON_HUNTER_DF3_ID } from 'common/ITEMS/dragonflight'; // prettier-ignore export default [ change(date(2023, 12, 14), <>Detect if no targets were hit by ., ToppleTheNun), - change(date(2023, 12, 10), <>Add CDR calculations for Screaming Torchfiend's Brutality.., ToppleTheNun), + change(date(2023, 12, 10), <>Add CDR calculations for Screaming Torchfiend's Brutality.., ToppleTheNun), change(date(2023, 11, 19), <>Revise guidance in single target and fix bug with consumption., ToppleTheNun), change(date(2023, 11, 15), <>Fix cooldown., ToppleTheNun), change(date(2023, 10, 24), <>Make not count as a cast., ToppleTheNun), diff --git a/src/analysis/retail/demonhunter/vengeance/CONFIG.tsx b/src/analysis/retail/demonhunter/vengeance/CONFIG.tsx index 0da96cc9047..adcf638a34b 100644 --- a/src/analysis/retail/demonhunter/vengeance/CONFIG.tsx +++ b/src/analysis/retail/demonhunter/vengeance/CONFIG.tsx @@ -17,7 +17,7 @@ const config: Config = { contributors: [ToppleTheNun], expansion: Expansion.Dragonflight, // The WoW client patch this spec was last updated. - patchCompatibility: '10.2.5', + patchCompatibility: '10.2.6', isPartial: false, // 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. @@ -68,7 +68,8 @@ const config: Config = { ), // A recent example report to see interesting parts of the spec. Will be shown on the homepage. - exampleReport: '/report/dFzCLcjyqMbX43KP/20-Mythic+Volcoross+-+Kill+(3:11)/Toppledh/standard', + exampleReport: + '/report/bjqrZRnNdvKPXt13/34-Mythic+Fyrakk+the+Blazing+-+Kill+(8:47)/Toppledh/standard', // Default to using the Guide guideDefault: true, // Only use the Guide diff --git a/src/analysis/retail/demonhunter/vengeance/modules/dragonflight/tier/ScreamingTorchfiendsBrutality.tsx b/src/analysis/retail/demonhunter/vengeance/modules/dragonflight/tier/ScreamingTorchfiendsBrutality.tsx index 20bb18fb39d..5af59bfcd88 100644 --- a/src/analysis/retail/demonhunter/vengeance/modules/dragonflight/tier/ScreamingTorchfiendsBrutality.tsx +++ b/src/analysis/retail/demonhunter/vengeance/modules/dragonflight/tier/ScreamingTorchfiendsBrutality.tsx @@ -6,7 +6,7 @@ import React from 'react'; import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; import Statistic from 'parser/ui/Statistic'; import BoringItemSetValueText from 'parser/ui/BoringItemSetValueText'; -import { DEMON_HUNTER_T31_ID } from 'common/ITEMS/dragonflight'; +import { DEMON_HUNTER_DF3_ID } from 'common/ITEMS/dragonflight'; import { formatDurationMillisMinSec, formatPercentage } from 'common/format'; import SpellLink from 'interface/SpellLink'; import getResourceSpent from 'parser/core/getResourceSpent'; @@ -34,7 +34,7 @@ export class ScreamingTorchfiendsBrutality extends Analyzer.withDependencies(dep constructor(options: Options) { super(options); this.spell = getSigilOfFlameSpell(this.selectedCombatant); - this.active = this.selectedCombatant.has4PieceByTier(TIERS.T31); + this.active = this.selectedCombatant.has4PieceByTier(TIERS.DF3); this.addEventListener( Events.damage.spell(SPELLS.SIGIL_OF_FLAME_DEBUFF).by(SELECTED_PLAYER), this.onSigilOfFlameTick, @@ -63,7 +63,7 @@ export class ScreamingTorchfiendsBrutality extends Analyzer.withDependencies(dep } >
diff --git a/src/analysis/retail/demonhunter/vengeance/modules/talents/Fracture.tsx b/src/analysis/retail/demonhunter/vengeance/modules/talents/Fracture.tsx index b8c4f3f47bf..70872d9969c 100644 --- a/src/analysis/retail/demonhunter/vengeance/modules/talents/Fracture.tsx +++ b/src/analysis/retail/demonhunter/vengeance/modules/talents/Fracture.tsx @@ -59,7 +59,7 @@ export default class Fracture extends Analyzer { return; } - const hasT292Pc = this.selectedCombatant.has2PieceByTier(TIERS.T29); + const hasT292Pc = this.selectedCombatant.has2PieceByTier(TIERS.DF1); this.maximumFury = BASE_FURY + @@ -132,7 +132,7 @@ export default class Fracture extends Analyzer { SPELLS.METAMORPHOSIS_TANK.id, event.timestamp, ); - const hasT292Piece = this.selectedCombatant.has2PieceByTier(TIERS.T29); + const hasT292Piece = this.selectedCombatant.has2PieceByTier(TIERS.DF1); const hasExtraDetails = hasMetamorphosis || hasT292Piece; const extraDetails = ( diff --git a/src/analysis/retail/druid/balance/CONFIG.tsx b/src/analysis/retail/druid/balance/CONFIG.tsx index d04953a444a..331f2617524 100644 --- a/src/analysis/retail/druid/balance/CONFIG.tsx +++ b/src/analysis/retail/druid/balance/CONFIG.tsx @@ -10,7 +10,7 @@ const config: Config = { contributors: [Sref, Hartra344, Jundarer], expansion: Expansion.Dragonflight, // The WoW client patch this spec was last updated. - patchCompatibility: '10.2.5', + patchCompatibility: '10.2.6', isPartial: false, // 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/druid/balance/modules/spells/GatheringStarstuff.tsx b/src/analysis/retail/druid/balance/modules/spells/GatheringStarstuff.tsx index 247744c7091..c08288f24c8 100644 --- a/src/analysis/retail/druid/balance/modules/spells/GatheringStarstuff.tsx +++ b/src/analysis/retail/druid/balance/modules/spells/GatheringStarstuff.tsx @@ -45,7 +45,7 @@ class GatheringStarstuff extends Analyzer { constructor(options: Options) { super(options); - this.active = this.selectedCombatant.has2PieceByTier(TIERS.T29); + this.active = this.selectedCombatant.has2PieceByTier(TIERS.DF1); this.stacksWhenCast = Array.from({ length: GATHERING_STARSTUFF.MAX_STACKS + 1 }, (x) => [0]); this.castWraths = []; diff --git a/src/analysis/retail/druid/balance/modules/spells/TouchTheCosmos.tsx b/src/analysis/retail/druid/balance/modules/spells/TouchTheCosmos.tsx index c4221dc9efc..fa27224c66d 100644 --- a/src/analysis/retail/druid/balance/modules/spells/TouchTheCosmos.tsx +++ b/src/analysis/retail/druid/balance/modules/spells/TouchTheCosmos.tsx @@ -18,7 +18,7 @@ class TouchTheCosmos extends Analyzer { constructor(options: Options) { super(options); - this.active = this.selectedCombatant.has4PieceByTier(TIERS.T29); + this.active = this.selectedCombatant.has4PieceByTier(TIERS.DF1); Object.values(AFFECTED_CAST).forEach((spell) => { this.totcBuffedAbilities[spell.id] = 0; diff --git a/src/analysis/retail/druid/feral/CONFIG.tsx b/src/analysis/retail/druid/feral/CONFIG.tsx index 3c97b15598d..b48e8362122 100644 --- a/src/analysis/retail/druid/feral/CONFIG.tsx +++ b/src/analysis/retail/druid/feral/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.2.5', + patchCompatibility: '10.2.6', isPartial: false, // 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/druid/feral/modules/Abilities.ts b/src/analysis/retail/druid/feral/modules/Abilities.ts index c6d07779fcf..bff5c3ab35a 100644 --- a/src/analysis/retail/druid/feral/modules/Abilities.ts +++ b/src/analysis/retail/druid/feral/modules/Abilities.ts @@ -193,7 +193,7 @@ class Abilities extends CoreAbilities { spell: TALENTS_DRUID.FERAL_FRENZY_TALENT.id, category: SPELL_CATEGORY.COOLDOWNS, enabled: combatant.hasTalent(TALENTS_DRUID.FERAL_FRENZY_TALENT), - cooldown: combatant.has4PieceByTier(TIERS.T31) ? 30 : 45, + cooldown: combatant.has4PieceByTier(TIERS.DF3) ? 30 : 45, castEfficiency: { suggestion: true, recommendedEfficiency: 0.9, diff --git a/src/analysis/retail/druid/feral/modules/dragonflight/Tier29.tsx b/src/analysis/retail/druid/feral/modules/dragonflight/Tier29.tsx index a6c67fe26e1..c76e3e27ca4 100644 --- a/src/analysis/retail/druid/feral/modules/dragonflight/Tier29.tsx +++ b/src/analysis/retail/druid/feral/modules/dragonflight/Tier29.tsx @@ -8,7 +8,7 @@ import STATISTIC_ORDER from 'parser/ui/STATISTIC_ORDER'; import STATISTIC_CATEGORY from 'parser/ui/STATISTIC_CATEGORY'; import ItemPercentDamageDone from 'parser/ui/ItemPercentDamageDone'; import ItemSetLink from 'interface/ItemSetLink'; -import { DRUID_T29_ID } from 'common/ITEMS/dragonflight'; +import { DRUID_DF1_ID } from 'common/ITEMS/dragonflight'; import { TALENTS_DRUID } from 'common/TALENTS'; import { CONVOKE_FB_CPS, FINISHERS, MAX_CPS } from 'analysis/retail/druid/feral/constants'; import getResourceSpent from 'parser/core/getResourceSpent'; @@ -70,8 +70,8 @@ export default class Tier29 extends Analyzer { constructor(options: Options) { super(options); - this.active = this.selectedCombatant.has2PieceByTier(TIERS.T29); - this.has4pc = this.selectedCombatant.has4PieceByTier(TIERS.T29); + this.active = this.selectedCombatant.has2PieceByTier(TIERS.DF1); + this.has4pc = this.selectedCombatant.has4PieceByTier(TIERS.DF1); this.addEventListener(Events.damage.by(SELECTED_PLAYER).spell(BOOSTED_2PC), this.on2pcDamage); if (this.has4pc) { @@ -161,7 +161,7 @@ export default class Tier29 extends Analyzer { >
2pc: diff --git a/src/analysis/retail/druid/feral/modules/spells/ConvokeSpiritsFeral.tsx b/src/analysis/retail/druid/feral/modules/spells/ConvokeSpiritsFeral.tsx index 65e545ba8b0..db64b3c761b 100644 --- a/src/analysis/retail/druid/feral/modules/spells/ConvokeSpiritsFeral.tsx +++ b/src/analysis/retail/druid/feral/modules/spells/ConvokeSpiritsFeral.tsx @@ -16,7 +16,7 @@ import ComboPointTracker from 'analysis/retail/druid/feral/modules/core/combopoi import { PassFailCheckmark, PerformanceMark } from 'interface/guide'; import { TIERS } from 'game/TIERS'; import ItemSetLink from 'interface/ItemSetLink'; -import { DRUID_T31_ID } from 'common/ITEMS/dragonflight'; +import { DRUID_DF3_ID } from 'common/ITEMS/dragonflight'; class ConvokeSpiritsFeral extends ConvokeSpirits { static dependencies = { @@ -77,7 +77,7 @@ class ConvokeSpiritsFeral extends ConvokeSpirits { /** Guide fragment showing a breakdown of each Convoke cast */ get guideCastBreakdown() { - const hasT31 = this.selectedCombatant.has2PieceByTier(TIERS.T31); + const hasT31 = this.selectedCombatant.has2PieceByTier(TIERS.DF3); const explanation = ( <>

@@ -91,7 +91,7 @@ class ConvokeSpiritsFeral extends ConvokeSpirits {

{hasT31 && (

- Because you have the Amirdrassil Tier Set, + Because you have the Amirdrassil Tier Set, you should also make sure to have active during Convoke.

diff --git a/src/analysis/retail/druid/feral/modules/spells/FeralFrenzy.tsx b/src/analysis/retail/druid/feral/modules/spells/FeralFrenzy.tsx index 161696f362f..b69914e1b58 100644 --- a/src/analysis/retail/druid/feral/modules/spells/FeralFrenzy.tsx +++ b/src/analysis/retail/druid/feral/modules/spells/FeralFrenzy.tsx @@ -12,7 +12,7 @@ import CooldownExpandable, { } from 'interface/guide/components/CooldownExpandable'; import { PassFailCheckmark, PerformanceMark } from 'interface/guide'; import { TIERS } from 'game/TIERS'; -import { DRUID_T31_ID } from 'common/ITEMS/dragonflight'; +import { DRUID_DF3_ID } from 'common/ITEMS/dragonflight'; import ItemSetLink from 'interface/ItemSetLink'; import EnergyTracker from 'analysis/retail/druid/feral/modules/core/energy/EnergyTracker'; @@ -45,7 +45,7 @@ export default class FeralFrenzy extends Analyzer { this.active = this.selectedCombatant.hasTalent(TALENTS_DRUID.FERAL_FRENZY_TALENT); this.hasSwarm = this.selectedCombatant.hasTalent(TALENTS_DRUID.ADAPTIVE_SWARM_TALENT); - this.hasT31 = this.selectedCombatant.has2PieceByTier(TIERS.T31); + this.hasT31 = this.selectedCombatant.has2PieceByTier(TIERS.DF3); this.addEventListener( Events.cast.by(SELECTED_PLAYER).spell(TALENTS_DRUID.FERAL_FRENZY_TALENT), @@ -96,7 +96,7 @@ export default class FeralFrenzy extends Analyzer {

{this.hasT31 && (

- Because you have the Amirdrassil Tier Set, + Because you have the Amirdrassil Tier Set, it's also important to pool energy before using Feral Frezy in order to maximize your abilities used during .

diff --git a/src/analysis/retail/druid/guardian/CONFIG.tsx b/src/analysis/retail/druid/guardian/CONFIG.tsx index da6bec26f5b..5682696eba3 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.2.5', + patchCompatibility: '10.2.6', 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. diff --git a/src/analysis/retail/druid/restoration/CONFIG.tsx b/src/analysis/retail/druid/restoration/CONFIG.tsx index 86ba11999b2..657755485eb 100644 --- a/src/analysis/retail/druid/restoration/CONFIG.tsx +++ b/src/analysis/retail/druid/restoration/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.2.5', + patchCompatibility: '10.2.6', isPartial: false, // 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/druid/restoration/modules/dragonflight/Tier29.tsx b/src/analysis/retail/druid/restoration/modules/dragonflight/Tier29.tsx index 593196853d9..105468ab829 100644 --- a/src/analysis/retail/druid/restoration/modules/dragonflight/Tier29.tsx +++ b/src/analysis/retail/druid/restoration/modules/dragonflight/Tier29.tsx @@ -9,7 +9,7 @@ import StatTracker from 'parser/shared/modules/StatTracker'; import HIT_TYPES from 'game/HIT_TYPES'; import ItemPercentHealingDone from 'parser/ui/ItemPercentHealingDone'; import ItemSetLink from 'interface/ItemSetLink'; -import { DRUID_T29_ID } from 'common/ITEMS/dragonflight'; +import { DRUID_DF1_ID } from 'common/ITEMS/dragonflight'; import HotTrackerRestoDruid from 'analysis/retail/druid/restoration/modules/core/hottracking/HotTrackerRestoDruid'; import SpellUsable from 'parser/shared/modules/SpellUsable'; import SpellLink from 'interface/SpellLink'; @@ -62,8 +62,8 @@ class Tier29 extends Analyzer { constructor(options: Options) { super(options); - this.active = this.selectedCombatant.has2PieceByTier(TIERS.T29); - this.has4pc = this.selectedCombatant.has4PieceByTier(TIERS.T29); + this.active = this.selectedCombatant.has2PieceByTier(TIERS.DF1); + this.has4pc = this.selectedCombatant.has4PieceByTier(TIERS.DF1); this.addEventListener(Events.heal.by(SELECTED_PLAYER).spell(TWO_PIECE_SPELLS), this.on2pcHeal); @@ -160,7 +160,7 @@ class Tier29 extends Analyzer { >